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;
}
}