this.properties = properties;
this.bundleContext = bundleContext;
// Transaction timeout
int transactionTimeout = getInt(TRANSACTION_TIMEOUT, DEFAULT_TRANSACTION_TIMEOUT);
if (transactionTimeout <= 0) {
throw new ConfigurationException(TRANSACTION_TIMEOUT, "Property " + TRANSACTION_TIMEOUT + " must be > 0");
}
// XID factory
XidFactory xidFactory = new XidFactoryImpl(pid.getBytes());
// Transaction log
if (getBool(RECOVERABLE, DEFAULT_RECOVERABLE)) {
String bufferClassName = getString(HOWL_BUFFER_CLASS_NAME, "org.objectweb.howl.log.BlockLogBuffer");
int bufferSizeKBytes = getInt(HOWL_BUFFER_SIZE, 32);
if (bufferSizeKBytes < 1 || bufferSizeKBytes > 32) {
throw new ConfigurationException(HOWL_BUFFER_SIZE, "bufferSize must be between 1 and 32");
}
boolean checksumEnabled = getBool(HOWL_CHECKSUM_ENABLED, true);
boolean adler32Checksum = getBool(HOWL_ADLER32_CHECKSUM, true);
int flushSleepTimeMilliseconds = getInt(HOWL_FLUSH_SLEEP_TIME, 50);
String logFileExt = getString(HOWL_LOG_FILE_EXT, "log");
String logFileName = getString(HOWL_LOG_FILE_NAME, "transaction");
int maxBlocksPerFile = getInt(HOWL_MAX_BLOCKS_PER_FILE, -1);
int maxLogFiles = getInt(HOWL_MAX_LOG_FILES, 2);
int minBuffers = getInt(HOWL_MIN_BUFFERS, 4);
if (minBuffers < 0) {
throw new ConfigurationException(HOWL_MIN_BUFFERS, "minBuffers must be > 0");
}
int maxBuffers = getInt(HOWL_MAX_BUFFERS, 0);
if (maxBuffers > 0 && minBuffers < maxBuffers) {
throw new ConfigurationException(HOWL_MAX_BUFFERS, "minBuffers must be <= maxBuffers");
}
int threadsWaitingForceThreshold = getInt(HOWL_THREADS_WAITING_FORCE_THRESHOLD, -1);
String logFileDir = getString(HOWL_LOG_FILE_DIR, null);
if (logFileDir == null || logFileDir.length() == 0 || !new File(logFileDir).isAbsolute()) {
throw new ConfigurationException(HOWL_LOG_FILE_DIR, "Property should be set to an absolute directory");
}
try {
transactionLog = new HOWLLog(bufferClassName,
bufferSizeKBytes,
checksumEnabled,
adler32Checksum,
flushSleepTimeMilliseconds,
logFileDir,
logFileExt,
logFileName,
maxBlocksPerFile,
maxBuffers,
maxLogFiles,
minBuffers,
threadsWaitingForceThreshold,
xidFactory != null ? xidFactory : new XidFactoryImpl(),
null);
} catch (LogConfigurationException e) {
// This should not really happen as we've checked properties earlier
throw new ConfigurationException(null, null, e);
} catch (IOException e) {
// This should not really happen as we've checked properties earlier
throw new ConfigurationException(null, null, e);
}
} else {
transactionLog = new UnrecoverableLog();
}
// Create transaction manager