a80aa1a21f0c7136b2acd66d8c2b8f9eff6091bf
[utils] / system / general / src / main / java / org / wamblee / system / Container.java
1 package org.wamblee.system;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.List;
6
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9
10 import sun.util.LocaleServiceProviderPool.LocalizedObjectGetter;
11
12 /**
13  * Composite system consisting of multiple subsystems. 
14  *
15  * @author Erik Brakkee
16  */
17 public class Container extends AbstractComponent {
18
19         private static final Log LOG = LogFactory.getLog(Container.class);
20
21         private Component[] _systems;
22
23         /**
24          * Construcst the composite system. 
25          * @param aName Name of the system. 
26          * @param aRegistry Service registry.
27          * @param aSystems Subsystems. 
28          * @param aProvided Provided services of the system. 
29          * @param aRequired Required services by the system. 
30          */
31         public Container(String aName, ServiceRegistry aRegistry, Component[] aSystems,
32                         ProvidedInterfaceDescriptor[] aProvided, RequiredInterfaceDescriptor[] aRequired) {
33                 super(aName, aRegistry, aProvided, aRequired);
34                 _systems = aSystems;
35                 validate();
36         }
37
38         /**
39          * Validates the subsystems together to check that there are
40          * no required services not in the required list and 
41          * no services in the provided list that cannot be provided. 
42          * Also logs a warning in case of superfluous requirements.  
43          */
44         private void validate() {
45                 List<InterfaceDescriptor> provided = new ArrayList<InterfaceDescriptor>();
46                 for (Component system : _systems) {
47                         provided.addAll(Arrays.asList(system.getProvidedServices()));
48                 }
49
50                 List<InterfaceDescriptor> required = new ArrayList<InterfaceDescriptor>();
51                 for (Component system : _systems) {
52                         required.addAll(Arrays.asList(system.getRequiredServices()));
53                 }
54
55                 for (InterfaceDescriptor service : getProvidedServices()) {
56                         if (!(provided.contains(service))) {
57                                 throw new SystemAssemblyException(getName() + ": Service '" + service
58                                                 + "' is not provided by any of the subsystems");
59                         }
60                 }
61
62                 for (InterfaceDescriptor service : getRequiredServices()) {
63                         if (!(required.contains(service))) {
64                                 info("Service '"
65                                                 + service
66                                                 + "' indicated as required is not actually required by any of the subsystems");
67                         }
68                 }
69
70                 List<InterfaceDescriptor> reallyRequired = new ArrayList<InterfaceDescriptor>(
71                                 required);
72                 for (InterfaceDescriptor service : provided) {
73                         reallyRequired.remove(service); 
74                 }
75                 for (InterfaceDescriptor service: getRequiredServices()) { 
76                         reallyRequired.remove(service); 
77                 }
78                 String missingRequired = "";
79                 for (InterfaceDescriptor service: reallyRequired) {
80                         missingRequired += service + "\n";
81                 }
82                 if ( missingRequired.length() > 0 ) { 
83                         throw new SystemAssemblyException(getName() + ": missing required services\n" + missingRequired);
84                 }
85         }
86
87         @Override
88         protected void doStart(String aContext, Service[] aRequiredServices) {
89                 List<ProvidedInterfaceDescriptor> descriptors = new ArrayList<ProvidedInterfaceDescriptor>();
90                 for (Service service : aRequiredServices) {
91                         descriptors.add(service.getDescriptor());
92                 }
93                 SystemAssembler assembler = new SystemAssembler(aContext + "." + getName(), _systems,
94                                 descriptors.toArray(new ProvidedInterfaceDescriptor[0]));
95                 assembler.start(getRegistry(), aRequiredServices);
96         }
97         
98         @Override
99         protected void doStop() {
100                 for (int i = _systems.length-1; i >= 0; i--) { 
101                         _systems[i].stop();
102                 }
103         }
104
105         private void info(String aMsg) {
106                 LOG.info(getName() + ": " + aMsg);
107         }
108
109 }