(no commit message)
[utils] / system / general / src / main / java / org / wamblee / system / core / AbstractComponent.java
index 38df3bc4c9bc297874834eaf1953fd3083e8962d..d2cf69fe76f3b1039133debdc726ae88857a927d 100644 (file)
@@ -17,9 +17,8 @@ package org.wamblee.system.core;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.List;
-import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -35,8 +34,8 @@ public abstract class AbstractComponent<Type> implements Component<Type> {
 
        private String _context;
        private String _name;
-       private ReadWriteProvidedInterfaces _provided;
-       private ReadWriteRequiredInterfaces _required;
+       private List<ProvidedInterface> _provided;
+       private List<RequiredInterface> _required;
 
        /**
         * Constructs the subsystem.
@@ -48,25 +47,40 @@ public abstract class AbstractComponent<Type> implements Component<Type> {
         * @param aRequired
         *            Required services.
         */
-       protected AbstractComponent(String aName, ProvidedInterface[] aProvided,
-                       RequiredInterface[] aRequired) {
+       protected AbstractComponent(String aName, List<ProvidedInterface> aProvided,
+                       List<RequiredInterface> aRequired) {
                _remaining = new ThreadLocal<List<ProvidedInterface>>();
                _context = null;
                _name = aName;
-               _provided = new ReadWriteProvidedInterfaces(aProvided);
-               _required = new ReadWriteRequiredInterfaces(aRequired);
+               _provided = new ArrayList<ProvidedInterface>(aProvided);
+               _required = new ArrayList<RequiredInterface>(aRequired); 
        }
        
+       /**
+     * Constructs the subsystem.
+     * 
+     * @param aName
+     *            Name of the system.
+     * @param aProvided
+     *            Provided services.
+     * @param aRequired
+     *            Required services.
+     */
+    protected AbstractComponent(String aName, ProvidedInterface[] aProvided,
+            RequiredInterface[] aRequired) {
+        this(aName, Arrays.asList(aProvided), Arrays.asList(aRequired));
+    }
+       
        protected AbstractComponent(String aName) {
                this(aName, new ProvidedInterface[0], new RequiredInterface[0]);
        }
        
-       public AbstractComponent addProvidedInterface(ProvidedInterface aProvided) { 
+       public AbstractComponent<Type> addProvidedInterface(ProvidedInterface aProvided) { 
                _provided.add(aProvided);
                return this; 
        }
        
-       public AbstractComponent addRequiredInterface(RequiredInterface aRequired) { 
+       public AbstractComponent<Type> addRequiredInterface(RequiredInterface aRequired) { 
                _required.add(aRequired);
                return this;
        }
@@ -99,20 +113,20 @@ public abstract class AbstractComponent<Type> implements Component<Type> {
        }
 
        @Override
-       public final ProvidedInterfaces getProvidedInterfaces() {
-               return _provided.readOnlyView();
+       public final List<ProvidedInterface> getProvidedInterfaces() {
+               return Collections.unmodifiableList(_provided);
        }
 
        @Override
-       public final RequiredInterfaces getRequiredInterfaces() {
-               return _required.readOnlyView();
+       public final List<RequiredInterface> getRequiredInterfaces() {
+               return Collections.unmodifiableList(_required);
        }
 
        @Override
        public final Type start(Scope aScope) {
                LOG.info("Initialization starting '" + getQualifiedName() + "'");
                List<ProvidedInterface> oldRemaining = _remaining.get();
-               _remaining.set(new ArrayList<ProvidedInterface>(Arrays.asList(getProvidedInterfaces().toArray())));
+               _remaining.set(new ArrayList<ProvidedInterface>(getProvidedInterfaces()));
                try {
                        Type runtime = doStart(aScope);
                        checkNotStartedInterfaces();
@@ -136,7 +150,7 @@ public abstract class AbstractComponent<Type> implements Component<Type> {
 
        /**
         * Must be implemented for initializing the subsystem. The implementation
-        * must call {@link #addService(Service)} for each service that is started.
+        * must call {@link #addInterface(ProvidedInterface, Object, Scope)} for each service that is started.
         * 
         * @return Returns the runtime of the component.
         */