package es.upm.fi.dia.oeg.map4rdf.server.command;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import com.google.inject.Inject;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetAddInfoConfigResult;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetAddInfoConfig;
import es.upm.fi.dia.oeg.map4rdf.client.action.SingletonResult;
import es.upm.fi.dia.oeg.map4rdf.server.conf.multiple.MultipleConfigurations;
import es.upm.fi.dia.oeg.map4rdf.share.GeoResource;
import es.upm.fi.dia.oeg.map4rdf.share.conf.ParametersNamesAddInfo;
import es.upm.fi.dia.oeg.map4rdf.share.conf.util.AdditionalInfo;
import net.customware.gwt.dispatch.server.ActionHandler;
import net.customware.gwt.dispatch.server.ExecutionContext;
import net.customware.gwt.dispatch.shared.DispatchException;
public class GetAddInfoConfigHandler implements ActionHandler<GetAddInfoConfig, SingletonResult<GetAddInfoConfigResult>>{
private MultipleConfigurations configurations;
@Inject
public GetAddInfoConfigHandler(MultipleConfigurations configurations){
this.configurations=configurations;
}
@Override
public Class<GetAddInfoConfig> getActionType() {
return GetAddInfoConfig.class;
}
@Override
public SingletonResult<GetAddInfoConfigResult> execute(GetAddInfoConfig action,
ExecutionContext context) throws DispatchException {
List<AdditionalInfo> toReturn= new ArrayList<AdditionalInfo>();
if(!configurations.existsConfiguration(action.getConfigID()) && configurations.getConfiguration(action.getConfigID()).getAddInfoConfigServer()!=null){
return new SingletonResult<GetAddInfoConfigResult>(new GetAddInfoConfigResult(toReturn));
}
for(AdditionalInfo info:configurations.getConfiguration(action.getConfigID()).getAddInfoConfigServer().getAdditionalsInfo()){
try {
URL u = new URL(info.getEndpoint()+parseQuery(info.getQuery(),info.getInputParameters(), action.getResource()));
URLConnection conn = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String inputLine;
StringBuffer result=new StringBuffer();
while ((inputLine = in.readLine()) != null){
result.append(inputLine+"\n");
}
AdditionalInfo newInfo=AdditionalInfo.newInstance();
newInfo.setEndpoint(info.getEndpoint());
newInfo.setQuery(info.getQuery());
newInfo.setQueryParametersResults(info.getQueryParametersResults());
newInfo.setResult(result.toString());
newInfo.setHas_image_limit(info.isHasImageLimit());
newInfo.setImage_parameter(info.getImage_parameter());
newInfo.setInferiorLimit(info.getInferiorLimit());
newInfo.setSuperiorLimit(info.getSuperiorLimit());
newInfo.setImages(info.getImages());
toReturn.add(newInfo);
} catch (MalformedURLException e) {
} catch (IOException e) {
}
}
return new SingletonResult<GetAddInfoConfigResult>(new GetAddInfoConfigResult(toReturn));
}
private String parseQuery(String query,String input,GeoResource resource){
if(query.contains(ParametersNamesAddInfo.RESOURCE) && input.contains(ParametersNamesAddInfo.RESOURCE)){
query=query.replace(ParametersNamesAddInfo.RESOURCE, resource.getUri());
}
try {
query=URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
}
return query;
}
@Override
public void rollback(GetAddInfoConfig action,
SingletonResult<GetAddInfoConfigResult> result, ExecutionContext context)
throws DispatchException {
}
}