X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fxmlrouter%2Fimpl%2FXMLRouter.java;h=2f4d45bae3a449e3118c50b8949a885b585a1071;hb=f8027d76e1c3e517a8b80a3476f51adee845fc5b;hp=e86593d274642c3a18500a899e4a9d4b78255103;hpb=5b4ee8d862b98d127abb04c646017c184d005838;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 e86593d..2f4d45b 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; @@ -34,7 +33,6 @@ import org.wamblee.xml.XMLDocument; import org.wamblee.xmlrouter.common.Id; 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,102 +40,52 @@ import org.wamblee.xmlrouter.publish.Gateway; import org.wamblee.xmlrouter.subscribe.Destination; import org.wamblee.xmlrouter.subscribe.DestinationRegistry; -// TODO concurrency. +// TODO check intermediate types during transformation based on filters. -public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { +/** + * The XML Router. + * + * @author Erik Brakkee + * + */ +public class XMLRouter implements 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, DocumentType> documentTypes; - private Transformations transformations; - private Map, Filter> filters; + + private XMLRouterConfiguration config; + private Map, Destination> destinations; - public XMLRouter(Clock aClock, EventListener aListener) { + public XMLRouter(Clock aClock, XMLRouterConfiguration aConfig, + EventListener aListener) { + sequenceNumbers = new AtomicLong(1); listener = aListener; clock = aClock; nextEventId = new AtomicLong(clock.currentTimeMillis()); - sequenceNumbers = new AtomicLong(1); - documentTypes = new LinkedHashMap, DocumentType>(); - transformations = new Transformations(); - filters = new LinkedHashMap, Filter>(); + config = aConfig; destinations = new LinkedHashMap, Destination>(); } - @Override - public Id addDocumentType(DocumentType aType) { - long seqno = sequenceNumbers.getAndIncrement(); - documentTypes.put(new Id(seqno), aType); - return new Id(seqno); - } - - @Override - public void removeDocumentType(Id aId) { - documentTypes.remove(aId); - } - - @Override - public Collection> getDocumentTypes() { - return Collections.unmodifiableCollection(documentTypes.keySet()); - } - - @Override - public DocumentType getDocumentType(Id aId) { - return documentTypes.get(aId); - } - - @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(); - } - - @Override - public Transformation getTransformation(Id aId) { - return transformations.getTransformation(aId); - } - - @Override - public Id addFilter(Filter aFilter) { - long seqno = sequenceNumbers.getAndIncrement(); - filters.put(new Id(seqno), aFilter); - return new Id(seqno); - } - - @Override - public void removeFilter(Id aId) { - filters.remove(aId); - } - - @Override - public Collection> getFilters() { - return Collections.unmodifiableCollection(filters.keySet()); - } - - @Override - public Filter getFilter(Id aId) { - return filters.get(aId); - } - @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(); - Id id = new Id(nextEventId.getAndIncrement()); + + Id id = new Id(nextEventId.getAndIncrement() + ""); List types = determineDocumentTypes(aEvent); EventInfo info = new EventInfo(time, aSource, id, types, aEvent); @@ -179,7 +127,7 @@ public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { boolean delivered = false; Set possibleTargetTypes = new HashSet(); - possibleTargetTypes.addAll(transformations + possibleTargetTypes.addAll(config.getTransformations() .getPossibleTargetTypes(aInputType)); // ask each destination what target types, if any they want to have. @@ -192,8 +140,8 @@ public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { if (!requested.isEmpty()) { // Deliver to the destination. for (String targetType : requested) { - TransformationPath path = transformations.getPath( - aInputType, targetType); + TransformationPath path = config.getTransformations() + .getPath(aInputType, targetType); List ts = path.getTransformations(); int i = 0; boolean allowed = true; @@ -217,7 +165,7 @@ public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { // allow the event. boolean result = destination.receive(transformed); listener.delivered(aInfo, ts, destinationId.getId(), - destination.getName(), result); + result); delivered = delivered || result; } @@ -243,7 +191,7 @@ public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { private boolean isAllowedByFilters(String aType, DOMSource aEvent) { boolean allowed = true; - for (Filter filter : filters.values()) { + for (Filter filter : config.getRouterConfig().filterConfig().values()) { if (!filter.isAllowed(aType, aEvent)) { allowed = false; } @@ -253,7 +201,8 @@ public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { private List determineDocumentTypes(DOMSource aEvent) { List res = new ArrayList(); - for (DocumentType type : documentTypes.values()) { + for (DocumentType type : config.getRouterConfig().documentTypeConfig() + .values()) { if (type.isInstance(aEvent)) { res.add(type.getName()); } @@ -261,18 +210,6 @@ public class XMLRouter implements RouterConfig, 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)); - } - private String eventToString(String aSource, DOMSource aEvent) { return "source '" + aSource + "': Event: '" + new XMLDocument(aEvent).print(true) + "'"; @@ -295,7 +232,7 @@ public class XMLRouter implements RouterConfig, Gateway, DestinationRegistry { public Id registerDestination(Destination aDestination) { notNull("destination", aDestination); long seqno = sequenceNumbers.getAndIncrement(); - Id id = new Id(seqno); + Id id = new Id(seqno + ""); destinations.put(id, new RobustDestination(id, aDestination)); return id; }