Newer
Older
/**
* Component manager that handles ports and component creation
*
* @author ETSI / STF424
* @version $URL$
* $Id$
*
*/
package org.etsi.its.adapter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Observer;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import org.etsi.common.ITuple;
import org.etsi.common.Tuple;
import org.etsi.its.adapter.ports.IObservable;
import org.etsi.its.adapter.ports.IPort;
import org.etsi.ttcn.tri.TriComponentId;
import org.etsi.ttcn.tri.TriPortId;
/**
* Component manager that handles ports and component creation
*/
public class ComponentMgr{
/**
* Association Component ID <-> Component reference
*/
private LinkedHashMap<String, TriComponentId> mapCompNameToTriComp;
/**
* Association Component ID <-> { (TTCN-3 Port reference / SUT Port reference) }
*/
private LinkedHashMap<String, Map<String, ITuple<TriPortId, IPort>>> mapTriPortToTuple;
/**
* Used to add Observer object
*/
private TestAdapter adapter;
/**
* Constructor
* @param adapter TestAdapter reference, required for Observer/Observable pattern
*/
public ComponentMgr(final TestAdapter adapter) {
this.adapter = adapter;
mapCompNameToTriComp = new LinkedHashMap<String, TriComponentId>();
mapTriPortToTuple = new LinkedHashMap<String, Map<String, ITuple<TriPortId, IPort>>>();
}
/**
* Adds a new component
* If the component was already added, nothing is done
* @param component The component to add
*/
public void addComponent(TriComponentId component) {
// Sanity check
if(component == null) {
TERFactory.getInstance().logError("Error: Trying to add null component");
return;
}
if(!mapCompNameToTriComp.containsKey(component.getComponentId())) {
// Create an entry in the list of Component
mapCompNameToTriComp.put(component.getComponentId(), component);
if(!mapTriPortToTuple.containsKey(component.getComponentId())) {
// Create an entry in the list of Component/Ports
mapTriPortToTuple.put(component.getComponentId(), new LinkedHashMap<String, ITuple<TriPortId, IPort>>());
}
}
}
/**
* Adds a new port to the specified component
* @param component The component reference
* @param portname The port name
* @param port The port to add
*/
public void addPort(final String componentName, final TriPortId ttcnPort, final IPort port) {
// Sanity checks
if(componentName.isEmpty() || (ttcnPort == null) || (port == null)) {
return;
}
if(!mapCompNameToTriComp.containsKey(componentName)) {
TERFactory.getInstance().logError("Error: Trying to add port to unknown component");
return;
}
if(!mapTriPortToTuple.containsKey(componentName)) {
// Create an entry in the list of Component/Ports
mapTriPortToTuple.put(componentName, new LinkedHashMap<String, ITuple<TriPortId, IPort>>());
}
Map<String, ITuple<TriPortId, IPort>> portItem = mapTriPortToTuple.get(componentName);
if(!portItem.containsKey(ttcnPort.getPortName())) {
portItem.put(ttcnPort.getPortName(), new Tuple<TriPortId, IPort>(ttcnPort, port));
((IObservable)port).addObserver((Observer) adapter);
mapTriPortToTuple.put(componentName, portItem);
}
}
/**
* Gets the component reference from its name
* @param componentName The component name
* @return The component reference if the component exists, null otherwise
*/
public TriComponentId getComponent(String componentName) {
// Sanity checks
if(componentName == null || componentName.isEmpty()) {
TERFactory.getInstance().logError("Invalid component");
return null;
}
return mapCompNameToTriComp.get(componentName);
}
/**
* Retrieves the TTCN-3 port identifier (TriPortId) from component/port names
* @param componentName The component reference
* @param portName The port name
* @return The TTCN-3 port identifier if the component and the port exists, null otherwise
*/
public TriPortId getPortId(String componentName, String portName) {
// Sanity checks
if(componentName.isEmpty() || portName.isEmpty()) {
return null;
}
if(!mapCompNameToTriComp.containsKey(componentName)) {
TERFactory.getInstance().logError("Unknown component");
return null;
}
if(!mapTriPortToTuple.containsKey(componentName)) {
TERFactory.getInstance().logError("No port list entry");
return null;
}
Map<String, ITuple<TriPortId, IPort>> portItem = mapTriPortToTuple.get(componentName);
if(!portItem.containsKey(portName)) {
return null;
}
ITuple<TriPortId, IPort> item = portItem.get(portName);
return item.getA();
}
/**
* Retrieves the test adapter port identifier (Port or IAdapterPort) from component/port names
* @param componentName The component owner
* @return The port reference if the component and the port exists, null otherwise
*
* @see Port
* @see IAdapterPort
*/
public IPort getPort(String componentName, String portName) {
// Sanity checks
if(componentName.isEmpty() || portName.isEmpty()) {
return null;
}
if(!mapCompNameToTriComp.containsKey(componentName)) {
TERFactory.getInstance().logError("Unknown component");
return null;
}
if(!mapTriPortToTuple.containsKey(componentName)) {
TERFactory.getInstance().logError("No port list entry");
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
return null;
}
Map<String, ITuple<TriPortId, IPort>> portItem = mapTriPortToTuple.get(componentName);
if(!portItem.containsKey(portName)) {
return null;
}
ITuple<TriPortId, IPort> item = portItem.get(portName);
return item.getB();
}
/**
* Removes the specified component
*
* Note that after the port removal, if the component has no more port, it will be removed also
*
* @param component The component reference
*/
public void removeComponent(String componentName) {
removeAllPorts();
}
/**
* Removes the specified port
*
* Note that all ports attached to this component will be removed also
*
* @param componentName The component name to remove
*/
public void removePort(String componentName, String portName) {
// Sanity checks
if(componentName.isEmpty() || portName.isEmpty()) {
return;
}
if(!mapCompNameToTriComp.containsKey(componentName)) {
TERFactory.getInstance().logError("Unknown component");
return;
}
if(!mapTriPortToTuple.containsKey(componentName)) {
TERFactory.getInstance().logError("No port list entry");
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
return;
}
Map<String, ITuple<TriPortId, IPort>> portItem = mapTriPortToTuple.get(componentName);
if(!portItem.containsKey(portName)) {
return;
}
// Remove Observers
((IObservable)portItem.get(portName).getB()).deleteObservers();
// Call dispose
((IPort)portItem.get(portName).getB()).dispose();
// Remove item
portItem.remove(portName);
if(portItem.size() != 0) {
mapTriPortToTuple.put(componentName, portItem);
} else {
mapTriPortToTuple.remove(componentName);
mapCompNameToTriComp.remove(componentName);
if(mapCompNameToTriComp.isEmpty()) {
mapCompNameToTriComp.clear();
}
}
if(mapTriPortToTuple.isEmpty()) {
mapTriPortToTuple.clear();
}
}
/**
* Removes all ports.
*/
public void removeAllPorts() {
// Remove all ports
for(Object componentName : mapTriPortToTuple.keySet().toArray()) {
Map<String, ITuple<TriPortId, IPort>> portItem = mapTriPortToTuple.get(componentName);
for(Object portName : portItem.keySet().toArray()) {
removePort((String)componentName, (String)portName);
}
}
// Remove component mapping
mapCompNameToTriComp.clear();
}
}