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"; private Constructor streamReaderConstructor; private Constructor streamWriterConstructor; private Object legacySerializationPolicy; @Create public void startup() throws Exception { try { log.trace("GWT14Service 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 GWT14Service. Please ensure " + "the GWT 1.4 libraries are in the classpath."); throw ex; } } @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) { responseObj = 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); } } }