X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcontainer%2FContainer.java;h=2baaa2021ab18be7c979ff5fbeee64c2c52577bc;hb=49ce7cb8387601982d5e6ef186ce206d38f6e3d7;hp=9669cb216dd65a28e0f75670e3f0a9d106b2efb0;hpb=e1975449f1bf16ccb441632d68e440f3e3704a79;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 9669cb21..2baaa202 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 @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2005-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,9 @@ package org.wamblee.system.container; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.wamblee.general.Pair; import org.wamblee.system.core.AbstractComponent; import org.wamblee.system.core.Component; @@ -42,12 +42,14 @@ import org.wamblee.system.graph.component.ConnectRequiredProvidedEdgeFilter; * @author Erik Brakkee */ public class Container extends AbstractComponent { + private static final Logger LOG = Logger.getLogger(Container.class + .getName()); - private static final Log LOG = LogFactory.getLog(Container.class); + private List components; - private List _components; - private CompositeEdgeFilter _edgeFilter; - private boolean _sealed; + private CompositeEdgeFilter edgeFilter; + + private boolean sealed; /** * Constructs the container @@ -62,17 +64,18 @@ public class Container extends AbstractComponent { * Required services by the container. */ public Container(String aName, Component[] aComponents, - List aProvided, List aRequired) { + 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 * @@ -86,130 +89,183 @@ public class Container extends AbstractComponent { * Required services by the container. */ public Container(String aName, Component[] aComponents, - ProvidedInterface[] aProvided, RequiredInterface[] aRequired) { - this(aName, aComponents, Arrays.asList(aProvided), Arrays.asList(aRequired)); + ProvidedInterface[] aProvided, RequiredInterface[] aRequired) { + this(aName, aComponents, Arrays.asList(aProvided), Arrays + .asList(aRequired)); } + /** + * Creates a new Container object. + * + */ public Container(String aName) { this(aName, new Component[0], new ProvidedInterface[0], - new RequiredInterface[0]); + new RequiredInterface[0]); } 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() + "'"); + + if (findComponent(aComponent.getName()) != null) { + throw new SystemAssemblyException("Duplicate component '" + + aComponent.getName() + "'"); } - _components.add(aComponent); + + components.add(aComponent); aComponent.addContext(getQualifiedName()); + return this; } - + /** - * 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. + * 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 void connectRequiredProvided(String aClientComponent, String aRequiredInterface, - String aServerComponent, String aProvidedInterface) { + public void connectRequiredProvided(String aClientComponent, + String aRequiredInterface, String aServerComponent, + String aProvidedInterface) { checkSealed(); + Component client = findComponent(aClientComponent); Component server = findComponent(aServerComponent); - if ( client == null ) { - throw new SystemAssemblyException(getQualifiedName() + ": No component '" + aClientComponent + "' in the container"); + + 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 (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 (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 + "'"); - } + + 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)); + + 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). + * 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) { + public void connectExternalRequired(String aComponent, + String aRequiredInterface, String aExternalRequiredInterface) { checkSealed(); + Component client = findComponent(aComponent); - if ( client == null ) { - throw new SystemAssemblyException(getQualifiedName() + ": No component '" + aComponent + "' in the container"); + + 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 (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 + "'"); - } + + 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)); + + edgeFilter.add(new ConnectRequiredExternallyRequiredEdgeFilter( + aComponent, aRequiredInterface, aExternalRequiredInterface)); } - - public void connectExternalProvided(String aExternalProvided, String aComponent, String aProvidedInterface) { + + public void connectExternalProvided(String aExternalProvided, + String aComponent, String aProvidedInterface) { checkSealed(); + Component server = findComponent(aComponent); - - - if ( server == null ) { - throw new SystemAssemblyException("No component '" + aComponent + "' in the container"); + + 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 (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 + "'"); - } + + 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)); - } + edgeFilter.add(new ConnectExternalProvidedProvidedFilter( + aExternalProvided, aComponent, aProvidedInterface)); + } @Override public Container addProvidedInterface(ProvidedInterface aProvided) { checkSealed(); super.addProvidedInterface(aProvided); + return this; } @@ -217,13 +273,15 @@ public class Container extends AbstractComponent { public Container addRequiredInterface(RequiredInterface aRequired) { checkSealed(); super.addRequiredInterface(aRequired); + return this; } @Override public void addContext(String aContext) { super.addContext(aContext); - for (Component component : _components) { + + for (Component component : components) { component.addContext(aContext); } } @@ -233,9 +291,6 @@ public class Container extends AbstractComponent { * 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. - * - * @throws SystemAssemblyException - * in case of any validation problems. */ public void validate() { doStartOptionalDryRun(null, true); @@ -246,7 +301,7 @@ public class Container extends AbstractComponent { * be added. */ public void seal() { - _sealed = true; + sealed = true; } /** @@ -255,7 +310,7 @@ public class Container extends AbstractComponent { * @return True iff the container is sealed. */ public boolean isSealed() { - return _sealed; + return sealed; } /** @@ -266,24 +321,29 @@ public class Container extends AbstractComponent { */ public Scope start() { Scope scope = new DefaultScope(getProvidedInterfaces()); + return super.start(scope); } @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(); + return scope; } - private void exposeProvidedInterfaces(ComponentGraph aGraph, Scope aExternalScope, - Scope aInternalScope) { - for (Pair mapping: - aGraph.findExternalProvidedInterfaceMapping()) { - Object svc = aInternalScope.getInterfaceImplementation(mapping.getSecond(), Object.class); + private void exposeProvidedInterfaces(ComponentGraph aGraph, + Scope aExternalScope, Scope aInternalScope) { + for (Pair mapping : aGraph + .findExternalProvidedInterfaceMapping()) { + Object svc = aInternalScope.getInterfaceImplementation(mapping + .getSecond(), Object.class); addInterface(mapping.getFirst(), svc, aExternalScope); } } @@ -296,7 +356,8 @@ public class Container extends AbstractComponent { LOG.info("Starting '" + getQualifiedName() + "'"); List started = new ArrayList(); - for (Component component : _components) { + + for (Component component : components) { try { // Start the service. if (!aDryRun) { @@ -307,33 +368,39 @@ public class Container extends AbstractComponent { } catch (SystemAssemblyException e) { throw e; } catch (RuntimeException e) { - LOG.error(getQualifiedName() + ": could not start '" - + component.getQualifiedName() + "'", e); + LOG.log(Level.WARNING, getQualifiedName() + + ": could not start '" + component.getQualifiedName() + "'", + e); stopAlreadyStartedComponents(started, aScope); throw e; } } + return graph; } private ComponentGraph createComponentGraph() { ComponentGraph graph = new ComponentGraph(); + for (RequiredInterface req : getRequiredInterfaces()) { graph.addRequiredInterface(this, req); } - for (Component comp : _components) { + + for (Component comp : components) { graph.addComponent(comp); } - for (ProvidedInterface prov: getProvidedInterfaces()) { + + for (ProvidedInterface prov : getProvidedInterfaces()) { graph.addProvidedInterface(this, prov); } - graph.addEdgeFilter(_edgeFilter); + graph.addEdgeFilter(edgeFilter); + return graph; } private void stopAlreadyStartedComponents(List aStarted, - Scope aScope) { + Scope aScope) { // an exception occurred, stop the successfully started // components for (int i = aStarted.size() - 1; i >= 0; i--) { @@ -341,47 +408,55 @@ 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 + .log(Level.WARNING, getQualifiedName() + + ": error stopping " + + aStarted.get(i).getQualifiedName(), t); } } } @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. + * 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; + 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; + + private static T findInterface( + List aInterfaces, String aInterfaceName) { + for (T intf : aInterfaces) { + if (intf.getName().equals(aInterfaceName)) { + return intf; + } + } + + return null; } }