package org.oliot.epcis.service.registry; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import net.openhft.koloboke.collect.map.hash.HashObjObjMaps; import net.openhft.koloboke.collect.set.hash.HashObjSets; public class DiscoveryServiceAgent { public static Map<String, HashSet<String>> gtinMap = HashObjObjMaps.<String, HashSet<String>> newUpdatableMap(); public static Set<String> epcSet = HashObjSets.<String> newUpdatableSet(); /** * 원활한 작업을 위해 한글로 주석 후보 EPC들을 받아 DS에 전송함 * * @param candidateSet * : 후보 EPC들 * @return DS에 업데이트된 EPC의 개수를 리턴 */ public int registerEPC(HashSet<String> candidateSet) { // 후보 EPC들을 순회함 Iterator<String> iter = candidateSet.iterator(); int updatedEPCCount = 0; while (iter.hasNext()) { // 후보 EPC를 받아 String candidate = iter.next(); // 해당하는 GTIN을 얻는다 String gtin = getGTIN(candidate); if (gtin == null) { // null의 의미는 잘못된 코드 continue; } // GTIN을 GTIN 맵에서 검색해서 URL을 얻음 HashSet<String> urlForGTIN = gtinMap.get(gtin); if (urlForGTIN == null) { // null의 의미는 GTIN에 대한 맵이 없기 때문에 // ONS를 접속해서 DS주소를 얻어내야 한다는 의미 HashSet<String> dsURLSet = getDiscoveryServiceURL(gtin); if (dsURLSet.isEmpty() == true) { // ONS도 주소를 모른다는 의미 이 EPC는 패스한다 continue; } else { // 새로운 주소를 gtinMap에 업데이트 gtinMap.put(gtin, dsURLSet); // DS에 등록 Iterator<String> dsURLIter = dsURLSet.iterator(); while (dsURLIter.hasNext()) { // ONS가 반환한 dsURL을 가지고 String dsURL = dsURLIter.next(); // DS에 등록한다 boolean isRegistered = registerEPCToDS(candidate, dsURL); // 등록이 성공하면 if (isRegistered == true) { // 새로운 EPC를 epcSet에도 넣어줌 epcSet.add(candidate); updatedEPCCount++; } } } } else { // GTIN에 대한 URL은 존재함을 의미 // EPC SET에 epc가 있음을 체크 if (epcSet.contains(candidate)) { // 있다면, DS에 등록할 필요 없음 continue; } else { // 없다면, DS에 등록 Iterator<String> dsURLIter = urlForGTIN.iterator(); while (dsURLIter.hasNext()) { // 이미 gtinMap에서 보유했던 dsURL을 가지고 String dsURL = dsURLIter.next(); // DS에 등록한다 boolean isRegistered = registerEPCToDS(candidate, dsURL); // 등록이 성공하면 if (isRegistered == true) { // 새로운 EPC를 epcSet에도 넣어줌 epcSet.add(candidate); updatedEPCCount++; } } } } } return updatedEPCCount; } private String getGTIN(String EPC) { // TODO: SGTIN, LGTIN를 받아 GTIN으로 변환해 돌려주는 기능 // TODO: 변환이 안되는 코드 (예: SSCC, GSRN, SGLN등)은 null을 리턴 // TODO: 실은 이것은 이슈임. ONS를 통하기 때문에 GTIN만 처리할 수 있음 return null; } private HashSet<String> getDiscoveryServiceURL(String gtin) { // TODO: gtin을 ONS에 물어봐서 해당하는 DS주소 해시셋에 넣어서 돌려준다 // TODO: Configuration.onsAddress 는 시작시 설정가능한 ons 주소를 갖고 있으므로 이용바람 HashSet<String> dsURLSet = new HashSet<String>(); // TODO: Some Logic return dsURLSet; } private boolean registerEPCToDS(String epc, String dsURL) { // TODO: dsURL에 epc를 등록하는 메소드, 결과로 성공 여부를 반환한다 return false; } }