001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.activemq.store.amq;
018
019import java.io.File;
020import org.apache.activemq.kaha.impl.async.AsyncDataManager;
021import org.apache.activemq.kaha.impl.index.hash.HashIndex;
022import org.apache.activemq.store.PersistenceAdapter;
023import org.apache.activemq.store.PersistenceAdapterFactory;
024import org.apache.activemq.store.ReferenceStoreAdapter;
025import org.apache.activemq.thread.TaskRunnerFactory;
026import org.apache.activemq.util.IOHelper;
027
028/**
029 * An implementation of {@link PersistenceAdapterFactory}
030 * 
031 * @org.apache.xbean.XBean element="amqPersistenceAdapterFactory"
032 * 
033 * 
034 */
035public class AMQPersistenceAdapterFactory implements PersistenceAdapterFactory {
036    static final int DEFAULT_MAX_REFERNCE_FILE_LENGTH=2*1024*1024;
037    private File dataDirectory;
038    private int journalThreadPriority = Thread.MAX_PRIORITY;
039    private String brokerName = "localhost";
040    private ReferenceStoreAdapter referenceStoreAdapter;
041    private boolean syncOnWrite;
042    private boolean syncOnTransaction=true;
043    private boolean persistentIndex=true;
044    private boolean useNio = true;
045    private int maxFileLength = AsyncDataManager.DEFAULT_MAX_FILE_LENGTH;
046    private long cleanupInterval = AsyncDataManager.DEFAULT_CLEANUP_INTERVAL;
047    private int indexBinSize = HashIndex.DEFAULT_BIN_SIZE;
048    private int indexKeySize = HashIndex.DEFAULT_KEY_SIZE;
049    private int indexPageSize = HashIndex.DEFAULT_PAGE_SIZE;
050    private int indexMaxBinSize = HashIndex.MAXIMUM_CAPACITY;
051    private int indexLoadFactor = HashIndex.DEFAULT_LOAD_FACTOR;
052    private int maxReferenceFileLength=DEFAULT_MAX_REFERNCE_FILE_LENGTH;
053    private boolean recoverReferenceStore=true;
054    private boolean forceRecoverReferenceStore=false;
055    private long checkpointInterval = 1000 * 20;
056    private boolean useDedicatedTaskRunner;
057    private TaskRunnerFactory taskRunnerFactory;
058
059
060    /**
061     * @return a AMQPersistenceAdapter
062     * @see org.apache.activemq.store.PersistenceAdapterFactory#createPersistenceAdapter()
063     */
064    public PersistenceAdapter createPersistenceAdapter() {
065        AMQPersistenceAdapter result = new AMQPersistenceAdapter();
066        result.setDirectory(getDataDirectory());
067        result.setTaskRunnerFactory(getTaskRunnerFactory());
068        result.setBrokerName(getBrokerName());
069        result.setSyncOnWrite(isSyncOnWrite());
070        result.setPersistentIndex(isPersistentIndex());
071        result.setReferenceStoreAdapter(getReferenceStoreAdapter());
072        result.setUseNio(isUseNio());
073        result.setMaxFileLength(getMaxFileLength());
074        result.setCleanupInterval(getCleanupInterval());
075        result.setCheckpointInterval(getCheckpointInterval());
076        result.setIndexBinSize(getIndexBinSize());
077        result.setIndexKeySize(getIndexKeySize());
078        result.setIndexPageSize(getIndexPageSize());
079        result.setIndexMaxBinSize(getIndexMaxBinSize());
080        result.setIndexLoadFactor(getIndexLoadFactor());
081        result.setMaxReferenceFileLength(getMaxReferenceFileLength());
082        result.setForceRecoverReferenceStore(isForceRecoverReferenceStore());
083        result.setRecoverReferenceStore(isRecoverReferenceStore());
084        result.setUseDedicatedTaskRunner(isUseDedicatedTaskRunner());
085        result.setJournalThreadPriority(getJournalThreadPriority());
086        return result;
087    }
088
089    public long getCleanupInterval() {
090        return cleanupInterval;
091    }
092    
093    public void setCleanupInterval(long val) {
094        cleanupInterval = val;
095    }
096
097    /**
098     * @return the dataDirectory
099     */
100    public File getDataDirectory() {
101        if (this.dataDirectory == null) {
102            this.dataDirectory = new File(IOHelper.getDefaultDataDirectory(), IOHelper.toFileSystemSafeName(brokerName));
103        }
104        return this.dataDirectory;
105    }
106
107    /**
108     * @param dataDirectory the dataDirectory to set
109     */
110    public void setDataDirectory(File dataDirectory) {
111        this.dataDirectory = dataDirectory;
112    }
113
114    public boolean isUseDedicatedTaskRunner() {
115        return useDedicatedTaskRunner;
116    }
117    
118    public void setUseDedicatedTaskRunner(boolean useDedicatedTaskRunner) {
119        this.useDedicatedTaskRunner = useDedicatedTaskRunner;
120    }
121    
122    /**
123     * @return the taskRunnerFactory
124     */
125    public TaskRunnerFactory getTaskRunnerFactory() {
126        return taskRunnerFactory;
127    }
128
129    /**
130     * @param taskRunnerFactory the taskRunnerFactory to set
131     */
132    public void setTaskRunnerFactory(TaskRunnerFactory taskRunnerFactory) {
133        this.taskRunnerFactory = taskRunnerFactory;
134    }
135
136    /**
137     * @return the journalThreadPriority
138     */
139    public int getJournalThreadPriority() {
140        return this.journalThreadPriority;
141    }
142
143    /**
144     * @param journalThreadPriority the journalThreadPriority to set
145     */
146    public void setJournalThreadPriority(int journalThreadPriority) {
147        this.journalThreadPriority = journalThreadPriority;
148    }
149
150    /**
151     * @return the brokerName
152     */
153    public String getBrokerName() {
154        return this.brokerName;
155    }
156
157    /**
158     * @param brokerName the brokerName to set
159     */
160    public void setBrokerName(String brokerName) {
161        this.brokerName = brokerName;
162    }
163
164    /**
165     * @return the referenceStoreAdapter
166     */
167    public ReferenceStoreAdapter getReferenceStoreAdapter() {
168        return this.referenceStoreAdapter;
169    }
170
171    /**
172     * @param referenceStoreAdapter the referenceStoreAdapter to set
173     */
174    public void setReferenceStoreAdapter(ReferenceStoreAdapter referenceStoreAdapter) {
175        this.referenceStoreAdapter = referenceStoreAdapter;
176    }
177    
178    public boolean isPersistentIndex() {
179                return persistentIndex;
180        }
181
182        public void setPersistentIndex(boolean persistentIndex) {
183                this.persistentIndex = persistentIndex;
184        }
185
186        public boolean isSyncOnWrite() {
187                return syncOnWrite;
188        }
189
190        public void setSyncOnWrite(boolean syncOnWrite) {
191                this.syncOnWrite = syncOnWrite;
192        }
193        
194        public boolean isSyncOnTransaction() {
195        return syncOnTransaction;
196    }
197
198    public void setSyncOnTransaction(boolean syncOnTransaction) {
199        this.syncOnTransaction = syncOnTransaction;
200    }
201
202        public boolean isUseNio() {
203                return useNio;
204        }
205
206        public void setUseNio(boolean useNio) {
207                this.useNio = useNio;
208        }
209
210        public int getMaxFileLength() {
211                return maxFileLength;
212        }
213
214        public void setMaxFileLength(int maxFileLength) {
215                this.maxFileLength = maxFileLength;
216        }
217
218    /**
219     * @return the indexBinSize
220     */
221    public int getIndexBinSize() {
222        return indexBinSize;
223    }
224
225    /**
226     * @param indexBinSize the indexBinSize to set
227     */
228    public void setIndexBinSize(int indexBinSize) {
229        this.indexBinSize = indexBinSize;
230    }
231
232    /**
233     * @return the indexKeySize
234     */
235    public int getIndexKeySize() {
236        return indexKeySize;
237    }
238
239    /**
240     * @param indexKeySize the indexKeySize to set
241     */
242    public void setIndexKeySize(int indexKeySize) {
243        this.indexKeySize = indexKeySize;
244    }
245
246    /**
247     * @return the indexPageSize
248     */
249    public int getIndexPageSize() {
250        return indexPageSize;
251    }
252
253    /**
254     * @param indexPageSize the indexPageSize to set
255     */
256    public void setIndexPageSize(int indexPageSize) {
257        this.indexPageSize = indexPageSize;
258    }
259
260    /**
261     * @return the indexMaxBinSize
262     */
263    public int getIndexMaxBinSize() {
264        return indexMaxBinSize;
265    }
266
267    /**
268     * @param indexMaxBinSize the indexMaxBinSize to set
269     */
270    public void setIndexMaxBinSize(int indexMaxBinSize) {
271        this.indexMaxBinSize = indexMaxBinSize;
272    }
273
274    /**
275     * @return the indexLoadFactor
276     */
277    public int getIndexLoadFactor() {
278        return indexLoadFactor;
279    }
280
281    /**
282     * @param indexLoadFactor the indexLoadFactor to set
283     */
284    public void setIndexLoadFactor(int indexLoadFactor) {
285        this.indexLoadFactor = indexLoadFactor;
286    }
287
288    /**
289     * @return the maxReferenceFileLength
290     */
291    public int getMaxReferenceFileLength() {
292        return maxReferenceFileLength;
293    }
294
295    /**
296     * @param maxReferenceFileLength the maxReferenceFileLength to set
297     */
298    public void setMaxReferenceFileLength(int maxReferenceFileLength) {
299        this.maxReferenceFileLength = maxReferenceFileLength;
300    }
301
302    /**
303     * @return the recoverReferenceStore
304     */
305    public boolean isRecoverReferenceStore() {
306        return recoverReferenceStore;
307    }
308
309    /**
310     * @param recoverReferenceStore the recoverReferenceStore to set
311     */
312    public void setRecoverReferenceStore(boolean recoverReferenceStore) {
313        this.recoverReferenceStore = recoverReferenceStore;
314    }
315
316    /**
317     * @return the forceRecoverReferenceStore
318     */
319    public boolean isForceRecoverReferenceStore() {
320        return forceRecoverReferenceStore;
321    }
322
323    /**
324     * @param forceRecoverReferenceStore the forceRecoverReferenceStore to set
325     */
326    public void setForceRecoverReferenceStore(boolean forceRecoverReferenceStore) {
327        this.forceRecoverReferenceStore = forceRecoverReferenceStore;
328    }
329
330    /**
331     * @return the checkpointInterval
332     */
333    public long getCheckpointInterval() {
334        return checkpointInterval;
335    }
336
337    /**
338     * @param checkpointInterval the checkpointInterval to set
339     */
340    public void setCheckpointInterval(long checkpointInterval) {
341        this.checkpointInterval = checkpointInterval;
342    }
343}