Reduced the time during which the configuration is locked. Computation of paths now...
authorErik Brakkee <erik@brakkee.org>
Sat, 30 Jul 2011 20:50:44 +0000 (22:50 +0200)
committerErik Brakkee <erik@brakkee.org>
Sat, 30 Jul 2011 20:50:44 +0000 (22:50 +0200)
impl/src/main/java/org/wamblee/xmlrouter/impl/TransformationPaths.java
impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigService.java
impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfiguration.java
impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java
impl/src/test/java/org/wamblee/xmlrouter/impl/TransformationPathsTest.java
impl/src/test/java/org/wamblee/xmlrouter/impl/XMLRouterTest.java

index 7a86c87d8f41e135bb9f659da4d1155222e2676b..caca48cfd7150185b97d6fe4d49174cc98c61ce2 100644 (file)
@@ -18,7 +18,6 @@ package org.wamblee.xmlrouter.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -44,15 +43,11 @@ public class TransformationPaths {
     /**
      * Construct the transformations.
      */
-    public TransformationPaths() {
-        transformations = new LinkedHashMap<Id<Transformation>, Transformation>();
-        vertices = new ArrayList<String>();
-        matrix = new TransformationPath[0][0];
-    }
-
-    public void replaceTransformations(
+    public TransformationPaths(
         Map<Id<Transformation>, Transformation> aTransformations) {
         transformations = aTransformations;
+        vertices = new ArrayList<String>();
+        matrix = new TransformationPath[0][0];
         computeTransformationSequences();
     }
 
index ca5e41748e08f8e22851c7ab0b21760f4e904a0f..230a6dcf6d8bfc06e77efcca22dff88374833808 100644 (file)
@@ -51,16 +51,6 @@ public class XMLRouterConfigService implements RouterConfigService {
 
     @Override
     public Id<RouterConfig> apply(RouterConfig aConfig,
-        Id<RouterConfig> aOldConfig) {
-        config.startConfigurationChange();
-        try {
-            return applyImpl(aConfig, aOldConfig);
-        } finally {
-            config.endConfigurationChange();
-        }
-    }
-
-    private Id<RouterConfig> applyImpl(RouterConfig aConfig,
         Id<RouterConfig> aOldConfig) {
         if (aOldConfig != null) {
             routerConfigs.remove(aOldConfig);
@@ -72,15 +62,6 @@ public class XMLRouterConfigService implements RouterConfigService {
 
     @Override
     public void clear(Id<RouterConfig> aConfig) {
-        config.startConfigurationChange();
-        try {
-            clearImpl(aConfig);
-        } finally {
-            config.endConfigurationChange();
-        }
-    }
-
-    private void clearImpl(Id<RouterConfig> aConfig) {
         routerConfigs.remove(aConfig);
         update();
     }
index 25ae3313151cb70d2a7f6684ab231ce704f3e93a..a57a84569e8092f044878f422a466018d2887291 100644 (file)
@@ -27,22 +27,21 @@ package org.wamblee.xmlrouter.impl;
 public interface XMLRouterConfiguration {
 
     /**
-     * To be called before the configuration is updated. Corresponds to write
-     * lock acquire.
+     * To be called before the configuration is used. Corresponds to read lock
+     * acquire.
      */
-    void startConfigurationChange();
+    void startPublishEvent();
 
     /**
-     * To be called after the configuration is updated. Corresponds to write
-     * lock acquire.
+     * @return Configuration data. {@link #startPublishEvent()} must have been
+     *         called before doing this.
      */
-    void endConfigurationChange();
+    ExtendedRouterConfig getRouterConfig();
 
     /**
-     * To be called before the configuration is used. Corresponds to read lock
-     * acquire.
+     * @return Transformation paths (derived data).
      */
-    void startPublishEvent();
+    TransformationPaths getTransformations();
 
     /**
      * To be called after the configuration is used. Corresponds to read lock
@@ -51,20 +50,11 @@ public interface XMLRouterConfiguration {
     void endPublishEvent();
 
     /**
-     * @return Configuration data.
-     */
-    ExtendedRouterConfig getRouterConfig();
-
-    /**
-     * Sets the configuration and updates derived data.
+     * Atomically sets the configuration and updates derived data. There will be
+     * a short time during which read attempts will fail.
      * 
      * @param aConfig
      *            Configuration to set.
      */
     void setRouterConfig(ExtendedRouterConfig aConfig);
-
-    /**
-     * @return Transformation paths (derived data).
-     */
-    TransformationPaths getTransformations();
 }
index 99db0fd2b65a71b77e0e3eaade316cdbd4bcbf23..fe6d50773e7f4d9c5399f5b7abfe9b5d2e38a19e 100644 (file)
@@ -38,23 +38,14 @@ public class XMLRouterConfigurationImpl implements XMLRouterConfiguration {
 
     public XMLRouterConfigurationImpl(ExtendedRouterConfig aConfig) {
         config = aConfig;
-        transformations = new TransformationPaths();
+        transformations = new TransformationPaths(config.transformationConfig()
+            .map());
     }
 
     public XMLRouterConfigurationImpl() {
         this(new CompositeRouterConfig(new ArrayList<RouterConfig>()));
     }
 
-    @Override
-    public void startConfigurationChange() {
-        wlock.lock();
-    }
-
-    @Override
-    public void endConfigurationChange() {
-        wlock.unlock();
-    }
-
     @Override
     public void startPublishEvent() {
         rlock.lock();
@@ -72,9 +63,17 @@ public class XMLRouterConfigurationImpl implements XMLRouterConfiguration {
 
     @Override
     public void setRouterConfig(ExtendedRouterConfig aConfig) {
-        config = aConfig;
-        transformations.replaceTransformations(config.transformationConfig()
-            .map());
+
+        TransformationPaths newTransformations = new TransformationPaths(
+            aConfig.transformationConfig().map());
+
+        wlock.lock();
+        try {
+            config = aConfig;
+            transformations = newTransformations;
+        } finally {
+            wlock.unlock();
+        }
     }
 
     @Override
index a45853272272806d0441b8958c12796b1868919f..18e065fb2405c86ac7991c48119f6a75202e7592 100644 (file)
@@ -18,12 +18,12 @@ package org.wamblee.xmlrouter.impl;
 import static junit.framework.Assert.*;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 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;
@@ -68,11 +68,6 @@ public class TransformationPathsTest {
 
     private TransformationPaths transformations;
 
-    @Before
-    public void setUp() {
-        transformations = new TransformationPaths();
-    }
-
     private Map<Id<Transformation>, Transformation> createTransformations(
         long aStartId, Transformation... aTransformations) {
         Map<Id<Transformation>, Transformation> res = new LinkedHashMap<Id<Transformation>, Transformation>();
@@ -86,7 +81,7 @@ public class TransformationPathsTest {
 
     @Test
     public void testOneTransformation() {
-        transformations.replaceTransformations(createTransformations(10L,
+        transformations = new TransformationPaths(createTransformations(10L,
             new MyTransformation("A", "B")));
 
         System.out.println(transformations.toString());
@@ -106,14 +101,14 @@ public class TransformationPathsTest {
 
     @Test
     public void testMultipleTransformations() {
-        transformations.replaceTransformations(createTransformations(10L,
+        transformations = new TransformationPaths(createTransformations(10L,
             new MyTransformation("A", "B"), new MyTransformation("B", "C"),
             new MyTransformation("C", "A")));
 
         System.out.println(transformations);
         assertEquals(2, transformations.getPath("C", "B").size());
 
-        transformations.replaceTransformations(createTransformations(10L,
+        transformations = new TransformationPaths(createTransformations(10L,
             new MyTransformation("B", "C"), new MyTransformation("C", "A")));
 
         assertNull(transformations.getPath("C", "B"));
@@ -121,13 +116,15 @@ public class TransformationPathsTest {
 
     @Test
     public void testUnknownDestination() {
-        transformations.replaceTransformations(createTransformations(10L,
+        transformations = new TransformationPaths(createTransformations(10L,
             new MyTransformation("A", "B")));
         assertNull(transformations.getPath("A", "D"));
     }
 
     @Test
     public void testWithoutTransformations() {
+        transformations = new TransformationPaths(
+            new HashMap<Id<Transformation>, Transformation>());
         Collection<String> res = transformations.getPossibleTargetTypes("a");
         assertEquals(1, res.size());
 
index baa63a16c7a6de2cc7121ce85407a8131fbf4a13..64aefa1a8ca9f77e8746d7b0f94c5eacb192a00c 100644 (file)
@@ -275,8 +275,7 @@ public class XMLRouterTest {
         when(transformation.getToType()).thenReturn("bla");
         when(transformation.transform(same(source1))).thenReturn(source2);
         routerConfig.transformationConfig().add(transformation);
-        config.getTransformations().replaceTransformations(
-            routerConfig.transformationConfig().map());
+        config.setRouterConfig(routerConfig);
 
         Destination destination = mock(Destination.class);
         when(
@@ -339,9 +338,7 @@ public class XMLRouterTest {
             source1, null);
 
         routerConfig.transformationConfig().add(transformation);
-        config.getTransformations().replaceTransformations(
-            routerConfig.transformationConfig().map());
-
+        config.setRouterConfig(routerConfig);
         Destination destination = mock(Destination.class);
         when(
             destination.chooseFromTargetTypes((Collection<String>) anyObject()))
@@ -359,8 +356,7 @@ public class XMLRouterTest {
             source1, source2);
 
         routerConfig.transformationConfig().add(transformation2);
-        config.getTransformations().replaceTransformations(
-            routerConfig.transformationConfig().map());
+        config.setRouterConfig(routerConfig);
         when(
             destination.chooseFromTargetTypes((Collection<String>) anyObject()))
             .thenReturn(Arrays.asList("bla", "bla2"));
@@ -405,8 +401,7 @@ public class XMLRouterTest {
         Transformation transformation = createTransformation("any", "other",
             source1, source2);
         routerConfig.transformationConfig().add(transformation);
-        config.getTransformations().replaceTransformations(
-            routerConfig.transformationConfig().map());
+        config.setRouterConfig(routerConfig);
 
         router.publish("source", source1);
         verify(listener, times(2)).delivered(any(EventInfo.class),
@@ -428,8 +423,7 @@ public class XMLRouterTest {
         Transformation t2 = createTransformation("intermediate", "other",
             source2, source3);
         routerConfig.transformationConfig().add(t2);
-        config.getTransformations().replaceTransformations(
-            routerConfig.transformationConfig().map());
+        config.setRouterConfig(routerConfig);
 
         router.publish("source", source1);
         verify(listener).delivered(any(EventInfo.class),