X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fxmlrouter%2Fimpl%2FXMLRouter.java;h=ca0637b43353708b0c0b9410e5eda9577ef861d5;hb=b3f837bff31337a9a7cb6abeb22c5a981be39b51;hp=6b460d1dea203495d7ef258afec33c75e86c71ab;hpb=20807d81708bd33b3b5a4616fadcf3ae91bf9508;p=xmlrouter 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 6b460d1..ca0637b 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouter.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouter.java @@ -17,7 +17,6 @@ package org.wamblee.xmlrouter.impl; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -35,6 +34,7 @@ import org.wamblee.xmlrouter.common.Id; import org.wamblee.xmlrouter.config.Config; import org.wamblee.xmlrouter.config.DocumentType; import org.wamblee.xmlrouter.config.Filter; +import org.wamblee.xmlrouter.config.RouterConfig; import org.wamblee.xmlrouter.config.Transformation; import org.wamblee.xmlrouter.listener.EventInfo; import org.wamblee.xmlrouter.listener.EventListener; @@ -42,86 +42,62 @@ import org.wamblee.xmlrouter.publish.Gateway; import org.wamblee.xmlrouter.subscribe.Destination; import org.wamblee.xmlrouter.subscribe.DestinationRegistry; -// TODO concurrency. - -public class XMLRouter implements Config, Gateway, DestinationRegistry { +/** + * The XML Router. + * + * @author Erik Brakkee + * + */ +public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { private static final Logger LOGGER = Logger.getLogger(XMLRouter.class .getName()); + private AtomicLong sequenceNumbers; private EventListener listener; private Clock clock; private AtomicLong nextEventId; - private AtomicLong sequenceNumbers; - private Map documentTypes; - private Transformations transformations; - private Map filters; - private Map destinations; + + private ExtendedRouterConfig routerConfig; + private TransformationPaths transformations; + + private Map, Destination> destinations; public XMLRouter(Clock aClock, EventListener aListener) { + sequenceNumbers = new AtomicLong(1); listener = aListener; clock = aClock; nextEventId = new AtomicLong(clock.currentTimeMillis()); - sequenceNumbers = new AtomicLong(1); - documentTypes = new LinkedHashMap(); - transformations = new Transformations(); - filters = new LinkedHashMap(); - destinations = new LinkedHashMap(); - } - - @Override - public Id addDocumentType(DocumentType aType) { - long seqno = sequenceNumbers.getAndIncrement(); - documentTypes.put(seqno, aType); - return new Id(seqno); - } - - @Override - public void removeDocumentType(Id aId) { - documentTypes.remove(aId); - } - - @Override - public Collection getDocumentTypes() { - return Collections.unmodifiableCollection(documentTypes.values()); - } - - @Override - public Id addTransformation(Transformation aTransformation) { - return transformations.addTransformation(aTransformation); - } - - @Override - public void removeTransformation(Id aId) { - transformations.removeTransformation(aId); - } - - @Override - public Collection getTransformations() { - return transformations.getTransformations(); + routerConfig = new SingleRouterConfig(sequenceNumbers); + transformations = new TransformationPaths(); + destinations = new LinkedHashMap, Destination>(); } @Override - public Id addFilter(Filter aFilter) { - long seqno = sequenceNumbers.getAndIncrement(); - filters.put(seqno, aFilter); - return new Id(seqno); + public Config documentTypeConfig() { + return routerConfig.documentTypeConfig(); } @Override - public void removeFilter(Id aId) { - filters.remove(aId); + public Config transformationConfig() { + return routerConfig.transformationConfig(); } @Override - public Collection getFilters() { - return Collections.unmodifiableCollection(filters.values()); + public Config filterConfig() { + return routerConfig.filterConfig(); } @Override public void publish(String aSource, DOMSource aEvent) { - long time = clock.currentTimeMillis(); + + if (routerConfig.isDirty()) { + transformations.replaceTransformations(routerConfig + .transformationConfig().map()); + routerConfig.resetDirty(); + } + Id id = new Id(nextEventId.getAndIncrement()); List types = determineDocumentTypes(aEvent); EventInfo info = new EventInfo(time, aSource, id, types, aEvent); @@ -168,8 +144,9 @@ public class XMLRouter implements Config, Gateway, DestinationRegistry { .getPossibleTargetTypes(aInputType)); // ask each destination what target types, if any they want to have. - for (Map.Entry entry : destinations.entrySet()) { - long destinationId = entry.getKey(); + for (Map.Entry, Destination> entry : destinations + .entrySet()) { + Id destinationId = entry.getKey(); Destination destination = entry.getValue(); Collection requested = destination .chooseFromTargetTypes(possibleTargetTypes); @@ -200,7 +177,7 @@ public class XMLRouter implements Config, Gateway, DestinationRegistry { // all transformations done and all filters still // allow the event. boolean result = destination.receive(transformed); - listener.delivered(aInfo, ts, destinationId, + listener.delivered(aInfo, ts, destinationId.getId(), destination.getName(), result); delivered = delivered || result; @@ -227,7 +204,7 @@ public class XMLRouter implements Config, Gateway, DestinationRegistry { private boolean isAllowedByFilters(String aType, DOMSource aEvent) { boolean allowed = true; - for (Filter filter : filters.values()) { + for (Filter filter : routerConfig.filterConfig().map().values()) { if (!filter.isAllowed(aType, aEvent)) { allowed = false; } @@ -237,7 +214,8 @@ public class XMLRouter implements Config, Gateway, DestinationRegistry { private List determineDocumentTypes(DOMSource aEvent) { List res = new ArrayList(); - for (DocumentType type : documentTypes.values()) { + for (DocumentType type : routerConfig.documentTypeConfig().map() + .values()) { if (type.isInstance(aEvent)) { res.add(type.getName()); } @@ -245,13 +223,6 @@ public class XMLRouter implements Config, Gateway, DestinationRegistry { return res; } - private void logEvent(String aMessage, String aSource, DOMSource aEvent, - Exception aException) { - LOGGER.log(Level.WARNING, aMessage + ": source '" + aSource + - "': Event: '" + new XMLDocument(aEvent).print(true) + "'", - aException); - } - private void logEvent(String aMessage, String aSource, DOMSource aEvent) { LOGGER.log(Level.WARNING, aMessage + ": " + eventToString(aSource, aEvent)); @@ -280,13 +251,13 @@ public class XMLRouter implements Config, Gateway, DestinationRegistry { notNull("destination", aDestination); long seqno = sequenceNumbers.getAndIncrement(); Id id = new Id(seqno); - destinations.put(seqno, new RobustDestination(id, aDestination)); + destinations.put(id, new RobustDestination(id, aDestination)); return id; } @Override public void unregisterDestination(Id aId) { - destinations.remove(aId.getId()); + destinations.remove(aId); } private void notNull(String aName, Object aValue) {