0837d5f67f233ffe6c7d9e5ddd6c73bf52d05917
[utils] / system / general / src / main / java / org / wamblee / system / AbstractSubSystem.java
1 package org.wamblee.system;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11
12 /**
13  * Abstract subsystem class making it easy to implement new 
14  * subsystems.
15  */
16 public abstract class AbstractSubSystem implements SubSystem {
17         
18         private static final Log LOG = LogFactory.getLog(AbstractSubSystem.class);
19         
20         private String _name; 
21         private List<ServiceDescriptor> _provided;
22         private List<ServiceDescriptor> _required;
23         private Map<ServiceDescriptor, Service> _running; 
24         
25         /**
26          * Constructs the subsystem. 
27          * @param aName Name of the system. 
28          * @param aProvided Provided services. 
29          * @param aRequired Required services. 
30          */
31         protected AbstractSubSystem(String aName, ServiceDescriptor[] aProvided, 
32                         ServiceDescriptor[] aRequired) { 
33                 _name = aName; 
34                 _provided = new ArrayList<ServiceDescriptor>(); 
35                 _provided.addAll(Arrays.asList(aProvided));
36                 _required = new ArrayList<ServiceDescriptor>(); 
37                 _required.addAll(Arrays.asList(aRequired));
38                 _running = new HashMap<ServiceDescriptor, Service>(); 
39         }
40
41         @Override
42         public final String getName() {
43                 return _name; 
44         }
45
46         @Override
47         public final ServiceDescriptor[] getProvidedServices() {
48                 return _provided.toArray(new ServiceDescriptor[0]); 
49         }
50
51         @Override
52         public final ServiceDescriptor[] getRequiredServices() {
53                 return _required.toArray(new ServiceDescriptor[0]);
54         }
55
56         @Override
57         public final Service[] initialize(String aContext, Service[] aRequiredServices) {
58                 LOG.info("Initializing '" + aContext + "." + _name + "' with " + Arrays.asList(aRequiredServices));
59                 doInitialize(aContext + "." + getName(), aRequiredServices); 
60                 return _running.values().toArray(new Service[0]);
61         }
62         
63         /**
64          * Must be implemented for initializing the subsystem. 
65          * The implementation must call {@link #addService(Service)}
66          * for each service that is started. 
67          * @param aRequiredServices Services that are already running
68          * from other subsystems that may be used. 
69          */
70         protected abstract void doInitialize(String aContext, Service[] aRequiredServices); 
71         
72         /**
73          * Implementations must call this method to indicate that
74          * a new service has been started. 
75          * @param aService Service. 
76          */
77         protected final void addService(String aContext, Service aService) { 
78                 LOG.info(aContext + ": service '" + aService + "' started.");
79                 _running.put(aService.getDescriptor(), aService);
80         }
81
82         @Override
83         public Service[] getRunningServices() {
84                 return _running.values().toArray(new Service[0]);
85         }
86         
87         @Override
88         public String toString() {
89                 return _name; 
90         }
91
92 }