import org.wamblee.system.core.AbstractComponent;
import org.wamblee.system.core.Component;
import org.wamblee.system.core.DefaultScope;
+import org.wamblee.system.core.NamedInterface;
import org.wamblee.system.core.ProvidedInterface;
import org.wamblee.system.core.RequiredInterface;
import org.wamblee.system.core.Scope;
private static final Log LOG = LogFactory.getLog(Container.class);
private List<Component> _components;
- private Set<String> _componentNames;
private CompositeEdgeFilter _edgeFilter;
private boolean _sealed;
super(aName, aProvided, aRequired);
_components = new ArrayList<Component>();
- _componentNames = new HashSet<String>();
_edgeFilter = new CompositeEdgeFilter();
_sealed = false;
for (Component component : aComponents) {
+ aComponent.getName()
+ "' is already part of another hierarchy");
}
- if (_componentNames.contains(aComponent.getName())) {
+ if ( findComponent(aComponent.getName()) != null ) {
throw new SystemAssemblyException("Duplicate component '"
+ aComponent.getName() + "'");
}
_components.add(aComponent);
- _componentNames.add(aComponent.getName());
aComponent.addContext(getQualifiedName());
return this;
}
public void connectRequiredProvided(String aClientComponent, String aRequiredInterface,
String aServerComponent, String aProvidedInterface) {
checkSealed();
- // TODO validate
+ Component client = findComponent(aClientComponent);
+ Component server = findComponent(aServerComponent);
+ if ( client == null ) {
+ throw new SystemAssemblyException(getQualifiedName() + ": No component '" + aClientComponent + "' in the container");
+ }
+ if ( aRequiredInterface != null ) {
+ if ( findInterface(client.getRequiredInterfaces(), aRequiredInterface) == null ) {
+ throw new SystemAssemblyException(
+ getQualifiedName() + ": Component '" + aClientComponent + "' does not have a required interface named '"
+ + aRequiredInterface + "'");
+ }
+ }
+ if ( server == null ) {
+ throw new SystemAssemblyException("No component '" + aClientComponent + "' in the container");
+ }
+ if ( aProvidedInterface != null ) {
+ if ( findInterface(server.getProvidedInterfaces(), aProvidedInterface) == null) {
+ throw new SystemAssemblyException(
+ getQualifiedName() + ": Component '" + aServerComponent + "' does not have a provided interface named '"
+ + aProvidedInterface + "'");
+ }
+ }
_edgeFilter.add(new ConnectRequiredProvidedEdgeFilter(aClientComponent, aRequiredInterface, aServerComponent, aProvidedInterface));
}
throw new SystemAssemblyException("Container is sealed");
}
}
+
+ /**
+ * Finds a component based on the non-qualified name of the component.
+ * @param aName Component name.
+ * @return Component or null if not found.
+ */
+ public Component findComponent(String aName) {
+ for (Component<?> component: _components) {
+ if ( component.getName().equals(aName)) {
+ return component;
+ }
+ }
+ return null;
+ }
+
+ private static <T extends NamedInterface> T findInterface(List<T> aInterfaces, String aInterfaceName) {
+ for (T intf: aInterfaces) {
+ if ( intf.getName().equals(aInterfaceName)) {
+ return intf;
+ }
+ }
+ return null;
+ }
}