From 91782d5f15c9c12ef3b6285144eceafef61cbc33 Mon Sep 17 00:00:00 2001
From: Abhishek Raha
Date: Fri, 3 Oct 2025 16:22:36 +0530
Subject: [PATCH 1/3] Minor changes to the quickfixj-core module to reduce
unnecessary
---
.../main/java/quickfix/CachedFileStore.java | 34 +---
.../java/quickfix/CachedFileStoreFactory.java | 2 +-
.../java/quickfix/DefaultSessionFactory.java | 45 ++---
.../src/main/java/quickfix/FileLog.java | 17 +-
.../src/main/java/quickfix/FileStore.java | 25 +--
.../main/java/quickfix/MessageCracker.java | 6 +-
.../main/java/quickfix/SleepycatStore.java | 35 ++--
.../java/quickfix/mina/SessionConnector.java | 42 ++--
.../SingleThreadedEventHandlingStrategy.java | 184 +++++++++---------
.../mina/acceptor/AbstractSocketAcceptor.java | 45 ++---
.../initiator/AbstractSocketInitiator.java | 61 ++----
.../quickfix/mina/ssl/InitiatorSslFilter.java | 4 +-
12 files changed, 188 insertions(+), 312 deletions(-)
diff --git a/quickfixj-core/src/main/java/quickfix/CachedFileStore.java b/quickfixj-core/src/main/java/quickfix/CachedFileStore.java
index 8464e60d1..73167d381 100644
--- a/quickfixj-core/src/main/java/quickfix/CachedFileStore.java
+++ b/quickfixj-core/src/main/java/quickfix/CachedFileStore.java
@@ -24,26 +24,8 @@
import org.slf4j.LoggerFactory;
import quickfix.field.converter.UtcTimestampConverter;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.RandomAccessFile;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
+import java.io.*;
+import java.util.*;
/**
* File store implementation. THIS CLASS IS PUBLIC ONLY TO MAINTAIN COMPATIBILITY WITH THE QUICKFIX JNI. IT SHOULD ONLY
@@ -100,9 +82,7 @@ public class CachedFileStore implements MessageStore {
sessionFileName = prefix + "session";
final File directory = new File(msgFileName).getParentFile();
- if (!directory.exists()) {
- directory.mkdirs();
- }
+ directory.mkdirs();
initialize(false);
}
@@ -176,7 +156,7 @@ private void initializeSequenceNumbers() throws IOException {
final String s = sequenceNumberFile.readUTF();
final int offset = s.indexOf(':');
if (offset < 0) {
- throw new IOException("Invalid sequenceNumbderFile '" + seqNumFileName
+ throw new IOException("Invalid sequenceNumberFile '" + seqNumFileName
+ "' character ':' is missing");
}
cache.setNextSenderMsgSeqNum(Integer.parseInt(s.substring(0, offset)));
@@ -349,7 +329,7 @@ public boolean set(int sequence, String message) throws IOException {
final long offset = messageFileWriter.getFilePointer();
final byte[] messageBytes = message.getBytes(CharsetSupport.getCharset());
final int size = messageBytes.length;
- messageIndex.put((long) sequence, new long[] { offset, size });
+ messageIndex.put((long) sequence, new long[]{offset, size});
headerDataOutputStream.writeInt(sequence);
headerDataOutputStream.writeLong(offset);
headerDataOutputStream.writeInt(size);
@@ -488,7 +468,7 @@ private long[] seekMessageIndex(final long index) {
final long offset = headerDataInputStream.readLong();
final int size = headerDataInputStream.readInt();
if (index == sequenceNumber) {
- return new long[] { offset, size };
+ return new long[]{offset, size};
}
}
} catch (final IOException e) {
@@ -519,7 +499,7 @@ private List seekMessageIndex(final long startSequence, final long endSe
final long offset = headerDataInputStream.readLong();
final int size = headerDataInputStream.readInt();
if (sequenceNumber >= startSequence && sequenceNumber <= endSequence) {
- indexPerSequenceNumber.put(sequenceNumber, new long[] { offset, size });
+ indexPerSequenceNumber.put(sequenceNumber, new long[]{offset, size});
}
}
} catch (final IOException e) {
diff --git a/quickfixj-core/src/main/java/quickfix/CachedFileStoreFactory.java b/quickfixj-core/src/main/java/quickfix/CachedFileStoreFactory.java
index e6aa8b2ec..b6a9af022 100644
--- a/quickfixj-core/src/main/java/quickfix/CachedFileStoreFactory.java
+++ b/quickfixj-core/src/main/java/quickfix/CachedFileStoreFactory.java
@@ -21,7 +21,7 @@
/**
* Creates a message store that stores messages in a file. Compatibility note: The file formats are not compatible with
- * QF C++/JNI. If you upgrading from the QuickFIX JNI, you must delete your old session state files.)
+ * QF C++/JNI. If you're upgrading from the QuickFIX JNI, you must delete your old session state files.)
*/
public class CachedFileStoreFactory extends FileStoreFactory {
diff --git a/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java b/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java
index f131f5d4b..7d826b118 100644
--- a/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java
+++ b/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java
@@ -27,12 +27,7 @@
import quickfix.field.DefaultApplVerID;
import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
+import java.util.*;
/**
* Factory for creating sessions. Used by the communications code (acceptors,
@@ -56,7 +51,7 @@ public class DefaultSessionFactory implements SessionFactory {
private final SessionScheduleFactory sessionScheduleFactory;
public DefaultSessionFactory(Application application, MessageStoreFactory messageStoreFactory,
- LogFactory logFactory) {
+ LogFactory logFactory) {
this.application = application;
this.messageStoreFactory = messageStoreFactory;
this.messageQueueFactory = new InMemoryMessageQueueFactory();
@@ -66,7 +61,7 @@ public DefaultSessionFactory(Application application, MessageStoreFactory messag
}
public DefaultSessionFactory(Application application, MessageStoreFactory messageStoreFactory,
- LogFactory logFactory, MessageFactory messageFactory) {
+ LogFactory logFactory, MessageFactory messageFactory) {
this.application = application;
this.messageStoreFactory = messageStoreFactory;
this.messageQueueFactory = new InMemoryMessageQueueFactory();
@@ -274,7 +269,7 @@ public Session create(SessionID sessionID, SessionSettings settings) throws Conf
}
private void processPreFixtDataDictionary(SessionID sessionID, SessionSettings settings,
- DefaultDataDictionaryProvider dataDictionaryProvider) throws ConfigError,
+ DefaultDataDictionaryProvider dataDictionaryProvider) throws ConfigError,
FieldConvertError {
final DataDictionary dataDictionary = createDataDictionary(sessionID, settings,
Session.SETTING_DATA_DICTIONARY, sessionID.getBeginString());
@@ -284,7 +279,7 @@ private void processPreFixtDataDictionary(SessionID sessionID, SessionSettings s
}
private DataDictionary createDataDictionary(SessionID sessionID, SessionSettings settings,
- String settingsKey, String beginString) throws ConfigError, FieldConvertError {
+ String settingsKey, String beginString) throws ConfigError, FieldConvertError {
final String path = getDictionaryPath(sessionID, settings, settingsKey, beginString);
return getDataDictionary(path);
}
@@ -293,22 +288,22 @@ private ValidationSettings createValidationSettings(SessionID sessionID, Session
ValidationSettings validationSettings = new ValidationSettings();
validationSettings.setCheckFieldsOutOfOrder(settings.getBoolOrDefault(sessionID,
- Session.SETTING_VALIDATE_FIELDS_OUT_OF_ORDER, validationSettings.isCheckFieldsOutOfOrder()));
+ Session.SETTING_VALIDATE_FIELDS_OUT_OF_ORDER, validationSettings.isCheckFieldsOutOfOrder()));
validationSettings.setCheckFieldsHaveValues(settings.getBoolOrDefault(sessionID,
- Session.SETTING_VALIDATE_FIELDS_HAVE_VALUES, validationSettings.isCheckFieldsHaveValues()));
+ Session.SETTING_VALIDATE_FIELDS_HAVE_VALUES, validationSettings.isCheckFieldsHaveValues()));
validationSettings.setCheckUnorderedGroupFields(settings.getBoolOrDefault(sessionID,
- Session.SETTING_VALIDATE_UNORDERED_GROUP_FIELDS, validationSettings.isCheckUnorderedGroupFields()));
+ Session.SETTING_VALIDATE_UNORDERED_GROUP_FIELDS, validationSettings.isCheckUnorderedGroupFields()));
validationSettings.setCheckUserDefinedFields(settings.getBoolOrDefault(sessionID,
- Session.SETTING_VALIDATE_USER_DEFINED_FIELDS, validationSettings.isCheckUserDefinedFields()));
+ Session.SETTING_VALIDATE_USER_DEFINED_FIELDS, validationSettings.isCheckUserDefinedFields()));
validationSettings.setAllowUnknownMessageFields(settings.getBoolOrDefault(sessionID,
- Session.SETTING_ALLOW_UNKNOWN_MSG_FIELDS, validationSettings.isAllowUnknownMessageFields()));
+ Session.SETTING_ALLOW_UNKNOWN_MSG_FIELDS, validationSettings.isAllowUnknownMessageFields()));
validationSettings.setFirstFieldInGroupIsDelimiter(settings.getBoolOrDefault(sessionID,
- Session.SETTING_FIRST_FIELD_IN_GROUP_IS_DELIMITER, validationSettings.isFirstFieldInGroupIsDelimiter()));
+ Session.SETTING_FIRST_FIELD_IN_GROUP_IS_DELIMITER, validationSettings.isFirstFieldInGroupIsDelimiter()));
validateValidationSettings(validationSettings);
@@ -323,7 +318,7 @@ private void validateValidationSettings(ValidationSettings validationSettings) {
}
private void processFixtDataDictionaries(SessionID sessionID, SessionSettings settings,
- DefaultDataDictionaryProvider dataDictionaryProvider) throws ConfigError,
+ DefaultDataDictionaryProvider dataDictionaryProvider) throws ConfigError,
FieldConvertError {
dataDictionaryProvider.addTransportDictionary(
sessionID.getBeginString(),
@@ -373,7 +368,7 @@ private boolean isApplVerIdEnum(String value) {
}
private String getDictionaryPath(SessionID sessionID, SessionSettings settings,
- String settingsKey, String beginString) throws ConfigError, FieldConvertError {
+ String settingsKey, String beginString) throws ConfigError, FieldConvertError {
String path;
if (settings.isSetting(sessionID, settingsKey)) {
path = settings.getString(sessionID, settingsKey);
@@ -410,7 +405,7 @@ private int[] getLogonIntervalsInSeconds(SessionSettings settings, SessionID ses
throw new ConfigError(e);
}
}
- return new int[] { 5 }; // default value
+ return new int[]{5}; // default value
}
private Set getInetAddresses(SessionSettings settings, SessionID sessionID)
@@ -428,26 +423,26 @@ private Set getInetAddresses(SessionSettings settings, SessionID se
}
private boolean getSetting(SessionSettings settings, SessionID sessionID, String key,
- boolean defaultValue) throws ConfigError, FieldConvertError {
+ boolean defaultValue) throws ConfigError, FieldConvertError {
return settings.isSetting(sessionID, key) ? settings.getBool(sessionID, key) : defaultValue;
}
private int getSetting(SessionSettings settings, SessionID sessionID, String key,
- int defaultValue) throws ConfigError, FieldConvertError {
+ int defaultValue) throws ConfigError, FieldConvertError {
return settings.isSetting(sessionID, key)
? (int) settings.getLong(sessionID, key)
: defaultValue;
}
private double getSetting(SessionSettings settings, SessionID sessionID, String key,
- double defaultValue) throws ConfigError, FieldConvertError {
+ double defaultValue) throws ConfigError, FieldConvertError {
return settings.isSetting(sessionID, key)
? Double.parseDouble(settings.getString(sessionID, key))
: defaultValue;
}
private UtcTimestampPrecision getTimestampPrecision(SessionSettings settings, SessionID sessionID,
- UtcTimestampPrecision defaultValue) throws ConfigError, FieldConvertError {
+ UtcTimestampPrecision defaultValue) throws ConfigError, FieldConvertError {
if (settings.isSetting(sessionID, Session.SETTING_TIMESTAMP_PRECISION)) {
String string = settings.getString(sessionID, Session.SETTING_TIMESTAMP_PRECISION);
try {
@@ -462,13 +457,13 @@ private UtcTimestampPrecision getTimestampPrecision(SessionSettings settings, Se
private List getLogonTags(SessionSettings settings, SessionID sessionID) throws ConfigError, FieldConvertError {
List logonTags = new ArrayList<>();
- for (int index = 0;; index++) {
+ for (int index = 0; ; index++) {
final String logonTagSetting = Session.SETTING_LOGON_TAG
+ (index == 0 ? "" : NumbersCache.get(index));
if (settings.isSetting(sessionID, logonTagSetting)) {
String tag = settings.getString(sessionID, logonTagSetting);
String[] split = tag.split("=", 2);
- StringField stringField = new StringField(Integer.valueOf(split[0]), split[1]);
+ StringField stringField = new StringField(Integer.parseInt(split[0]), split[1]);
logonTags.add(stringField);
} else {
break;
diff --git a/quickfixj-core/src/main/java/quickfix/FileLog.java b/quickfixj-core/src/main/java/quickfix/FileLog.java
index ecd84fe5a..396069099 100644
--- a/quickfixj-core/src/main/java/quickfix/FileLog.java
+++ b/quickfixj-core/src/main/java/quickfix/FileLog.java
@@ -19,17 +19,11 @@
package quickfix;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-
import org.quickfixj.CharsetSupport;
-
import quickfix.field.converter.UtcTimestampConverter;
+import java.io.*;
+
/**
* File log implementation. THIS CLASS IS PUBLIC ONLY TO MAINTAIN COMPATIBILITY
* WITH THE QUICKFIX JNI. IT SHOULD ONLY BE CREATED USING A FACTORY.
@@ -69,9 +63,8 @@ public class FileLog extends AbstractLog {
eventFileName = prefix + "event.log";
File directory = new File(messagesFileName).getParentFile();
- if (!directory.exists()) {
- directory.mkdirs();
- }
+ directory.mkdirs();
+
this.includeMillis = includeMillis;
this.includeTimestampForMessages = includeTimestampForMessages;
@@ -94,7 +87,7 @@ protected void logOutgoing(String message) {
private void writeMessage(FileOutputStream stream, Object lock, String message, boolean forceTimestamp) {
try {
- synchronized(lock) {
+ synchronized (lock) {
if (forceTimestamp || includeTimestampForMessages) {
writeTimeStamp(stream);
}
diff --git a/quickfixj-core/src/main/java/quickfix/FileStore.java b/quickfixj-core/src/main/java/quickfix/FileStore.java
index 4cf6a5127..37e93afd9 100644
--- a/quickfixj-core/src/main/java/quickfix/FileStore.java
+++ b/quickfixj-core/src/main/java/quickfix/FileStore.java
@@ -22,23 +22,8 @@
import org.quickfixj.CharsetSupport;
import quickfix.field.converter.UtcTimestampConverter;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.Closeable;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TreeMap;
+import java.io.*;
+import java.util.*;
/**
* File store implementation. THIS CLASS IS PUBLIC ONLY TO MAINTAIN
@@ -88,9 +73,7 @@ public class FileStore implements MessageStore, Closeable {
sessionFileName = prefix + "session";
final File directory = new File(msgFileName).getParentFile();
- if (!directory.exists()) {
- directory.mkdirs();
- }
+ directory.mkdirs();
initialize(false);
}
@@ -203,7 +186,7 @@ private void updateMessageIndex(long sequenceNum, long offset, int size) {
messageIndex.pollFirstEntry();
}
- messageIndex.put(sequenceNum, new long[] { offset, size });
+ messageIndex.put(sequenceNum, new long[]{offset, size});
}
/**
diff --git a/quickfixj-core/src/main/java/quickfix/MessageCracker.java b/quickfixj-core/src/main/java/quickfix/MessageCracker.java
index 28b65dac1..685a4f7fe 100644
--- a/quickfixj-core/src/main/java/quickfix/MessageCracker.java
+++ b/quickfixj-core/src/main/java/quickfix/MessageCracker.java
@@ -41,7 +41,7 @@ public class MessageCracker {
public @interface Handler {
}
- public class RedundantHandlerException extends RuntimeException {
+ public static class RedundantHandlerException extends RuntimeException {
private final Class> messageClass;
private final Method originalMethod;
private final Method redundantMethod;
@@ -55,7 +55,7 @@ public RedundantHandlerException(Class> messageClass, Method originalMethod,
@Override
public String toString() {
- return "Duplicate handler method for " + messageClass + ", orginal method is "
+ return "Duplicate handler method for " + messageClass + ", original method is "
+ originalMethod + ", redundant method is " + redundantMethod;
}
}
@@ -97,7 +97,7 @@ private boolean matchesConventionOrAnnotation(Method method) {
return method.getName().equals("onMessage") || method.isAnnotationPresent(Handler.class);
}
- private class Invoker {
+ private static class Invoker {
private final Object target;
private final Method method;
diff --git a/quickfixj-core/src/main/java/quickfix/SleepycatStore.java b/quickfixj-core/src/main/java/quickfix/SleepycatStore.java
index 3fddd79f5..ce307d7b9 100644
--- a/quickfixj-core/src/main/java/quickfix/SleepycatStore.java
+++ b/quickfixj-core/src/main/java/quickfix/SleepycatStore.java
@@ -19,30 +19,21 @@
package quickfix;
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+import com.sleepycat.je.*;
+import org.quickfixj.CharsetSupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
-import org.quickfixj.CharsetSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.sleepycat.bind.EntryBinding;
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import com.sleepycat.je.Cursor;
-import com.sleepycat.je.Database;
-import com.sleepycat.je.DatabaseConfig;
-import com.sleepycat.je.DatabaseEntry;
-import com.sleepycat.je.DatabaseException;
-import com.sleepycat.je.Environment;
-import com.sleepycat.je.EnvironmentConfig;
-import com.sleepycat.je.LockMode;
-import com.sleepycat.je.OperationStatus;
-
/**
* Sleepycat message and session state storage. This could be creating
* using the Sleepycat store factory.
@@ -211,7 +202,7 @@ public synchronized void get(int startSequence, int endSequence, Collection sequenceBinding = TupleBinding.getPrimitiveBinding(Integer.class);
// Must start at start-1 because db will look for next record larger
sequenceBinding.objectToEntry(startSequence - 1, sequenceKey);
@@ -223,7 +214,7 @@ public synchronized void get(int startSequence, int endSequence, Collection sequenceBinding = TupleBinding.getPrimitiveBinding(Integer.class);
sequenceBinding.objectToEntry(sequence, sequenceKey);
DatabaseEntry messageBytes = new DatabaseEntry(message.getBytes(CharsetSupport.getCharset()));
messageDatabase.put(null, sequenceKey, messageBytes);
diff --git a/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java b/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java
index 675387a6e..670b71e94 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java
@@ -20,39 +20,19 @@
package quickfix.mina;
import org.apache.mina.core.filterchain.IoFilterChainBuilder;
+import org.apache.mina.core.future.CloseFuture;
+import org.apache.mina.core.service.IoService;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import quickfix.ConfigError;
-import quickfix.Connector;
-import quickfix.ExecutorFactory;
-import quickfix.FieldConvertError;
-import quickfix.Session;
-import quickfix.SessionFactory;
-import quickfix.SessionID;
-import quickfix.SessionSettings;
+import quickfix.*;
import quickfix.field.converter.IntConverter;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.ConcurrentHashMap;
-import org.apache.mina.core.future.CloseFuture;
-import org.apache.mina.core.service.IoService;
+import java.util.*;
+import java.util.concurrent.*;
/**
* An abstract base class for acceptors and initiators. Provides support for common functionality and also serves as an
@@ -98,7 +78,7 @@ public SessionConnector(SessionSettings settings, SessionFactory sessionFactory)
* If using external Executors, this method should be called immediately after the constructor. Once set, the
* Executors cannot be changed.
*
- *
+ *
* @param executorFactory See {@link ExecutorFactory} for detailed requirements.
*/
public void setExecutorFactory(ExecutorFactory executorFactory) {
@@ -296,7 +276,7 @@ protected void waitForLogout() {
}
protected void logError(SessionID sessionID, IoSession protocolSession, String message, Throwable t) {
- log.error(message + getLogSuffix(sessionID, protocolSession), t);
+ log.error("{}{}", message, getLogSuffix(sessionID, protocolSession), t);
}
private String getLogSuffix(SessionID sessionID, IoSession protocolSession) {
@@ -329,7 +309,7 @@ protected void stopSessionTimer() {
// visible for testing
boolean checkSessionTimerRunning() {
- if ( sessionTimerFuture != null ) {
+ if (sessionTimerFuture != null) {
return !sessionTimerFuture.isDone();
}
return false;
@@ -433,13 +413,13 @@ public void setIoFilterChainBuilder(IoFilterChainBuilder ioFilterChainBuilder) {
protected IoFilterChainBuilder getIoFilterChainBuilder() {
return ioFilterChainBuilder;
}
-
+
/**
* Closes all managed sessions of an Initiator/Acceptor.
*
- * @param ioService Acceptor or Initiator implementation
+ * @param ioService Acceptor or Initiator implementation
* @param awaitTermination whether to wait for underlying ExecutorService to terminate
- * @param logger used for logging WARNING when IoSession could not be closed
+ * @param logger used for logging WARNING when IoSession could not be closed
*/
public static void closeManagedSessionsAndDispose(IoService ioService, boolean awaitTermination, Logger logger) {
Map managedSessions = ioService.getManagedSessions();
diff --git a/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java b/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java
index 4d34d5ca9..8ddd36a29 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java
@@ -24,11 +24,7 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
import static quickfix.mina.QueueTrackers.newDefaultQueueTracker;
import static quickfix.mina.QueueTrackers.newMultiSessionWatermarkTracker;
@@ -215,95 +211,95 @@ public int getQueueSize(SessionID sessionID) {
return getQueueSize();
}
- /**
- * A stand-in for the Thread class that delegates to an Executor.
- * Implements all the API required by pre-existing QFJ code.
- */
- static final class ThreadAdapter {
-
- private final Executor executor;
- private final RunnableWrapper wrapper;
-
- ThreadAdapter(Runnable command, String name, Executor executor) {
- wrapper = new RunnableWrapper(command, name);
- this.executor = executor != null ? executor : new DedicatedThreadExecutor(name);
- }
-
- public void join() throws InterruptedException {
- wrapper.join();
- }
-
- public void setDaemon(boolean b) {
- /* No-Op. Already set for DedicatedThreadExecutor. Not relevant for externally supplied Executors. */
- }
-
- public boolean isAlive() {
- return wrapper.isAlive();
- }
-
- public void start() {
- executor.execute(wrapper);
- }
-
- /**
- * Provides the Thread::join and Thread::isAlive semantics on the nested Runnable.
- */
- static final class RunnableWrapper implements Runnable {
-
- private final CountDownLatch latch = new CountDownLatch(1);
- private final Runnable command;
- private final String name;
-
- public RunnableWrapper(Runnable command, String name) {
- this.command = command;
- this.name = name;
- }
-
- @Override
- public void run() {
- Thread currentThread = Thread.currentThread();
- String threadName = currentThread.getName();
- try {
- if (!name.equals(threadName)) {
- currentThread.setName(name + " (" + threadName + ")");
- }
- command.run();
- } finally {
- latch.countDown();
- currentThread.setName(threadName);
- }
- }
+ /**
+ * A stand-in for the Thread class that delegates to an Executor.
+ * Implements all the API required by pre-existing QFJ code.
+ */
+ static final class ThreadAdapter {
+
+ private final Executor executor;
+ private final RunnableWrapper wrapper;
+
+ ThreadAdapter(Runnable command, String name, Executor executor) {
+ wrapper = new RunnableWrapper(command, name);
+ this.executor = executor != null ? executor : new DedicatedThreadExecutor(name);
+ }
+
+ public void join() throws InterruptedException {
+ wrapper.join();
+ }
+
+ public void setDaemon(boolean b) {
+ /* No-Op. Already set for DedicatedThreadExecutor. Not relevant for externally supplied Executors. */
+ }
+
+ public boolean isAlive() {
+ return wrapper.isAlive();
+ }
+
+ public void start() {
+ executor.execute(wrapper);
+ }
+
+ /**
+ * Provides the Thread::join and Thread::isAlive semantics on the nested Runnable.
+ */
+ static final class RunnableWrapper implements Runnable {
+
+ private final CountDownLatch latch = new CountDownLatch(1);
+ private final Runnable command;
+ private final String name;
+
+ public RunnableWrapper(Runnable command, String name) {
+ this.command = command;
+ this.name = name;
+ }
- public void join() throws InterruptedException {
- latch.await();
- }
-
- public boolean isAlive() {
- return latch.getCount() > 0;
- }
- }
-
- /**
- * An Executor that uses its own dedicated Thread.
- * Provides equivalent behavior to the prior non-Executor approach.
- */
- static final class DedicatedThreadExecutor implements Executor {
-
- private final String name;
- private Thread thread;
-
- DedicatedThreadExecutor(String name) {
- this.name = name;
- }
-
- @Override
- public void execute(Runnable command) {
- thread = new Thread(command, name);
- thread.setDaemon(true);
- thread.start();
- }
- }
-
- }
+ @Override
+ public void run() {
+ Thread currentThread = Thread.currentThread();
+ String threadName = currentThread.getName();
+ try {
+ if (!name.equals(threadName)) {
+ currentThread.setName(name + " (" + threadName + ")");
+ }
+ command.run();
+ } finally {
+ latch.countDown();
+ currentThread.setName(threadName);
+ }
+ }
+
+ public void join() throws InterruptedException {
+ latch.await();
+ }
+
+ public boolean isAlive() {
+ return latch.getCount() > 0;
+ }
+ }
+
+ /**
+ * An Executor that uses its own dedicated Thread.
+ * Provides equivalent behavior to the prior non-Executor approach.
+ */
+ static final class DedicatedThreadExecutor implements Executor {
+
+ private final String name;
+ private Thread thread;
+
+ DedicatedThreadExecutor(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public void execute(Runnable command) {
+ thread = new Thread(command, name);
+ thread.setDaemon(true);
+ thread.start();
+ }
+ }
+
+ }
}
diff --git a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
index f9f418b5d..3939670af 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
@@ -24,26 +24,8 @@
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.ssl.SslFilter;
-import quickfix.Acceptor;
-import quickfix.Application;
-import quickfix.ConfigError;
-import quickfix.DefaultSessionFactory;
-import quickfix.FieldConvertError;
-import quickfix.LogFactory;
-import quickfix.LogUtil;
-import quickfix.MessageFactory;
-import quickfix.MessageStoreFactory;
-import quickfix.RuntimeError;
-import quickfix.ScreenLogFactory;
-import quickfix.Session;
-import quickfix.SessionFactory;
-import quickfix.SessionID;
-import quickfix.SessionSettings;
-import quickfix.mina.CompositeIoFilterChainBuilder;
-import quickfix.mina.EventHandlingStrategy;
-import quickfix.mina.NetworkingOptions;
-import quickfix.mina.ProtocolFactory;
-import quickfix.mina.SessionConnector;
+import quickfix.*;
+import quickfix.mina.*;
import quickfix.mina.message.FIXProtocolCodecFactory;
import quickfix.mina.ssl.SSLConfig;
import quickfix.mina.ssl.SSLContextFactory;
@@ -53,11 +35,7 @@
import java.io.IOException;
import java.net.SocketAddress;
import java.security.GeneralSecurityException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -81,13 +59,15 @@ protected AbstractSocketAcceptor(SessionSettings settings, SessionFactory sessio
protected AbstractSocketAcceptor(Application application,
MessageStoreFactory messageStoreFactory, SessionSettings settings,
MessageFactory messageFactory) throws ConfigError {
+ MessageStoreFactory messageStoreFactory, SessionSettings settings,
+ MessageFactory messageFactory) throws ConfigError {
this(application, messageStoreFactory, settings, new ScreenLogFactory(settings),
messageFactory);
}
protected AbstractSocketAcceptor(Application application,
- MessageStoreFactory messageStoreFactory, SessionSettings settings,
- LogFactory logFactory, MessageFactory messageFactory) throws ConfigError {
+ MessageStoreFactory messageStoreFactory, SessionSettings settings,
+ LogFactory logFactory, MessageFactory messageFactory) throws ConfigError {
this(settings, new DefaultSessionFactory(application, messageStoreFactory, logFactory,
messageFactory));
}
@@ -122,7 +102,7 @@ protected synchronized void startAcceptingConnections() throws ConfigError {
if (continueInitOnError) {
log.warn("error during session initialization for session(s) {}, continuing...", socketDescriptor.getAcceptedSessions().keySet(), e);
} else {
- log.error("Cannot start acceptor session for {}, error: {}", address, e);
+ log.error("Cannot start acceptor session for {}, error: ", address, e);
throw new RuntimeError(e);
}
}
@@ -130,7 +110,7 @@ protected synchronized void startAcceptingConnections() throws ConfigError {
}
private void installSSL(AcceptorSocketDescriptor descriptor,
- CompositeIoFilterChainBuilder ioFilterChainBuilder) throws GeneralSecurityException {
+ CompositeIoFilterChainBuilder ioFilterChainBuilder) throws GeneralSecurityException {
log.info("Installing SSL filter for {}", descriptor.getAddress());
SSLConfig sslConfig = descriptor.getSslConfig();
SSLContext sslContext = SSLContextFactory.getInstance(sslConfig);
@@ -214,7 +194,7 @@ && getSettings().getBool(sessionID, SSLSupport.SETTING_USE_SSL)) {
descriptor.acceptSession(session);
allSessions.put(sessionID, session);
}
-
+
if (acceptTransportType != ProtocolFactory.SOCKET
&& getSettings().getBoolOrDefault(sessionID, SSLSupport.SETTING_USE_SSL, false)) {
LogUtil.logWarning(sessionID, "SSL is only supported for transport type SOCKET and will not be enabled for transport type=" + acceptTransportType);
@@ -227,7 +207,7 @@ private boolean equals(Object object1, Object object2) {
private void createSessions(SessionSettings settings, boolean continueInitOnError) throws ConfigError {
Map allSessions = new HashMap<>();
- for (Iterator i = settings.sectionIterator(); i.hasNext();) {
+ for (Iterator i = settings.sectionIterator(); i.hasNext(); ) {
SessionID sessionID = i.next();
try {
String connectionType = null;
@@ -345,9 +325,10 @@ public int getQueueSize() {
return ehs == null ? 0 : ehs.getQueueSize();
}
- protected abstract EventHandlingStrategy getEventHandlingStrategy() ;
+ protected abstract EventHandlingStrategy getEventHandlingStrategy();
private class DefaultAcceptorSessionProvider implements AcceptorSessionProvider {
+ private static class DefaultAcceptorSessionProvider implements AcceptorSessionProvider {
private final Map acceptorSessions;
diff --git a/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java b/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java
index e276d4b8b..aac309970 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java
@@ -23,19 +23,7 @@
import org.apache.mina.core.buffer.SimpleBufferAllocator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import quickfix.Application;
-import quickfix.ConfigError;
-import quickfix.DefaultSessionFactory;
-import quickfix.FieldConvertError;
-import quickfix.Initiator;
-import quickfix.LogFactory;
-import quickfix.LogUtil;
-import quickfix.MessageFactory;
-import quickfix.MessageStoreFactory;
-import quickfix.Session;
-import quickfix.SessionFactory;
-import quickfix.SessionID;
-import quickfix.SessionSettings;
+import quickfix.*;
import quickfix.field.converter.BooleanConverter;
import quickfix.mina.EventHandlingStrategy;
import quickfix.mina.NetworkingOptions;
@@ -45,17 +33,8 @@
import quickfix.mina.ssl.SSLSupport;
import java.net.SocketAddress;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.*;
+import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -69,8 +48,8 @@ public abstract class AbstractSocketInitiator extends SessionConnector implement
public static final String QFJ_RECONNECT_THREAD_PREFIX = "QFJ Reconnect Thread-";
protected AbstractSocketInitiator(Application application,
- MessageStoreFactory messageStoreFactory, SessionSettings settings,
- LogFactory logFactory, MessageFactory messageFactory) throws ConfigError {
+ MessageStoreFactory messageStoreFactory, SessionSettings settings,
+ LogFactory logFactory, MessageFactory messageFactory) throws ConfigError {
this(settings, new DefaultSessionFactory(application, messageStoreFactory, logFactory,
messageFactory));
}
@@ -81,8 +60,8 @@ protected AbstractSocketInitiator(SessionSettings settings, SessionFactory sessi
}
protected AbstractSocketInitiator(Application application,
- MessageStoreFactory messageStoreFactory, SessionSettings settings,
- LogFactory logFactory, MessageFactory messageFactory, int numReconnectThreads) throws ConfigError {
+ MessageStoreFactory messageStoreFactory, SessionSettings settings,
+ LogFactory logFactory, MessageFactory messageFactory, int numReconnectThreads) throws ConfigError {
this(settings, new DefaultSessionFactory(application, messageStoreFactory, logFactory,
messageFactory), numReconnectThreads);
}
@@ -114,7 +93,7 @@ protected void createSessionInitiators()
}
private void createInitiator(final Session session, final boolean continueInitOnError) throws ConfigError, FieldConvertError {
-
+
SessionSettings settings = getSettings();
final SessionID sessionID = session.getSessionID();
final int[] reconnectingIntervals = getReconnectIntervalInSeconds(sessionID);
@@ -216,7 +195,7 @@ private SocketAddress getLocalAddress(SessionSettings settings, final Session se
private void createSessions(boolean continueInitOnError) throws ConfigError, FieldConvertError {
final SessionSettings settings = getSettings();
final Map initiatorSessions = new HashMap<>();
- for (final Iterator i = settings.sectionIterator(); i.hasNext();) {
+ for (final Iterator i = settings.sectionIterator(); i.hasNext(); ) {
final SessionID sessionID = i.next();
if (isInitiatorSession(sessionID)) {
try {
@@ -236,7 +215,7 @@ private void createSessions(boolean continueInitOnError) throws ConfigError, Fie
}
setSessions(initiatorSessions);
}
-
+
public void createDynamicSession(SessionID sessionID) throws ConfigError {
try {
@@ -263,20 +242,18 @@ private int[] getReconnectIntervalInSeconds(SessionID sessionID) throws ConfigEr
throw new ConfigError(e);
}
}
- return new int[] { 30 };
+ return new int[]{30};
}
private SocketAddress[] getSocketAddresses(SessionID sessionID) throws ConfigError {
final SessionSettings settings = getSettings();
final ArrayList addresses = new ArrayList<>();
- for (int index = 0;; index++) {
+ for (int index = 0; ; index++) {
try {
- final String protocolKey = Initiator.SETTING_SOCKET_CONNECT_PROTOCOL
- + (index == 0 ? "" : Integer.toString(index));
- final String hostKey = Initiator.SETTING_SOCKET_CONNECT_HOST
- + (index == 0 ? "" : Integer.toString(index));
- final String portKey = Initiator.SETTING_SOCKET_CONNECT_PORT
- + (index == 0 ? "" : Integer.toString(index));
+ final String keySuffix = index == 0 ? "" : Integer.toString(index);
+ final String protocolKey = Initiator.SETTING_SOCKET_CONNECT_PROTOCOL + keySuffix;
+ final String hostKey = Initiator.SETTING_SOCKET_CONNECT_HOST + keySuffix;
+ final String portKey = Initiator.SETTING_SOCKET_CONNECT_PORT + keySuffix;
int transportType = ProtocolFactory.SOCKET;
if (settings.isSetting(sessionID, protocolKey)) {
try {
@@ -325,7 +302,7 @@ protected void startInitiators() {
}
protected void stopInitiators() {
- for (Iterator iterator = initiators.iterator(); iterator.hasNext();) {
+ for (Iterator iterator = initiators.iterator(); iterator.hasNext(); ) {
iterator.next().stop();
iterator.remove();
}
@@ -342,8 +319,8 @@ public int getQueueSize() {
}
protected abstract EventHandlingStrategy getEventHandlingStrategy();
-
-
+
+
private static class QFScheduledReconnectThreadFactory implements ThreadFactory {
private static final AtomicInteger COUNTER = new AtomicInteger(1);
diff --git a/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java b/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java
index 7c4e5b438..d7bf56a7c 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java
@@ -8,7 +8,7 @@
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;
import java.net.InetSocketAddress;
-import java.util.Arrays;
+import java.util.Collections;
public final class InitiatorSslFilter extends SslFilter {
@@ -53,7 +53,7 @@ protected SSLEngine createEngine(IoSession session, InetSocketAddress addr) {
if (sniHostName != null) {
SSLParameters sslParameters = sslEngine.getSSLParameters();
- sslParameters.setServerNames(Arrays.asList(new SNIHostName(sniHostName)));
+ sslParameters.setServerNames(Collections.singletonList(new SNIHostName(sniHostName)));
sslEngine.setSSLParameters(sslParameters);
}
From 3aa2197e6fcc6d18a9b9c24a53280026ec89ebe3 Mon Sep 17 00:00:00 2001
From: Abhishek Raha
Date: Fri, 3 Oct 2025 16:23:59 +0530
Subject: [PATCH 2/3] Minor changes to the quickfixj-core module to reduce
unnecessary
---
.../java/quickfix/mina/acceptor/AbstractSocketAcceptor.java | 3 ---
1 file changed, 3 deletions(-)
diff --git a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
index 3939670af..1c6269d19 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
@@ -57,8 +57,6 @@ protected AbstractSocketAcceptor(SessionSettings settings, SessionFactory sessio
}
protected AbstractSocketAcceptor(Application application,
- MessageStoreFactory messageStoreFactory, SessionSettings settings,
- MessageFactory messageFactory) throws ConfigError {
MessageStoreFactory messageStoreFactory, SessionSettings settings,
MessageFactory messageFactory) throws ConfigError {
this(application, messageStoreFactory, settings, new ScreenLogFactory(settings),
@@ -327,7 +325,6 @@ public int getQueueSize() {
protected abstract EventHandlingStrategy getEventHandlingStrategy();
- private class DefaultAcceptorSessionProvider implements AcceptorSessionProvider {
private static class DefaultAcceptorSessionProvider implements AcceptorSessionProvider {
private final Map acceptorSessions;
From 08df24911f08c267400c3e67b5d8a2b864119d2a Mon Sep 17 00:00:00 2001
From: Abhishek Raha
Date: Sat, 4 Oct 2025 22:33:38 +0530
Subject: [PATCH 3/3] reverted import changes as per review comments
---
.../main/java/quickfix/CachedFileStore.java | 22 ++++++++++++--
.../java/quickfix/DefaultSessionFactory.java | 7 ++++-
.../src/main/java/quickfix/FileLog.java | 10 +++++--
.../src/main/java/quickfix/FileStore.java | 19 ++++++++++--
.../main/java/quickfix/SleepycatStore.java | 27 +++++++++++------
.../java/quickfix/mina/SessionConnector.java | 30 +++++++++++++++----
.../SingleThreadedEventHandlingStrategy.java | 6 +++-
.../mina/acceptor/AbstractSocketAcceptor.java | 28 +++++++++++++++--
.../initiator/AbstractSocketInitiator.java | 27 +++++++++++++++--
9 files changed, 148 insertions(+), 28 deletions(-)
diff --git a/quickfixj-core/src/main/java/quickfix/CachedFileStore.java b/quickfixj-core/src/main/java/quickfix/CachedFileStore.java
index 73167d381..164a14421 100644
--- a/quickfixj-core/src/main/java/quickfix/CachedFileStore.java
+++ b/quickfixj-core/src/main/java/quickfix/CachedFileStore.java
@@ -24,8 +24,26 @@
import org.slf4j.LoggerFactory;
import quickfix.field.converter.UtcTimestampConverter;
-import java.io.*;
-import java.util.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
/**
* File store implementation. THIS CLASS IS PUBLIC ONLY TO MAINTAIN COMPATIBILITY WITH THE QUICKFIX JNI. IT SHOULD ONLY
diff --git a/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java b/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java
index 7d826b118..f38d36e11 100644
--- a/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java
+++ b/quickfixj-core/src/main/java/quickfix/DefaultSessionFactory.java
@@ -27,7 +27,12 @@
import quickfix.field.DefaultApplVerID;
import java.net.InetAddress;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
/**
* Factory for creating sessions. Used by the communications code (acceptors,
diff --git a/quickfixj-core/src/main/java/quickfix/FileLog.java b/quickfixj-core/src/main/java/quickfix/FileLog.java
index 396069099..41db4c16e 100644
--- a/quickfixj-core/src/main/java/quickfix/FileLog.java
+++ b/quickfixj-core/src/main/java/quickfix/FileLog.java
@@ -19,10 +19,16 @@
package quickfix;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+
import org.quickfixj.CharsetSupport;
-import quickfix.field.converter.UtcTimestampConverter;
-import java.io.*;
+import quickfix.field.converter.UtcTimestampConverter;
/**
* File log implementation. THIS CLASS IS PUBLIC ONLY TO MAINTAIN COMPATIBILITY
diff --git a/quickfixj-core/src/main/java/quickfix/FileStore.java b/quickfixj-core/src/main/java/quickfix/FileStore.java
index 37e93afd9..808e30b9b 100644
--- a/quickfixj-core/src/main/java/quickfix/FileStore.java
+++ b/quickfixj-core/src/main/java/quickfix/FileStore.java
@@ -22,8 +22,23 @@
import org.quickfixj.CharsetSupport;
import quickfix.field.converter.UtcTimestampConverter;
-import java.io.*;
-import java.util.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.Closeable;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.TreeMap;
/**
* File store implementation. THIS CLASS IS PUBLIC ONLY TO MAINTAIN
diff --git a/quickfixj-core/src/main/java/quickfix/SleepycatStore.java b/quickfixj-core/src/main/java/quickfix/SleepycatStore.java
index ce307d7b9..f9c0dcf4c 100644
--- a/quickfixj-core/src/main/java/quickfix/SleepycatStore.java
+++ b/quickfixj-core/src/main/java/quickfix/SleepycatStore.java
@@ -19,21 +19,30 @@
package quickfix;
-import com.sleepycat.bind.EntryBinding;
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import com.sleepycat.je.*;
-import org.quickfixj.CharsetSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
+import org.quickfixj.CharsetSupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+
/**
* Sleepycat message and session state storage. This could be creating
* using the Sleepycat store factory.
diff --git a/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java b/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java
index 670b71e94..bc7a45105 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/SessionConnector.java
@@ -20,19 +20,39 @@
package quickfix.mina;
import org.apache.mina.core.filterchain.IoFilterChainBuilder;
-import org.apache.mina.core.future.CloseFuture;
-import org.apache.mina.core.service.IoService;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import quickfix.*;
+import quickfix.ConfigError;
+import quickfix.Connector;
+import quickfix.ExecutorFactory;
+import quickfix.FieldConvertError;
+import quickfix.Session;
+import quickfix.SessionFactory;
+import quickfix.SessionID;
+import quickfix.SessionSettings;
import quickfix.field.converter.IntConverter;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
-import java.util.*;
-import java.util.concurrent.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.mina.core.future.CloseFuture;
+import org.apache.mina.core.service.IoService;
/**
* An abstract base class for acceptors and initiators. Provides support for common functionality and also serves as an
diff --git a/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java b/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java
index 8ddd36a29..9c933d17b 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/SingleThreadedEventHandlingStrategy.java
@@ -24,7 +24,11 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.*;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
import static quickfix.mina.QueueTrackers.newDefaultQueueTracker;
import static quickfix.mina.QueueTrackers.newMultiSessionWatermarkTracker;
diff --git a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
index 1c6269d19..5e094c646 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java
@@ -24,8 +24,26 @@
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.ssl.SslFilter;
-import quickfix.*;
-import quickfix.mina.*;
+import quickfix.Acceptor;
+import quickfix.Application;
+import quickfix.ConfigError;
+import quickfix.DefaultSessionFactory;
+import quickfix.FieldConvertError;
+import quickfix.LogFactory;
+import quickfix.LogUtil;
+import quickfix.MessageFactory;
+import quickfix.MessageStoreFactory;
+import quickfix.RuntimeError;
+import quickfix.ScreenLogFactory;
+import quickfix.Session;
+import quickfix.SessionFactory;
+import quickfix.SessionID;
+import quickfix.SessionSettings;
+import quickfix.mina.CompositeIoFilterChainBuilder;
+import quickfix.mina.EventHandlingStrategy;
+import quickfix.mina.NetworkingOptions;
+import quickfix.mina.ProtocolFactory;
+import quickfix.mina.SessionConnector;
import quickfix.mina.message.FIXProtocolCodecFactory;
import quickfix.mina.ssl.SSLConfig;
import quickfix.mina.ssl.SSLContextFactory;
@@ -35,7 +53,11 @@
import java.io.IOException;
import java.net.SocketAddress;
import java.security.GeneralSecurityException;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
diff --git a/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java b/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java
index aac309970..96c7975c7 100644
--- a/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java
+++ b/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java
@@ -23,7 +23,19 @@
import org.apache.mina.core.buffer.SimpleBufferAllocator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import quickfix.*;
+import quickfix.Application;
+import quickfix.ConfigError;
+import quickfix.DefaultSessionFactory;
+import quickfix.FieldConvertError;
+import quickfix.Initiator;
+import quickfix.LogFactory;
+import quickfix.LogUtil;
+import quickfix.MessageFactory;
+import quickfix.MessageStoreFactory;
+import quickfix.Session;
+import quickfix.SessionFactory;
+import quickfix.SessionID;
+import quickfix.SessionSettings;
import quickfix.field.converter.BooleanConverter;
import quickfix.mina.EventHandlingStrategy;
import quickfix.mina.NetworkingOptions;
@@ -33,8 +45,17 @@
import quickfix.mina.ssl.SSLSupport;
import java.net.SocketAddress;
-import java.util.*;
-import java.util.concurrent.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
/**