/*
* Copyright 2014 cruxframework.org.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.cruxframework.crux.core.rebind.rest;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import org.cruxframework.crux.core.client.utils.EscapeUtils;
import org.cruxframework.crux.core.rebind.AbstractProxyCreator.SourcePrinter;
import org.cruxframework.crux.core.rebind.context.RebindContext;
import org.cruxframework.crux.core.utils.JClassUtils;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JParameter;
public class JsonPRestCreatorHelper
{
protected RebindContext context;
private JClassType javascriptObjectType;
public JsonPRestCreatorHelper(RebindContext context)
{
this.context = context;
javascriptObjectType = context.getGeneratorContext().getTypeOracle().findType(JavaScriptObject.class.getCanonicalName());
}
protected void generateJSONPInvocation(RestMethodInfo methodInfo, SourcePrinter srcWriter, JParameter callbackParameter,
String callbackResultTypeName, String callbackParameterName, String restURIParam, String jsonPCallbackParam, String jsonPFailureCallbackParam)
{
srcWriter.println("try{");
srcWriter.println("JsonpRequestBuilder builder = new JsonpRequestBuilder();");
if (jsonPCallbackParam.length() > 0)
{
srcWriter.println("builder.setCallbackParam("+EscapeUtils.quote(jsonPCallbackParam)+");");
}
if (jsonPFailureCallbackParam.length() > 0)
{
srcWriter.println("builder.setFailureCallbackParam("+EscapeUtils.quote(jsonPFailureCallbackParam)+");");
}
JClassType callbackResultType = JClassUtils.getTypeArgForGenericType(callbackParameter.getType().isClassOrInterface());
if (callbackResultType.isEnum() != null || callbackResultType.getQualifiedSourceName().equals(String.class.getCanonicalName())
|| callbackResultType.getQualifiedSourceName().equals(BigDecimal.class.getCanonicalName())
|| callbackResultType.getQualifiedSourceName().equals(BigInteger.class.getCanonicalName()))
{
generateRequestAndOnSuccessMethodForString(srcWriter, callbackResultTypeName, callbackParameterName, restURIParam, callbackResultType);
}
else if (callbackResultType.getQualifiedSourceName().equals(Boolean.class.getCanonicalName()))
{
generateRequestAndOnSuccessMethodForBoolean(srcWriter, callbackResultTypeName, callbackParameterName, restURIParam, callbackResultType);
}
else if (callbackResultType.getQualifiedSourceName().equals(Integer.class.getCanonicalName())
|| callbackResultType.getQualifiedSourceName().equals(Short.class.getCanonicalName())
|| callbackResultType.getQualifiedSourceName().equals(Byte.class.getCanonicalName()))
{
generateRequestAndOnSuccessMethodForInteger(srcWriter, callbackResultTypeName, callbackParameterName, restURIParam, callbackResultType);
}
else if (callbackResultType.getQualifiedSourceName().equals(Double.class.getCanonicalName())
|| callbackResultType.getQualifiedSourceName().equals(Long.class.getCanonicalName())
|| callbackResultType.getQualifiedSourceName().equals(Date.class.getCanonicalName()))
{
generateRequestAndOnSuccessMethodForDouble(srcWriter, callbackResultTypeName, callbackParameterName, restURIParam, callbackResultType);
}
else
{
generateRequestAndOnSuccessMethodForObject(srcWriter, callbackResultTypeName, callbackParameterName, restURIParam, callbackResultType);
}
srcWriter.println("public void onFailure(Throwable exception){");
srcWriter.println(callbackParameterName+".onError(new RestError(-1, Crux.getMessages().restServiceUnexpectedError(exception.getMessage())));");
srcWriter.println("}");
srcWriter.println("});");
srcWriter.println("}catch (Exception e){");
srcWriter.println(callbackParameterName+".onError(new RestError(-1, Crux.getMessages().restServiceUnexpectedError(e.getMessage())));");
srcWriter.println("}");
}
protected void generateRequestAndOnSuccessMethodForString(SourcePrinter srcWriter, String callbackResultTypeName, String callbackParameterName, String restURIParam, JClassType callbackResultType)
{
srcWriter.println("builder.requestString("+restURIParam+", new AsyncCallback<String>(){");
srcWriter.println("public void onSuccess(String jsonText){");
srcWriter.println("try{");
srcWriter.println("JSONValue jsonValue = new JSONString(jsonText);");
String serializerName = new JSonSerializerProxyCreator(context, callbackResultType).create();
srcWriter.println(callbackResultTypeName+" result = new "+serializerName+"().decode(jsonValue);");
srcWriter.println(callbackParameterName+".onSuccess(result);");
srcWriter.println("}catch (Exception e){");
srcWriter.println("if (LogConfiguration.loggingIsEnabled()){");
srcWriter.println("__log.log(Level.SEVERE, e.getMessage(), e);");
srcWriter.println("}");
srcWriter.println("}");
srcWriter.println("}");
}
protected void generateRequestAndOnSuccessMethodForBoolean(SourcePrinter srcWriter, String callbackResultTypeName, String callbackParameterName, String restURIParam, JClassType callbackResultType)
{
srcWriter.println("builder.requestBoolean("+restURIParam+", new AsyncCallback<Boolean>(){");
srcWriter.println("public void onSuccess(Boolean result){");
srcWriter.println("try{");
srcWriter.println(callbackParameterName+".onSuccess(result);");
srcWriter.println("}catch (Exception e){");
srcWriter.println("if (LogConfiguration.loggingIsEnabled()){");
srcWriter.println("__log.log(Level.SEVERE, e.getMessage(), e);");
srcWriter.println("}");
srcWriter.println("}");
srcWriter.println("}");
}
protected void generateRequestAndOnSuccessMethodForDouble(SourcePrinter srcWriter, String callbackResultTypeName, String callbackParameterName, String restURIParam, JClassType callbackResultType)
{
srcWriter.println("builder.requestDouble("+restURIParam+", new AsyncCallback<Double>(){");
srcWriter.println("public void onSuccess(Double value){");
srcWriter.println("try{");
srcWriter.println("JSONValue jsonValue = new JSONNumber(value);");
String serializerName = new JSonSerializerProxyCreator(context, callbackResultType).create();
srcWriter.println(callbackResultTypeName+" result = new "+serializerName+"().decode(jsonValue);");
srcWriter.println(callbackParameterName+".onSuccess(result);");
srcWriter.println("}catch (Exception e){");
srcWriter.println("if (LogConfiguration.loggingIsEnabled()){");
srcWriter.println("__log.log(Level.SEVERE, e.getMessage(), e);");
srcWriter.println("}");
srcWriter.println("}");
srcWriter.println("}");
}
protected void generateRequestAndOnSuccessMethodForInteger(SourcePrinter srcWriter, String callbackResultTypeName, String callbackParameterName, String restURIParam, JClassType callbackResultType)
{
srcWriter.println("builder.requestInteger("+restURIParam+", new AsyncCallback<Integer>(){");
srcWriter.println("public void onSuccess(Integer value){");
srcWriter.println("try{");
srcWriter.println("JSONValue jsonValue = new JSONNumber(value);");
String serializerName = new JSonSerializerProxyCreator(context, callbackResultType).create();
srcWriter.println(callbackResultTypeName+" result = new "+serializerName+"().decode(jsonValue);");
srcWriter.println(callbackParameterName+".onSuccess(result);");
srcWriter.println("}catch (Exception e){");
srcWriter.println("if (LogConfiguration.loggingIsEnabled()){");
srcWriter.println("__log.log(Level.SEVERE, e.getMessage(), e);");
srcWriter.println("}");
srcWriter.println("}");
srcWriter.println("}");
}
protected void generateRequestAndOnSuccessMethodForObject(SourcePrinter srcWriter, String callbackResultTypeName, String callbackParameterName, String restURIParam, JClassType callbackResultType)
{
srcWriter.println("builder.requestObject("+restURIParam+", new AsyncCallback<"+JavaScriptObject.class.getCanonicalName()+">(){");
srcWriter.println("public void onSuccess("+JavaScriptObject.class.getCanonicalName()+" obj){");
srcWriter.println("try{");
if (callbackResultType != null && callbackResultType.isAssignableTo(javascriptObjectType))
{
srcWriter.println(callbackResultTypeName+" result = obj!=null?obj.cast():null;");
}
else
{
srcWriter.println("JSONValue jsonValue = new JSONObject(obj);");
String serializerName = new JSonSerializerProxyCreator(context, callbackResultType).create();
srcWriter.println(callbackResultTypeName+" result = new "+serializerName+"().decode(jsonValue);");
}
srcWriter.println(callbackParameterName+".onSuccess(result);");
srcWriter.println("}catch (Exception e){");
srcWriter.println("if (LogConfiguration.loggingIsEnabled()){");
srcWriter.println("__log.log(Level.SEVERE, e.getMessage(), e);");
srcWriter.println("}");
srcWriter.println("}");
srcWriter.println("}");
}
}