1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.fosstrak.llrp.client.repository.sql.roaccess;
23
24 import java.sql.Timestamp;
25 import java.util.LinkedList;
26 import java.util.List;
27
28 import org.apache.log4j.Logger;
29 import org.llrp.ltk.generated.interfaces.AirProtocolTagData;
30 import org.llrp.ltk.generated.interfaces.EPCParameter;
31 import org.llrp.ltk.generated.messages.RO_ACCESS_REPORT;
32 import org.llrp.ltk.generated.parameters.AccessSpecID;
33 import org.llrp.ltk.generated.parameters.AntennaID;
34 import org.llrp.ltk.generated.parameters.C1G2_CRC;
35 import org.llrp.ltk.generated.parameters.C1G2_PC;
36 import org.llrp.ltk.generated.parameters.ChannelIndex;
37 import org.llrp.ltk.generated.parameters.EPCData;
38 import org.llrp.ltk.generated.parameters.EPC_96;
39 import org.llrp.ltk.generated.parameters.FirstSeenTimestampUTC;
40 import org.llrp.ltk.generated.parameters.FirstSeenTimestampUptime;
41 import org.llrp.ltk.generated.parameters.InventoryParameterSpecID;
42 import org.llrp.ltk.generated.parameters.LastSeenTimestampUTC;
43 import org.llrp.ltk.generated.parameters.LastSeenTimestampUptime;
44 import org.llrp.ltk.generated.parameters.PeakRSSI;
45 import org.llrp.ltk.generated.parameters.ROSpecID;
46 import org.llrp.ltk.generated.parameters.SpecIndex;
47 import org.llrp.ltk.generated.parameters.TagReportData;
48 import org.llrp.ltk.generated.parameters.TagSeenCount;
49 import org.llrp.ltk.types.BitArray_HEX;
50 import org.llrp.ltk.types.Integer96_HEX;
51
52
53
54
55
56
57 public class ROAccessItem {
58
59
60 private static Logger log = Logger.getLogger(ROAccessItem.class);
61
62
63 private Timestamp logTime;
64
65
66 private String adapterName;
67
68
69 private String readerName;
70
71
72 private String epc;
73
74
75 private Long roSpecID;
76
77
78 private Integer specIndex;
79
80
81 private Integer inventoryPrmSpecID;
82
83
84 private Integer antennaID;
85
86
87 private Short peakRSSI;
88
89
90 private Integer channelIndex;
91
92
93 private Timestamp firstSeenUTC;
94
95
96 private Timestamp firstSeenUptime;
97
98
99 private Timestamp lastSeenUTC;
100
101
102 private Timestamp lastSeenUptime;
103
104
105 private Integer tagSeenCount;
106
107
108 private Integer c1g2_CRC;
109
110
111 private Integer c1g2_PC;
112
113
114 private Long accessSpecID;
115
116
117
118
119
120
121
122
123 public static List<ROAccessItem> parse(
124 RO_ACCESS_REPORT report,
125 String adapterName,
126 String readerName,
127 long currentTime) {
128
129 List<ROAccessItem> items = new LinkedList<ROAccessItem> ();
130
131 List<TagReportData> tagDataList = report.getTagReportDataList();
132
133 for (TagReportData tagData : tagDataList) {
134
135 ROAccessItem item = new ROAccessItem();
136
137
138 item.setLogTime(new Timestamp(currentTime));
139
140
141 item.setAdapterName(adapterName);
142
143
144 item.setReaderName(readerName);
145
146
147 EPCParameter epcParameter = tagData.getEPCParameter();
148 String epc = null;
149 if (epcParameter instanceof EPC_96) {
150 EPC_96 epc96 = (EPC_96) epcParameter;
151 Integer96_HEX hex = epc96.getEPC();
152 String hx = hex.toString();
153 epc = hx;
154 } else if (epcParameter instanceof EPCData){
155 EPCData epcData = (EPCData) epcParameter;
156 BitArray_HEX hex = epcData.getEPC();
157 String hx = hex.toString();
158 epc = hx;
159 } else {
160 log.error("Unknown EPCParameter encountered - ignoring.");
161 }
162 item.setEpc(epc);
163
164
165 ROSpecID roSpecID = tagData.getROSpecID();
166 if ((null != roSpecID) && (null != roSpecID.getROSpecID())) {
167 item.setRoSpecID(roSpecID.getROSpecID().toLong());
168 }
169
170
171 SpecIndex specIndex = tagData.getSpecIndex();
172 if ((null != specIndex) && (null != specIndex.getSpecIndex())) {
173 item.setSpecIndex(specIndex.getSpecIndex().toInteger());
174 }
175
176
177 InventoryParameterSpecID inventoryPrmSpecID =
178 tagData.getInventoryParameterSpecID();
179 if ((null != inventoryPrmSpecID) &&
180 (null != inventoryPrmSpecID.getInventoryParameterSpecID())) {
181 item.setInventoryPrmSpecID(
182 tagData.getInventoryParameterSpecID().
183 getInventoryParameterSpecID().toInteger());
184 }
185
186
187 AntennaID antennaID = tagData.getAntennaID();
188 if ((null != antennaID) && (null != antennaID.getAntennaID())) {
189 item.setAntennaID(antennaID.getAntennaID().toInteger());
190 }
191
192
193 PeakRSSI peakRSSI = tagData.getPeakRSSI();
194 if ((null != peakRSSI) && (null != peakRSSI.getPeakRSSI())) {
195 item.setPeakRSSI(new Short(peakRSSI.getPeakRSSI().toByte()));
196 }
197
198
199 ChannelIndex channelIndex = tagData.getChannelIndex();
200 if ((null != channelIndex) && (null != channelIndex.getChannelIndex())) {
201 item.setChannelIndex(channelIndex.getChannelIndex().toInteger());
202 }
203
204
205 FirstSeenTimestampUTC frstSnUTC =
206 tagData.getFirstSeenTimestampUTC();
207 if ((null != frstSnUTC) && (null != frstSnUTC.getMicroseconds())) {
208 item.setFirstSeenUTC(
209 AbstractSQLROAccessReportsRepository.extractTimestamp(
210 frstSnUTC.getMicroseconds()));
211 }
212
213
214 FirstSeenTimestampUptime frstSnUptime =
215 tagData.getFirstSeenTimestampUptime();
216 if ((null != frstSnUptime) && (null != frstSnUptime.getMicroseconds())) {
217 item.setFirstSeenUptime(
218 AbstractSQLROAccessReportsRepository.extractTimestamp(
219 frstSnUptime.getMicroseconds()));
220 }
221
222
223 LastSeenTimestampUTC lstSnUTC =
224 tagData.getLastSeenTimestampUTC();
225 if ((null != lstSnUTC) && (null != lstSnUTC.getMicroseconds())) {
226 item.setLastSeenUTC(
227 AbstractSQLROAccessReportsRepository.extractTimestamp(
228 lstSnUTC.getMicroseconds()));
229 }
230
231
232 LastSeenTimestampUptime lstSnUptime =
233 tagData.getLastSeenTimestampUptime();
234 if ((null != lstSnUptime) && (null != lstSnUptime.getMicroseconds())) {
235 item.setLastSeenUptime(
236 AbstractSQLROAccessReportsRepository.extractTimestamp(
237 lstSnUptime.getMicroseconds()));
238 }
239
240
241 TagSeenCount tagSeenCount = tagData.getTagSeenCount();
242 if ((null != tagSeenCount) && (null != tagSeenCount.getTagCount())) {
243 item.setTagSeenCount(tagSeenCount.getTagCount().toInteger());
244 }
245
246 List<AirProtocolTagData> airProtoTagData =
247 tagData.getAirProtocolTagDataList();
248
249 for (AirProtocolTagData aptd : airProtoTagData) {
250 if (aptd instanceof C1G2_CRC) {
251 C1G2_CRC c1g2_crc = (C1G2_CRC) aptd;
252 if ((null != c1g2_crc) && (null != c1g2_crc.getCRC())) {
253 item.setC1g2_CRC(c1g2_crc.getCRC().toInteger());
254 }
255 } else if (aptd instanceof C1G2_PC) {
256 C1G2_PC c1g2_pc = (C1G2_PC) aptd;
257 if ((null != c1g2_pc) && (null != c1g2_pc.getPC_Bits())) {
258 item.setC1g2_PC(c1g2_pc.getPC_Bits().toInteger());
259 }
260 } else {
261 log.error("Unknown AirProtocolTagData item encountered.");
262 }
263 }
264
265
266 AccessSpecID accessSpecID = tagData.getAccessSpecID();
267 if ((null != accessSpecID) &&
268 (null != accessSpecID.getAccessSpecID())) {
269 item.setAccessSpecID(accessSpecID.getAccessSpecID().toLong());
270 }
271
272 items.add(item);
273 }
274
275 return items;
276 }
277
278
279
280
281 public void setLogTime(Timestamp logTime) {
282 this.logTime = logTime;
283 }
284
285
286
287
288 public Timestamp getLogTime() {
289 return logTime;
290 }
291
292
293
294
295 public void setAdapterName(String adapterName) {
296 this.adapterName = adapterName;
297 }
298
299
300
301
302 public String getAdapterName() {
303 return adapterName;
304 }
305
306
307
308
309 public void setReaderName(String readerName) {
310 this.readerName = readerName;
311 }
312
313
314
315
316 public String getReaderName() {
317 return readerName;
318 }
319
320
321
322
323 public void setEpc(String epc) {
324 this.epc = epc;
325 }
326
327
328
329
330 public String getEpc() {
331 return epc;
332 }
333
334
335
336
337 public void setRoSpecID(Long roSpecID) {
338 this.roSpecID = roSpecID;
339 }
340
341
342
343
344 public Long getRoSpecID() {
345 return roSpecID;
346 }
347
348
349
350
351 public void setSpecIndex(Integer specIndex) {
352 this.specIndex = specIndex;
353 }
354
355
356
357
358 public Integer getSpecIndex() {
359 return specIndex;
360 }
361
362
363
364
365 public void setInventoryPrmSpecID(Integer inventoryPrmSpecID) {
366 this.inventoryPrmSpecID = inventoryPrmSpecID;
367 }
368
369
370
371
372 public Integer getInventoryPrmSpecID() {
373 return inventoryPrmSpecID;
374 }
375
376
377
378
379 public void setAntennaID(Integer antennaID) {
380 this.antennaID = antennaID;
381 }
382
383
384
385
386 public Integer getAntennaID() {
387 return antennaID;
388 }
389
390
391
392
393 public void setPeakRSSI(Short peakRSSI) {
394 this.peakRSSI = peakRSSI;
395 }
396
397
398
399
400 public Short getPeakRSSI() {
401 return peakRSSI;
402 }
403
404
405
406
407 public Integer getChannelIndex() {
408 return channelIndex;
409 }
410
411
412
413
414 public void setChannelIndex(Integer channelIndex) {
415 this.channelIndex = channelIndex;
416 }
417
418
419
420
421 public Timestamp getFirstSeenUTC() {
422 return firstSeenUTC;
423 }
424
425
426
427
428 public void setFirstSeenUTC(Timestamp firstSeenUTC) {
429 this.firstSeenUTC = firstSeenUTC;
430 }
431
432
433
434
435 public Timestamp getFirstSeenUptime() {
436 return firstSeenUptime;
437 }
438
439
440
441
442 public void setFirstSeenUptime(Timestamp firstSeenUptime) {
443 this.firstSeenUptime = firstSeenUptime;
444 }
445
446
447
448
449 public Timestamp getLastSeenUTC() {
450 return lastSeenUTC;
451 }
452
453
454
455
456 public void setLastSeenUTC(Timestamp lastSeenUTC) {
457 this.lastSeenUTC = lastSeenUTC;
458 }
459
460
461
462
463 public Timestamp getLastSeenUptime() {
464 return lastSeenUptime;
465 }
466
467
468
469
470 public void setLastSeenUptime(Timestamp lastSeenUptime) {
471 this.lastSeenUptime = lastSeenUptime;
472 }
473
474
475
476
477 public Integer getTagSeenCount() {
478 return tagSeenCount;
479 }
480
481
482
483
484 public void setTagSeenCount(Integer tagSeenCount) {
485 this.tagSeenCount = tagSeenCount;
486 }
487
488
489
490
491 public Integer getC1g2_CRC() {
492 return c1g2_CRC;
493 }
494
495
496
497
498 public void setC1g2_CRC(Integer c1g2CRC) {
499 c1g2_CRC = c1g2CRC;
500 }
501
502
503
504
505 public Integer getC1g2_PC() {
506 return c1g2_PC;
507 }
508
509
510
511
512 public void setC1g2_PC(Integer c1g2PC) {
513 c1g2_PC = c1g2PC;
514 }
515
516
517
518
519 public Long getAccessSpecID() {
520 return accessSpecID;
521 }
522
523
524
525
526 public void setAccessSpecID(Long accessSpecID) {
527 this.accessSpecID = accessSpecID;
528 }
529
530
531
532
533
534
535
536
537 public Object get(int index) {
538 switch (index) {
539 case AbstractSQLROAccessReportsRepository.CINDEX_LOGTIME:
540 return getLogTime();
541 case AbstractSQLROAccessReportsRepository.CINDEX_ADAPTER:
542 return getAdapterName();
543 case AbstractSQLROAccessReportsRepository.CINDEX_READER:
544 return getReaderName();
545 case AbstractSQLROAccessReportsRepository.CINDEX_EPC:
546 return getEpc();
547 case AbstractSQLROAccessReportsRepository.CINDEX_ROSpecID:
548 return getRoSpecID();
549 case AbstractSQLROAccessReportsRepository.CINDEX_SpecIndex:
550 return getSpecIndex();
551 case AbstractSQLROAccessReportsRepository.CINDEX_InventoryParameterSpecID:
552 return getInventoryPrmSpecID();
553 case AbstractSQLROAccessReportsRepository.CINDEX_AntennaID:
554 return getAntennaID();
555 case AbstractSQLROAccessReportsRepository.CINDEX_PeakRSSI:
556 return getPeakRSSI();
557 case AbstractSQLROAccessReportsRepository.CINDEX_ChannelIndex:
558 return getChannelIndex();
559 case AbstractSQLROAccessReportsRepository.CINDEX_FirstSeenTimestampUTC:
560 return getFirstSeenUTC();
561 case AbstractSQLROAccessReportsRepository.CINDEX_FirstSeenTimestampUptime:
562 return getFirstSeenUptime();
563 case AbstractSQLROAccessReportsRepository.CINDEX_LastSeenTimestampUTC:
564 return getLastSeenUTC();
565 case AbstractSQLROAccessReportsRepository.CINDEX_LastSeenTimestampUptime:
566 return getLastSeenUptime();
567 case AbstractSQLROAccessReportsRepository.CINDEX_TagSeenCount:
568 return getTagSeenCount();
569 case AbstractSQLROAccessReportsRepository.CINDEX_C1G2_CRC:
570 return getC1g2_CRC();
571 case AbstractSQLROAccessReportsRepository.CINDEX_C1G2_PC:
572 return getC1g2_PC();
573 case AbstractSQLROAccessReportsRepository.CINDEX_AccessSpecID:
574 return getAccessSpecID();
575 }
576 return null;
577 }
578
579
580
581
582
583
584
585 public String getAsString(int index) {
586 String ret;
587 try {
588 return get(index).toString();
589 } catch (Exception e) {
590
591 ret = null;
592 }
593 return ret;
594 }
595
596
597
598
599 public String getAsCSV() {
600 StringBuffer str = new StringBuffer();
601 final int len = AbstractSQLROAccessReportsRepository.NUM_COLUMNS + 1;
602 for (int i=1; i<len; i++) {
603 String s = getAsString(i);
604 if (null != s) {
605 str.append(s);
606 }
607 str.append(",");
608 }
609 return str.toString();
610 }
611
612 }