/*
* Copyright 2010 kk-electronic a/s.
*
* This file is part of KKPortal.
*
* KKPortal is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KKPortal is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with KKPortal. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kk_electronic.kkportal.examples.rpc;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONValue;
import com.google.inject.Inject;
import com.kk_electronic.kkportal.core.rpc.Dispatcher;
import com.kk_electronic.kkportal.core.rpc.JsonEncoder;
import com.kk_electronic.kkportal.core.rpc.jsonformat.UnableToDeserialize;
import com.kk_electronic.kkportal.core.rpc.jsonformat.UnableToSerialize;
/**
* An Example of how a dispatcher for service requests would look written to use PHP
*
* TODO: Write a more extensive comment on this dispatcher
*
* It's server side file is located in "war-src/php" and is called dispatch.php
*
* @author Jes Andersen
*
*/
public class PHPDispatcher implements Dispatcher {
private final JsonEncoder encoder;
@Inject
public PHPDispatcher(JsonEncoder encoder) {
this.encoder = encoder;
}
@Override
public <T> void execute(final com.kk_electronic.kkportal.core.rpc.Request<T> orequest) {
String url = "php/dispatch.php?i="+orequest.getServerinterface().getName()+"&m="+orequest.getMethod();
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,url);
StringBuilder sb = new StringBuilder();
try {
encoder.encode(orequest.getParams(), sb);
} catch (UnableToSerialize e) {
orequest.onFailure(e);
}
try {
builder.sendRequest(sb.toString(),new RequestCallback() {
@Override
public void onError(com.google.gwt.http.client.Request request,
Throwable exception) {
orequest.onFailure(exception);
}
@Override
public void onResponseReceived(Request request,
Response response) {
JSONValue result;
try {
result = encoder.decode(response.getText());
} catch (UnableToDeserialize e) {
orequest.onFailure(e);
return;
}
T decodedResult = null;
try {
decodedResult = encoder.validate(result, decodedResult, orequest.getReturnValueType());
} catch (UnableToDeserialize e) {
orequest.onFailure(e);
return;
}
orequest.onSuccess(decodedResult);
}
});
} catch (RequestException e) {
orequest.onFailure(e);
}
}
}