Inheritance diagram for de.stz.bt.fnd.FND_DataPointContext:
Public Member Functions | |
FND_DataPointContext (Element config) | |
void | init () |
FND_DatagramFactory | getDatagramFactory () |
FND_DataPointFactory | getDataPointFactory () |
int | getContextControlType () |
InetAddress | getTarget () |
List | enumerateAllDatapoints () |
FND_MessagePoint | getMessagePoint (String dpid) |
FND_SwitchPoint | getSwitchPoint (String dpid) |
FND_MeasurePoint | getMeasurePoint (String dpid) |
FND_SetPoint | getSetPoint (String dpid) |
FND_TransferPoint | getTransferPoint (String dpid) |
FND_CollectAddressPoint | getCollectAddresspoint (String dpid) |
Static Public Attributes | |
final int | CENTRAL = 0 |
final int | ISLAND = 1 |
Protected Member Functions | |
synchronized void | handleNORMALDatagram (FND_Datagram dgram) throws Exception |
synchronized void | handleREJECTDatagram (FND_Datagram dgram) |
synchronized void | handleERRORDatagram (FND_Datagram dgram) |
void | sendDatagram (FND_Datagram out) |
Protected Attributes | |
String | URL_PREFIX = "" |
FND_DatagramFactory | dgramFactory |
FND_DataPointFactory | dpFactory |
LinkedHashMap | datapoints = new LinkedHashMap() |
- FND Connectivity This service provides means of receiving FND_Datagram Messages and to deliver messages to. It is configurable to act with other systems or processes. At the moment it runs a FND UDP Server to interact with datagram messages. extensions will be built for using the IBM MQTT Architecture.
- FND DataPoint Factory The factory provides means of creating datapoints. The handling of the datapoints is done by the context. The reason why this is a factory is that the context (and also the factory as subcomponent) are configured, so that we do't need to care about this when we need a DataPoint Object
- FND Datagram Factory This factory provides datagrams needed by the datapoints, or by an external entity that want's to access an datapoint.
A datagram has a source and a drain. It is sourced either by API Interaction with a datapoint, or by a datagram received through an outside interface like the UDPServer. The Datagram Factory provides the source, and should in the future also be the sink and contain a datagram pool for deterministic memory consumption
|
Default Constructor. Set the configuration Element and detaches it from its Tree.
00126 { 00127 this.config = (Element) config.clone(); 00128 this.config.detach(); 00129 dpFactory.setContext(this); 00130 } |
|
00478 {
00479 return contextControlType;
00480 }
|
|
00201 {
00202 return dgramFactory;
00203 }
|
|
Implements de.stz.bt.framework.DataPointContext.
00208 {
00209 return dpFactory;
00210 }
|
|
00502 {
00503 return target;
00504 }
|
|
this method handles error datagrams Only ISLAND contexts can send error datagrams, son only CENTRAL contexts have to handle them
|
|
handles a normal datagram. In this method we have to diffenratiate the type of the datagram and check if this context is responsible for handling it with one of it's datapoints
00309 { 00310 00311 // get the datapoint address from the datagram 00312 byte[] dp_id = dgram.getDataPointID(); 00313 logger.debug("Context: got NORMAL datagram"); 00314 logger.debug("for DP ID: " + new String(dp_id)); 00315 00316 //This checks if a datapoint with the given ID exists, else creates 00317 // one. 00318 // This should be optional by adding a flag in the config 00319 if (!datapoints.containsKey(URL_PREFIX + new String(dp_id).trim())) { 00320 dpFactory.createDataPointFromDatagram(dgram); 00321 } 00322 00323 // TODO: very big mistake! we create a datapoint and afterwards it 00324 // happens that we don't want to handle it. 00325 // we have to encapsulate this code and execute it from each of the 00326 // select 00327 // methods below !!!!! 00328 00329 // Finally we get the datapoint (have to handle exceptions if dp is not 00330 // auto-created) 00331 FND_DataPoint dp = (FND_DataPoint) datapoints.get(URL_PREFIX 00332 + new String(dp_id).trim()); 00333 00334 // --- 00335 dp.setLastAccessTime(); 00336 if (dgram.getDatapointType() != dp.getDp_type()) { 00337 logger 00338 .warn("datapoint type and adressed type mismatch --> rejecting datagram"); 00339 sendDatagram(dgramFactory.getREJECTDatagram(dgram)); 00340 } else { 00341 //TODO: check for convinience method 00342 byte d_r = dgram.getTransportControl()[0]; 00343 FND_Datagram result = null; 00344 switch (d_r) { 00345 00346 //This is executed if we receive a cmd 00347 //happens only on islands 00348 // we have to put the 00349 // invoke id into the receive pool 00350 // we check this and reject if needed 00351 case FND_Datagram.D_R_CMD: 00352 // TODO: handle invoke_id 00353 //If this is a central context we do handle no CMD 00354 if (this.contextControlType == FND_DataPointContext.CENTRAL) { 00355 logger 00356 .warn("central context can not handle CMD datagrams --> rejecting"); 00357 result = dgramFactory.getREJECTDatagram(dgram); 00358 sendDatagram(result); 00359 } else { 00360 logger.debug("handle CMD datagram"); 00361 logger 00362 .debug("SHORTCUT: I just return a response datagram and put into queue"); 00363 // we set the busy flag on the datapoint for thread 00364 // synchronization 00365 logger.debug("locking datapoint"); 00366 dp.lockDP(); // the lock is reset from within an datapoint 00367 00368 result = dp.handleCMDDatagram(dgramFactory 00369 .getRSPDatagram(dgram)); 00370 sendDatagram(result); 00371 } 00372 break; 00373 00374 // This is executed if we receive a RSP datagram. 00375 // Happens only on centrals 00376 // 00377 case FND_Datagram.D_R_RSP: 00378 //TODO: handle invoke_id 00379 // If this is a island context we do handle no RSP 00380 if (this.contextControlType == FND_DataPointContext.ISLAND) { 00381 logger 00382 .warn("island context can not handle RSP --> rejecting"); 00383 result = dgramFactory.getREJECTDatagram(dgram); 00384 sendDatagram(result); 00385 } else { 00386 logger.debug("handle RSP datagram"); 00387 // we set the busy flag on the datapoint for thread 00388 // synchronization 00389 logger.debug("locking datapoint"); 00390 dp.lockDP(); // the lock is reset from within an datapoint 00391 00392 dp.handleRSPDatagram(dgram); 00393 } 00394 00395 case FND_Datagram.D_R_USM: 00396 // If this is a island context we do handle no USM 00397 // TODO: handle invoke_id 00398 if (this.contextControlType == FND_DataPointContext.ISLAND) { 00399 logger 00400 .warn("island context can not handle USM --> rejecting"); 00401 result = dgramFactory.getREJECTDatagram(dgram); 00402 sendDatagram(result); 00403 } else { 00404 logger.debug("handle USM datagram"); 00405 // we set the busy flag on the datapoint for thread 00406 // synchronization 00407 logger.debug("locking datapoint"); 00408 dp.lockDP(); // the lock is reset from within an datapoint 00409 00410 result = dp.handleUSMDatagram(dgramFactory 00411 .getACKDatagram(dgram)); 00412 sendDatagram(result); 00413 } 00414 break; 00415 00416 case FND_Datagram.D_R_ACK: 00417 // TODO: handle invoke_id 00418 // If this is a central context we do handle no ACK 00419 if (this.contextControlType == FND_DataPointContext.CENTRAL) { 00420 logger 00421 .warn("central context does not handle ACK --> rejecting"); 00422 result = dgramFactory.getREJECTDatagram(dgram); 00423 sendDatagram(result); 00424 } else { 00425 logger.debug("handle ACK datagram"); 00426 // we set the busy flag on the datapoint for thread 00427 // synchronization 00428 logger.debug("locking datapoint"); 00429 dp.lockDP(); // the lock is reset from within an datapoint 00430 00431 dp.handleACKDatagram(dgram); 00432 // an ACK does not have a result 00433 //sendDatagram(result); 00434 } 00435 break; 00436 } 00437 00438 } 00439 00440 } |
|
this method handles reject datagrams
|
|
After creating the object it has to be initialized by calling this method.
00152 { 00153 00154 // create a datapoint object for each declared datapoint 00155 createDatapoints(config.getChildren("datapoint")); 00156 00157 String mode = config.getAttributeValue("mode"); 00158 if (mode.equals("CENTRAL")) { 00159 setContextControlType(CENTRAL); 00160 logger.debug("Context Mode:CENTRAL"); 00161 } 00162 if (mode.equals("ISLAND")) { 00163 setContextControlType(ISLAND); 00164 logger.debug("Context Mode:ISLAND"); 00165 } 00166 00167 URL_PREFIX = config.getAttributeValue("prefix") 00168 + config.getAttributeValue("id") + "/"; 00169 logger.debug("context prefix: " + URL_PREFIX); 00170 00171 // setting the peer IP Address 00172 try { 00173 target = InetAddress.getByName(config.getChild("transport") 00174 .getAttributeValue("target")); 00175 logger.debug("target ip=" + target.getHostAddress()); 00176 } catch (UnknownHostException e1) { 00177 logger.error("Target Host is unknown :(", e1); 00178 } 00179 try { 00180 // reference context from server 00181 this.fndUDPServer = new FND_UDPTransport(this); 00182 } catch (SocketException e) { 00183 logger.error("socket error", e); 00184 } catch (IOException e) { 00185 // TODO Auto-generated catch block 00186 logger.error("IOException",e); 00187 e.printStackTrace(); 00188 } 00189 00190 fndUDPServer.start(); 00191 00192 //create the worker thread, later we can have more than one worker 00193 FND_ContextThread t = new FND_ContextThread(this); 00194 t.start(); 00195 00196 } |
|
Initial value: FND_DatagramFactory .getInstance() |
|
Initial value: FND_DataPointFactory .getInstance() |