refactoring of the config interface towards more reuse in the implementation and...
[xmlrouter] / impl / src / main / java / org / wamblee / xmlrouter / impl / Transformations.java
index 7fd3e10e7041efd6173dcc35832b94e67d0cbc46..c297fac787ce5ea66ca66339435fdd85bc59a8c7 100644 (file)
@@ -17,41 +17,89 @@ 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;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.wamblee.xmlrouter.common.Id;
+import org.wamblee.xmlrouter.config.Config;
 import org.wamblee.xmlrouter.config.Transformation;
 
+/**
+ * This class manages transformations and computes the shortest transformations
+ * paths based on the provided transformations.
+ * 
+ * @author Erik Brakkee
+ * 
+ */
 public class Transformations {
 
-    private AtomicLong sequenceNumber;
-    private Map<Id<Transformation>, Transformation> transformations;
+    private Config<Transformation> transformations;
     private List<String> vertices;
     private TransformationPath[][] matrix;
 
     private Map<String, List<TransformationPath>> sequences;
 
+    /**
+     * Construct the transformations.
+     */
     public Transformations() {
-        sequenceNumber = new AtomicLong(1);
-        transformations = new LinkedHashMap<Id<Transformation>, Transformation>();
+        transformations = new ConfigImpl<Transformation>() {
+            @Override
+            public Transformation wrap(Id<Transformation> aId,
+                Transformation aType) {
+                return new RobustTransformation(aId, aType);
+            }
+        };
         vertices = new ArrayList<String>();
         matrix = new TransformationPath[0][0];
     }
 
+    public Config<Transformation> getTransformationConfig() {
+        return new Config<Transformation>() {
+            @Override
+            public Id<Transformation> add(Transformation aT) {
+                return addTransformation(aT);
+            }
+
+            @Override
+            public Transformation get(Id<Transformation> aId) {
+                return transformations.get(aId);
+            }
+
+            @Override
+            public Collection<Id<Transformation>> ids() {
+                return transformations.ids();
+            }
+
+            @Override
+            public boolean remove(Id<Transformation> aId) {
+                return transformations.remove(aId);
+            }
+        };
+    }
+
+    /**
+     * Adds a transformation. Leads to recomputation of shortest paths.
+     * 
+     * @param aTransformation
+     *            Transformation to add.
+     * @return Id of the transformation.
+     */
     public Id<Transformation> addTransformation(Transformation aTransformation) {
-        long seqno = sequenceNumber.getAndIncrement();
-        Id<Transformation> id = new Id<Transformation>(seqno);
-        transformations.put(id, new RobustTransformation(id, aTransformation));
+        Id<Transformation> id = transformations.add(aTransformation);
         computeTransformationSequences();
         return id;
     }
 
+    /**
+     * Gets the possible target types based on an input type.
+     * 
+     * @param aType
+     *            Input type.
+     * @return Possible target types.
+     */
     public Collection<String> getPossibleTargetTypes(String aType) {
         int index = vertices.indexOf(aType);
         Set<String> res = new HashSet<String>();
@@ -93,12 +141,16 @@ public class Transformations {
         return matrix[i][j];
     }
 
+    /**
+     * Computest the transformation sequences using Floyd's algorithm.
+     */
     private void computeTransformationSequences() {
         vertices = new ArrayList<String>();
 
         // Obtain possible starting points.
         Set<String> v = new HashSet<String>();
-        for (Transformation transformation : transformations.values()) {
+        for (Id<Transformation> id : transformations.ids()) {
+            Transformation transformation = transformations.get(id);
             v.add(transformation.getFromType());
             v.add(transformation.getToType());
         }
@@ -112,7 +164,8 @@ public class Transformations {
         for (int i = 0; i < nvertices; i++) {
             matrix[i][i] = new TransformationPath();
         }
-        for (Transformation transformation : transformations.values()) {
+        for (Id<Transformation> id : transformations.ids()) {
+            Transformation transformation = transformations.get(id);
             int from = vertices.indexOf(transformation.getFromType());
             int to = vertices.indexOf(transformation.getToType());
             TransformationPath path = new TransformationPath(transformation);
@@ -143,19 +196,17 @@ public class Transformations {
             .size();
     }
 
+    /**
+     * Removes a transformation.
+     * 
+     * @param aId
+     *            Id of the transformation.
+     */
     public void removeTransformation(Id<Transformation> aId) {
         transformations.remove(aId);
         computeTransformationSequences();
     }
 
-    public Collection<Id<Transformation>> getTransformations() {
-        return Collections.unmodifiableCollection(transformations.keySet());
-    }
-
-    public Transformation getTransformation(Id<Transformation> aId) {
-        return transformations.get(aId);
-    }
-
     @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();