package org.oliot.epcis.serde.sql;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.apache.log4j.Level;
import org.oliot.epcis.configuration.Configuration;
import org.oliot.model.oliot.ExtensionMap;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
public class WriteUtility {
// static void getAnyAttributeObject(List<Object> objectList,List<ExtensionMap> extensionMapList){
// Edge edge=new Edge();
// ExtensionMap parentExtensionMap=new ExtensionMap();
// parentExtensionMap.setqName("parent");
// //parentExtensionMap.setLeftNodeNumber(WriteUtility.leftNodeNumber);
// parentExtensionMap.setLeftNodeNumber(edge.getLeftNodeNumber());
// for(int i=0; i<objectList.size();i++){
// Object object=objectList.get(i);
// if(object instanceof Element){
//
// Element element=(Element)object;
// //int[] level= new int[1];
// //level[0]=0;
// WriteUtility.getAnyMap(element, extensionMapList,1,true, edge);
//
// }else if(object instanceof String){
//
// }
//
// }
// //WriteUtility.rightNodeNumber=WriteUtility.leftNodeNumber+1;
// edge.setRightNodeNumber(edge.getLeftNodeNumber()+1);
// //parentExtensionMap.setRightNodeNumber(WriteUtility.rightNodeNumber);
// parentExtensionMap.setRightNodeNumber(edge.getRightNodeNumber());
// extensionMapList.add(parentExtensionMap);
// }
static void getAnyObject(List<Object> objectList,List<ExtensionMap> extensionMapList){
//WriteUtility.leftNodeNumber=1;
//WriteUtility.rightNodeNumber=1;
Edge edge=new Edge();
ExtensionMap parentExtensionMap=new ExtensionMap();
parentExtensionMap.setqName("parent");
//parentExtensionMap.setLeftNodeNumber(WriteUtility.leftNodeNumber);
parentExtensionMap.setLeftNodeNumber(edge.getLeftNodeNumber());
for(int i=0; i<objectList.size();i++){
Object object=objectList.get(i);
if(object instanceof Element){
Element element=(Element)object;
//int[] level= new int[1];
//level[0]=0;
WriteUtility.getAnyMap(element, extensionMapList,1,true, edge);
}
}
//WriteUtility.rightNodeNumber=WriteUtility.leftNodeNumber+1;
edge.setRightNodeNumber(edge.getLeftNodeNumber()+1);
//parentExtensionMap.setRightNodeNumber(WriteUtility.rightNodeNumber);
parentExtensionMap.setRightNodeNumber(edge.getRightNodeNumber());
extensionMapList.add(parentExtensionMap);
}
static Boolean getAnyMap(Element element, List<ExtensionMap> extensionMaps, int level, Boolean parent,Edge edge){
Boolean hirarch=false;
ExtensionMap extensionMap=new ExtensionMap();
String nodeNameParent = element.getNodeName();
String[] checkArrParent =nodeNameParent.split(":");
if(checkArrParent.length!=2)
return null;
String qnameParent=element.getNamespaceURI()+"#"+checkArrParent[1];
//WriteUtility.leftNodeNumber=WriteUtility.rightNodeNumber+1;
//WriteUtility.rightNodeNumber=WriteUtility.leftNodeNumber;
edge.setLeftNodeNumber(edge.getRightNodeNumber()+1);
edge.setRightNodeNumber(edge.getLeftNodeNumber());
extensionMap.setqName(qnameParent);
extensionMap.setPrefixValue(checkArrParent[0]);
//extensionMap.setLeftNodeNumber(WriteUtility.leftNodeNumber);
extensionMap.setLeftNodeNumber(edge.getLeftNodeNumber());
Node firstChild=element.getFirstChild();
if(firstChild != null){
if(firstChild instanceof Text){
//WriteUtility.rightNodeNumber=WriteUtility.leftNodeNumber+1;
//WriteUtility.leftNodeNumber=WriteUtility.rightNodeNumber;
edge.setRightNodeNumber(edge.getLeftNodeNumber()+1);
edge.setLeftNodeNumber(edge.getRightNodeNumber());
String[] data=new String[2];
String value=firstChild.getTextContent();
data=reflectXsi(value,element);
String dataType=data[1];
String dataValue=data[0];
setExteMap(extensionMap,dataType, dataValue);
if(level==1){
//Configuration.logger.info("Top Level :- "+ qnameParent);
//extensionMap.setInnerValue(false);
extensionMap.setInnerValue(0);
}else{
//Configuration.logger.info("Inner Level :- "+ qnameParent);
//extensionMap.setInnerValue(true);
extensionMap.setInnerValue(1);
}
//extensionMap.setRightNodeNumber(WriteUtility.rightNodeNumber);
extensionMap.setRightNodeNumber(edge.getRightNodeNumber());
extensionMaps.add(extensionMap);
}else if(firstChild instanceof Element){
hirarch=true;
Element childNode=null;
do{
//Configuration.logger.info("Do i");
if(firstChild instanceof Element){
childNode=(Element)firstChild;
getAnyMap(childNode,extensionMaps,0,false, edge);
}
}while((firstChild=firstChild.getNextSibling())!=null);
//WriteUtility.rightNodeNumber=WriteUtility.leftNodeNumber+1;
//WriteUtility.leftNodeNumber=WriteUtility.rightNodeNumber;
edge.setRightNodeNumber(edge.getLeftNodeNumber()+1);
edge.setLeftNodeNumber(edge.getRightNodeNumber());
//extensionMap.setRightNodeNumber(WriteUtility.rightNodeNumber);
extensionMap.setRightNodeNumber(edge.getRightNodeNumber());
if(level==1){
//Configuration.logger.info("Top Level :- "+ qnameParent);
//extensionMap.setInnerValue(false);
extensionMap.setInnerValue(0);
}else{
//Configuration.logger.info("Inner Level :- "+ qnameParent);
//extensionMap.setInnerValue(true);
extensionMap.setInnerValue(1);
}
extensionMaps.add(extensionMap);
}
}
return hirarch;
}
static void setExteMap(ExtensionMap extensionMap, String dataType, String dataValue){
//data[0] value, data[1],type
if(dataType!=null){
if (dataType.contains("int")) {
extensionMap.setDataType("int");
extensionMap.setIntValue(Integer.parseInt(dataValue)); //need conversion here
} else if (dataType.contains("long")) {
extensionMap.setDataType("int");
extensionMap.setIntValue(Integer.parseInt(dataValue));
} else if (dataType.contains("float")) {
extensionMap.setDataType("float");
extensionMap.setFloatValue(Float.parseFloat(dataValue));
} else if (dataType.contains("double")) {
extensionMap.setDataType("float");
extensionMap.setFloatValue(Float.parseFloat(dataValue));
} else if (dataType.contains("boolean")) {
extensionMap.setDataType("boolean");
if(dataValue.equals(true)){
extensionMap.setBoleanValue(1);
}else{
extensionMap.setBoleanValue(0);
}
//extensionMap.setBoleanValue(Boolean.parseBoolean(dataValue));
} else if (dataType.contains("dateTime")) {
extensionMap.setDataType("dateTime");
extensionMap.setTimeValue(getDateTimeAny(dataValue));
}else{
extensionMap.setDataType("String");
extensionMap.setStringValue(dataValue);
}
}
}
static String[] reflectXsi(String value, Element element){
// xsi: int, long, float, double, boolean, dateTime
// Wedge is evaluated before xsi
String[] data=new String[2]; //[0] value, [1],type
String type = element.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type");
if ( value.indexOf('^') > -1) {
if (value.contains("int")) {
String[] restValue=value.split("\\^");
data[0]=restValue[0].trim();
data[1]=restValue[1].trim();
} else if (value.contains("long")) {
String[] restValue=value.split("\\^");
data[0]=restValue[0].trim();
data[1]=restValue[1].trim();
} else if (value.contains("float")) {
String[] restValue=value.split("\\^");
data[0]=restValue[0].trim();
data[1]=restValue[1].trim();
} else if (value.contains("double")) {
String[] restValue=value.split("\\^");
data[0]=restValue[0].trim();
data[1]=restValue[1].trim();
} else if (value.contains("boolean")) {
String[] restValue=value.split("\\^");
data[0]=restValue[0].trim();
data[1]=restValue[1].trim();
} else if (value.contains("dateTime")) {
String[] restValue=value.split("\\^");
data[0]=restValue[0].trim();
data[1]=restValue[1].trim();
}
if(value.contains("time")){
String[] restValue=value.split("\\^");
data[0]=restValue[0].trim();
data[1]="dateTime";
}
}else {
data[0]=value;
data[1]=type;
}
return data;
}
static String refletXsiType(String value, Element element){
// xsi: int, long, float, double, boolean, dateTime
// Wedge is evaluated before xsi
String type = element.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type");
Configuration.logger.info("Type -------" +type);
if (type != null && !type.isEmpty() && value.indexOf('^') == -1) {
if (type.contains("int")) {
value = value.trim();
value += "^int";
} else if (type.contains("long")) {
value = value.trim();
value += "^long";
} else if (type.contains("float")) {
value = value.trim();
value += "^float";
} else if (type.contains("double")) {
value = value.trim();
value += "^double";
} else if (type.contains("boolean")) {
value = value.trim();
value += "^boolean";
} else if (type.contains("dateTime")) {
value = value.trim();
value += "^dateTime";
}
}
return value;
}
static Date getDateTimeAny(String standardDateString) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
GregorianCalendar eventTimeCalendar = new GregorianCalendar();
eventTimeCalendar.setTime(sdf.parse(standardDateString));
return new Date(eventTimeCalendar.getTimeInMillis());
} catch (ParseException e) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
GregorianCalendar eventTimeCalendar = new GregorianCalendar();
eventTimeCalendar.setTime(sdf.parse(standardDateString));
return new Date(eventTimeCalendar.getTimeInMillis());
} catch (ParseException e1) {
Configuration.logger.log(Level.ERROR, e1.toString());
}
}
// Never Happened
return null;
}
public static int leftNodeNumber=1;
public static int rightNodeNumber=1;
}