Now the component provides read-only access to the interfaces.
[utils] / system / general / src / test / java / org / wamblee / system / container / Application.java
1 /*
2  * Copyright 2007 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.container;
17
18 import org.wamblee.system.core.AbstractComponent;
19 import org.wamblee.system.core.DefaultRequiredInterface;
20 import org.wamblee.system.core.ProvidedInterface;
21 import org.wamblee.system.core.RequiredInterface;
22 import org.wamblee.system.core.Scope;
23 import org.wamblee.test.EventTracker;
24
25 public class Application extends AbstractComponent {
26         public static RequiredInterface[] required(boolean aOptional, String aPrefix) {
27                 return
28                 new RequiredInterface[] { 
29                         new DefaultRequiredInterface(aPrefix + "string", String.class, aOptional), 
30                         new DefaultRequiredInterface(aPrefix + "integer", Integer.class, aOptional)
31         };
32         }
33         
34         public static RequiredInterface[] required(boolean aOptional) {
35         return required(aOptional, "");
36     }
37     
38
39         private EventTracker<String> _tracker;
40         private String _string; 
41         private Integer _integer;
42         private double _random; 
43         
44         public Application() {
45             this("application");
46         }
47         
48         public Application(String aName) {
49             this(aName, "");
50     }
51         
52         public Application(String aName, String aPrefix) {
53         super(aName, new ProvidedInterface[0], required(false, aPrefix));
54         _random = Math.random();
55     }
56         
57         public Application(boolean aIsOptinal) { 
58                 super("application", new ProvidedInterface[0], required(true, "")); 
59         }
60         
61         public Application(EventTracker<String> aTracker) { 
62                 this();
63                 _tracker = aTracker; 
64         }
65
66         @Override
67         public Object doStart(Scope aScope) {
68                 track("start." + getName());
69                 _string = aScope.getInterfaceImplementation(getRequiredInterfaces().get(0).getProvider(), String.class);
70             _integer = aScope.getInterfaceImplementation(getRequiredInterfaces().get(1).getProvider(), Integer.class);
71             return _random; 
72         }
73         
74         public String getString() {
75                 return _string;
76         }
77         
78         public Integer getInteger() {
79                 return _integer;
80         }
81         
82         @Override
83         public void doStop(Object aRuntime) {
84                 track("stop." + getName());
85                 if ( _random != (Double)aRuntime) { 
86                         throw new IllegalArgumentException("Wrong runtime: expected " + _random + " but got " +
87                                         aRuntime);
88                 }
89         }
90         
91         private void track(String aString) {
92                 if ( _tracker == null ) { 
93                         return; 
94                 }
95                 _tracker.eventOccurred(aString);
96         }
97 }