package com.esri.geoevent.solutions.processor.timetolong; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.esri.ges.core.ConfigurationException; import com.esri.ges.core.component.ComponentException; import com.esri.ges.core.geoevent.DefaultFieldDefinition; import com.esri.ges.core.geoevent.FieldDefinition; import com.esri.ges.core.geoevent.FieldType; import com.esri.ges.core.geoevent.GeoEvent; import com.esri.ges.core.geoevent.GeoEventDefinition; import com.esri.ges.core.geoevent.GeoEventPropertyName; import com.esri.ges.framework.i18n.BundleLogger; import com.esri.ges.framework.i18n.BundleLoggerFactory; import com.esri.ges.manager.geoeventdefinition.GeoEventDefinitionManager; import com.esri.ges.manager.geoeventdefinition.GeoEventDefinitionManagerException; import com.esri.ges.messaging.GeoEventCreator; import com.esri.ges.messaging.Messaging; import com.esri.ges.processor.GeoEventProcessorBase; import com.esri.ges.processor.GeoEventProcessorDefinition; public class TimeToLongProcessor extends GeoEventProcessorBase { private GeoEventDefinitionManager manager; public Messaging messaging; public TimeToLongProcessor(GeoEventProcessorDefinition definition) throws ComponentException { super(definition); // TODO Auto-generated constructor stub } private static final BundleLogger LOGGER = BundleLoggerFactory .getLogger(TimeToLongProcessor.class); private String timefld; private String numfld; private String newdefname; private Boolean useexisting; private String outputtype; private GeoEventDefinition ged; private Boolean createDef = false; private List<FieldDefinition> fds; @Override public boolean isGeoEventMutator() { return true; } @Override public GeoEvent process(GeoEvent evt) throws Exception { if (createDef) { createGeoEventDefinition(evt); createDef = false; } GeoEvent geOut = null; Date dt = (Date) evt.getField(timefld); long longdate = dt.getTime(); if (useexisting) { geOut = evt; if (outputtype.equals("long")) { evt.setField(numfld, longdate); } else if (outputtype.equals("float")) { float floatdate = (float) longdate; evt.setField(numfld, floatdate); } else if (outputtype.equals("double")) { Double dbldate = longdate * 1.0; evt.setField(numfld, dbldate); }else if (outputtype.equals("string")) { String strdate = ((Long) longdate).toString(); evt.setField(numfld, strdate); } } else { if (outputtype.equals("long")) { GeoEventCreator geoEventCreator = messaging .createGeoEventCreator(); geOut = geoEventCreator.create(ged.getGuid(), new Object[] { evt.getAllFields(), longdate }); } else if (outputtype.equals("float")) { float floatdate = (float) longdate; GeoEventCreator geoEventCreator = messaging .createGeoEventCreator(); geOut = geoEventCreator.create(ged.getGuid(), new Object[] { evt.getAllFields(), floatdate }); } else if (outputtype.equals("double")) { Double dbldate = longdate * 1.0; GeoEventCreator geoEventCreator = messaging .createGeoEventCreator(); geOut = geoEventCreator.create(ged.getGuid(), new Object[] { evt.getAllFields(), dbldate }); } else if (outputtype.equals("string")) { String strdate = ((Long) longdate).toString(); GeoEventCreator geoEventCreator = messaging .createGeoEventCreator(); geOut = geoEventCreator.create(ged.getGuid(), new Object[] { evt.getAllFields(), strdate }); } geOut.setProperty(GeoEventPropertyName.TYPE, "message"); geOut.setProperty(GeoEventPropertyName.OWNER_ID, getId()); geOut.setProperty(GeoEventPropertyName.OWNER_ID, definition.getUri()); } return geOut; } @Override public void afterPropertiesSet() { timefld = properties.get("timefld").getValueAsString(); numfld = properties.get("longfld").getValueAsString(); newdefname = properties.get("newdef").getValueAsString(); useexisting = (Boolean) properties.get("useexisting").getValue(); outputtype = properties.get("outputtype").getValueAsString(); if (!useexisting) { try { FieldDefinition fd = null; if (outputtype.equals("long")) { fd = new DefaultFieldDefinition(numfld, FieldType.Long); } else if (outputtype.equals("float")) { fd = new DefaultFieldDefinition(numfld, FieldType.Float); } else if (outputtype.equals("double")) { fd = new DefaultFieldDefinition(numfld, FieldType.Double); } else if (outputtype.equals("string")) { fd = new DefaultFieldDefinition(numfld, FieldType.String); } fds = new ArrayList<FieldDefinition>(); fds.add(fd); if ((ged = manager.searchGeoEventDefinition(newdefname, definition.getUri().toString())) == null) { createDef = true; } } catch (ConfigurationException e) { LOGGER.error(e.getMessage()); } } } // getters and setters public void setMessaging(Messaging messaging) { this.messaging = messaging; } public void setManager(GeoEventDefinitionManager manager) { this.manager = manager; } private void createGeoEventDefinition(GeoEvent event) { GeoEventDefinition eventDef = event.getGeoEventDefinition(); try { ged = eventDef.augment(fds); } catch (ConfigurationException e) { LOGGER.error(e.getLocalizedMessage()); } ged.setName(newdefname); ged.setOwner(definition.getUri().toString()); try { manager.addGeoEventDefinition(ged); } catch (GeoEventDefinitionManagerException e) { LOGGER.error(e.getMessage()); } } }