package kr.ac.kaist.resl.lilliput.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import org.epcglobalinc.tdt.LevelTypeList; import org.fosstrak.tdt.TDTEngine; import org.json.JSONException; import org.json.JSONObject; public class ONSHelper { @SuppressWarnings("unchecked") public static JSONObject getNAPTRFromONS(String url, String hostName) { //Phase 2 : DNS Resolving via ONS //We use JNDI for using DNS try { Hashtable<String, String> env = new Hashtable<String,String>(); // JNDI Properties env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); // IPv6 address of ONS env.put("java.naming.provider.url", url); // Variable Initialize Attributes returnAttributes = null; @SuppressWarnings("rawtypes") NamingEnumeration attributeEnum = null; @SuppressWarnings("rawtypes") ArrayList results = new ArrayList(); DirContext ictx = new InitialDirContext(env); //ONS use NAPTR Type returnAttributes = ictx.getAttributes(hostName, new String[]{"NAPTR"}); if(returnAttributes.size() > 0) { attributeEnum = returnAttributes.get("NAPTR").getAll(); while(attributeEnum.hasMore()) results.add((String)attributeEnum.next()); } //{naptr=NAPTR: 0 0 u EPC+ws !^.*$!http://143.248.106.26:8880/EcoMiddleware/services/SmartMetering! ., //0 0 u EPC+epcis !^.*$!http://[2002:8ff8:6a89::8ff8:6a89]/epcis-repository-0.4.2/query! .} String result; String[] subResults = null; JSONObject returnJson = new JSONObject(); //ONS can returns several records ( Service ) for( int i = 0 ; i < results.size() ; i ++ ) { result = (String)results.get(i); System.out.println("Returned Service related to EPC : " + result); //Split by delimiter " " <-- whitespace subResults = result.split(" "); if( subResults[3].equals("EPC+ws")) { String SEP = subResults[4].substring(6, subResults[4].length()-1); returnJson.put("ws", SEP); } else if( subResults[3].equals("EPC+epcis")) { String SEP = subResults[4].substring(6, subResults[4].length()-1); returnJson.put("epcis", SEP); } else if( subResults[3].equals("EPC+rest")) { String SEP = subResults[4].substring(6, subResults[4].length()-1); returnJson.put("rest", SEP); } } return returnJson; } catch( NamingException ne) { ne.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @SuppressWarnings("unchecked") public static JSONObject getNAPTRFromONSWithEPC(String url, String epc) { //"dns://[2002:8ff8:6a87::8ff8:6a87]" // Phase 1 : Using TDTEngine // TDTEngine for translating any epc format to ONS hostname // Initialize TDTEngine engine = null; Map<String, String> params; params = new HashMap<String, String>(); if( engine == null ) { try { engine = new TDTEngine(); } catch ( Exception e ) { e.printStackTrace(System.err); } } params.put("taglength", "96"); //Run the TDT Engine // convert( source epc, parameters, target type ) String hostName = engine.convert(epc, params, LevelTypeList.ONS_HOSTNAME); //You get Host Name Of EPC System.out.println("host name of EPC : "+ hostName); //Phase 2 : DNS Resolving via ONS //We use JNDI for using DNS try { Hashtable<String, String> env = new Hashtable<String,String>(); // JNDI Properties env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); // IPv6 address of ONS env.put("java.naming.provider.url", url); // Variable Initialize Attributes returnAttributes = null; @SuppressWarnings("rawtypes") NamingEnumeration attributeEnum = null; @SuppressWarnings("rawtypes") ArrayList results = new ArrayList(); DirContext ictx = new InitialDirContext(env); //ONS use NAPTR Type returnAttributes = ictx.getAttributes(hostName, new String[]{"NAPTR"}); if(returnAttributes.size() > 0) { attributeEnum = returnAttributes.get("NAPTR").getAll(); while(attributeEnum.hasMore()) results.add((String)attributeEnum.next()); } //{naptr=NAPTR: 0 0 u EPC+ws !^.*$!http://143.248.106.26:8880/EcoMiddleware/services/SmartMetering! ., //0 0 u EPC+epcis !^.*$!http://[2002:8ff8:6a89::8ff8:6a89]/epcis-repository-0.4.2/query! .} String result; String[] subResults = null; JSONObject returnJson = new JSONObject(); //ONS can returns several records ( Service ) for( int i = 0 ; i < results.size() ; i ++ ) { result = (String)results.get(i); System.out.println("Returned Service related to EPC : " + result); //Split by delimiter " " <-- whitespace subResults = result.split(" "); if( subResults[3].equals("EPC+ws")) { String SEP = subResults[4].substring(6, subResults[4].length()-1); returnJson.put("ws", SEP); } else if( subResults[3].equals("EPC+epcis")) { String SEP = subResults[4].substring(6, subResults[4].length()-1); returnJson.put("epcis", SEP); } else if( subResults[3].equals("EPC+rest")) { String SEP = subResults[4].substring(6, subResults[4].length()-1); returnJson.put("rest", SEP); } } return returnJson; } catch( NamingException ne) { ne.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }