X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcontainer%2FContainer.java;h=ab27e7c07f896c35d9f72e4c8cdacaf06760f371;hb=8de36ff0206c996baf3ee4adc3e2293b12ff5f39;hp=bb69712de4df6124b75ff76a209c841d0c45591c;hpb=89c06d4d52b46c154128c97d6e758fa1f4fc7a6e;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 bb69712d..ab27e7c0 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 @@ -38,34 +38,21 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - /** * Container consisting of multiple components. - * + * * @author Erik Brakkee */ public class Container extends AbstractComponent { - /** - * DOCUMENT ME! - */ private static final Log LOG = LogFactory.getLog(Container.class); - /** - * DOCUMENT ME! - */ private List components; - /** - * DOCUMENT ME! - */ private CompositeEdgeFilter edgeFilter; - /** - * DOCUMENT ME! - */ private boolean sealed; -/** + /** * Constructs the container * * @param aName @@ -80,17 +67,17 @@ 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(); - edgeFilter = new CompositeEdgeFilter(); - sealed = false; + edgeFilter = new CompositeEdgeFilter(); + sealed = false; for (Component component : aComponents) { addComponent(component); } } -/** + /** * Constructs the container * * @param aName @@ -104,39 +91,31 @@ public class Container extends AbstractComponent { */ public Container(String aName, Component[] aComponents, ProvidedInterface[] aProvided, RequiredInterface[] aRequired) { - this(aName, aComponents, Arrays.asList(aProvided), - Arrays.asList(aRequired)); + this(aName, aComponents, Arrays.asList(aProvided), Arrays + .asList(aRequired)); } /** * Creates a new Container object. - * - * @param aName DOCUMENT ME! + * */ public Container(String aName) { this(aName, new Component[0], new ProvidedInterface[0], new RequiredInterface[0]); } - /** - * DOCUMENT ME! - * - * @param aComponent DOCUMENT ME! - * - * @return DOCUMENT ME! - */ public Container addComponent(Component aComponent) { checkSealed(); if (aComponent.getContext() != null) { throw new SystemAssemblyException( - "Inconsistent hierarchy, component '" + aComponent.getName() - + "' is already part of another hierarchy"); + "Inconsistent hierarchy, component '" + aComponent.getName() + + "' is already part of another hierarchy"); } if (findComponent(aComponent.getName()) != null) { - throw new SystemAssemblyException("Duplicate component '" - + aComponent.getName() + "'"); + throw new SystemAssemblyException("Duplicate component '" + + aComponent.getName() + "'"); } components.add(aComponent); @@ -147,18 +126,20 @@ public class Container extends AbstractComponent { /** * 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. - * - * @throws SystemAssemblyException DOCUMENT ME! + * + * @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 void connectRequiredProvided(String aClientComponent, String aRequiredInterface, String aServerComponent, @@ -169,48 +150,50 @@ public class Container extends AbstractComponent { Component server = findComponent(aServerComponent); if (client == null) { - throw new SystemAssemblyException(getQualifiedName() - + ": No component '" + aClientComponent + "' in the container"); + 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 (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"); + 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 + "'"); + 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)); + 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). - * - * @throws SystemAssemblyException DOCUMENT ME! + * 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) { @@ -219,39 +202,33 @@ public class Container extends AbstractComponent { Component client = findComponent(aComponent); if (client == null) { - throw new SystemAssemblyException(getQualifiedName() - + ": No component '" + aComponent + "' in the container"); + 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 (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 + "'"); + aExternalRequiredInterface) == null) { + throw new SystemAssemblyException(getQualifiedName() + + ": container does not have a required interface named '" + + aExternalRequiredInterface + "'"); } } edgeFilter.add(new ConnectRequiredExternallyRequiredEdgeFilter( - aComponent, aRequiredInterface, aExternalRequiredInterface)); + aComponent, aRequiredInterface, aExternalRequiredInterface)); } - /** - * DOCUMENT ME! - * - * @param aExternalProvided DOCUMENT ME! - * @param aComponent DOCUMENT ME! - * @param aProvidedInterface DOCUMENT ME! - */ public void connectExternalProvided(String aExternalProvided, String aComponent, String aProvidedInterface) { checkSealed(); @@ -259,38 +236,32 @@ public class Container extends AbstractComponent { Component server = findComponent(aComponent); if (server == null) { - throw new SystemAssemblyException("No component '" + aComponent - + "' in the container"); + 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 (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 + "'"); + throw new SystemAssemblyException(getQualifiedName() + + ": Container does not have a provided interface named '" + + aExternalProvided + "'"); } } edgeFilter.add(new ConnectExternalProvidedProvidedFilter( - aExternalProvided, aComponent, aProvidedInterface)); + aExternalProvided, aComponent, aProvidedInterface)); } - /** - * DOCUMENT ME! - * - * @param aProvided DOCUMENT ME! - * - * @return DOCUMENT ME! - */ @Override public Container addProvidedInterface(ProvidedInterface aProvided) { checkSealed(); @@ -299,13 +270,6 @@ public class Container extends AbstractComponent { return this; } - /** - * DOCUMENT ME! - * - * @param aRequired DOCUMENT ME! - * - * @return DOCUMENT ME! - */ @Override public Container addRequiredInterface(RequiredInterface aRequired) { checkSealed(); @@ -314,11 +278,6 @@ public class Container extends AbstractComponent { return this; } - /** - * DOCUMENT ME! - * - * @param aContext DOCUMENT ME! - */ @Override public void addContext(String aContext) { super.addContext(aContext); @@ -329,18 +288,18 @@ public class Container extends AbstractComponent { } /** - * Validates the components together to check that there are no - * required services not in the required list and no services in the - * provided list that cannot be provided. Also logs a warning in case of - * superfluous requirements. + * Validates the components together to check that there are no required + * services not in the required list and no services in the provided list + * that cannot be provided. Also logs a warning in case of superfluous + * requirements. */ public void validate() { doStartOptionalDryRun(null, true); } /** - * Seal the container, meaning that no further components or - * interfaces may be added. + * Seal the container, meaning that no further components or interfaces may + * be added. */ public void seal() { sealed = true; @@ -348,7 +307,7 @@ public class Container extends AbstractComponent { /** * Checks if the container is sealed. - * + * * @return True iff the container is sealed. */ public boolean isSealed() { @@ -356,10 +315,9 @@ public class Container extends AbstractComponent { } /** - * Utility method to start with an empty external scope. This is - * useful for top-level containers which are not part of another - * container. - * + * Utility method to start with an empty external scope. This is useful for + * top-level containers which are not part of another container. + * * @return Scope. */ public Scope start() { @@ -368,19 +326,12 @@ public class Container extends AbstractComponent { return super.start(scope); } - /** - * DOCUMENT ME! - * - * @param aExternalScope DOCUMENT ME! - * - * @return DOCUMENT ME! - */ @Override protected Scope doStart(Scope aExternalScope) { validate(); - Scope scope = new DefaultScope(getProvidedInterfaces() - .toArray(new ProvidedInterface[0]), aExternalScope); + Scope scope = new DefaultScope(getProvidedInterfaces().toArray( + new ProvidedInterface[0]), aExternalScope); ComponentGraph graph = doStartOptionalDryRun(scope, false); exposeProvidedInterfaces(graph, aExternalScope, scope); seal(); @@ -388,31 +339,16 @@ public class Container extends AbstractComponent { return scope; } - /** - * DOCUMENT ME! - * - * @param aGraph DOCUMENT ME! - * @param aExternalScope DOCUMENT ME! - * @param aInternalScope DOCUMENT ME! - */ private void exposeProvidedInterfaces(ComponentGraph aGraph, Scope aExternalScope, Scope aInternalScope) { for (Pair mapping : aGraph .findExternalProvidedInterfaceMapping()) { Object svc = aInternalScope.getInterfaceImplementation(mapping - .getSecond(), Object.class); + .getSecond(), Object.class); addInterface(mapping.getFirst(), svc, aExternalScope); } } - /** - * DOCUMENT ME! - * - * @param aScope DOCUMENT ME! - * @param aDryRun DOCUMENT ME! - * - * @return DOCUMENT ME! - */ private ComponentGraph doStartOptionalDryRun(Scope aScope, boolean aDryRun) { ComponentGraph graph = createComponentGraph(); graph.validate(); @@ -433,8 +369,8 @@ public class Container extends AbstractComponent { } catch (SystemAssemblyException e) { throw e; } catch (RuntimeException e) { - LOG.error(getQualifiedName() + ": could not start '" - + component.getQualifiedName() + "'", e); + LOG.error(getQualifiedName() + ": could not start '" + + component.getQualifiedName() + "'", e); stopAlreadyStartedComponents(started, aScope); throw e; } @@ -443,11 +379,6 @@ public class Container extends AbstractComponent { return graph; } - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ private ComponentGraph createComponentGraph() { ComponentGraph graph = new ComponentGraph(); @@ -468,12 +399,6 @@ public class Container extends AbstractComponent { return graph; } - /** - * DOCUMENT ME! - * - * @param aStarted DOCUMENT ME! - * @param aScope DOCUMENT ME! - */ private void stopAlreadyStartedComponents(List aStarted, Scope aScope) { // an exception occurred, stop the successfully started @@ -483,29 +408,21 @@ public class Container extends AbstractComponent { Component component = aStarted.get(i); aStarted.get(i).stop(aScope.getRuntime(component)); } catch (Throwable t) { - LOG.error(getQualifiedName() + ": error stopping " - + aStarted.get(i).getQualifiedName()); + LOG.error(getQualifiedName() + ": error stopping " + + aStarted.get(i).getQualifiedName()); } } } - /** - * DOCUMENT ME! - * - * @param aScope DOCUMENT ME! - */ @Override protected void doStop(Scope aScope) { for (int i = components.size() - 1; i >= 0; i--) { Component component = components.get(i); - Object runtime = aScope.getRuntime(component); + Object runtime = aScope.getRuntime(component); component.stop(runtime); } } - /** - * DOCUMENT ME! - */ private void checkSealed() { if (sealed) { throw new SystemAssemblyException("Container is sealed"); @@ -513,11 +430,11 @@ public class Container extends AbstractComponent { } /** - * Finds a component based on the non-qualified name of the - * component. - * - * @param aName Component name. - * + * 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) { @@ -530,15 +447,6 @@ public class Container extends AbstractComponent { return null; } - /** - * DOCUMENT ME! - * - * @param DOCUMENT ME! - * @param aInterfaces DOCUMENT ME! - * @param aInterfaceName DOCUMENT ME! - * - * @return DOCUMENT ME! - */ private static T findInterface( List aInterfaces, String aInterfaceName) { for (T intf : aInterfaces) {