From e6b6fb93462537cb3a1573d01178a5a026edb98f Mon Sep 17 00:00:00 2001 From: erik Date: Sun, 8 Jun 2008 10:37:17 +0000 Subject: [PATCH] --- .../wamblee/system/container/Container.java | 52 +++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/trunk/system/general/src/main/java/org/wamblee/system/container/Container.java b/trunk/system/general/src/main/java/org/wamblee/system/container/Container.java index 60456c5e..9ef2ae18 100644 --- a/trunk/system/general/src/main/java/org/wamblee/system/container/Container.java +++ b/trunk/system/general/src/main/java/org/wamblee/system/container/Container.java @@ -27,6 +27,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; @@ -47,7 +48,6 @@ 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; @@ -68,7 +68,6 @@ public class Container extends AbstractComponent { super(aName, aProvided, aRequired); _components = new ArrayList(); - _componentNames = new HashSet(); _edgeFilter = new CompositeEdgeFilter(); _sealed = false; for (Component component : aComponents) { @@ -106,12 +105,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()); aComponent.addContext(getQualifiedName()); return this; } @@ -128,7 +126,28 @@ public class Container extends AbstractComponent { 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)); } @@ -311,4 +330,27 @@ public class Container extends AbstractComponent { 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; + } } -- 2.31.1