package es.upm.fi.dia.oeg.map4rdf.server.command;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import com.google.inject.Inject;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetRoutePoints;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetRoutePointsResult;
import es.upm.fi.dia.oeg.map4rdf.server.cartociudad.RouteFinderCall;
import es.upm.fi.dia.oeg.map4rdf.server.conf.multiple.MultipleConfigurations;
import es.upm.fi.dia.oeg.map4rdf.share.Point;
import es.upm.fi.dia.oeg.map4rdf.share.PointBean;
import es.upm.fi.dia.oeg.map4rdf.share.conf.ParameterNames;
import net.customware.gwt.dispatch.server.ActionHandler;
import net.customware.gwt.dispatch.server.ExecutionContext;
import net.customware.gwt.dispatch.shared.ActionException;
public class GetRoutePointsHandler implements ActionHandler<GetRoutePoints, GetRoutePointsResult> {
private MultipleConfigurations configurations;
private Logger logger = Logger.getLogger(GetRoutePointsHandler.class);
@Inject
public GetRoutePointsHandler(MultipleConfigurations configurations){
this.configurations = configurations;
}
@Override
public GetRoutePointsResult execute(GetRoutePoints action,
ExecutionContext context) throws ActionException {
List<es.upm.fi.dia.oeg.map4rdf.server.cartociudad.types.Point> points = new ArrayList<es.upm.fi.dia.oeg.map4rdf.server.cartociudad.types.Point>();
List<Point> toReturn = new ArrayList<Point>();
if(!configurations.existsConfiguration(action.getConfigID())){
throw new ActionException("Bad Config ID");
}
int timeoutMiliSeconds;
try{
timeoutMiliSeconds=Integer.valueOf(configurations.getConfiguration(action.getConfigID()).
getConfigurationParamValue(ParameterNames.ROUTES_SERVICE_TIMEOUT_MILISECONDS));
}catch (Exception e){
logger.warn("An error ocurred when parse to int the parameter: "+
ParameterNames.ROUTES_SERVICE_TIMEOUT_MILISECONDS+
". Timeout set to default (30000 ms). Please change parameter value and"+
" reload the service.");
timeoutMiliSeconds=30000;
}
if(timeoutMiliSeconds!=0){
boolean incorrectEPSG=false;
for(Point point:action.getPoints()){
if(!point.getProjection().toLowerCase().trim().equals("epsg:4326")){
incorrectEPSG=true;
break;
}
}
if(incorrectEPSG){
throw new ActionException("EPSG incorrect in some point, can't use Route service");
}
for(Point point:action.getPoints()){
points.add(new es.upm.fi.dia.oeg.map4rdf.server.cartociudad.types.Point(String.valueOf(point.getX()),String.valueOf(point.getY())));
}
RouteFinderCall rfc = new RouteFinderCall("http://www.cartociudad.es/wps/WebProcessingService",timeoutMiliSeconds);
List<List<es.upm.fi.dia.oeg.map4rdf.server.cartociudad.types.Point>> paths = rfc.getPath(points);
for(List<es.upm.fi.dia.oeg.map4rdf.server.cartociudad.types.Point> listPoints:paths){
for(es.upm.fi.dia.oeg.map4rdf.server.cartociudad.types.Point point: listPoints){
toReturn.add(new PointBean("", Double.parseDouble(point.getLat()),Double.parseDouble(point.getLon()),"EPSG:4326"));
}
}
}
return new GetRoutePointsResult(toReturn);
}
@Override
public Class<GetRoutePoints> getActionType() {
return GetRoutePoints.class;
}
@Override
public void rollback(GetRoutePoints arg0, GetRoutePointsResult arg1,
ExecutionContext arg2) throws ActionException {
}
}