X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcore%2FAbstractComponent.java;h=38df3bc4c9bc297874834eaf1953fd3083e8962d;hb=1bfc42afcea288a918e8befe65fd8f87b99ba2e4;hp=6567e4e74067cf13f563e5e0f7f4ab6aa4cdc4be;hpb=f9145c96b66fea2db0b9f04b009caf992ad1ab70;p=utils diff --git a/system/general/src/main/java/org/wamblee/system/core/AbstractComponent.java b/system/general/src/main/java/org/wamblee/system/core/AbstractComponent.java index 6567e4e7..38df3bc4 100644 --- a/system/general/src/main/java/org/wamblee/system/core/AbstractComponent.java +++ b/system/general/src/main/java/org/wamblee/system/core/AbstractComponent.java @@ -35,8 +35,8 @@ public abstract class AbstractComponent implements Component { private String _context; private String _name; - private List _provided; - private List _required; + private ReadWriteProvidedInterfaces _provided; + private ReadWriteRequiredInterfaces _required; /** * Constructs the subsystem. @@ -53,10 +53,8 @@ public abstract class AbstractComponent implements Component { _remaining = new ThreadLocal>(); _context = null; _name = aName; - _provided = new ArrayList(); - _provided.addAll(Arrays.asList(aProvided)); - _required = new ArrayList(); - _required.addAll(Arrays.asList(aRequired)); + _provided = new ReadWriteProvidedInterfaces(aProvided); + _required = new ReadWriteRequiredInterfaces(aRequired); } protected AbstractComponent(String aName) { @@ -101,20 +99,20 @@ public abstract class AbstractComponent implements Component { } @Override - public final ProvidedInterface[] getProvidedInterfaces() { - return _provided.toArray(new ProvidedInterface[0]); + public final ProvidedInterfaces getProvidedInterfaces() { + return _provided.readOnlyView(); } @Override - public final RequiredInterface[] getRequiredInterfaces() { - return _required.toArray(new RequiredInterface[0]); + public final RequiredInterfaces getRequiredInterfaces() { + return _required.readOnlyView(); } @Override public final Type start(Scope aScope) { LOG.info("Initialization starting '" + getQualifiedName() + "'"); List oldRemaining = _remaining.get(); - _remaining.set(new ArrayList(Arrays.asList(getProvidedInterfaces()))); + _remaining.set(new ArrayList(Arrays.asList(getProvidedInterfaces().toArray()))); try { Type runtime = doStart(aScope); checkNotStartedInterfaces(); @@ -159,7 +157,10 @@ public abstract class AbstractComponent implements Component { Object aService, Scope aScope) { LOG.info("Interface '" + getQualifiedName() + "." + aDescriptor.getName() + "' started."); - _remaining.get().remove(aDescriptor); + if ( !_remaining.get().remove(aDescriptor) ) { + throw new SystemAssemblyException("Component '" + getQualifiedName() + "' started an unexpected interface '" + + aDescriptor + "' that was not registerd as a provided interface before"); + } aScope.publishInterface(aDescriptor, aService); } @@ -176,5 +177,23 @@ public abstract class AbstractComponent implements Component { public String toString() { return getQualifiedName(); } + + public ProvidedInterface findProvidedInterface(String aName) { + for (ProvidedInterface provided: getProvidedInterfaces()) { + if ( provided.getName().equals(aName)) { + return provided; + } + } + return null; + } + + public RequiredInterface findRequiredInterface(String aName) { + for (RequiredInterface required: getRequiredInterfaces()) { + if ( required.getName().equals(aName)) { + return required; + } + } + return null; + } }