View Javadoc
1   package de.dlr.bt.stc.bridge.uas;
2   
3   import org.eclipse.milo.opcua.sdk.server.nodes.UaObjectTypeNode;
4   import org.eclipse.milo.opcua.sdk.server.nodes.filters.AttributeFilters;
5   import org.eclipse.milo.opcua.stack.core.Identifiers;
6   import org.eclipse.milo.opcua.stack.core.UaException;
7   import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
8   import org.eclipse.milo.opcua.stack.core.types.builtin.DateTime;
9   import org.eclipse.milo.opcua.stack.core.types.builtin.Variant;
10  
11  import de.dlr.bt.stc.bridge.Bridge;
12  import de.dlr.bt.stc.init.Register;
13  import de.dlr.bt.stc.opcuaserver.ANodeCreator;
14  import de.dlr.bt.stc.opcuaserver.NodeFactory;
15  import de.dlr.bt.stc.opcuaserver.STCNamespace;
16  import de.dlr.bt.stc.opcuaserver.STCNamespace.Folders;
17  import lombok.extern.slf4j.Slf4j;
18  
19  @Slf4j
20  public class BridgeNode extends ANodeCreator {
21  	private static final String BRIDGE_TYPE = "BridgeType";
22  
23  	private static final String SOURCE_ID = "SourceID";
24  	private static final String SINK_ID = "SinkID";
25  	private static final String QUEUE_SIZE = "QueueSize";
26  	private static final String QUEUE_DURATION = "QueueDuration";
27  	private static final String VALUE_TEMPLATE = "ValueTemplate";
28  	private static final String CACHE_CLEARED = "CacheCleared";
29  	private static final String CURRENT_SIZE = "CurrentSize";
30  
31  	private UaObjectTypeNode typeNode;
32  
33  	@Register
34  	public static void register() {
35  		NodeFactory.getInstance().registerCreator(Bridge.class, BridgeNode::new);
36  	}
37  
38  	private BridgeNode(STCNamespace namespace) {
39  		super(namespace, "stc", "bridge");
40  	}
41  
42  	@Override
43  	public void createObjectType() {
44  		var sourceid = namespace.createObjectTypeComponent(SOURCE_ID, namespace.newNodeId(nodePathType(SOURCE_ID)),
45  				Identifiers.String);
46  		var sinkid = namespace.createObjectTypeComponent(SINK_ID, namespace.newNodeId(nodePathType(SINK_ID)),
47  				Identifiers.String);
48  		var queuesize = namespace.createObjectTypeComponent(QUEUE_SIZE, namespace.newNodeId(nodePathType(QUEUE_SIZE)),
49  				Identifiers.Integer);
50  		var queueduration = namespace.createObjectTypeComponent(QUEUE_DURATION,
51  				namespace.newNodeId(nodePathType(QUEUE_DURATION)), Identifiers.Integer);
52  		var valuetemplate = namespace.createObjectTypeComponent(VALUE_TEMPLATE,
53  				namespace.newNodeId(nodePathType(VALUE_TEMPLATE)), Identifiers.String);
54  		var queuefull = namespace.createObjectTypeComponent(CACHE_CLEARED,
55  				namespace.newNodeId(nodePathType(CACHE_CLEARED)), Identifiers.DateTime);
56  		var currentsize = namespace.createObjectTypeComponent(CURRENT_SIZE,
57  				namespace.newNodeId(nodePathType(CURRENT_SIZE)), Identifiers.Integer);
58  
59  		typeNode = namespace.createObjectTypeNode(BRIDGE_TYPE, namespace.newNodeId(nodePathType(BRIDGE_TYPE)), sourceid,
60  				sinkid, queuesize, queueduration, valuetemplate, queuefull, currentsize);
61  	}
62  
63  	@Override
64  	public void createInstance(Object forNode, Folders folders) {
65  		if (!(forNode instanceof Bridge bridge))
66  			return;
67  
68  		try {
69  			String id = bridge.getKey();
70  			var uon = namespace.createObjectNode(typeNode, id, namespace.newNodeId(nodePathInst(id)),
71  					folders.getBridgeFolder());
72  
73  			namespace.setObjectNodeComponent(uon, SOURCE_ID, new Variant(bridge.getSourceKey()));
74  			namespace.setObjectNodeComponent(uon, SINK_ID, new Variant(bridge.getSinkKey()));
75  			namespace.setObjectNodeComponent(uon, QUEUE_SIZE, new Variant(bridge.getQueueSize()));
76  			namespace.setObjectNodeComponent(uon, QUEUE_DURATION, new Variant(bridge.getQueueDuration()));
77  			namespace.setObjectNodeComponent(uon, VALUE_TEMPLATE, new Variant(bridge.getValueTemplate()));
78  
79  			var qf = namespace.getObjectNodeComponent(uon, CACHE_CLEARED);
80  			if (qf != null) {
81  				qf.getFilterChain().addLast(AttributeFilters
82  						.getValue(context -> new DataValue(new Variant(new DateTime(bridge.getCacheCleared())))));
83  			}
84  
85  			var cs = namespace.getObjectNodeComponent(uon, CURRENT_SIZE);
86  			if (cs != null) {
87  				cs.getFilterChain().addLast(
88  						AttributeFilters.getValue(context -> new DataValue(new Variant(bridge.getCurrentCacheSize()))));
89  			}
90  
91  			addRootNode(forNode, uon);
92  		} catch (UaException e) {
93  			log.info("Exception during creation of NodeInstance {}: {}", bridge.getKey(), e);
94  		}
95  
96  	}
97  
98  }