First version after introduction of meaningful ids and Identifiable interface.
authorErik Brakkee <erik@brakkee.org>
Mon, 1 Aug 2011 20:14:40 +0000 (22:14 +0200)
committerErik Brakkee <erik@brakkee.org>
Mon, 1 Aug 2011 20:14:40 +0000 (22:14 +0200)
Now more testing.

35 files changed:
common/src/main/java/org/wamblee/xmlrouter/common/Id.java
common/src/test/java/org/wamblee/xmlrouter/common/IdTest.java
config/src/main/java/org/wamblee/xmlrouter/config/Config.java
config/src/main/java/org/wamblee/xmlrouter/config/DocumentType.java
config/src/main/java/org/wamblee/xmlrouter/config/Filter.java
config/src/main/java/org/wamblee/xmlrouter/config/Identifiable.java [new file with mode: 0644]
config/src/main/java/org/wamblee/xmlrouter/config/RouterConfig.java
config/src/main/java/org/wamblee/xmlrouter/config/RouterConfigService.java
config/src/main/java/org/wamblee/xmlrouter/config/Transformation.java
impl/src/main/java/org/wamblee/xmlrouter/impl/CompositeConfig.java
impl/src/main/java/org/wamblee/xmlrouter/impl/CompositeRouterConfig.java
impl/src/main/java/org/wamblee/xmlrouter/impl/ConfigImpl.java
impl/src/main/java/org/wamblee/xmlrouter/impl/Constants.java
impl/src/main/java/org/wamblee/xmlrouter/impl/RobustDocumentType.java
impl/src/main/java/org/wamblee/xmlrouter/impl/RobustFilter.java
impl/src/main/java/org/wamblee/xmlrouter/impl/RobustIdentifiable.java [new file with mode: 0644]
impl/src/main/java/org/wamblee/xmlrouter/impl/RobustTransformation.java
impl/src/main/java/org/wamblee/xmlrouter/impl/SingleRouterConfig.java
impl/src/main/java/org/wamblee/xmlrouter/impl/TransformationPaths.java
impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouter.java
impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigService.java
impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java
impl/src/test/java/org/wamblee/xmlrouter/impl/ConfigImplTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/RobustDestinationTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/RobustDocumentTypeTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/RobustFilterTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/RobustTransformationTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/SingleRouterConfigTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/TransformationPathsTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/XMLRouterFunctionTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/XMLRouterTest.java
listener/src/main/java/org/wamblee/xmlrouter/listener/CompositeEventListener.java
listener/src/main/java/org/wamblee/xmlrouter/listener/EventListener.java
listener/src/main/java/org/wamblee/xmlrouter/listener/LoggingEventListener.java
listener/src/test/java/org/wamblee/xmlrouter/listener/CompositeEventListenerTest.java

