/** * */ package com.esri.geoevent.solutions.adapter.cot; /* * #%L * CoTAdapterOutbound.java - Esri :: AGES :: Solutions :: Adapter :: CoT - Esri - 2013 * org.codehaus.mojo-license-maven-plugin-1.5 * $Id: update-file-header-config.apt.vm 17764 2012-12-12 10:22:04Z tchemit $ * $HeadURL: https://svn.codehaus.org/mojo/tags/license-maven-plugin-1.5/src/site/apt/examples/update-file-header-config.apt.vm $ * %% * Copyright (C) 2013 - 2014 Esri * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import com.esri.ges.adapter.AdapterDefinition; import com.esri.ges.adapter.OutboundAdapterBase; import com.esri.ges.core.component.ComponentException; import com.esri.ges.core.geoevent.FieldDefinition; import com.esri.ges.core.geoevent.FieldException; import com.esri.ges.core.geoevent.FieldGroup; import com.esri.ges.core.geoevent.FieldType; import com.esri.ges.core.geoevent.GeoEvent; import com.esri.ges.core.geoevent.GeoEventDefinition; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.*; public class CoTAdapterOutbound extends OutboundAdapterBase { private StringBuffer stringBuffer = new StringBuffer(10*1024); private ByteBuffer byteBuffer = ByteBuffer.allocate(10*1024); private Charset charset = Charset.forName("UTF-8"); private String dateFormat = "yyyy-MM-dd HH:mm:ss"; private SimpleDateFormat formatter = new SimpleDateFormat(dateFormat); private static final Log LOG = LogFactory.getLog(CoTAdapterOutbound.class); /** * @param definition * @throws ComponentException */ public CoTAdapterOutbound(AdapterDefinition definition) throws ComponentException { super(definition); // TODO Auto-generated constructor stub } @Override public byte[] processData(Map<String, List<GeoEvent>> geoevents) throws ComponentException { // TODO Auto-generated method stub return super.processData(geoevents); } /* (non-Javadoc) * @see com.esri.ges.messaging.GeoEventListener#receive(com.esri.ges.core.geoevent.GeoEvent) */ @Override public void receive(GeoEvent geoEvent) { stringBuffer.setLength(0); GeoEventDefinition definition = geoEvent.getGeoEventDefinition(); System.out.println("Creating Event to marshal..."); Event event=new Event(); for (FieldDefinition fieldDefinition : definition.getFieldDefinitions()) { try { String attributeName = fieldDefinition.getName(); Object value; if ((value = geoEvent.getField(attributeName)) != null) { if (attributeName.equalsIgnoreCase("version")) { event.setVersion((Double) value); } else if (attributeName.equalsIgnoreCase("uid")) { event.setUid(value.toString()); } else if (attributeName.equalsIgnoreCase("type")) { event.setType(value.toString()); } else if (attributeName.equalsIgnoreCase("how")) { event.setHow(value.toString()); } else if (attributeName.equalsIgnoreCase("time")) { event.setTime((Date) value); } else if (attributeName.equalsIgnoreCase("start")) { event.setStart((Date) value); } else if (attributeName.equalsIgnoreCase("stale")) { event.setStale((Date) value); } else if (attributeName.equalsIgnoreCase("access")) { event.setAccess(value.toString()); } else if (attributeName.equalsIgnoreCase("opex")) { event.setOpex(value.toString()); } else if (attributeName.equalsIgnoreCase("qos")) { event.setQos(value.toString()); } else if (attributeName.equalsIgnoreCase("detail")) { event.setDetail(this.unpackDetial(fieldDefinition, geoEvent.getFieldGroup("detail"))); // GETALLFIELDS // CHECK ITS TYPE IF GROUP THEN INSPECT THEM } else if (attributeName.equalsIgnoreCase("point")) { Point p = pointFromJson(value); event.setPoint(pointFromJson(p)); } } } catch (Exception e) { LOG.error(e.getMessage()); } } ///////////////////////// String xmlResult=null; StringBuilder myResult=new StringBuilder(); int content; System.out.println("Event created."); System.out.println("Marshalling Event into XML."); try { JAXBContext contextObj = JAXBContext.newInstance(Event.class); Marshaller marshallerObj=contextObj.createMarshaller(); marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); ByteArrayOutputStream os=new ByteArrayOutputStream(); marshallerObj.marshal(event,os); ByteArrayInputStream bais=new ByteArrayInputStream(os.toByteArray()); while ((content=bais.read()) != -1){ myResult.append((char)content); } xmlResult=fixEscapeCharacters(myResult.toString()); System.out.println("**** XML RESULTS ***"); System.out.println(xmlResult); this.byteListener.receive(ByteBuffer.wrap(xmlResult.getBytes()), ""); } catch (JAXBException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Done"); } private String unpackDetial(FieldDefinition detailObj, FieldGroup fieldGroup) { //System.out.println("&&&& inspecting detailObj...."); StringBuilder sb=new StringBuilder(); return traverseFieldGroup(detailObj,sb,fieldGroup); } private String traverseFieldGroup(FieldDefinition parentFieldDef, StringBuilder sb, FieldGroup fg){ StringBuilder mine=new StringBuilder(); //System.out.println("**Start: "+ parentFieldDef.getName()); for (FieldDefinition fieldDef: parentFieldDef.getChildren()){ if(fieldDef.getType()==FieldType.Group){ //System.out.println("Found another Group:"+ fieldDef.getName()); try { mine.append("<"+fieldDef.getName()+getAttributes(fieldDef,mine,fg.getFieldGroup(fieldDef.getName()))+">"+traverseFieldGroup(fieldDef,mine,fg.getFieldGroup(fieldDef.getName()))+"</"+fieldDef.getName()+">"); } catch (FieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ //System.out.println("not a group:" + fieldDef.getName()+"="+fg.getField(fieldDef.getName())+ " toString: "+ fieldDef.toString()); if(fg.getField(fieldDef.getName())!=null){ if (fieldDef.getName().equals("#text")) mine.append(fg.getField(fieldDef.getName())); } } } //System.out.println("**End: "+ parentFieldDef.getName()); return mine.toString(); } private String getAttributes(FieldDefinition parentFieldDef, StringBuilder sb, FieldGroup fg){ StringBuilder mine=new StringBuilder(); for (FieldDefinition fieldDef: parentFieldDef.getChildren()){ if(fieldDef.getType()!=FieldType.Group){ if(fg.getField(fieldDef.getName())!=null){ if (!fieldDef.getName().equals("#text")) mine.append(" "+fieldDef.getName()+"=\""+fg.getField(fieldDef.getName())+"\""); } } } return mine.toString(); } private Point pointFromJson(Object value) { //JSONObject json = (JSONObject) JSONSerializer.toJSON( jsonTxt ); if(value instanceof com.esri.ges.spatial.Point) { com.esri.ges.spatial.Point p = (com.esri.ges.spatial.Point)value; } Point point=new Point(); JsonFactory jf= new JsonFactory(); try { JsonParser parser=jf.createJsonParser(value.toString()); parser.nextValue();//skips the initial JsonToken.START_OBJECT while (parser.nextToken() != JsonToken.END_OBJECT) { String field_name=parser.getCurrentName(); parser.nextToken(); if(field_name.equals("x")){ Double data=parser.getDoubleValue(); point.setLon(data); }else if(field_name.equals("y")){ Double data=parser.getDoubleValue(); point.setLat(data); }else if(field_name.equals("z")){ Double data=parser.getDoubleValue(); point.setHae(data); } }//while } catch (JsonParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return point; } private static String fixEscapeCharacters(String marshalledXML) { return marshalledXML.replace("<", "<").replace(">", ">").replace(""", "\"").replace("&", "&"); } public ByteBuffer getByteBuffer() { return byteBuffer; } public void setByteBuffer(ByteBuffer byteBuffer) { this.byteBuffer = byteBuffer; } public Charset getCharset() { return charset; } public void setCharset(Charset charset) { this.charset = charset; } public SimpleDateFormat getFormatter() { return formatter; } public void setFormatter(SimpleDateFormat formatter) { this.formatter = formatter; } }