package org.wamblee.system.container;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.wamblee.system.core.RequiredInterface;
import org.wamblee.system.core.Scope;
import org.wamblee.system.core.SystemAssemblyException;
+import org.wamblee.system.graph.CompositeEdgeFilter;
+import org.wamblee.system.graph.EdgeFilter;
import org.wamblee.system.graph.component.ComponentGraph;
+import org.wamblee.system.graph.component.ConnectRequiredExternallyRequiredEdgeFilter;
+import org.wamblee.system.graph.component.ConnectRequiredProvidedEdgeFilter;
+import org.wamblee.system.graph.component.RequiredProvidedEdgeFactory;
/**
* Container consisting of multiple components.
private List<Component> _components;
private Set<String> _componentNames;
- private CompositeInterfaceRestriction _restriction;
+ private CompositeEdgeFilter _edgeFilter;
private boolean _sealed;
/**
_components = new ArrayList<Component>();
_componentNames = new HashSet<String>();
- _restriction = new CompositeInterfaceRestriction();
+ _edgeFilter = new CompositeEdgeFilter();
_sealed = false;
for (Component component : aComponents) {
addComponent(component);
aComponent.addContext(getQualifiedName());
return this;
}
-
+
/**
- * Adds an interface restriction for explicitly configuring the relations
- * between components.
- *
- * @param aRestriction
- * Restriction to add.
- * @return Reference to this to allow call chaining.
+ * Explictly connects required and provided interfaces.
+ * @param aClientComponent Client component, may not be null.
+ * @param aRequiredInterface Required interface. If null it means all required interfaces.
+ * @param aServerComponent Server component to connect to. If null, it means that no server components
+ * may be connected to and the provider of the required interface will be null.
+ * @param aProvidedInterface Provided interface. If null, it means that there is no restriction on the
+ * name of the provided interface and that it is automatically selected.
*/
- public Container addRestriction(InterfaceRestriction aRestriction) {
+ public void connectRequiredProvided(String aClientComponent, String aRequiredInterface,
+ String aServerComponent, String aProvidedInterface) {
checkSealed();
- _restriction.add(aRestriction);
- return this;
+ _edgeFilter.add(new ConnectRequiredProvidedEdgeFilter(aClientComponent, aRequiredInterface, aServerComponent, aProvidedInterface));
+ }
+
+ /**
+ * Explicitly connects a externally required interface to an internally required interface.
+ * @param aComponent Component requiring the interface (must be non-null).
+ * @param aRequiredInterface Required interface of the component (must be non-null).
+ * @param aExternalRequiredInterface Externally required interface (must be non-null).
+ */
+ public void connectExternalRequired(String aComponent, String aRequiredInterface,
+ String aExternalRequiredInterface) {
+ checkSealed();
+ _edgeFilter.add(new ConnectRequiredExternallyRequiredEdgeFilter(
+ aComponent, aRequiredInterface, aExternalRequiredInterface));
}
+
+ public void connectExternalProvided(String aExternalProvided, String aComponent, String aProvidedInterface) {
+ checkSealed();
+ // TODO implement.
+ throw new RuntimeException("not implemented");
+ }
+
@Override
public Container addProvidedInterface(ProvidedInterface aProvided) {
private ComponentGraph createComponentGraph() {
ComponentGraph graph = new ComponentGraph();
for (RequiredInterface req : getRequiredInterfaces()) {
- graph.addRequiredInterface(req);
+ graph.addRequiredInterface(this, req);
}
for (Component comp : _components) {
graph.addComponent(comp);
}
for (ProvidedInterface prov: getProvidedInterfaces()) {
- graph.addProvidedInterface(prov);
+ graph.addProvidedInterface(this, prov);
}
- graph.addRestriction(_restriction);
+ graph.addEdgeFilter(_edgeFilter);
return graph;
}