X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcontainer%2FContainer.java;h=cb7a0981df0140a3097b363fee3bc5cf99e9bbf6;hb=0d8d8f24656e585ee75558cfd6a4c661f8f14985;hp=60456c5e4cdb98f84b74ab811eeab0c96cac53bf;hpb=32a8562695029cf13d915bc7941a61fe07ff0005;p=utils diff --git a/system/general/src/main/java/org/wamblee/system/container/Container.java b/system/general/src/main/java/org/wamblee/system/container/Container.java index 60456c5e..cb7a0981 100644 --- a/system/general/src/main/java/org/wamblee/system/container/Container.java +++ b/system/general/src/main/java/org/wamblee/system/container/Container.java @@ -17,9 +17,7 @@ package org.wamblee.system.container; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -27,6 +25,7 @@ import org.wamblee.general.Pair; 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; @@ -46,10 +45,9 @@ public class Container extends AbstractComponent { private static final Log LOG = LogFactory.getLog(Container.class); - private List _components; - private Set _componentNames; - private CompositeEdgeFilter _edgeFilter; - private boolean _sealed; + private List components; + private CompositeEdgeFilter edgeFilter; + private boolean sealed; /** * Constructs the container @@ -66,11 +64,10 @@ public class Container extends AbstractComponent { public Container(String aName, Component[] aComponents, List aProvided, List aRequired) { super(aName, aProvided, aRequired); - _components = new ArrayList(); + components = new ArrayList(); - _componentNames = new HashSet(); - _edgeFilter = new CompositeEdgeFilter(); - _sealed = false; + edgeFilter = new CompositeEdgeFilter(); + sealed = false; for (Component component : aComponents) { addComponent(component); } @@ -106,12 +103,11 @@ public class Container extends AbstractComponent { + 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()); + components.add(aComponent); aComponent.addContext(getQualifiedName()); return this; } @@ -128,8 +124,29 @@ public class Container extends AbstractComponent { public void connectRequiredProvided(String aClientComponent, String aRequiredInterface, String aServerComponent, String aProvidedInterface) { checkSealed(); - // TODO validate - _edgeFilter.add(new ConnectRequiredProvidedEdgeFilter(aClientComponent, aRequiredInterface, aServerComponent, aProvidedInterface)); + 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)); } /** @@ -141,15 +158,51 @@ public class Container extends AbstractComponent { public void connectExternalRequired(String aComponent, String aRequiredInterface, String aExternalRequiredInterface) { checkSealed(); - // TODO validate - _edgeFilter.add(new ConnectRequiredExternallyRequiredEdgeFilter( + Component client = findComponent(aComponent); + if ( client == null ) { + throw new SystemAssemblyException(getQualifiedName() + ": No component '" + aComponent + "' in the container"); + } + if ( aRequiredInterface != null ) { + if ( findInterface(client.getRequiredInterfaces(), aRequiredInterface) == null ) { + throw new SystemAssemblyException( + getQualifiedName() + ": Component '" + aComponent + "' does not have a required interface named '" + + aRequiredInterface + "'"); + } + } + if ( aExternalRequiredInterface != null) { + if ( findInterface(getRequiredInterfaces(), aExternalRequiredInterface) == null ) { + throw new SystemAssemblyException( + getQualifiedName() + ": container does not have a required interface named '" + + aExternalRequiredInterface + "'"); + } + } + edgeFilter.add(new ConnectRequiredExternallyRequiredEdgeFilter( aComponent, aRequiredInterface, aExternalRequiredInterface)); } public void connectExternalProvided(String aExternalProvided, String aComponent, String aProvidedInterface) { checkSealed(); - // TODO validate - _edgeFilter.add(new ConnectExternalProvidedProvidedFilter(aExternalProvided, aComponent, aProvidedInterface)); + Component server = findComponent(aComponent); + + + if ( server == null ) { + throw new SystemAssemblyException("No component '" + aComponent + "' in the container"); + } + if ( aProvidedInterface != null ) { + if ( findInterface(server.getProvidedInterfaces(), aProvidedInterface) == null) { + throw new SystemAssemblyException( + getQualifiedName() + ": Component '" + aComponent + "' does not have a provided interface named '" + + aProvidedInterface + "'"); + } + } + if ( aExternalProvided != null ) { + if ( findInterface(getProvidedInterfaces(), aExternalProvided) == null) { + throw new SystemAssemblyException( + getQualifiedName() + ": Container does not have a provided interface named '" + + aExternalProvided + "'"); + } + } + edgeFilter.add(new ConnectExternalProvidedProvidedFilter(aExternalProvided, aComponent, aProvidedInterface)); } @@ -170,7 +223,7 @@ public class Container extends AbstractComponent { @Override public void addContext(String aContext) { super.addContext(aContext); - for (Component component : _components) { + for (Component component : components) { component.addContext(aContext); } } @@ -193,7 +246,7 @@ public class Container extends AbstractComponent { * be added. */ public void seal() { - _sealed = true; + sealed = true; } /** @@ -202,7 +255,7 @@ public class Container extends AbstractComponent { * @return True iff the container is sealed. */ public boolean isSealed() { - return _sealed; + return sealed; } /** @@ -218,7 +271,6 @@ public class Container extends AbstractComponent { @Override protected Scope doStart(Scope aExternalScope) { - checkSealed(); validate(); Scope scope = new DefaultScope(getProvidedInterfaces().toArray(new ProvidedInterface[0]), aExternalScope); ComponentGraph graph = doStartOptionalDryRun(scope, false); @@ -239,14 +291,12 @@ public class Container extends AbstractComponent { private ComponentGraph doStartOptionalDryRun(Scope aScope, boolean aDryRun) { ComponentGraph graph = createComponentGraph(); graph.validate(); - if (!aDryRun) { - graph.link(); - } + graph.link(); LOG.info("Starting '" + getQualifiedName() + "'"); List started = new ArrayList(); - for (Component component : _components) { + for (Component component : components) { try { // Start the service. if (!aDryRun) { @@ -271,14 +321,14 @@ public class Container extends AbstractComponent { for (RequiredInterface req : getRequiredInterfaces()) { graph.addRequiredInterface(this, req); } - for (Component comp : _components) { + for (Component comp : components) { graph.addComponent(comp); } for (ProvidedInterface prov: getProvidedInterfaces()) { graph.addProvidedInterface(this, prov); } - graph.addEdgeFilter(_edgeFilter); + graph.addEdgeFilter(edgeFilter); return graph; } @@ -299,16 +349,39 @@ public class Container extends AbstractComponent { @Override protected void doStop(Scope aScope) { - for (int i = _components.size() - 1; i >= 0; i--) { - Component component = _components.get(i); + for (int i = components.size() - 1; i >= 0; i--) { + Component component = components.get(i); Object runtime = aScope.getRuntime(component); component.stop(runtime); } } private void checkSealed() { - if (_sealed) { + if (sealed) { 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 findInterface(List aInterfaces, String aInterfaceName) { + for (T intf: aInterfaces) { + if ( intf.getName().equals(aInterfaceName)) { + return intf; + } + } + return null; + } }