OpenECHO
 All Classes Namespaces Files Functions Variables
EchoObject.java
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Sony Computer Science Laboratories, Inc. <info@kadecot.net>
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 com.sonycsl.echo.eoj;
17 
18 import java.io.IOException;
19 import java.net.InetAddress;
20 import java.nio.ByteBuffer;
21 import java.nio.ByteOrder;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.Iterator;
26 import java.util.List;
27 
36 
37 
38 public abstract class EchoObject {
39 
40  private EchoNode mNode = null;
41 
42 
43  private Receiver mReceiver = null;
44 
45 
46 
47  private HashSet<Byte> mStatusChangeAnnouncementProperties;
48  private HashSet<Byte> mSetProperties;
49  private HashSet<Byte> mGetProperties;
50 
51  public EchoObject() {
52  super();
53 
54  mStatusChangeAnnouncementProperties = new HashSet<Byte>();
55  mSetProperties = new HashSet<Byte>();
56  mGetProperties = new HashSet<Byte>();
57 
59  }
60 
61  public void onNew() {
62  Echo.getEventListener().onNewEchoObject(this);
63  }
64 
65  public void onFound() {
66  Echo.getEventListener().onNewEchoObject(this);
67  }
68 
69  protected void setupPropertyMaps() {}
70 
71  protected final void addStatusChangeAnnouncementProperty(byte epc) {
72  mStatusChangeAnnouncementProperties.add(epc);
73  }
74 
75  protected final void removeStatusChangeAnnouncementProperty(byte epc) {
76  if(mStatusChangeAnnouncementProperties.contains(epc))
77  mStatusChangeAnnouncementProperties.remove(epc);
78  }
79 
80  protected final void clearStatusChangeAnnouncementProperties() {
81  mStatusChangeAnnouncementProperties.clear();
82  }
83 
84  public final byte[] getStatusChangeAnnouncementProperties() {
85  byte[] ret = new byte[mStatusChangeAnnouncementProperties.size()];
86  Iterator<Byte> it = mStatusChangeAnnouncementProperties.iterator();
87  for(int i = 0; i < ret.length; i++) {
88  ret[i] = it.next();
89  }
90  return ret;
91  }
92 
93  protected final void addSetProperty(byte epc) {
94  mSetProperties.add(epc);
95  }
96 
97 
98  protected final void removeSetProperty(byte epc) {
99  if(mSetProperties.contains(epc))
100  mSetProperties.remove(epc);
101  }
102 
103  protected final void clearSetProperties() {
104  mSetProperties.clear();
105  }
106 
107  public final byte[] getSetProperties() {
108  byte[] ret = new byte[mSetProperties.size()];
109  Iterator<Byte> it = mSetProperties.iterator();
110  for(int i = 0; i < ret.length; i++) {
111  ret[i] = it.next();
112  }
113  return ret;
114  }
115 
116  protected final void addGetProperty(byte epc) {
117  mGetProperties.add(epc);
118  }
119 
120  protected final void removeGetProperty(byte epc) {
121  if(mGetProperties.contains(epc))
122  mGetProperties.remove(epc);
123  }
124 
125  protected final void clearGetProperties() {
126  mGetProperties.clear();
127  }
128 
129  public final byte[] getGetProperties() {
130  byte[] ret = new byte[mGetProperties.size()];
131  Iterator<Byte> it = mGetProperties.iterator();
132  for(int i = 0; i < ret.length; i++) {
133  ret[i] = it.next();
134  }
135  return ret;
136  }
137 
138 
139  @Override
140  public String toString() {
141  StringBuilder sb = new StringBuilder();
142  sb.append("groupCode:");
143  sb.append(String.format("%02x", getClassGroupCode()));
144  sb.append(",classCode:");
145  sb.append(String.format("%02x", getClassCode()));
146  sb.append(",instanceCode:");
147  sb.append(String.format("%02x", getInstanceCode()));
148  sb.append(",address:");
149  if(getNode() != null) {
150  sb.append(getNode().getAddressStr());
151  }
152  return new String(sb);
153  }
154 
155  public final byte getClassGroupCode() {
156  short code = getEchoClassCode();
157  return (byte)((code >> 8) & 0xFF);
158  }
159 
160  public final byte getClassCode() {
161  short code = getEchoClassCode();
162  return (byte)(code & 0xFF);
163  }
164 
165  public abstract byte getInstanceCode();
166 
167  public abstract short getEchoClassCode();
168 
169  public final int getEchoObjectCode() {
170  return EchoUtils.getEchoObjectCode(getEchoClassCode(), getInstanceCode());
171  }
172 
173  public final void setNode(EchoNode node) {
174  mNode = node;
175  }
176 
177  public final EchoNode getNode() {
178  return mNode;
179  }
180 
181  public final void removeNode() {
182  mNode = null;
183  }
184 
185  public final boolean isSelfObject() {
186  EchoNode node = getNode();
187  if(node==null) return false;
188  else return node.isSelfNode();
189 
190  }
191 
192  public final boolean isProxy() {
193  EchoNode node = getNode();
194  if(node==null) return true;
195  else return node.isProxy();
196  }
197 
198 
199  protected synchronized boolean setProperty(EchoProperty property) {
200  return false;
201  }
202 
203  protected synchronized byte[] getProperty(byte epc) {
204  return null;
205  }
206 
207  protected synchronized boolean isValidProperty(EchoProperty property) {
208  return false;
209  }
210 
211  public final void setReceiver(Receiver receiver) {
212  mReceiver = receiver;
213  }
214 
215  public final Receiver getReceiver() {
216  return mReceiver;
217  }
218 
219  public final EchoFrame onReceiveRequest(EchoFrame frame) {
220  /*
221  EchoProperty[] properties = frame.getProperties();
222 
223  Echo.EventListener listener = Echo.getEventListener();
224 
225  // receive response
226  for(EchoProperty p : properties) {
227  try {
228  switch(frame.getESV()) {
229  case EchoFrame.ESV_SET_RES: case EchoFrame.ESV_SETI_SNA: case EchoFrame.ESV_SETC_SNA:
230  if(mReceiver != null) mReceiver.onSetProperty(this, frame.getTid(), frame.getESV(), p, (p.pdc == 0));
231  if(listener != null) listener.onSetProperty(this, frame.getTid(), frame.getESV(), p, (p.pdc == 0));
232  break;
233  case EchoFrame.ESV_GET_RES: case EchoFrame.ESV_GET_SNA:
234  case EchoFrame.ESV_INF: case EchoFrame.ESV_INF_SNA:
235  case EchoFrame.ESV_INFC:
236  onReceiveProperty(p);
237  if(mReceiver != null) mReceiver.onGetProperty(this, frame.getTid(), frame.getESV(), p, (p.pdc != 0));
238  if(listener != null) listener.onGetProperty(this, frame.getTid(), frame.getESV(), p, (p.pdc != 0));
239  break;
240  case EchoFrame.ESV_INFC_RES:
241  if(mReceiver != null) mReceiver.onInformProperty(this, frame.getTid(), frame.getESV(), p);
242  if(listener != null) listener.onInformProperty(this, frame.getTid(), frame.getESV(), p);
243  break;
244  }
245  } catch(Exception e) {
246  try{if(listener != null) listener.onCatchException(e);}catch(Exception ex){}
247  }
248  }*/
249 
250  // receive request
251  byte esv = 0;
252  switch(frame.getESV()) {
253  case EchoFrame.ESV_SETI:
255  break;
256  case EchoFrame.ESV_SETC:
257  esv = EchoFrame.ESV_SET_RES;
258  break;
259  case EchoFrame.ESV_GET:
260  esv = EchoFrame.ESV_GET_RES;
261  break;
262  case EchoFrame.ESV_INF_REQ:
263  esv = EchoFrame.ESV_INF;
264  break;
265  case EchoFrame.ESV_INFC:
267  break;
268  case EchoFrame.ESV_SET_GET:
270  break;
271  }
272  EchoFrame response = new EchoFrame(frame.getDstEchoClassCode(), frame.getDstEchoInstanceCode()
273  , frame.getSrcEchoClassCode(), frame.getSrcEchoInstanceCode()
274  , frame.getSrcEchoAddress(), esv);
275  response.setTID(frame.getTID());
276  switch(frame.getESV()) {
277  case EchoFrame.ESV_SETI:
278  case EchoFrame.ESV_SETC:
279  for(EchoProperty p : frame.getPropertyList()) {
280  onReceiveSetRequest(p, response);
281  }
282  break;
283  case EchoFrame.ESV_GET:
284  case EchoFrame.ESV_INF_REQ:
285  for(EchoProperty p : frame.getPropertyList()) {
286  onReceiveGetRequest(p.epc, response);
287  }
288  break;
289  case EchoFrame.ESV_INFC:
290  for(EchoProperty p : frame.getPropertyList()) {
291  response.addPropertyForResponse(p.epc);
292  }
293  break;
294  }
295  return response;
296 
297 
298  }
299 
300  protected final void onReceiveSetRequest(EchoProperty property, EchoFrame response) {
301  boolean success = false;
302  Echo.EventListener listener = Echo.getEventListener();
303  try {
304  if(mSetProperties.contains(property.epc)) {
305  boolean valid = isValidProperty(property);
306  if(listener != null) listener.isValidProperty(this, property, valid);
307  if(valid) {
308  // valid property
309  success = setProperty(property);
310  if(listener != null) listener.setProperty(this, property, success);
311  } else {
312  // invalid property
313  success = false;
314  }
315  } else {
316  success = false;
317  }
318  } catch (Exception e) {
319  //e.printStackTrace();
320  success = false;
321  try{if(listener != null) listener.onCatchException(e);}catch(Exception ex){}
322  }
323 
324  if(success) {
325  response.addPropertyForResponse(property.epc);
326  } else {
327  response.addPropertyForResponse(property.epc, property.edt);
328  }
329  }
330 
331  protected final void onReceiveGetRequest(byte epc, EchoFrame response) {
332  byte[] edt = null;
333  Echo.EventListener listener = Echo.getEventListener();
334  try {
335  if(response.getESV() == EchoFrame.ESV_GET_RES || response.getESV() == EchoFrame.ESV_GET_SNA) {
336  edt = mGetProperties.contains(epc) ? getProperty(epc) : null;
337  } else {
338  edt = getProperty(epc);
339  }
340  EchoProperty property = new EchoProperty(epc, edt);
341  listener.getProperty(this, property);
342  boolean valid = isValidProperty(property);
343  if(listener != null) listener.isValidProperty(this, property, valid);
344  if(valid) {
345  // valid property
346  } else {
347  // invalid property
348  edt = null;
349  }
350  } catch (Exception e) {
351  //e.printStackTrace();
352  edt = null;
353  try{if(listener != null) listener.onCatchException(e);}catch(Exception ex){}
354  }
355  response.addPropertyForResponse(epc, edt);
356  }
357 
358  public Setter set() {
359  return set(true);
360  }
361 
362  public Setter set(boolean responseRequired) {
363  return new Setter(getEchoClassCode(), getInstanceCode()
364  , getNode().getAddressStr(), responseRequired);
365  }
366 
367  public Getter get() {
368  return new Getter(getEchoClassCode(), getInstanceCode()
369  , getNode().getAddressStr());
370  }
371 
372  public Informer inform() {
373  return inform(isSelfObject());
374  }
375 
376  protected Informer inform(boolean multicast) {
377 
378  String address;
379  if(multicast) {
381  } else {
382  address = getNode().getAddressStr();
383  }
384  return new Informer(getEchoClassCode(), getInstanceCode()
385  , address, isSelfObject());
386  }
387 
388  protected InformerC informC(String address) {
389  return new InformerC(getEchoClassCode(), getInstanceCode()
390  , address);
391  }
392 
393 
394  public static class Receiver {
395 
396  public void onReceive(EchoObject eoj, EchoFrame frame){
397  onReceiveFrame(eoj, frame);
398 
399  switch(frame.getESV()) {
400  case EchoFrame.ESV_SET_RES: case EchoFrame.ESV_SETI_SNA: case EchoFrame.ESV_SETC_SNA:
401  for(EchoProperty p : frame.getPropertyList()) {
402  onSetProperty(eoj, frame.getTID(), frame.getESV(), p, (p.pdc == 0));
403  }
404  break;
405  case EchoFrame.ESV_GET_RES: case EchoFrame.ESV_GET_SNA:
406  case EchoFrame.ESV_INF: case EchoFrame.ESV_INF_SNA:
407  case EchoFrame.ESV_INFC:
408  for(EchoProperty p : frame.getPropertyList()) {
409  onGetProperty(eoj, frame.getTID(), frame.getESV(), p, (p.pdc != 0));
410  }
411  break;
412  case EchoFrame.ESV_INFC_RES:
413  for(EchoProperty p : frame.getPropertyList()) {
414  onInformProperty(eoj, frame.getTID(), frame.getESV(), p);
415  }
416  break;
417  }
418  }
419 
420  public void onReceiveFrame(EchoObject eoj, EchoFrame frame) {
421 
422  }
423 
424  protected boolean onSetProperty(EchoObject eoj, short tid, byte esv, EchoProperty property, boolean success) {
425  return false;
426  }
427 
428  protected boolean onGetProperty(EchoObject eoj, short tid, byte esv, EchoProperty property, boolean success) {
429  return false;
430  }
431 
432  protected boolean onInformProperty(EchoObject eoj, short tid, byte esv, EchoProperty property) {
433  return false;
434  }
435 
436  }
437 
438  protected static abstract class Sender {
439  protected short mSrcEchoClassCode;
440  protected byte mSrcEchoInstanceCode;
441  protected short mDstEchoClassCode;
442  protected byte mDstEchoInstanceCode;
443  protected String mDstEchoAddress;
444  protected byte mESV;
445 
446 
447  public Sender(short srcEchoClassCode, byte srcEchoInstanceCode
448  , short dstEchoClassCode, byte dstEchoInstanceCode
449  , String dstEchoAddress, byte esv) {
450  mSrcEchoClassCode = srcEchoClassCode;
451  mSrcEchoInstanceCode = srcEchoInstanceCode;
452  mDstEchoClassCode = dstEchoClassCode;
453  mDstEchoInstanceCode = dstEchoInstanceCode;
454  mDstEchoAddress = dstEchoAddress;
455  mESV = esv;
456  }
457  /*
458  protected EchoFrame send() throws IOException {
459  short tid = EchoSocket.getNextTID();
460  EchoFrame frame = new EchoFrame(tid, mSeoj, mDeoj, mEsv);
461  switch(mEsv) {
462  case EchoFrame.ESV_SETI : case EchoFrame.ESV_SETC :
463  for(EchoProperty p : mPropertyList) {
464  if(isValidProperty(p)) {
465  frame.addProperty(p);
466  }
467  }
468  break;
469  case EchoFrame.ESV_GET : case EchoFrame.ESV_INF_REQ :
470  for(EchoProperty p : mPropertyList) {
471  frame.addProperty(p);
472  }
473  break;
474  case EchoFrame.ESV_INF : case EchoFrame.ESV_INFC :
475 
476  for(EchoProperty p : mPropertyList) {
477  EchoProperty pp = new EchoProperty(p.epc, mEoj.getProperty(p.epc));
478  if(isValidProperty(pp)) {
479  frame.addProperty(pp);
480  }
481  }
482  break;
483  }
484  byte[] data = frame.getFrameByteArray();
485 
486  if (mMulticast) {
487  EchoSocket.sendGroup(data);
488  } else {
489  //EchoSocket.send(mEoj.getNode().getAddress(), data);
490  if(getDeoj().getNode() == null) {
491  throw new IOException("Not found target node.");
492  }
493  EchoSocket.send(getDeoj().getNode().getAddress(), data);
494  }
495  //if(Echo.getMethodInvokedListener() == null) return;
496  //Echo.getMethodInvokedListener().onInvokedSendMethod(frame);
497 
498 
499  Echo.EventListener listener = Echo.getEventListener();
500  try {
501  if(listener != null) listener.sendEvent(frame);
502  } catch(Exception e) {
503  try{if(listener != null) listener.onCatchException(e);}catch(Exception ex){}
504  }
505  return tid;
506  }*/
507 
508  abstract EchoFrame send() throws IOException ;
509  public void send(EchoFrame frame) throws IOException {
510  short tid = EchoSocket.nextTID();
511  frame.setTID(tid);
512  EchoSocket.sendUDPFrame(frame);
513  }
514  abstract EchoFrame sendTCP() throws IOException ;
515  public void sendTCP(EchoFrame frame) throws IOException {
516  short tid = EchoSocket.nextTID();
517  frame.setTID(tid);
518  EchoSocket.sendTCPFrame(frame);
519  }
520 
521  public void setSeoj(short srcEchoClassCode, byte srcEchoInstanceCode) {
522  mSrcEchoClassCode = srcEchoClassCode;
523  mSrcEchoInstanceCode = srcEchoInstanceCode;
524  }
525 
526 
527  public void setDeoj(short dstEchoClassCode, byte dstEchoInstanceCode
528  , String dstEchoAddress) {
529  mDstEchoClassCode = dstEchoClassCode;
530  mDstEchoInstanceCode = dstEchoInstanceCode;
531  mDstEchoAddress = dstEchoAddress;
532  }
533 
534  }
535 
536  public static class Setter extends Sender {
537 
538 
539  protected ArrayList<EchoProperty> mPropertyList;
540  public Setter(short dstEchoClassCode, byte dstEchoInstanceCode
541  , String dstEchoAddress, boolean responseRequired) {
542  super(NodeProfile.ECHO_CLASS_CODE
543  , Echo.getSelfNode().getNodeProfile().getInstanceCode()
544  , dstEchoClassCode, dstEchoInstanceCode, dstEchoAddress
545  , responseRequired ? EchoFrame.ESV_SETC : EchoFrame.ESV_SETI);
546  mPropertyList = new ArrayList<EchoProperty>();
547  }
548 
549  @Override
550  public EchoFrame send() throws IOException {
551 
552  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
553  , mDstEchoClassCode, mDstEchoInstanceCode
554  , mDstEchoAddress, mESV);
555 
556  for(EchoProperty p : mPropertyList) {
557  frame.addProperty(p);
558  }
559  send(frame);
560  return frame;
561  }
562 
563  @Override
564  public EchoFrame sendTCP() throws IOException {
565 
566  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
567  , mDstEchoClassCode, mDstEchoInstanceCode
568  , mDstEchoAddress, mESV);
569 
570  for(EchoProperty p : mPropertyList) {
571  frame.addProperty(p);
572  }
573  sendTCP(frame);
574  return frame;
575  }
576 
577  public Setter reqSetProperty(byte epc, byte[] edt) {
578  mPropertyList.add(new EchoProperty(epc, edt));
579  return this;
580  }
581 
582 
583  }
584 
585  public static class Getter extends Sender {
586  protected ArrayList<Byte> mEPCList;
587 
588 
589 
590  public Getter(short dstEchoClassCode, byte dstEchoInstanceCode
591  , String dstEchoAddress) {
592  super(NodeProfile.ECHO_CLASS_CODE
593  , Echo.getSelfNode().getNodeProfile().getInstanceCode()
594  , dstEchoClassCode, dstEchoInstanceCode, dstEchoAddress
596  mEPCList = new ArrayList<Byte>();
597  }
598 
599  @Override
600  public EchoFrame send() throws IOException {
601 
602  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
603  , mDstEchoClassCode, mDstEchoInstanceCode
604  , mDstEchoAddress, mESV);
605 
606 
607  for(Byte epc : mEPCList) {
608  frame.addProperty(new EchoProperty(epc));
609  }
610  send(frame);
611  return frame;
612  }
613 
614  @Override
615  public EchoFrame sendTCP() throws IOException {
616 
617  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
618  , mDstEchoClassCode, mDstEchoInstanceCode
619  , mDstEchoAddress, mESV);
620 
621 
622  for(Byte epc : mEPCList) {
623  frame.addProperty(new EchoProperty(epc));
624  }
625  sendTCP(frame);
626  return frame;
627  }
628 
629  public Getter reqGetProperty(byte epc) {
630  mEPCList.add(epc);
631  return this;
632  }
633 
634  }
635 
636 
637  public static class Informer extends Sender {
638  protected ArrayList<Byte> mEPCList;
639 
640  public Informer(short echoClassCode, byte echoInstanceCode
641  , String dstEchoAddress, boolean isSelfObject) {
642  super(
643  isSelfObject ? echoClassCode : NodeProfile.ECHO_CLASS_CODE
644  , isSelfObject ? echoInstanceCode : Echo.getSelfNode().getNodeProfile().getInstanceCode()
645  , isSelfObject ? NodeProfile.ECHO_CLASS_CODE : echoClassCode
646  , isSelfObject ? NodeProfile.INSTANCE_CODE : echoInstanceCode
647  , dstEchoAddress
648  , isSelfObject ? EchoFrame.ESV_INF : EchoFrame.ESV_INF_REQ);
649  mEPCList = new ArrayList<Byte>();
650  }
651 
652  @Override
653  public EchoFrame send() throws IOException {
654 
655  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
656  , mDstEchoClassCode, mDstEchoInstanceCode
657  , mDstEchoAddress, mESV);
658 
659  if(mESV == EchoFrame.ESV_INF_REQ) {
660  for(Byte epc : mEPCList) {
661  frame.addProperty(new EchoProperty(epc));
662  }
663  } else {
664  EchoNode node = Echo.getSelfNode();
665  EchoObject seoj = node.getInstance(mSrcEchoClassCode, mSrcEchoInstanceCode);
666  if(seoj.get() == null) {
667  return frame;
668  }
669  for(Byte epc : mEPCList) {
670  byte[] edt = seoj.getProperty(epc);
671 
672  if(edt != null) {
673  EchoProperty property = new EchoProperty(epc, edt);
674 
675  if(seoj.isValidProperty(property)) {
676  frame.addProperty(property);
677  }
678  }
679  }
680  }
681 
682  send(frame);
683  return frame;
684  }
685 
686  public Informer reqInformProperty(byte epc) {
687  mEPCList.add(epc);
688  return this;
689  }
690 
691  @Override
692  public EchoFrame sendTCP() throws IOException {
693 
694  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
695  , mDstEchoClassCode, mDstEchoInstanceCode
696  , mDstEchoAddress, mESV);
697 
698  if(mESV == EchoFrame.ESV_INF_REQ) {
699  for(Byte epc : mEPCList) {
700  frame.addProperty(new EchoProperty(epc));
701  }
702  } else {
703  EchoNode node = Echo.getSelfNode();
704  if(node == null) {
705  return frame;
706  }
707  EchoObject seoj = node.getInstance(mSrcEchoClassCode, mSrcEchoInstanceCode);
708  if(seoj.get() == null) {
709  return frame;
710  }
711  for(Byte epc : mEPCList) {
712  byte[] edt = seoj.getProperty(epc);
713 
714  if(edt != null) {
715  EchoProperty property = new EchoProperty(epc, edt);
716 
717  if(seoj.isValidProperty(property)) {
718  frame.addProperty(property);
719  }
720  }
721  }
722  }
723 
724  sendTCP(frame);
725  return frame;
726  }
727  }
728 
729  public static class InformerC extends Sender {
730  protected ArrayList<Byte> mEPCList;
731 
732  public InformerC(short srcEchoClassCode, byte srcEchoInstanceCode
733  , String dstEchoAddress) {
734  super(NodeProfile.ECHO_CLASS_CODE
735  , Echo.getSelfNode().getNodeProfile().getInstanceCode()
738  mEPCList = new ArrayList<Byte>();
739  }
740 
741  @Override
742  public EchoFrame send() throws IOException {
743 
744  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
745  , mDstEchoClassCode, mDstEchoInstanceCode
746  , mDstEchoAddress, mESV);
747 
748  EchoNode node = Echo.getSelfNode();
749  if(node == null) {
750  return frame;
751  }
752  EchoObject seoj = node.getInstance(mSrcEchoClassCode, mSrcEchoInstanceCode);
753  if(seoj.get() == null) {
754  return frame;
755  }
756  for(Byte epc : mEPCList) {
757  byte[] edt = seoj.getProperty(epc);
758 
759  if(edt != null) {
760  EchoProperty property = new EchoProperty(epc, edt);
761 
762  if(seoj.isValidProperty(property)) {
763  frame.addProperty(property);
764  }
765  }
766  }
767 
768  send(frame);
769  return frame;
770  }
771 
772  public InformerC reqInformProperty(byte epc) {
773  mEPCList.add(epc);
774  return this;
775  }
776 
777  @Override
778  public EchoFrame sendTCP() throws IOException {
779  EchoFrame frame = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
780  , mDstEchoClassCode, mDstEchoInstanceCode
781  , mDstEchoAddress, mESV);
782 
783  EchoNode node = Echo.getSelfNode();
784  if(node == null) {
785  return frame;
786  }
787  EchoObject seoj = node.getInstance(mSrcEchoClassCode, mSrcEchoInstanceCode);
788  if(seoj.get() == null) {
789  return frame;
790  }
791  for(Byte epc : mEPCList) {
792  byte[] edt = seoj.getProperty(epc);
793 
794  if(edt != null) {
795  EchoProperty property = new EchoProperty(epc, edt);
796 
797  if(seoj.isValidProperty(property)) {
798  frame.addProperty(property);
799  }
800  }
801  }
802 
803  sendTCP(frame);
804  return frame;
805  }
806  }
807 
808 }
static final byte ESV_SET_GET_SNA
Definition: EchoFrame.java:63
synchronized byte[] getProperty(byte epc)
synchronized boolean setProperty(EchoProperty property)
final byte[] getStatusChangeAnnouncementProperties()
Definition: EchoObject.java:84
final void removeSetProperty(byte epc)
Definition: EchoObject.java:98
final void setNode(EchoNode node)
final void setReceiver(Receiver receiver)
final void addStatusChangeAnnouncementProperty(byte epc)
Definition: EchoObject.java:71
final void addGetProperty(byte epc)
static final byte ESV_SET_NO_RES
Definition: EchoFrame.java:59
InformerC informC(String address)
final void addSetProperty(byte epc)
Definition: EchoObject.java:93
List< EchoProperty > getPropertyList()
Definition: EchoFrame.java:263
Informer inform(boolean multicast)
static final byte ESV_INFC_RES
Definition: EchoFrame.java:53
static final byte ESV_INFC
Definition: EchoFrame.java:52
static final byte ESV_INF
Definition: EchoFrame.java:51
final void removeGetProperty(byte epc)
static final byte ESV_SETI
Definition: EchoFrame.java:45
final void removeStatusChangeAnnouncementProperty(byte epc)
Definition: EchoObject.java:75
static final byte ESV_GET_SNA
Definition: EchoFrame.java:56
static final byte ESV_GET_RES
Definition: EchoFrame.java:50
final EchoFrame onReceiveRequest(EchoFrame frame)
final void clearStatusChangeAnnouncementProperties()
Definition: EchoObject.java:80
static final byte ESV_GET
Definition: EchoFrame.java:47
Setter set(boolean responseRequired)
final void onReceiveGetRequest(byte epc, EchoFrame response)
static final String MULTICAST_ADDRESS
Definition: EchoSocket.java:53
static final byte ESV_SET_RES
Definition: EchoFrame.java:49
static final byte ESV_INF_REQ
Definition: EchoFrame.java:48
final void onReceiveSetRequest(EchoProperty property, EchoFrame response)
abstract short getEchoClassCode()
synchronized boolean isValidProperty(EchoProperty property)