package org.jboss.seam.remoting.gwt;
import static org.jboss.seam.ScopeType.APPLICATION;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader;
import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter;
/**
*
* @author Shane Bryzak
*/
@Scope(APPLICATION)
@Name("org.jboss.seam.remoting.gwt.gwtRemoteService")
@Install(precedence = BUILT_IN, classDependencies = {"com.google.gwt.user.client.rpc.RemoteService"})
@BypassInterceptors
public class GWT14Service extends GWTService {
private static final String SERIALIZATION_POLICY_PROVIDER_CLASS = "com.google.gwt.user.server.rpc.SerializationPolicyProvider";
private static final String SERIALIZATION_POLICY_CLASS = "com.google.gwt.user.server.rpc.SerializationPolicy";
private static final String LEGACY_SERIALIZATION_POLICY_CLASS = "com.google.gwt.user.server.rpc.impl.LegacySerializationPolicy";
@SuppressWarnings("unchecked")
private Constructor streamReaderConstructor;
@SuppressWarnings("unchecked")
private Constructor streamWriterConstructor;
private Object legacySerializationPolicy;
@SuppressWarnings("unchecked")
@Create
public void startup() throws Exception {
try {
log.trace("GWT2Service starting up");
Class policyProviderClass = Class.forName(SERIALIZATION_POLICY_PROVIDER_CLASS);
Class serializationPolicyClass = Class.forName(SERIALIZATION_POLICY_CLASS);
streamReaderConstructor = ServerSerializationStreamReader.class.getConstructor(
new Class[]{ClassLoader.class, policyProviderClass});
streamWriterConstructor = ServerSerializationStreamWriter.class.getConstructor(
new Class[]{serializationPolicyClass});
Class legacySerializationPolicyClass = Class.forName(LEGACY_SERIALIZATION_POLICY_CLASS);
Method m = legacySerializationPolicyClass.getDeclaredMethod("getInstance");
legacySerializationPolicy = m.invoke(null);
} catch (Exception ex) {
log.error("Error initializing GWT2Service. Please ensure the GWT 2.0 libraries are in the classpath.");
throw ex;
}
}
@SuppressWarnings("unchecked")
@Override
protected String createResponse(
ServerSerializationStreamWriter stream, Class responseType, Object responseObj, boolean isException) {
stream.prepareToWrite();
if (responseType != void.class) {
try {
stream.serializeValue(responseObj, responseType);
} catch (SerializationException e) {
isException = true;
}
}
return (isException ? "//EX" : "//OK") + stream.toString();
}
@Override
public ServerSerializationStreamReader getStreamReader() {
try {
return (ServerSerializationStreamReader) streamReaderConstructor.newInstance(
Thread.currentThread().getContextClassLoader(), null);
} catch (Exception ex) {
throw new RuntimeException("Unable to create stream reader", ex);
}
}
@Override
public ServerSerializationStreamWriter getStreamWriter() {
try {
return (ServerSerializationStreamWriter) streamWriterConstructor.newInstance(legacySerializationPolicy);
} catch (Exception ex) {
throw new RuntimeException("Unable to create stream writer", ex);
}
}
}