import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.wamblee.collections.CollectionFilter;
+import org.wamblee.conditions.Condition;
import org.wamblee.general.Pair;
/**
private Set<String> _componentNames;
private CompositeInterfaceRestriction _restriction;
private boolean _sealed;
-
-
- public static ProvidedInterface[] filterProvidedServices(
+
+ static ProvidedInterface[] filterProvidedServices(
Component aClient, RequiredInterface aRequired, Collection<Pair<ProvidedInterface,Component>> aProvided,
InterfaceRestriction aRestriction) {
List<ProvidedInterface> result = new ArrayList<ProvidedInterface>();
// provided interfaces of the container.
// The code below assumes an exact match.
if (!(provided.contains(service))) {
- throw new SystemAssemblyException(getName() + ": Service '"
+ throw new SystemAssemblyException(getQualifiedName() + ": Service '"
+ service
+ "' is not provided by any of its components");
}
}
}
- /**
- * Starts the container. After the container is started, the container
- * becomes sealed meaning that no further components, required or provided
- * interfaces may be added.
- *
- * @return Scope.
- */
- public Scope start() {
- checkSealed();
- validate();
- Scope scope = super.start(new DefaultScope(new ProvidedInterface[0]));
- seal();
- return scope;
- }
-
/**
* Seal the container, meaning that no further components or interfaces may
* be added.
public boolean isSealed() {
return _sealed;
}
+
+ /**
+ * 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() {
+ Scope scope = new DefaultScope(getProvidedInterfaces());
+ return super.start(scope);
+ }
@Override
protected Scope doStart(Scope aExternalScope) {
- return doStartOptionalDryRun(aExternalScope, false);
+ checkSealed();
+ validate();
+ Scope scope = new DefaultScope(getProvidedInterfaces(), aExternalScope);
+ doStartOptionalDryRun(scope, false);
+ seal();
+ return scope;
}
- private Scope doStartOptionalDryRun(Scope aExternalScope, boolean aDryRun) {
+ private void doStartOptionalDryRun(Scope aScope, boolean aDryRun) {
LOG.info("Starting '" + getQualifiedName() + "'");
- Scope scope = new DefaultScope(getProvidedInterfaces(), aExternalScope);
-
List<Pair<ProvidedInterface,Component>> allProvided = new ArrayList<Pair<ProvidedInterface,Component>>();
addProvidersOfRequiredInterfaces(allProvided);
// Start the service.
if (!aDryRun) {
- Object runtime = component.start(scope);
- scope.addRuntime(component, runtime);
+ Object runtime = component.start(aScope);
+ aScope.addRuntime(component, runtime);
started.add(component);
}
} catch (RuntimeException e) {
LOG.error(getQualifiedName() + ": could not start '"
+ component.getQualifiedName() + "'", e);
- stopAlreadyStartedComponents(started, scope);
+ stopAlreadyStartedComponents(started, aScope);
throw e;
}
}
- return scope;
}
private void addProvidersOfRequiredInterfaces(