package es.upm.fi.dia.oeg.map4rdf.client.util;
import java.util.HashMap;
import java.util.Map;
import net.customware.gwt.dispatch.client.DispatchAsync;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.rpc.AsyncCallback;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetAddInfoConfig;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetAddInfoConfigResult;
import es.upm.fi.dia.oeg.map4rdf.client.action.SingletonResult;
import es.upm.fi.dia.oeg.map4rdf.share.GeoResource;
import es.upm.fi.dia.oeg.map4rdf.share.conf.util.AdditionalInfo;
import es.upm.fi.dia.oeg.map4rdf.share.conf.util.QueryParameterResult;
public class AdditionalInfoExecuter {
private static GetAddInfoConfigResult addInfoConfig;
private static Map<Integer,Boolean> doCallbacks=new HashMap<Integer, Boolean>();
private static int id=0;
public interface InfoCallback{
void success(AdditionalInfoSummary additionalInfo);
}
private static class AdditionalInfoReturn{
private Map<String,String> transformedValues=new HashMap<String, String>();
private Map<String,String> originalValues=new HashMap<String, String>();
public Map<String, String> getTransformedValues() {
return transformedValues;
}
public Map<String, String> getOriginalValues() {
return originalValues;
}
}
public static void getAdditionalInfo(final String configID,final DispatchAsync dispatchAsync,final GeoResource resource,final InfoCallback callback){
addInfoConfig=null;
final int myId=id++;
doCallbacks.put(myId, true);
if(id==100){
id=0;
}
dispatchAsync.execute(new GetAddInfoConfig(configID,resource), new AsyncCallback<SingletonResult<GetAddInfoConfigResult>>() {
@Override
public void onFailure(Throwable caught) {
Map<String,String> toReturn = new HashMap<String, String>();
AdditionalInfoSummary additionalInfo= new AdditionalInfoSummary(toReturn);
if(doCallbacks.containsKey(myId) && doCallbacks.get(myId)){
callback.success(additionalInfo);
}
doCallbacks.remove(myId);
}
@Override
public void onSuccess(SingletonResult<GetAddInfoConfigResult> result) {
addInfoConfig=result.getValue();
AdditionalInfoReturn toReturn=new AdditionalInfoReturn();
for(AdditionalInfo addiInfo:addInfoConfig.getAdditionalsInfo()){
toReturn=analizeJSON(addiInfo, toReturn);
}
if(doCallbacks.containsKey(myId) && doCallbacks.get(myId)){
AdditionalInfoSummary additionalInfo= new AdditionalInfoSummary(toReturn.getTransformedValues());
for(AdditionalInfo addiInfo:addInfoConfig.getAdditionalsInfo()){
if(addiInfo.isHasImageLimit()){
if(toReturn.getOriginalValues().containsKey(addiInfo.getImage_parameter())){
try{
Double doLimit=Double.parseDouble(toReturn.getOriginalValues().get(addiInfo.getImage_parameter()));
if(doLimit<addiInfo.getInferiorLimit()){
additionalInfo.setImage(addiInfo.getImages()[0]);
break;
}
if(doLimit>addiInfo.getSuperiorLimit()){
additionalInfo.setImage(addiInfo.getImages()[2]);
break;
}
if(doLimit>=addiInfo.getInferiorLimit() && doLimit<=addiInfo.getSuperiorLimit()){
additionalInfo.setImage(addiInfo.getImages()[1]);
break;
}
}catch(Exception e){
}
}
}
}
callback.success(additionalInfo);
}
doCallbacks.remove(myId);
}
});
}
public static void cancelAllCallbacks(){
for(int key:doCallbacks.keySet()){
doCallbacks.put(key, false);
}
}
public static AdditionalInfoReturn analizeJSON(AdditionalInfo info, AdditionalInfoReturn infoReturn){
String datasValues= info.getResult();
if(datasValues!=null && !datasValues.isEmpty()){
JSONValue value= JSONParser.parseStrict(datasValues);
if( value!=null && value.isObject()!=null
&& value.isObject().get("results")!=null
&& value.isObject().get("results").isObject()!=null
&& value.isObject().get("results").isObject().get("bindings")!=null
&& value.isObject().get("results").isObject().get("bindings").isArray()!=null){
JSONArray array= value.isObject().get("results").isObject().get("bindings").isArray();
int addValues=0;
for(int i=0;i<array.size();i++){
if(array.get(i)!=null && array.get(i).isObject()!=null){
JSONObject valor=array.get(i).isObject();
for(QueryParameterResult res:info.getQueryParametersResults()){
if(valor.get(res.getUri())!=null && valor.get(res.getUri()).isObject()!=null
&& valor.get(res.getUri()).isObject().get("value")!=null
&& valor.get(res.getUri()).isObject().get("value").isString()!=null){
String anadir=valor.get(res.getUri()).isObject().get("value").isString().toString().replace("\"", "");
if(!infoReturn.getOriginalValues().containsKey(res.getParameter())){
infoReturn.getOriginalValues().put(res.getParameter(), anadir);
}
if(!infoReturn.getTransformedValues().containsKey(LocaleUtil.getBestLabel(res))){
infoReturn.getTransformedValues().put(LocaleUtil.getBestLabel(res), anadir);
addValues++;
}
}
}
if(addValues==info.getQueryParametersResults().size()){
break;
}
}
}
}
}
return infoReturn;
}
}