(no commit message)
[utils] / system / general / src / main / java / org / wamblee / system / core / Component.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.system.core;
17
18 import java.util.List;
19
20 /**
21  * A component represents a part of a system that requires a number of
22  * interfaces and provides a number of interfaces.
23  * 
24  * The component interface provides the meta-data for a component. After calling
25  * {@link #start(Scope)}, an actual runtime representation of the component can
26  * be created which is independent of this component. As a special case, the
27  * runtime representation may be identical to the component instance but in
28  * general it is not. This allows a component to be used as a factory for
29  * creating objects.
30  * 
31  * 
32  * @author Erik Brakkee
33  */
34 public interface Component<Type> {
35     /**
36      * Gets the name of the subsystem.
37      * 
38      * @return Subsystem name.
39      */
40     String getName();
41
42     /**
43      * Prepends the context with a super context.
44      * 
45      */
46     void addContext(String aContext);
47
48     /**
49      * Getst the context.
50      * 
51      * @return Context or null if not set.
52      */
53     String getContext();
54
55     /**
56      * Gets the fully qualified name of the component which includes the context
57      * of the component. This method can only be used after the component has
58      * started.
59      * 
60      * @return Qualified name.
61      */
62     String getQualifiedName();
63
64     /**
65      * Gets a description of the provided interfaces.
66      * 
67      * @return Provided interfaces.
68      */
69     List<ProvidedInterface> getProvidedInterfaces();
70
71     /**
72      * Gets a description of the required interfaces.
73      * 
74      * @return Required interfaces.
75      */
76     List<RequiredInterface> getRequiredInterfaces();
77
78     /**
79      * Initialises the subsystem by starting all the services that it described
80      * as provided.
81      * 
82      * @param aScope
83      *            Scope with external interface implementations that are
84      *            available. The component must publish its runtime and its
85      *            provided interfaces in this scope.
86      * 
87      * @return Gets an object representing the runtime of the component.
88      */
89     Type start(Scope aScope);
90
91     /**
92      * Stops a component.
93      * 
94      * @param aRuntime
95      *            THe runtime part of the component.
96      */
97     void stop(Type aRuntime);
98 }