*/
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.ConfigException;
+import org.wamblee.xmlrouter.config.Identifiable;
/**
* Composite config. The composite 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) {
+ notNull("aId", 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) {
+ notNull("aConfig", aConfig);
+ if (ids.contains(aConfig.getId())) {
+ throw new ConfigException("duplicate id '" +
+ aConfig.getId().toString() + "'");
+ }
for (T item : aConfig.values()) {
- configs.add(item);
+ 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 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);
}
}