index f057b416ee8572570b018fd83594fa40869ffd63..1d31c8bab25115da24949ae4383326681a17f3d2 100644 (file)
@@ -25,28 +25,33 @@ package org.wamblee.xmlrouter.common;
  */
 public class Id<T> implements Comparable<Id<T>> {
 
-    private long id;
+    private String id;
 
     /**
      * Constructs the id.
      * 
      * @param aId
      *            Integer id.
+     * @throws NullPointerException
+     *             in case the id is null.
      */
-    public Id(long aId) {
+    public Id(String aId) {
+        if (aId == null) {
+            throw new NullPointerException("id is null");
+        }
         id = aId;
     }
 
     /**
      * @return The underlying id.
      */
-    public long getId() {
+    public String getId() {
         return id;
     }
 
     @Override
     public int hashCode() {
-        return ((Long) id).hashCode();
+        return id.hashCode();
     }
 
     @Override
@@ -62,11 +67,11 @@ public class Id<T> implements Comparable<Id<T>> {
 
     @Override
     public String toString() {
-        return id + "";
+        return id;
     }
 
     @Override
     public int compareTo(Id<T> aId) {
-        return ((Long) id).compareTo((Long) aId.getId());
+        return id.compareTo(aId.getId());
     }
 }
index 183d885f2fdd8eb05c9d842000adfbec8a739aa1..5f8f444a284a04dfa75181d617fc8ea2ca83229f 100644 (file)
@@ -23,23 +23,28 @@ public class IdTest {
 
     @Test
     public void testGetSet() {
-        Id<IdTest> id = new Id<IdTest>(100L);
-        assertEquals(100L, id.getId());
+        Id<IdTest> id = new Id<IdTest>("hello");
+        assertEquals("hello", id.getId());
     }
 
     @Test
     public void testEqualsHashCodeCompare() {
-        Id<IdTest> id1 = new Id<IdTest>(100L);
-        Id<IdTest> id2 = new Id<IdTest>(200L);
-        Id<IdTest> id3 = new Id<IdTest>(100L);
+        Id<IdTest> id1 = new Id<IdTest>("a");
+        Id<IdTest> id2 = new Id<IdTest>("b");
+        Id<IdTest> id3 = new Id<IdTest>("a");
         assertEquals(id1, id3);
         assertFalse(id1.equals(id2));
         assertFalse(id1.equals(null));
-        assertFalse(id1.equals("hello"));
+        assertFalse(id1.equals("a"));
         assertEquals(id1.hashCode(), id3.hashCode());
 
         assertTrue(id1.compareTo(id2) < 0);
         assertTrue(id2.compareTo(id1) > 0);
         assertEquals(0, id1.compareTo(id3));
     }
+
+    @Test(expected = NullPointerException.class)
+    public void testNullNotAccepted() {
+        Id<IdTest> id = new Id<IdTest>(null);
+    }
 }
index 263b0b66bfe7c0fbad9087dc6c8b2de21462cbdd..39ecfaefe0c179ab3a5aecc13fecbf94f356a661 100644 (file)
@@ -15,7 +15,7 @@
  */
 package org.wamblee.xmlrouter.config;
 
-import java.util.Map;
+import java.util.List;
 
 import org.wamblee.xmlrouter.common.Id;
 
@@ -28,16 +28,15 @@ import org.wamblee.xmlrouter.common.Id;
  * @param <T>
  *            Type for which ids are generated.
  */
-public interface Config<T> {
+public interface Config<T> extends Identifiable<Config> {
 
     /**
-     * Adds a item
+     * Adds an item. No item with the same id may exist.
      * 
      * @param aT
      *            item
-     * @return Unique id.
      */
-    Id<T> add(T aT);
+    void add(T aT);
 
     /**
      * Removes the item with a given id.
@@ -49,7 +48,7 @@ public interface Config<T> {
     boolean remove(Id<T> aId);
 
     /**
-     * @return All available ids.
+     * @return All available items.
      */
-    Map<Id<T>, T> map();
+    List<T> values();
 }
\ No newline at end of file
index 4ffc5f83bdc07e1a74c6e4dc86d629a97019c7a4..d4d12efdc64f6644a00ac217d40c03fcd31cab34 100644 (file)
@@ -24,7 +24,7 @@ import javax.xml.transform.dom.DOMSource;
  * @author Erik Brakkee
  * 
  */
-public interface DocumentType {
+public interface DocumentType extends Identifiable<DocumentType> {
 
     /**
      * Symbolic name for the document type.
index 212c65f90162b0f5ae0507b6c278c7ca5d3ab694..7e2ea6cc5ea58cb8b4e7fe26c41880d0c069a0bd 100644 (file)
@@ -24,7 +24,7 @@ import javax.xml.transform.dom.DOMSource;
  * @author Erik Brakkee
  * 
  */
-public interface Filter {
+public interface Filter extends Identifiable<Filter> {
 
     /**
      * Determines if a given document will be processed or not.
diff --git a/config/src/main/java/org/wamblee/xmlrouter/config/Identifiable.java b/config/src/main/java/org/wamblee/xmlrouter/config/Identifiable.java
new file mode 100644 (file)
index 0000000..dc1f993
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2005-2011 the original author or authors.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.wamblee.xmlrouter.config;
+
+import org.wamblee.xmlrouter.common.Id;
+
+/**
+ * Classes implementing this interface must provide a unique id to identify
+ * their contents and behavior. If the content or behavior of an object changes,
+ * then a different id should be returned. Conversely, it is required for the id
+ * to keep as constant as possible. Also, a given object should return the same
+ * id throughout its lifecycle (from the moment it's {@link #getId()} method is
+ * called until the moment it can no longer be referenced.
+ * 
+ * @author Erik Brakkee
+ * 
+ */
+public interface Identifiable<T> {
+
+    /**
+     * Returns the unique id for the object.
+     * 
+     * @return Unique id.
+     */
+    Id<T> getId();
+}
index 57ddae740cc78a438190733c9242ca550b9f27ed..14622508f06e6fc65303c6b45a3465f0f3c89418 100644 (file)
@@ -20,7 +20,7 @@ package org.wamblee.xmlrouter.config;
  * 
  * @author Erik Brakkee
  */
-public interface RouterConfig {
+public interface RouterConfig extends Identifiable<RouterConfig> {
 
     /**
      * @return Document types.
index baefd944799cf3e31d1adcd60bbd84722a3db405..5fc7f2ed827373966cf6cc29cdea8cd5df4b9e2f 100644 (file)
@@ -40,7 +40,7 @@ public interface RouterConfigService {
      *            configuration.
      * @return Id of the applied configuration.
      */
-    Id<RouterConfig> apply(RouterConfig aConfig, Id<RouterConfig> aOldConfig);
+    void apply(RouterConfig aConfig, Id<RouterConfig> aOldConfig);
 
     /**
      * Clears the configuration for a given id.
index 9f200845dcbe5811a661072a13c40d27bf7303c7..9867392d7340acd029b847caff271fdaf6d71ee1 100644 (file)
@@ -23,12 +23,7 @@ import javax.xml.transform.dom.DOMSource;
  * @author Erik Brakkee
  * 
  */
-public interface Transformation {
-
-    /**
-     * @return Name for the transformation.
-     */
-    String getName();
+public interface Transformation extends Identifiable<Transformation> {
 
     /**
      * From type that can be transformed.
index b378052c207b05015b78d427870070c733e7dcbf..5166315e7640504643c80307c42ea782a0902a9c 100644 (file)
  */
 package org.wamblee.xmlrouter.impl;
 
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Config;
 
 public class CompositeConfig<T> implements ExtendedConfig<T> {
 
-    private Map<Id<T>, T> configs;
+    private Id<Config> id;
+    private List<T> configs;
 
-    public CompositeConfig() {
-        configs = new LinkedHashMap<Id<T>, T>();
+    public CompositeConfig(Id<Config> aId) {
+        id = aId;
+        configs = new ArrayList<T>();
+    }
+
+    @Override
+    public Id<Config> getId() {
+        // TODO test id.
+        return id;
     }
 
     public void add(Config<T> aConfig) {
-        for (Id<T> id : aConfig.map().keySet()) {
-            configs.put(id, aConfig.map().get(id));
+        // TODO check duplicate config.
+        for (T item : aConfig.values()) {
+            configs.add(item);
         }
     }
 
     @Override
-    public Map<Id<T>, T> map() {
+    public List<T> values() {
         return configs;
     }
 
@@ -46,13 +55,12 @@ public class CompositeConfig<T> implements ExtendedConfig<T> {
         return false;
     }
 
-    private void notSupported() {
-        throw new RuntimeException("readonly instance");
-    }
-
     @Override
-    public Id<T> add(T aT) {
+    public void add(T aT) {
         notSupported();
-        return null;
+    }
+
+    private void notSupported() {
+        throw new RuntimeException("readonly instance");
     }
 }
index 5ba6571aee1d302d1e655e280552733c197d202f..2b40e58a2e3ca2d7558a5cf2aaac538d7df5dfb0 100644 (file)
@@ -17,22 +17,29 @@ package org.wamblee.xmlrouter.impl;
 
 import java.util.Collection;
 
+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;
 
+// TODO test this class.
 public class CompositeRouterConfig implements ExtendedRouterConfig {
 
+    private Id<RouterConfig> id;
     private CompositeConfig<DocumentType> documentTypes;
     private CompositeConfig<Transformation> transformations;
     private CompositeConfig<Filter> filters;
 
-    public CompositeRouterConfig(Collection<RouterConfig> aConfigs) {
-        documentTypes = new CompositeConfig<DocumentType>();
-        transformations = new CompositeConfig<Transformation>();
-        filters = new CompositeConfig<Filter>();
+    public CompositeRouterConfig(Id<RouterConfig> aId,
+        Collection<RouterConfig> aConfigs) {
+        id = aId;
+        documentTypes = new CompositeConfig<DocumentType>(new Id<Config>(
+            "documentTypes"));
+        transformations = new CompositeConfig<Transformation>(new Id<Config>(
+            "transformations"));
+        filters = new CompositeConfig<Filter>(new Id<Config>("filters"));
         for (RouterConfig config : aConfigs) {
             documentTypes.add(config.documentTypeConfig());
             transformations.add(config.transformationConfig());
@@ -40,6 +47,13 @@ public class CompositeRouterConfig implements ExtendedRouterConfig {
         }
     }
 
+    // TODO test id.
+
+    @Override
+    public Id<RouterConfig> getId() {
+        return id;
+    }
+
     @Override
     public Config<DocumentType> documentTypeConfig() {
         return documentTypes;
index e29725e8655d2be5ad4fab667d4152dca68e37e8..c561e364b287958a169a90eb611baa58769ed3fc 100644 (file)
  */
 package org.wamblee.xmlrouter.impl;
 
+import java.util.ArrayList;
 import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
+import java.util.Iterator;
+import java.util.List;
 
 import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Config;
+import org.wamblee.xmlrouter.config.Identifiable;
 
 /**
  * Default implementation of the {@link Config} interface.
@@ -30,19 +31,24 @@ import org.wamblee.xmlrouter.config.Config;
  * 
  * @param <T>
  */
-public abstract class ConfigImpl<T> implements ExtendedConfig<T> {
+public abstract class ConfigImpl<T extends Identifiable> implements
+    ExtendedConfig<T> {
 
-    private boolean dirty;
-    private AtomicLong next;
-    private Map<Id<T>, T> registered;
+    private Id<Config> id;
+    private List<T> registered;
 
     /**
      * Constructs the object.
      */
-    public ConfigImpl(AtomicLong aNext) {
-        dirty = false;
-        next = aNext;
-        registered = new LinkedHashMap<Id<T>, T>();
+    public ConfigImpl(Id<Config> aId) {
+        // TODO test for null.
+        id = aId;
+        registered = new ArrayList<T>();
+    }
+
+    @Override
+    public Id<Config> getId() {
+        return id;
     }
 
     /*
@@ -51,25 +57,20 @@ public abstract class ConfigImpl<T> implements ExtendedConfig<T> {
      * @see org.wamblee.xmlrouter.config.Config#add(T)
      */
     @Override
-    public synchronized Id<T> add(T aT) {
+    public synchronized void add(T aT) {
+        // TODO test duplicate ids.
         notNull(aT);
-        long seqno = next.incrementAndGet();
-        Id<T> id = new Id<T>(seqno);
-        registered.put(id, wrap(id, aT));
-        dirty = true;
-        return id;
+        registered.add(wrap(aT));
     }
 
     /**
      * This is called to wrap the given object by a safer version.
      * 
-     * @param aId
-     *            Id.
      * @param aT
      *            Object to wrap.
      * @return Wrapped object.
      */
-    public abstract T wrap(Id<T> aId, T aT);
+    public abstract T wrap(T aT);
 
     /*
      * (non-Javadoc)
@@ -81,13 +82,20 @@ public abstract class ConfigImpl<T> implements ExtendedConfig<T> {
     @Override
     public synchronized boolean remove(Id<T> aId) {
         notNull(aId);
-        dirty = true;
-        return registered.remove(aId) != null;
+        Iterator<T> i = registered.iterator();
+        while (i.hasNext()) {
+            T t = i.next();
+            if (t.getId().equals(aId)) {
+                i.remove();
+                return true;
+            }
+        }
+        return false;
     }
 
     @Override
-    public Map<Id<T>, T> map() {
-        return Collections.unmodifiableMap(registered);
+    public List<T> values() {
+        return Collections.unmodifiableList(registered);
     }
 
     private void notNull(T aT) {
index c51c1155ebabf6750b4489b2ec9d9a73035788b8..3b181a85fcf52527b28bcab626591e12ceb2da64 100644 (file)
@@ -22,5 +22,5 @@ package org.wamblee.xmlrouter.impl;
  * 
  */
 public enum Constants {
-    UNKNOWN_DOCUMENT_TYPE, UNKNOWN_DESTINATION_NAME, UNKNOWN_NAME
+    UNKNOWN_DOCUMENT_TYPE, UNKNOWN_DESTINATION_NAME, UNKNOWN_NAME, UNKNOWN_ID
 }
index 34664e848188e3636f92171738018822e0135857..52244837dda20bcc70de5513c7c87be487a59857 100644 (file)
@@ -20,7 +20,6 @@ import java.util.logging.Logger;
 
 import javax.xml.transform.dom.DOMSource;
 
-import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.DocumentType;
 
 /**
@@ -30,12 +29,12 @@ import org.wamblee.xmlrouter.config.DocumentType;
  * @author Erik Brakkee
  * 
  */
-public class RobustDocumentType implements DocumentType {
+public class RobustDocumentType extends RobustIdentifiable<DocumentType>
+    implements DocumentType {
 
     private static final Logger LOGGER = Logger
         .getLogger(RobustDocumentType.class.getName());
 
-    private Id<DocumentType> id;
     private DocumentType type;
 
     /**
@@ -46,8 +45,8 @@ public class RobustDocumentType implements DocumentType {
      * @param aType
      *            Document type to wrap.
      */
-    public RobustDocumentType(Id<DocumentType> aId, DocumentType aType) {
-        id = aId;
+    public RobustDocumentType(DocumentType aType) {
+        super(aType);
         type = aType;
     }
 
@@ -56,13 +55,13 @@ public class RobustDocumentType implements DocumentType {
         try {
             String name = type.getName();
             if (name == null) {
-                LOGGER.log(Level.WARNING, "Document type " + id +
+                LOGGER.log(Level.WARNING, "Document type " + getId() +
                     " returned null for name");
                 return Constants.UNKNOWN_DOCUMENT_TYPE.toString();
             }
             return name;
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Document type " + id +
+            LOGGER.log(Level.WARNING, "Document type " + getId() +
                 " threw exception", e);
             return Constants.UNKNOWN_DOCUMENT_TYPE.toString();
         }
@@ -73,7 +72,7 @@ public class RobustDocumentType implements DocumentType {
         try {
             return type.isInstance(aSource);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Document type " + id +
+            LOGGER.log(Level.WARNING, "Document type " + getId() +
                 " threw exception", e);
             return false;
         }
@@ -84,7 +83,7 @@ public class RobustDocumentType implements DocumentType {
         try {
             return type.validate(aSource);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Document type " + id +
+            LOGGER.log(Level.WARNING, "Document type " + getId() +
                 " threw exception", e);
             return false;
         }
index 4bf4cf2393bf94eca6a6d13c5294c2db5545edb0..056690a39e00178f96ca07a20ecdf806a22fad56 100644 (file)
@@ -20,7 +20,6 @@ import java.util.logging.Logger;
 
 import javax.xml.transform.dom.DOMSource;
 
-import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Filter;
 
 /**
@@ -29,12 +28,11 @@ import org.wamblee.xmlrouter.config.Filter;
  * @author Erik Brakkee
  * 
  */
-public class RobustFilter implements Filter {
+public class RobustFilter extends RobustIdentifiable<Filter> implements Filter {
 
     private static final Logger LOGGER = Logger.getLogger(RobustFilter.class
         .getName());
 
-    private Id<Filter> id;
     private Filter filter;
 
     /**
@@ -45,8 +43,8 @@ public class RobustFilter implements Filter {
      * @param aFilter
      *            Filter to wrap.
      */
-    public RobustFilter(Id<Filter> aId, Filter aFilter) {
-        id = aId;
+    public RobustFilter(Filter aFilter) {
+        super(aFilter);
         filter = aFilter;
     }
 
@@ -55,7 +53,7 @@ public class RobustFilter implements Filter {
         try {
             return filter.isAllowed(aDocumentType, aSource);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Filter " + id +
+            LOGGER.log(Level.WARNING, "Filter " + getId() +
                 " threw exception, assuming filter returns true", e);
             return true;
         }
diff --git a/impl/src/main/java/org/wamblee/xmlrouter/impl/RobustIdentifiable.java b/impl/src/main/java/org/wamblee/xmlrouter/impl/RobustIdentifiable.java
new file mode 100644 (file)
index 0000000..f3da5f4
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2005-2011 the original author or authors.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.wamblee.xmlrouter.impl;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.wamblee.xmlrouter.common.Id;
+import org.wamblee.xmlrouter.config.Identifiable;
+
+/**
+ * Robust identifiable provides robustness for identifiable objects.
+ * 
+ * @author Erik Brakkee
+ * 
+ * @param <T>
+ */
+public class RobustIdentifiable<T> implements Identifiable<T> {
+    private static final Logger LOGGER = Logger
+        .getLogger(RobustIdentifiable.class.getName());
+
+    private Id<T> id;
+
+    // TODO test this class.
+    // TODO test that id is constant even though delegated changes its id.
+
+    public RobustIdentifiable(Identifiable<T> aIdentifiable) {
+        // TODO test id is null
+        // TODO getId() throws exception
+        try {
+            id = aIdentifiable.getId();
+            if (id == null) {
+                id = new Id<T>(Constants.UNKNOWN_ID.toString());
+                throw new RuntimeException(
+                    "Temporary to catch nulls during refactoring");
+            }
+        } catch (Exception e) {
+            LOGGER
+                .log(Level.WARNING, "Identifiable getId() threw exception", e);
+        }
+
+    }
+
+    @Override
+    public Id<T> getId() {
+        return id;
+    }
+
+    // TODO test equals, hashcode.
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object aObj) {
+        if (aObj == null) {
+            return false;
+        }
+        if (!getClass().isInstance(aObj)) {
+            return false;
+        }
+        RobustIdentifiable<T> obj = (RobustIdentifiable<T>) aObj;
+        return id.equals(obj.getId());
+    }
+}
index 81748e0f9c1c1c3274f1c7b4e6791c54e1b50578..2fa025e005a836410517332d8f7ff2b3053ffbf7 100644 (file)
@@ -21,7 +21,6 @@ import java.util.logging.Logger;
 import javax.xml.transform.dom.DOMSource;
 
 import org.wamblee.xml.XMLDocument;
-import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Transformation;
 
 /**
@@ -30,12 +29,12 @@ import org.wamblee.xmlrouter.config.Transformation;
  * @author Erik Brakkee
  * 
  */
-public class RobustTransformation implements Transformation {
+public class RobustTransformation extends RobustIdentifiable<Transformation>
+    implements Transformation {
 
     private static final Logger LOGGER = Logger
         .getLogger(RobustTransformation.class.getName());
 
-    private Id<Transformation> id;
     private Transformation transformation;
 
     /**
@@ -46,27 +45,11 @@ public class RobustTransformation implements Transformation {
      * @param aTransformation
      *            Wrapped transformation.
      */
-    public RobustTransformation(Id<Transformation> aId,
-        Transformation aTransformation) {
-        id = aId;
+    public RobustTransformation(Transformation aTransformation) {
+        super(aTransformation);
         transformation = aTransformation;
     }
 
-    @Override
-    public String getName() {
-        try {
-            String name = transformation.getName();
-            if (name == null) {
-                logTypeReturnedNull("from");
-                return Constants.UNKNOWN_DOCUMENT_TYPE.toString();
-            }
-            return name;
-        } catch (Exception e) {
-            logNameThrewException(e);
-            return Constants.UNKNOWN_DOCUMENT_TYPE.toString();
-        }
-    }
-
     @Override
     public String getFromType() {
         try {
@@ -132,12 +115,12 @@ public class RobustTransformation implements Transformation {
 
     private void logTranformationThrewException(DOMSource aEvent, Exception aE) {
         LOGGER.log(Level.WARNING,
-            "transformation " + id + " threw exception for event " +
+            "transformation " + getId() + " threw exception for event " +
                 new XMLDocument(aEvent).print(true), aE);
     }
 
     private void logTransformationReturnedNull(DOMSource aEvent) {
-        LOGGER.log(Level.WARNING, "transformation " + id +
+        LOGGER.log(Level.WARNING, "transformation " + getId() +
             " returned null for event " + new XMLDocument(aEvent).print(true));
     }
 
index c58ef8909f6e6db8ebc19bcdda4fea35b3ece394..5e2fffe4829009b1d67cc26c8f66bc2808b776a7 100644 (file)
  */
 package org.wamblee.xmlrouter.impl;
 
-import java.util.concurrent.atomic.AtomicLong;
-
 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;
 
 /**
@@ -30,7 +29,7 @@ import org.wamblee.xmlrouter.config.Transformation;
  * @author Erik Brakkee
  */
 public class SingleRouterConfig implements ExtendedRouterConfig {
-    private AtomicLong sequenceNumbers;
+    private Id<RouterConfig> id;
     private ExtendedConfig<DocumentType> documentTypes;
     private ExtendedConfig<Transformation> transformations;
     private ExtendedConfig<Filter> filters;
@@ -41,29 +40,36 @@ public class SingleRouterConfig implements ExtendedRouterConfig {
      * @param aSequenceNumberGenerator
      *            Sequence number generator to use.
      */
-    public SingleRouterConfig(AtomicLong aSequenceNumberGenerator) {
-        sequenceNumbers = aSequenceNumberGenerator;
-        documentTypes = new ConfigImpl<DocumentType>(sequenceNumbers) {
+    public SingleRouterConfig(Id<RouterConfig> aId) {
+        id = aId;
+        documentTypes = new ConfigImpl<DocumentType>(new Id<Config>(
+            "documentTypes")) {
             @Override
-            public DocumentType wrap(Id<DocumentType> aId, DocumentType aT) {
-                return new RobustDocumentType(aId, aT);
+            public DocumentType wrap(DocumentType aT) {
+                return new RobustDocumentType(aT);
             }
         };
-        transformations = new ConfigImpl<Transformation>(sequenceNumbers) {
+        transformations = new ConfigImpl<Transformation>(new Id<Config>(
+            "transformations")) {
             @Override
-            public Transformation wrap(Id<Transformation> aId,
-                Transformation aTransformation) {
-                return new RobustTransformation(aId, aTransformation);
+            public Transformation wrap(Transformation aTransformation) {
+                return new RobustTransformation(aTransformation);
             }
         };
-        filters = new ConfigImpl<Filter>(sequenceNumbers) {
+        filters = new ConfigImpl<Filter>(new Id<Config>("filters")) {
             @Override
-            public Filter wrap(Id<Filter> aId, Filter aFilter) {
-                return new RobustFilter(aId, aFilter);
+            public Filter wrap(Filter aFilter) {
+                return new RobustFilter(aFilter);
             }
         };
     }
 
+    // TODO test getId.
+    @Override
+    public Id<RouterConfig> getId() {
+        return id;
+    }
+
     @Override
     public Config<DocumentType> documentTypeConfig() {
         return documentTypes;
index caca48cfd7150185b97d6fe4d49174cc98c61ce2..e6956d30b4f1faa7937e080ea2481b6a655d0a24 100644 (file)
@@ -19,10 +19,8 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
-import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Transformation;
 
 /**
@@ -34,17 +32,14 @@ import org.wamblee.xmlrouter.config.Transformation;
  */
 public class TransformationPaths {
 
-    private Map<Id<Transformation>, Transformation> transformations;
+    private Collection<Transformation> transformations;
     private List<String> vertices;
     private TransformationPath[][] matrix;
 
-    private Map<String, List<TransformationPath>> sequences;
-
     /**
      * Construct the transformations.
      */
-    public TransformationPaths(
-        Map<Id<Transformation>, Transformation> aTransformations) {
+    public TransformationPaths(Collection<Transformation> aTransformations) {
         transformations = aTransformations;
         vertices = new ArrayList<String>();
         matrix = new TransformationPath[0][0];
@@ -107,7 +102,7 @@ public class TransformationPaths {
 
         // Obtain possible starting points.
         Set<String> v = new HashSet<String>();
-        for (Transformation transformation : transformations.values()) {
+        for (Transformation transformation : transformations) {
             v.add(transformation.getFromType());
             v.add(transformation.getToType());
         }
@@ -121,7 +116,7 @@ public class TransformationPaths {
         for (int i = 0; i < nvertices; i++) {
             matrix[i][i] = new TransformationPath();
         }
-        for (Transformation transformation : transformations.values()) {
+        for (Transformation transformation : transformations) {
             int from = vertices.indexOf(transformation.getFromType());
             int to = vertices.indexOf(transformation.getToType());
             TransformationPath path = new TransformationPath(transformation);
index a203f93fe380e2d8d2ecc493ba4f2a4b89ed2dde..ea44601b72d1c6ca8d409c645b281bcf0d9c671d 100644 (file)
@@ -83,7 +83,7 @@ public class XMLRouter implements Gateway, DestinationRegistry {
     private void publishImpl(String aSource, DOMSource aEvent) {
         long time = clock.currentTimeMillis();
 
-        Id<DOMSource> id = new Id<DOMSource>(nextEventId.getAndIncrement());
+        Id<DOMSource> id = new Id<DOMSource>(nextEventId.getAndIncrement() + "");
         List<String> types = determineDocumentTypes(aEvent);
         EventInfo info = new EventInfo(time, aSource, id, types, aEvent);
 
@@ -163,7 +163,7 @@ public class XMLRouter implements Gateway, DestinationRegistry {
                         // allow the event.
                         boolean result = destination.receive(transformed);
                         listener.delivered(aInfo, ts, destinationId.getId(),
-                            destination.getName(), result);
+                            result);
                         delivered = delivered || result;
 
                     }
@@ -189,8 +189,7 @@ public class XMLRouter implements Gateway, DestinationRegistry {
 
     private boolean isAllowedByFilters(String aType, DOMSource aEvent) {
         boolean allowed = true;
-        for (Filter filter : config.getRouterConfig().filterConfig().map()
-            .values()) {
+        for (Filter filter : config.getRouterConfig().filterConfig().values()) {
             if (!filter.isAllowed(aType, aEvent)) {
                 allowed = false;
             }
@@ -201,7 +200,7 @@ public class XMLRouter implements Gateway, DestinationRegistry {
     private List<String> determineDocumentTypes(DOMSource aEvent) {
         List<String> res = new ArrayList<String>();
         for (DocumentType type : config.getRouterConfig().documentTypeConfig()
-            .map().values()) {
+            .values()) {
             if (type.isInstance(aEvent)) {
                 res.add(type.getName());
             }
@@ -209,11 +208,6 @@ public class XMLRouter implements Gateway, DestinationRegistry {
         return res;
     }
 
-    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) + "'";
@@ -236,7 +230,7 @@ public class XMLRouter implements Gateway, DestinationRegistry {
     public Id<Destination> registerDestination(Destination aDestination) {
         notNull("destination", aDestination);
         long seqno = sequenceNumbers.getAndIncrement();
-        Id<Destination> id = new Id<Destination>(seqno);
+        Id<Destination> id = new Id<Destination>(seqno + "");
         destinations.put(id, new RobustDestination(id, aDestination));
         return id;
     }
index 230a6dcf6d8bfc06e77efcca22dff88374833808..054956df0a0e6d8255119298fb751e9fd9ed23d7 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.wamblee.xmlrouter.impl;
 
+import java.util.UUID;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.wamblee.xmlrouter.common.Id;
@@ -37,8 +38,8 @@ public class XMLRouterConfigService implements RouterConfigService {
     public XMLRouterConfigService(XMLRouterConfiguration aConfig) {
         sequence = new AtomicLong(1L);
         config = aConfig;
-        routerConfigs = new ConfigImpl<RouterConfig>(sequence) {
-            public RouterConfig wrap(Id<RouterConfig> aId, RouterConfig aT) {
+        routerConfigs = new ConfigImpl<RouterConfig>(new Id<Config>("config")) {
+            public RouterConfig wrap(RouterConfig aT) {
                 return aT;
             }
         };
@@ -46,18 +47,18 @@ public class XMLRouterConfigService implements RouterConfigService {
 
     @Override
     public RouterConfig emptyConfig() {
-        return new SingleRouterConfig(sequence);
+        // TODO check and document API impacts.
+        String id = UUID.randomUUID().toString();
+        return new SingleRouterConfig(new Id<RouterConfig>(id));
     }
 
     @Override
-    public Id<RouterConfig> apply(RouterConfig aConfig,
-        Id<RouterConfig> aOldConfig) {
+    public void apply(RouterConfig aConfig, Id<RouterConfig> aOldConfig) {
         if (aOldConfig != null) {
             routerConfigs.remove(aOldConfig);
         }
-        Id<RouterConfig> id = routerConfigs.add(aConfig);
+        routerConfigs.add(aConfig);
         update();
-        return id;
     }
 
     @Override
@@ -68,7 +69,7 @@ public class XMLRouterConfigService implements RouterConfigService {
 
     private void update() {
         ExtendedRouterConfig newconfig = new CompositeRouterConfig(
-            routerConfigs.map().values());
+            new Id<RouterConfig>("routerconfig"), routerConfigs.values());
         config.setRouterConfig(newconfig);
     }
 
index fe6d50773e7f4d9c5399f5b7abfe9b5d2e38a19e..679e55df7baa6f4fe9c71066cc6fa37927c7076a 100644 (file)
@@ -18,6 +18,7 @@ package org.wamblee.xmlrouter.impl;
 import java.util.ArrayList;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.RouterConfig;
 
 /**
@@ -39,11 +40,12 @@ public class XMLRouterConfigurationImpl implements XMLRouterConfiguration {
     public XMLRouterConfigurationImpl(ExtendedRouterConfig aConfig) {
         config = aConfig;
         transformations = new TransformationPaths(config.transformationConfig()
-            .map());
+            .values());
     }
 
     public XMLRouterConfigurationImpl() {
-        this(new CompositeRouterConfig(new ArrayList<RouterConfig>()));
+        this(new CompositeRouterConfig(new Id<RouterConfig>("routerconfig"),
+            new ArrayList<RouterConfig>()));
     }
 
     @Override
@@ -65,7 +67,7 @@ public class XMLRouterConfigurationImpl implements XMLRouterConfiguration {
     public void setRouterConfig(ExtendedRouterConfig aConfig) {
 
         TransformationPaths newTransformations = new TransformationPaths(
-            aConfig.transformationConfig().map());
+            aConfig.transformationConfig().values());
 
         wlock.lock();
         try {
index 1e8cfc3b35c1ef5ce9a0631f9ce8dee0d0525570..5e3ad92059625e3b4b5e1a5152da4ed0e9feefd1 100644 (file)
@@ -23,25 +23,30 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.junit.Before;
 import org.junit.Test;
 import org.wamblee.xmlrouter.common.Id;
+import org.wamblee.xmlrouter.config.Config;
+import org.wamblee.xmlrouter.config.Identifiable;
 
 public class ConfigImplTest {
 
-    private static interface MyType {
+    private static interface MyType extends Identifiable {
 
     }
 
     private static class MyTypeWrapper implements MyType {
-        private Id<MyType> id;
         private MyType type;
 
-        public MyTypeWrapper(Id<MyType> aId, MyType aType) {
-            id = aId;
+        public MyTypeWrapper(MyType aType) {
             type = aType;
         }
 
         public MyType getType() {
             return type;
         }
+
+        @Override
+        public Id getId() {
+            return type.getId();
+        }
     }
 
     private AtomicLong sequence;
@@ -50,10 +55,10 @@ public class ConfigImplTest {
     @Before
     public void setUp() {
         sequence = new AtomicLong(1L);
-        config = new ConfigImpl<MyType>(sequence) {
+        config = new ConfigImpl<MyType>(new Id<Config>("mytype")) {
             @Override
-            public MyType wrap(Id<MyType> aId, MyType aT) {
-                return new MyTypeWrapper(aId, aT);
+            public MyType wrap(MyType aT) {
+                return new MyTypeWrapper(aT);
             }
         };
     }
@@ -61,36 +66,37 @@ public class ConfigImplTest {
     @Test
     public void testAdd() {
         MyType type1 = mock(MyType.class);
+        when(type1.getId()).thenReturn(new Id("type1"));
 
-        Id<MyType> id1 = config.add(type1);
+        config.add(type1);
 
-        assertNotNull(id1);
-        assertEquals(1, config.map().size());
-        assertTrue(config.map().get(id1) instanceof MyTypeWrapper);
-        assertSame(type1, ((MyTypeWrapper) config.map().get(id1)).getType());
+        assertEquals(1, config.values().size());
+        assertTrue(config.values().get(0) instanceof MyTypeWrapper);
+        assertSame(type1, ((MyTypeWrapper) config.values().get(0)).getType());
 
         // add another one.
         MyType type2 = mock(MyType.class);
-        Id<MyType> id2 = config.add(type2);
-        assertNotNull(id2);
-        assertEquals(2, config.map().size());
-        assertFalse(id1.equals(id2));
+        when(type2.getId()).thenReturn(new Id("type2"));
+        config.add(type2);
+
+        assertEquals(2, config.values().size());
     }
 
     @Test
     public void testRemove() {
         MyType type1 = mock(MyType.class);
-        Id<MyType> id1 = config.add(type1);
+        when(type1.getId()).thenReturn(new Id("type1"));
+
+        config.add(type1);
 
-        assertNotNull(id1);
-        assertEquals(1, config.map().size());
+        assertEquals(1, config.values().size());
 
-        config.remove(id1);
-        assertTrue(config.map().isEmpty());
+        assertTrue(config.remove(new Id("type1")));
+        assertTrue(config.values().isEmpty());
     }
 
     @Test(expected = UnsupportedOperationException.class)
     public void testUnmodifiable() {
-        config.map().put(new Id<MyType>(100L), mock(MyType.class));
+        config.values().add(mock(MyType.class));
     }
 }
index a42f1c4a5e8a7c56053ed139a1c71482ffb87ca1..b92e4887430243b30a0103c0434270166408dd14 100644 (file)
@@ -39,7 +39,7 @@ public class RobustDestinationTest {
     @Before
     public void setUp() {
         destination = mock(Destination.class);
-        robust = new RobustDestination(new Id<Destination>(100), destination);
+        robust = new RobustDestination(new Id<Destination>("100"), destination);
         source = mock(DOMSource.class);
     }
 
index 57289dcb5a68b736f6ff7745b4ae5c6334b5bf99..254826cb9573ebc2bc46d87d7562c412220b4714 100644 (file)
@@ -23,7 +23,6 @@ import javax.xml.transform.dom.DOMSource;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.DocumentType;
 
 public class RobustDocumentTypeTest {
@@ -35,7 +34,7 @@ public class RobustDocumentTypeTest {
     @Before
     public void setUp() {
         documentType = mock(DocumentType.class);
-        robust = new RobustDocumentType(new Id<DocumentType>(10), documentType);
+        robust = new RobustDocumentType(documentType);
         source = mock(DOMSource.class);
     }
 
index 2c7e742efa06892257ee10039ed5277fe4fe8902..372511236cb0ba8b80c1d3a7385afdc0d2ce9847 100644 (file)
@@ -23,7 +23,6 @@ import javax.xml.transform.dom.DOMSource;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Filter;
 
 public class RobustFilterTest {
@@ -35,7 +34,7 @@ public class RobustFilterTest {
     @Before
     public void setUp() {
         filter = mock(Filter.class);
-        robust = new RobustFilter(new Id<Filter>(10), filter);
+        robust = new RobustFilter(filter);
         source = mock(DOMSource.class);
     }
 
index d26e9dee1c8d641c1eda8c0f7717685718163961..25327cb977d037e360c6a9e2683358fc1c6946b2 100644 (file)
@@ -23,7 +23,6 @@ import javax.xml.transform.dom.DOMSource;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Transformation;
 
 public class RobustTransformationTest {
@@ -35,8 +34,7 @@ public class RobustTransformationTest {
     @Before
     public void setUp() {
         transformation = mock(Transformation.class);
-        robust = new RobustTransformation(new Id<Transformation>(100),
-            transformation);
+        robust = new RobustTransformation(transformation);
         source = mock(DOMSource.class);
         resSource = mock(DOMSource.class);
     }
index af347372a4fdfdc79fec1bbf38dd543dc53cbe89..280e6dac420fb78b05b89a8c2f0ce6c1051bd0c3 100644 (file)
@@ -18,68 +18,64 @@ package org.wamblee.xmlrouter.impl;
 import static junit.framework.Assert.*;
 import static org.mockito.Mockito.*;
 
-import java.util.concurrent.atomic.AtomicLong;
-
 import org.junit.Before;
 import org.junit.Test;
 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;
 
 public class SingleRouterConfigTest {
 
-    private AtomicLong sequence;
     private ExtendedRouterConfig config;
 
     @Before
     public void setUp() {
-        sequence = new AtomicLong(1L);
-        config = new SingleRouterConfig(sequence);
+        config = new SingleRouterConfig(new Id<RouterConfig>("routerconfig"));
     }
 
     @Test
     public void testDocumentType() {
         DocumentType type1 = mock(DocumentType.class);
+        when(type1.getId()).thenReturn(new Id<DocumentType>("type1"));
         DocumentType type2 = mock(DocumentType.class);
+        when(type1.getId()).thenReturn(new Id<DocumentType>("type2"));
 
-        Id<DocumentType> id1 = config.documentTypeConfig().add(type1);
-
-        Id<DocumentType> id2 = config.documentTypeConfig().add(type2);
-        assertFalse(id1.equals(id2));
-
-        assertEquals(2, config.documentTypeConfig().map().size());
-        assertTrue(config.documentTypeConfig().map().get(id1) instanceof RobustDocumentType);
+        config.documentTypeConfig().add(type1);
+        config.documentTypeConfig().add(type2);
 
+        assertEquals(2, config.documentTypeConfig().values().size());
+        assertTrue(config.documentTypeConfig().values().get(0) instanceof RobustDocumentType);
     }
 
     @Test
     public void testTransformation() {
         Transformation transformation1 = mock(Transformation.class);
+        when(transformation1.getId()).thenReturn(new Id<Transformation>("t1"));
         Transformation transformation2 = mock(Transformation.class);
+        when(transformation1.getId()).thenReturn(new Id<Transformation>("t2"));
 
-        Id<Transformation> id1 = config.transformationConfig().add(
-            transformation1);
+        config.transformationConfig().add(transformation1);
 
-        Id<Transformation> id2 = config.transformationConfig().add(
-            transformation2);
-        assertFalse(id1.equals(id2));
+        config.transformationConfig().add(transformation2);
 
-        assertEquals(2, config.transformationConfig().map().size());
-        assertTrue(config.transformationConfig().map().get(id1) instanceof RobustTransformation);
+        assertEquals(2, config.transformationConfig().values().size());
+        assertTrue(config.transformationConfig().values().get(0) instanceof RobustTransformation);
     }
 
     @Test
     public void testFilter() {
         Filter filter1 = mock(Filter.class);
+        when(filter1.getId()).thenReturn(new Id<Filter>("f1"));
         Filter filter2 = mock(Filter.class);
+        when(filter1.getId()).thenReturn(new Id<Filter>("f2"));
 
-        Id<Filter> id1 = config.filterConfig().add(filter1);
+        config.filterConfig().add(filter1);
 
-        Id<Filter> id2 = config.filterConfig().add(filter2);
-        assertFalse(id1.equals(id2));
+        config.filterConfig().add(filter2);
 
-        assertEquals(2, config.filterConfig().map().size());
-        assertTrue(config.filterConfig().map().get(id1) instanceof RobustFilter);
+        assertEquals(2, config.filterConfig().values().size());
+        assertTrue(config.filterConfig().values().get(0) instanceof RobustFilter);
     }
 }
index 18e065fb2405c86ac7991c48119f6a75202e7592..33e16bfcd792d7f7bdded62c4febf585cfd0ebd1 100644 (file)
@@ -17,10 +17,9 @@ package org.wamblee.xmlrouter.impl;
 
 import static junit.framework.Assert.*;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.List;
 
 import javax.xml.transform.dom.DOMSource;
 
@@ -41,8 +40,8 @@ public class TransformationPathsTest {
         }
 
         @Override
-        public String getName() {
-            return "myname";
+        public Id<Transformation> getId() {
+            return new Id<Transformation>("myname");
         }
 
         @Override
@@ -68,13 +67,12 @@ public class TransformationPathsTest {
 
     private TransformationPaths transformations;
 
-    private Map<Id<Transformation>, Transformation> createTransformations(
-        long aStartId, Transformation... aTransformations) {
-        Map<Id<Transformation>, Transformation> res = new LinkedHashMap<Id<Transformation>, Transformation>();
+    private List<Transformation> createTransformations(long aStartId,
+        Transformation... aTransformations) {
+        List<Transformation> res = new ArrayList<Transformation>();
 
-        long id = aStartId;
         for (Transformation t : aTransformations) {
-            res.put(new Id<Transformation>(id++), t);
+            res.add(t);
         }
         return res;
     }
@@ -124,7 +122,7 @@ public class TransformationPathsTest {
     @Test
     public void testWithoutTransformations() {
         transformations = new TransformationPaths(
-            new HashMap<Id<Transformation>, Transformation>());
+            new ArrayList<Transformation>());
         Collection<String> res = transformations.getPossibleTargetTypes("a");
         assertEquals(1, res.size());
 
index 46e36c0c4bdb4c86a67f07c067e512b889a35151..5d84107255f75ada0bf3702282f28239c1c9ef4f 100644 (file)
@@ -27,6 +27,7 @@ import javax.xml.transform.dom.DOMSource;
 import org.junit.Before;
 import org.junit.Test;
 import org.wamblee.general.SystemClock;
+import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.DocumentType;
 import org.wamblee.xmlrouter.config.RouterConfig;
 import org.wamblee.xmlrouter.config.Transformation;
@@ -71,7 +72,8 @@ public class XMLRouterFunctionTest {
     public void testOneTransformationOneDestination() {
         RouterConfig routerConfig = registerDocumentType("any");
         Transformation transformation = mock(Transformation.class);
-        when(transformation.getName()).thenReturn("trans");
+        when(transformation.getId())
+            .thenReturn(new Id<Transformation>("trans"));
         when(transformation.getFromType()).thenReturn("any");
         when(transformation.getToType()).thenReturn("bla");
         when(transformation.transform(same(source1))).thenReturn(source2);
@@ -89,7 +91,7 @@ public class XMLRouterFunctionTest {
         when(destination.receive(any(DOMSource.class))).thenReturn(true);
         routerService.publish("bla", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(transformation).transform(source1);
         verify(destination).receive(same(source2));
index 64aefa1a8ca9f77e8746d7b0f94c5eacb192a00c..2746253de58653f31b04a21d63ef990f89680b44 100644 (file)
@@ -20,7 +20,6 @@ import static org.mockito.Mockito.*;
 
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.concurrent.atomic.AtomicLong;
 import java.util.logging.Level;
 
 import javax.xml.transform.dom.DOMSource;
@@ -31,6 +30,7 @@ import org.wamblee.general.SystemClock;
 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;
@@ -79,7 +79,8 @@ public class XMLRouterTest {
 
     @Before
     public void setUp() {
-        routerConfig = new SingleRouterConfig(new AtomicLong(1L));
+        routerConfig = new SingleRouterConfig(new Id<RouterConfig>(
+            "routerconfig"));
         config = new XMLRouterConfigurationImpl(routerConfig);
         EventListener logListener = new LoggingEventListener(Level.INFO);
         listener = spy(logListener);
@@ -129,7 +130,7 @@ public class XMLRouterTest {
 
         router.publish("any", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
         verify(destinationSpy).receive(same(source1));
 
         // Unregister the destination.
@@ -149,14 +150,14 @@ public class XMLRouterTest {
         DocumentType type = mock(DocumentType.class);
         when(type.isInstance(any(DOMSource.class))).thenReturn(true);
         when(type.getName()).thenReturn(aType);
-        Id<DocumentType> typeId = routerConfig.documentTypeConfig().add(type);
+        routerConfig.documentTypeConfig().add(type);
     }
 
     private void registerDocumentType(String aType, DOMSource aSource) {
         DocumentType type = mock(DocumentType.class);
         when(type.isInstance(same(aSource))).thenReturn(true);
         when(type.getName()).thenReturn(aType);
-        Id<DocumentType> typeId = routerConfig.documentTypeConfig().add(type);
+        routerConfig.documentTypeConfig().add(type);
     }
 
     private Destination registerDestination(boolean aResult, String... types) {
@@ -200,7 +201,7 @@ public class XMLRouterTest {
 
         router.publish("any", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(destinationSpy2).receive(same(source1));
 
@@ -229,7 +230,7 @@ public class XMLRouterTest {
             .registerDestination(destinationSpy2);
         router.publish("any", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(destinationSpy, never()).receive(same(source1));
         verify(destinationSpy2).receive(same(source1));
@@ -260,7 +261,7 @@ public class XMLRouterTest {
             .registerDestination(destinationSpy2);
         router.publish("any", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(destinationSpy, never()).receive(same(source1));
         verify(destinationSpy2).receive(same(source1));
@@ -270,7 +271,8 @@ public class XMLRouterTest {
     public void testOneTransformationOneDestination() {
         registerDocumentType("any");
         Transformation transformation = mock(Transformation.class);
-        when(transformation.getName()).thenReturn("trans");
+        when(transformation.getId())
+            .thenReturn(new Id<Transformation>("trans"));
         when(transformation.getFromType()).thenReturn("any");
         when(transformation.getToType()).thenReturn("bla");
         when(transformation.transform(same(source1))).thenReturn(source2);
@@ -287,7 +289,7 @@ public class XMLRouterTest {
         when(destination.receive(any(DOMSource.class))).thenReturn(true);
         router.publish("bla", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(transformation).transform(source1);
         verify(destination).receive(same(source2));
@@ -302,7 +304,8 @@ public class XMLRouterTest {
     public void testMisbehavingTransformationOneDestination() {
         registerDocumentType("any");
         Transformation transformation = mock(Transformation.class);
-        when(transformation.getName()).thenReturn("trans");
+        when(transformation.getId())
+            .thenReturn(new Id<Transformation>("trans"));
         when(transformation.getFromType()).thenReturn("any");
         when(transformation.getToType()).thenReturn("bla");
         doThrow(new RuntimeException("x")).when(transformation).transform(
@@ -324,7 +327,8 @@ public class XMLRouterTest {
     private Transformation createTransformation(String aFrom, String aTo,
         DOMSource aSource, DOMSource aTarget) {
         Transformation transformation = mock(Transformation.class);
-        when(transformation.getName()).thenReturn("trans");
+        when(transformation.getId())
+            .thenReturn(new Id<Transformation>("trans"));
         when(transformation.getFromType()).thenReturn(aFrom);
         when(transformation.getToType()).thenReturn(aTo);
         when(transformation.transform(same(aSource))).thenReturn(aTarget);
@@ -362,7 +366,8 @@ public class XMLRouterTest {
             .thenReturn(Arrays.asList("bla", "bla2"));
 
         reset(transformation);
-        when(transformation.getName()).thenReturn("trans");
+        when(transformation.getId())
+            .thenReturn(new Id<Transformation>("trans"));
         when(transformation.getFromType()).thenReturn("any");
         when(transformation.getToType()).thenReturn("bla");
         when(transformation.transform(same(source1))).thenReturn(null);
@@ -370,7 +375,7 @@ public class XMLRouterTest {
         when(destination.receive(any(DOMSource.class))).thenReturn(true);
         router.publish("bla", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(transformation).transform(source1);
         verify(transformation2).transform(source1);
@@ -387,7 +392,7 @@ public class XMLRouterTest {
 
         router.publish("source", source1);
         verify(listener, times(2)).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(dest1).receive(same(source1));
         verify(dest2).receive(same(source1));
@@ -405,7 +410,7 @@ public class XMLRouterTest {
 
         router.publish("source", source1);
         verify(listener, times(2)).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(dest).receive(same(source1));
         verify(dest).receive(same(source2));
@@ -427,7 +432,7 @@ public class XMLRouterTest {
 
         router.publish("source", source1);
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(true));
+            anyListOf(Transformation.class), anyString(), eq(true));
 
         verify(dest).receive(same(source3));
     }
@@ -447,7 +452,7 @@ public class XMLRouterTest {
         router.publish("source", source1);
 
         verify(listener).delivered(any(EventInfo.class),
-            anyListOf(Transformation.class), anyLong(), anyString(), eq(false));
+            anyListOf(Transformation.class), anyString(), eq(false));
 
     }
 }
index 791d9d141c0fe10a7dda49b713efb2dcca87937b..e54832b85c479990e5f37e26eeee667204ca5466 100644 (file)
@@ -69,11 +69,11 @@ public class CompositeEventListener implements EventListener {
     @Override
     @ReadLock
     public void delivered(EventInfo aInfo, List<Transformation> aSequence,
-        long aDestinationId, String aDestinationName, boolean aSuccessFlag) {
+        String aDestinationId, boolean aSuccessFlag) {
         for (EventListener logger : loggers) {
             try {
-                logger.delivered(aInfo, aSequence, aDestinationId,
-                    aDestinationName, aSuccessFlag);
+                logger
+                    .delivered(aInfo, aSequence, aDestinationId, aSuccessFlag);
             } catch (Exception e) {
                 LOGGER.log(Level.WARNING, "Logger threw exception", e);
             }
index 251417ac2946c42405a7af85037c1f4089615a58..a2e289a726c064f24869f8840fea19f8efa880f8 100644 (file)
@@ -36,13 +36,11 @@ public interface EventListener {
      *            Sequence of transformations performed.
      * @param aDestinationId
      *            Id of the destination the event was delivered to.
-     * @param aDestinationName
-     *            Destination name.
      * @param aSuccessFlag
      *            Whether or not event delivery succeeded.
      */
     void delivered(EventInfo aInfo, List<Transformation> aSequence,
-        long aDestinationId, String aDestinationName, boolean aSuccessFlag);
+        String aDestinationId, boolean aSuccessFlag);
 
     /**
      * Called when an event could not be delivered to any destination.
index 24c6be65c9333d571ab60f43e28dc291e40f0cff..2c917abdc03cda94b374e8623cc631c67cd642f7 100644 (file)
@@ -39,13 +39,11 @@ public class LoggingEventListener implements EventListener {
 
     @Override
     public void delivered(EventInfo aEvent, List<Transformation> aSequence,
-        long aDestinationId, String aDestinationName, boolean aSuccessFlag) {
+        String aDestinationId, boolean aSuccessFlag) {
         if (LOGGER.isLoggable(level)) {
-            LOGGER
-                .log(level, "event delivered: " + aEvent + ", sequence '" +
-                    getSequenceString(aSequence) + "', destinationId " +
-                    aDestinationId + ", destinationName '" + aDestinationName +
-                    "'");
+            LOGGER.log(level, "event delivered: " + aEvent + ", sequence '" +
+                getSequenceString(aSequence) + "', destinationId " +
+                aDestinationId + "'");
         }
     }
 
@@ -56,7 +54,7 @@ public class LoggingEventListener implements EventListener {
                 buf.append(", ");
             }
             Transformation transformation = aSequence.get(i);
-            buf.append(transformation.getName());
+            buf.append(transformation.getId());
             buf.append("(");
             buf.append(transformation.getFromType());
             buf.append("->");
index 19608b873ec3c4401533836fdbf84e766e7b5704..8d2b135fe99e1abc0e456776ed7a5c7a36032f21 100644 (file)
@@ -27,8 +27,7 @@ import org.wamblee.xmlrouter.config.Transformation;
 
 public class CompositeEventListenerTest {
 
-    private static final String DESTINATION_NAME = "dest";
-    private static final long DESTINATION_ID = 12L;
+    private static final String DESTINATION_ID = "destid";
     private CompositeEventListener composite;
 
     private EventInfo source;
@@ -43,7 +42,7 @@ public class CompositeEventListenerTest {
     public void testNoListeners() {
         // verify no exceptions occur.
         composite.delivered(mock(EventInfo.class), getTransformations(),
-            DESTINATION_ID, DESTINATION_NAME, true);
+            DESTINATION_ID, true);
         composite.notDelivered(mock(EventInfo.class));
     }
 
@@ -73,8 +72,7 @@ public class CompositeEventListenerTest {
     }
 
     private void invokeDelivered() {
-        composite.delivered(source, getTransformations(), DESTINATION_ID,
-            DESTINATION_NAME, true);
+        composite.delivered(source, getTransformations(), DESTINATION_ID, true);
     }
 
     private void invokeNotDelivered() {
@@ -83,7 +81,7 @@ public class CompositeEventListenerTest {
 
     private void checkInvokeDelivered(EventListener listener) {
         verify(listener).delivered(same(source), eq(getTransformations()),
-            eq(DESTINATION_ID), eq(DESTINATION_NAME), eq(true));
+            eq(DESTINATION_ID), eq(true));
     }
 
     @Test