CompositeConfig tested.
[xmlrouter] / impl / src / main / java / org / wamblee / xmlrouter / impl / CompositeConfig.java
index 56e3e8b3f7cb799f77e23d68c42a43b2b1a69864..22052108f5dd780c5eaffc3eb23f0e90bddafca0 100644 (file)
  */
 package org.wamblee.xmlrouter.impl;
 
+import static org.wamblee.xmlrouter.impl.MessageUtil.*;
+
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.wamblee.xmlrouter.common.Id;
 import org.wamblee.xmlrouter.config.Config;
+import org.wamblee.xmlrouter.config.DuplicateException;
+import org.wamblee.xmlrouter.config.Identifiable;
 
 /**
  * Composite config. The composite config
@@ -28,46 +34,57 @@ import org.wamblee.xmlrouter.config.Config;
  * 
  * @param <T>
  */
-public class CompositeConfig<T> implements ExtendedConfig<T> {
+public class CompositeConfig<T extends Identifiable<T>> implements
+    ExtendedConfig<T> {
 
+    private static final String READ_ONLY_INSTANCE = "read only instance";
+    private Set<Id<Config>> ids;
     private Id<Config> id;
-    private List<T> configs;
+    private List<Id<T>> valueIds;
+    private List<T> values;
 
     public CompositeConfig(Id<Config> aId) {
+        ids = new HashSet<Id<Config>>();
         id = aId;
-        configs = new ArrayList<T>();
+        valueIds = new ArrayList<Id<T>>();
+        values = new ArrayList<T>();
     }
 
     @Override
     public Id<Config> getId() {
-        // TODO test id.
         return id;
     }
 
-    public void add(Config<T> aConfig) {
-        // TODO check duplicate config.
+    public void addConfig(Config<T> aConfig) {
+        if (ids.contains(aConfig.getId())) {
+            throw new DuplicateException(aConfig.getId().toString());
+        }
         for (T item : aConfig.values()) {
-            configs.add(item);
+            if (valueIds.contains(item.getId())) {
+                throw new DuplicateException(item.getId().toString());
+            }
+        }
+
+        ids.add(aConfig.getId());
+        for (T item : aConfig.values()) {
+            valueIds.add(item.getId());
+            values.add(item);
         }
     }
 
     @Override
     public List<T> values() {
-        return configs;
+        return values;
     }
 
     @Override
     public boolean remove(Id<T> aId) {
-        notSupported();
+        notSupported(READ_ONLY_INSTANCE);
         return false;
     }
 
     @Override
     public void add(T aT) {
-        notSupported();
-    }
-
-    private void notSupported() {
-        throw new RuntimeException("readonly instance");
+        notSupported(READ_ONLY_INSTANCE);
     }
 }