Frame communication

25 views
Skip to first unread message

Netsurfer

unread,
Dec 4, 2008, 6:53:14 AM12/4/08
to Google Web Toolkit
In order to accomplish frame communication I've tryed an interesting
approach that I can share with the community.

The goal is to serialize an object into an econded String directly on
client side, pass through this data to an internal frame that expose a
javascript method to do it.
The frame that is a GWT application call a service that decode the
encoded String into the correct object.

You can use this method to restore an history status with contents
stored in a separated internal frame, to pass contents between frames
with only one server call.

Example code:

Class SharedObject:

package frame.communication.client;

import com.google.gwt.user.client.rpc.IsSerializable;

public class SharedObject implements IsSerializable {

private String name;

private String surname;

SharedObject() {
}

public SharedObject(String name, String surname) {
setName(name);
setSurname(surname);
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSurname() {
return surname;
}

public void setSurname(String surname) {
this.surname = surname;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((surname == null) ? 0 : surname.hashCode
());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SharedObject other = (SharedObject) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (surname == null) {
if (other.surname != null)
return false;
} else if (!surname.equals(other.surname))
return false;
return true;
}

}


Class FrameCommunication:

package frame.communication.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamFactory;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;

public class FrameCommunication implements EntryPoint {

public void onModuleLoad() {
SharedObject sharedObject = new SharedObject("John", "Doe");

try {
String encodedRequest = clientSerialization(sharedObject);
decodeClientSerialization(sharedObject, encodedRequest);
} catch (SerializationException e) {
Window.alert(e.getMessage());
}
}

public String clientSerialization(SharedObject sharedObject)
throws SerializationException {
SerializationStreamFactory factory = GWT
.create(SharedObjectService.class);
SerializationStreamWriter writer = factory.createStreamWriter();
writer.writeString(SharedObject.class.getName());
writer.writeObject(sharedObject);
return writer.toString();
}

public void decodeClientSerialization(final SharedObject
sharedObject,
String encodedRequest) {
SharedObjectService.Util.getInstance().decode(encodedRequest,
new AsyncCallback<SharedObject>() {
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
}

public void onSuccess(SharedObject result) {
boolean sameObject = sharedObject.equals(result);
Window.alert("Successful: " + sameObject);
}
});
}

}


Class SharedService:

package frame.communication.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

public interface SharedObjectService extends RemoteService {

public static final String SERVICE_URI = "SharedObjectService";

public static class Util {

public static SharedObjectServiceAsync getInstance() {

SharedObjectServiceAsync instance = (SharedObjectServiceAsync) GWT
.create(SharedObjectService.class);
ServiceDefTarget target = (ServiceDefTarget) instance;
target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI);
return instance;
}
}

public SharedObject decode(String encoded)
throws SerializationDecodeException;
}

Class SharedServiceImpl:

package frame.communication.server;

import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader;

import frame.communication.client.SerializationDecodeException;
import frame.communication.client.SharedObject;
import frame.communication.client.SharedObjectService;

public class SharedObjectServiceImpl extends RemoteServiceServlet
implements
SharedObjectService {

public SharedObject decode(String encodedRequest)
throws SerializationDecodeException {
ClassLoader classLoader = Thread.currentThread()
.getContextClassLoader();

ServerSerializationStreamReader streamReader = new
ServerSerializationStreamReader(
classLoader, null);

try {
streamReader.prepareToRead(encodedRequest);
String className = (String) streamReader
.deserializeValue(String.class);
return (SharedObject) streamReader.deserializeValue(Class
.forName(className));
} catch (SerializationException e) {
throw new SerializationDecodeException(e.getMessage());
} catch (ClassCastException ccExc) {
throw new SerializationDecodeException(ccExc.getMessage());
} catch (ClassNotFoundException e) {
throw new SerializationDecodeException(e.getMessage());
}
}

}



Reply all
Reply to author
Forward
0 new messages