package com.esri.geoevent.solutions.processor.addxyz;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.esri.core.geometry.Geometry;
import com.esri.core.geometry.MapGeometry;
import com.esri.core.geometry.Point;
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.property.PropertyDefinition;
import com.esri.ges.core.property.PropertyType;
import com.esri.ges.manager.geoeventdefinition.GeoEventDefinitionManager;
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 AddXYZProcessor extends GeoEventProcessorBase {
GeoEventDefinitionManager manager;
Messaging messaging;
private static final Log LOG = LogFactory
.getLog(AddXYZProcessor.class);
private String invalidGeo = "com.esri.geoevent.solutions.processor.addxyz.addxyz-processor.ERROR_INVALID_GEOMETRY";
private String geoFldName;
private String gedName;
private String xfield;
private String yfield;
private String zfield;
public AddXYZProcessor(GeoEventProcessorDefinition definition, GeoEventDefinitionManager mgr, Messaging mes)
throws ComponentException {
super(definition);
manager = mgr;
messaging = mes;
}
@Override
public void afterPropertiesSet()
{
geoFldName = properties.get("geofield").getValueAsString();
gedName = properties.get("gedName").getValueAsString();
xfield = properties.get("xfield").getValueAsString();
yfield = properties.get("yfield").getValueAsString();
zfield = properties.get("zfield").getValueAsString();
}
public GeoEvent process(GeoEvent evt) throws Exception {
try
{
GeoEventDefinition geDef = evt.getGeoEventDefinition();
GeoEventDefinition outDef = null;
Collection<GeoEventDefinition> defs = manager.searchGeoEventDefinitionByName(gedName);
if(defs.size() == 0)
{
List<FieldDefinition> newPropertyDefs = new ArrayList<FieldDefinition>();
FieldDefinition xfDef = new DefaultFieldDefinition(xfield, FieldType.Double);
FieldDefinition yfDef = new DefaultFieldDefinition(yfield, FieldType.Double);
FieldDefinition zfDef = new DefaultFieldDefinition(zfield, FieldType.Double);
newPropertyDefs.add(xfDef);
newPropertyDefs.add(yfDef);
newPropertyDefs.add(zfDef);
outDef = geDef.augment(newPropertyDefs);
outDef.setOwner(geDef.getOwner());
outDef.setName(gedName);
manager.addGeoEventDefinition(outDef);
}
else
{
outDef = (GeoEventDefinition) defs.toArray()[0];
}
GeoEventCreator creator = messaging.createGeoEventCreator();
GeoEvent newEvent = creator.create(outDef.getGuid());
MapGeometry mapGeo = evt.getGeometry();
Geometry geo = mapGeo.getGeometry();
if(!(geo instanceof Point))
{
IOException e = new IOException();
LOG.error(invalidGeo);
throw(e);
}
Point pt = (Point)geo;
newEvent.setField(xfield, pt.getX());
newEvent.setField(yfield, pt.getY());
if(zfield != null && !zfield.equals(""))
{
if(pt.getZ() != Double.NaN)
{
newEvent.setField(zfield, pt.getZ());
}
else
{
newEvent.setField(zfield, 0.0);
}
}
List<FieldDefinition> fldDefs = geDef.getFieldDefinitions();
for(FieldDefinition fd: fldDefs)
{
String name = fd.getName();
newEvent.setField(name, evt.getField(name));
}
return newEvent;
}
catch(Exception e)
{
LOG.error(e.getMessage());
throw(e);
}
}
}