From: Erik Brakkee Date: Sat, 30 Jul 2011 20:50:44 +0000 (+0200) Subject: Reduced the time during which the configuration is locked. Computation of paths now... X-Git-Tag: PAX_EXAM_MOCKITO_ISSUE~27 X-Git-Url: http://wamblee.org/gitweb/?a=commitdiff_plain;h=13b475f8216ad5d74d64df4122ea6812554f7a14;p=xmlrouter Reduced the time during which the configuration is locked. Computation of paths now takes place without a lock. --- diff --git a/impl/src/main/java/org/wamblee/xmlrouter/impl/TransformationPaths.java b/impl/src/main/java/org/wamblee/xmlrouter/impl/TransformationPaths.java index 7a86c87..caca48c 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/TransformationPaths.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/TransformationPaths.java @@ -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, Transformation>(); - vertices = new ArrayList(); - matrix = new TransformationPath[0][0]; - } - - public void replaceTransformations( + public TransformationPaths( Map, Transformation> aTransformations) { transformations = aTransformations; + vertices = new ArrayList(); + matrix = new TransformationPath[0][0]; computeTransformationSequences(); } diff --git a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigService.java b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigService.java index ca5e417..230a6dc 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigService.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigService.java @@ -51,16 +51,6 @@ public class XMLRouterConfigService implements RouterConfigService { @Override public Id apply(RouterConfig aConfig, - Id aOldConfig) { - config.startConfigurationChange(); - try { - return applyImpl(aConfig, aOldConfig); - } finally { - config.endConfigurationChange(); - } - } - - private Id applyImpl(RouterConfig aConfig, Id aOldConfig) { if (aOldConfig != null) { routerConfigs.remove(aOldConfig); @@ -72,15 +62,6 @@ public class XMLRouterConfigService implements RouterConfigService { @Override public void clear(Id aConfig) { - config.startConfigurationChange(); - try { - clearImpl(aConfig); - } finally { - config.endConfigurationChange(); - } - } - - private void clearImpl(Id aConfig) { routerConfigs.remove(aConfig); update(); } 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 25ae331..a57a845 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfiguration.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfiguration.java @@ -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(); } 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 99db0fd..fe6d507 100644 --- a/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java +++ b/impl/src/main/java/org/wamblee/xmlrouter/impl/XMLRouterConfigurationImpl.java @@ -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())); } - @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 diff --git a/impl/src/test/java/org/wamblee/xmlrouter/impl/TransformationPathsTest.java b/impl/src/test/java/org/wamblee/xmlrouter/impl/TransformationPathsTest.java index a458532..18e065f 100644 --- a/impl/src/test/java/org/wamblee/xmlrouter/impl/TransformationPathsTest.java +++ b/impl/src/test/java/org/wamblee/xmlrouter/impl/TransformationPathsTest.java @@ -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, Transformation> createTransformations( long aStartId, Transformation... aTransformations) { Map, Transformation> res = new LinkedHashMap, 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, Transformation>()); Collection res = transformations.getPossibleTargetTypes("a"); assertEquals(1, res.size()); diff --git a/impl/src/test/java/org/wamblee/xmlrouter/impl/XMLRouterTest.java b/impl/src/test/java/org/wamblee/xmlrouter/impl/XMLRouterTest.java index baa63a1..64aefa1 100644 --- a/impl/src/test/java/org/wamblee/xmlrouter/impl/XMLRouterTest.java +++ b/impl/src/test/java/org/wamblee/xmlrouter/impl/XMLRouterTest.java @@ -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) 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) 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),