Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/**
* Layer abstract class implementing generic behaviour of a protocol layer
*
* @author ETSI / STF424
* @version $URL$
* $Id$
*
*/
package org.etsi.its.adapter.layers;
import java.util.Map;
import java.util.Stack;
import org.etsi.its.adapter.IManagementLayers;
/**
* Layer abstract class implementing generic behaviour of a protocol layer
*/
public abstract class Layer {
/**
* Parameter name for reception timestamp
*/
public static final String RECEPTION_TIMESTAMP = "ReceptionTimestamp";
/**
* Constructor
* @param management Layer management instance
* @param lowerStack Lower protocol stack
*/
public Layer(IManagementLayers management, Stack<String> lowerStack) {
this.management = management;
this.lowerStack = lowerStack;
this.initialized = false;
}
/**
* Initialises lower stack
*/
protected void initialize() {
if(!initialized && lowerStack != null && !lowerStack.isEmpty()) {
lowerLayerName = lowerStack.pop();
lowerLayer = LayerFactory.getInstance().createLayer(management, lowerLayerName, lowerStack);
lowerLayer.register(this);
}
initialized = true;
}
/**
* Transmits a message to registered lower layer after encapsulation
* @param message Encoded message to be sent
* @param params Layer parameters for sending message
* @return true if send operation is successful, false otherwise
*/
public boolean send(byte[] message, Map<String, Object> params) {
if(lowerLayer != null) {
return lowerLayer.send(message, params);
}
return true;
}
/**
* Callback method invoked by registered lower layer upon message reception from lower stack
* @param message Message received from lower layer
* @param lowerInfo Additional information transmitted by lower layers
* @param receptionTime Message reception time
*/
public void receive(byte[] message, Map<String, Object> lowerInfo) {
if(registeredUpperLayer != null) {
registeredUpperLayer.receive(message, lowerInfo);
}
}
/**
* Registers an upper layer.
* This method will also cause current layer to initialise its lower stack
* Messages received from lower layer will now be transmitted to upper layer, if necessary
* @param upperLayer Instance of the upper layer
*/
public void register(Layer upperLayer) {
registeredUpperLayer = upperLayer;
initialize();
}
/**
* Unregisters upper layer.
* This method will also cause current layer to unregister from its lower layer
* @param upperLayer
*/
public void unregister(Layer upperLayer) {
registeredUpperLayer = null;
if(lowerLayer != null) {
lowerLayer.unregister(this);
}
}
/**
* Name of the lower layer
*/
protected String lowerLayerName;
/**
* Registered upper layer instance
*/
protected Layer registeredUpperLayer = null;
/**
* Lower layer instance
*/
protected Layer lowerLayer = null;
/**
* Management instance
*/
protected IManagementLayers management = null;
/**
* Lower stack
*/
private Stack<String> lowerStack;
/**
* Set to true if lower stack has been initialised (true if layer is operational), false otherwise
*/
private boolean initialized;
}