From: Erik Brakkee Date: Tue, 9 Aug 2011 12:15:33 +0000 (+0200) Subject: simplified the XMLRouterConfiguration API. It is now much simpler and still atomic. X-Git-Tag: PAX_EXAM_MOCKITO_ISSUE~10 X-Git-Url: http://wamblee.org/gitweb/?a=commitdiff_plain;h=537cfb1a832b99e2c0a55b4634cd2a42f7fbcc09;p=xmlrouter simplified the XMLRouterConfiguration API. It is now much simpler and still atomic. --- diff --git a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouter.java b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouter.java index 2f4d45b..09bbdc1 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouter.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouter.java @@ -29,6 +29,7 @@ import java.util.logging.Logger; import javax.xml.transform.dom.DOMSource; import org.wamblee.general.Clock; +import org.wamblee.general.Pair; import org.wamblee.xml.XMLDocument; import org.wamblee.xmlrouter.common.Id; import org.wamblee.xmlrouter.config.DocumentType; @@ -74,26 +75,22 @@ public class XMLRouter implements Gateway, DestinationRegistry { @Override public void publish(String aSource, DOMSource aEvent) { - config.startPublishEvent(); - try { - publishImpl(aSource, aEvent); - } finally { - config.endPublishEvent(); - } - } - - private void publishImpl(String aSource, DOMSource aEvent) { long time = clock.currentTimeMillis(); + Pair snapshotconfig = config + .getConfig(); + Id id = new Id(nextEventId.getAndIncrement() + ""); - List types = determineDocumentTypes(aEvent); + List types = determineDocumentTypes(snapshotconfig.getFirst() + .documentTypeConfig().values(), aEvent); EventInfo info = new EventInfo(time, aSource, id, types, aEvent); boolean delivered = false; try { List filteredInputTypes = determineFilteredInputTypes( - types, aEvent); + snapshotconfig.getFirst().filterConfig().values(), types, + aEvent); if (filteredInputTypes.isEmpty()) { if (LOGGER.isLoggable(Level.FINE)) { String doc = new XMLDocument(aEvent).print(true); @@ -112,7 +109,9 @@ public class XMLRouter implements Gateway, DestinationRegistry { // This is however certainly not the main case. for (String inputType : filteredInputTypes) { - boolean result = deliverEvent(info, inputType); + boolean result = deliverEvent(snapshotconfig.getFirst() + .filterConfig().values(), snapshotconfig.getSecond(), info, + inputType); delivered = delivered || result; } } finally { @@ -123,11 +122,12 @@ public class XMLRouter implements Gateway, DestinationRegistry { } } - private boolean deliverEvent(EventInfo aInfo, String aInputType) { + private boolean deliverEvent(Collection aFilters, + TransformationPaths aTransformations, EventInfo aInfo, String aInputType) { boolean delivered = false; Set possibleTargetTypes = new HashSet(); - possibleTargetTypes.addAll(config.getTransformations() + possibleTargetTypes.addAll(aTransformations .getPossibleTargetTypes(aInputType)); // ask each destination what target types, if any they want to have. @@ -140,8 +140,8 @@ public class XMLRouter implements Gateway, DestinationRegistry { if (!requested.isEmpty()) { // Deliver to the destination. for (String targetType : requested) { - TransformationPath path = config.getTransformations() - .getPath(aInputType, targetType); + TransformationPath path = aTransformations.getPath( + aInputType, targetType); List ts = path.getTransformations(); int i = 0; boolean allowed = true; @@ -155,7 +155,8 @@ public class XMLRouter implements Gateway, DestinationRegistry { aInfo.getEvent(), aInputType, t, orig); } - if (!isAllowedByFilters(t.getToType(), transformed)) { + if (!isAllowedByFilters(aFilters, t.getToType(), + transformed)) { allowed = false; } i++; @@ -175,13 +176,13 @@ public class XMLRouter implements Gateway, DestinationRegistry { return delivered; } - private List determineFilteredInputTypes(List aTypes, - DOMSource aEvent) { + private List determineFilteredInputTypes( + Collection aFilters, List aTypes, DOMSource aEvent) { // apply filters to the input List filteredTypes = new ArrayList(); for (String type : aTypes) { - boolean allowed = isAllowedByFilters(type, aEvent); + boolean allowed = isAllowedByFilters(aFilters, type, aEvent); if (allowed) { filteredTypes.add(type); } @@ -189,9 +190,10 @@ public class XMLRouter implements Gateway, DestinationRegistry { return filteredTypes; } - private boolean isAllowedByFilters(String aType, DOMSource aEvent) { + private boolean isAllowedByFilters(Collection aFilters, + String aType, DOMSource aEvent) { boolean allowed = true; - for (Filter filter : config.getRouterConfig().filterConfig().values()) { + for (Filter filter : aFilters) { if (!filter.isAllowed(aType, aEvent)) { allowed = false; } @@ -199,10 +201,10 @@ public class XMLRouter implements Gateway, DestinationRegistry { return allowed; } - private List determineDocumentTypes(DOMSource aEvent) { + private List determineDocumentTypes( + Collection aTypes, DOMSource aEvent) { List res = new ArrayList(); - for (DocumentType type : config.getRouterConfig().documentTypeConfig() - .values()) { + for (DocumentType type : aTypes) { if (type.isInstance(aEvent)) { res.add(type.getName()); } diff --git a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfiguration.java b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfiguration.java index a57a845..600aac3 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfiguration.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfiguration.java @@ -15,6 +15,8 @@ */ package org.wamblee.xmlrouter.impl; +import org.wamblee.general.Pair; + /** * The XML Router configuration contains both configuration data as well as * derived data used by the XML router. It is important that all this data is @@ -27,27 +29,13 @@ package org.wamblee.xmlrouter.impl; public interface XMLRouterConfiguration { /** - * To be called before the configuration is used. Corresponds to read lock - * acquire. - */ - void startPublishEvent(); - - /** - * @return Configuration data. {@link #startPublishEvent()} must have been - * called before doing this. - */ - ExtendedRouterConfig getRouterConfig(); - - /** - * @return Transformation paths (derived data). - */ - TransformationPaths getTransformations(); - - /** - * To be called after the configuration is used. Corresponds to read lock - * release. + * Atomically get the configuration. The XMLRouter uses this to get a + * snapshot of the configuration data for handling a single message. In this + * way a consistent configuration is used for each event. + * + * @return Configuration. */ - void endPublishEvent(); + Pair getConfig(); /** * Atomically sets the configuration and updates derived data. There will be diff --git a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java index 679e55d..7a91576 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java @@ -18,6 +18,7 @@ package org.wamblee.xmlrouter.impl; import java.util.ArrayList; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.wamblee.general.Pair; import org.wamblee.xmlrouter.common.Id; import org.wamblee.xmlrouter.config.RouterConfig; @@ -49,18 +50,14 @@ public class XMLRouterConfigurationImpl implements XMLRouterConfiguration { } @Override - public void startPublishEvent() { + public Pair getConfig() { rlock.lock(); - } - - @Override - public void endPublishEvent() { - rlock.unlock(); - } - - @Override - public ExtendedRouterConfig getRouterConfig() { - return config; + try { + return new Pair(config, + transformations); + } finally { + rlock.unlock(); + } } @Override @@ -77,9 +74,4 @@ public class XMLRouterConfigurationImpl implements XMLRouterConfiguration { wlock.unlock(); } } - - @Override - public TransformationPaths getTransformations() { - return transformations; - } }