*/
package org.wamblee.xmlrouter.impl;
-import java.util.LinkedHashMap;
-import java.util.Map;
+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.ConfigException;
+import org.wamblee.xmlrouter.config.Identifiable;
-public class CompositeConfig<T> implements ExtendedConfig<T> {
+/**
+ * Composite config. The composite config
+ *
+ * @author Erik Brakkee
+ *
+ * @param <T>
+ */
+public class CompositeConfig<T extends Identifiable<T>> implements
+ ExtendedConfig<T> {
- private Map<Id<T>, T> configs;
+ private static final Id<Config> ID = new Id<Config>("compositeconfig");
+ private static final String READ_ONLY_INSTANCE = "read only instance";
+ private Set<Id<Config>> ids;
+ private List<Id<T>> valueIds;
+ private List<T> values;
public CompositeConfig() {
- configs = new LinkedHashMap<Id<T>, T>();
+ ids = new HashSet<Id<Config>>();
+ valueIds = new ArrayList<Id<T>>();
+ values = new ArrayList<T>();
+ }
+
+ @Override
+ public Id<Config> getId() {
+ return ID;
}
- public void add(Config<T> aConfig) {
- for (Id<T> id : aConfig.map().keySet()) {
- configs.put(id, aConfig.map().get(id));
+ public void addConfig(Config<T> aConfig) {
+ notNull("aConfig", aConfig);
+ if (ids.contains(aConfig.getId())) {
+ throw new ConfigException("duplicate id '" +
+ aConfig.getId().toString() + "'");
+ }
+ for (T item : aConfig.values()) {
+ if (valueIds.contains(item.getId())) {
+ throw new ConfigException("duplicate id '" +
+ item.getId().toString() + "'");
+ }
+ }
+
+ ids.add(aConfig.getId());
+ for (T item : aConfig.values()) {
+ valueIds.add(item.getId());
+ values.add(item);
}
}
@Override
- public Map<Id<T>, T> map() {
- return configs;
+ public List<T> values() {
+ return values;
}
@Override
public boolean remove(Id<T> aId) {
- notSupported();
+ notSupported(READ_ONLY_INSTANCE);
return false;
}
- private void notSupported() {
- throw new RuntimeException("readonly instance");
- }
-
@Override
- public Id<T> add(T aT) {
- notSupported();
- return null;
+ public void add(T aT) {
+ notSupported(READ_ONLY_INSTANCE);
}
}