diff --git a/quickfixj-core/src/main/java/quickfix/SessionSettings.java b/quickfixj-core/src/main/java/quickfix/SessionSettings.java index 3765c35c1f..de52063503 100644 --- a/quickfixj-core/src/main/java/quickfix/SessionSettings.java +++ b/quickfixj-core/src/main/java/quickfix/SessionSettings.java @@ -877,4 +877,22 @@ public static Set parseRemoteAddresses(String raw) { return result; } + public void removeSection(final SessionID sessionID) throws ConfigError { + Properties properties = getSessionProperties(sessionID); + + if (properties == null) { + throw new ConfigError("Session not found"); + } + sections.remove(sessionID); + } + + public void removeSection(final String propertyKey, final String propertyValue) throws ConfigError { + SessionID sessionIdToRemove = sections.entrySet().stream() + .filter(entry -> propertyValue.equals(entry.getValue().get(propertyKey))) + .map(Map.Entry::getKey) + .findFirst() + .orElseThrow(() -> new ConfigError("Session not found")); + + sections.remove(sessionIdToRemove); + } } diff --git a/quickfixj-core/src/test/java/quickfix/SessionSettingsTest.java b/quickfixj-core/src/test/java/quickfix/SessionSettingsTest.java index 2de5d1ad10..19f468b85a 100644 --- a/quickfixj-core/src/test/java/quickfix/SessionSettingsTest.java +++ b/quickfixj-core/src/test/java/quickfix/SessionSettingsTest.java @@ -31,6 +31,7 @@ import java.util.Iterator; import java.util.Properties; import java.util.Set; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.HashMap; @@ -610,6 +611,51 @@ public void testConcurrentAccess() throws ConfigError, InterruptedException { assertTrue(testHasPassed.get()); } + @Test + public void testRemoveSectionBySessionID() throws ConfigError { + final Map defaultSettings = createDefaultSettings(); + + final Map pricingSection = createPricingSection(); + final SessionID pricingSessionID = new SessionID("FIX.4.2:FOOBAR_PRICING->*"); + + final Map tradingSection = createTradingSection(); + final SessionID tradingSessionID = new SessionID("FIX.4.2:FOOBAR_TRADING->*"); + + final SessionSettings sessionSettings = new SessionSettings(); + sessionSettings.set(new Dictionary(null, defaultSettings)); + sessionSettings.set(pricingSessionID, new Dictionary("sessions", pricingSection)); + sessionSettings.set(tradingSessionID, new Dictionary("sessions", tradingSection)); + + while (sessionSettings.sectionIterator().hasNext()) { + SessionID sessionID = sessionSettings.sectionIterator().next(); + sessionSettings.removeSection(sessionID); + } + + assertFalse(sessionSettings.sectionIterator().hasNext()); + } + + @Test + public void testRemoveSectionByPropertyKey() throws ConfigError { + final Map defaultSettings = createDefaultSettings(); + + final Map tradingSection = createTradingSection(); + final SessionID tradingSessionID = new SessionID("FIX.4.2:FOOBAR_TRADING->*"); + + final SessionSettings sessionSettings = new SessionSettings(); + sessionSettings.set(new Dictionary(null, defaultSettings)); + sessionSettings.set(tradingSessionID, new Dictionary("sessions", tradingSection)); + + sessionSettings.removeSection("SocketAcceptPort", "7566"); + + Set expectedSessionIdSet = new HashSet<>(); + while (sessionSettings.sectionIterator().hasNext()) { + SessionID sessionID = sessionSettings.sectionIterator().next(); + expectedSessionIdSet.add(sessionID); + } + + assertFalse(expectedSessionIdSet.contains(tradingSessionID)); + } + private Map createTradingSection() { final Map tradingSection = new HashMap<>(); tradingSection.put("PersistMessages","Y");