blob: 7735e99f69b3617195a3fa553b2ce7a349c2a115 [file] [log] [blame]
package org.apache.hupa.shared.storage;
import com.google.gwt.regexp.shared.MatchResult;
import com.google.gwt.regexp.shared.RegExp;
import com.google.inject.Inject;
import com.google.web.bindery.autobean.shared.AutoBean;
import com.google.web.bindery.autobean.shared.AutoBeanCodex;
import com.google.web.bindery.autobean.shared.AutoBeanFactory;
import com.google.web.bindery.autobean.shared.AutoBeanUtils;
import com.google.web.bindery.requestfactory.shared.BaseProxy;
import com.google.web.bindery.requestfactory.shared.DefaultProxyStore;
import com.google.web.bindery.requestfactory.shared.RequestFactory;
public class AppSerializer {
@Inject RequestFactory requestFactory;
@Inject AutoBeanFactory beanFactory;
private final RegExp proxyIdRegexp = RegExp.compile("^.*?\"([^\"]+@\\d+@[^\"]+)\":\\{\"[POSTY]\":(.+)$");
private final RegExp proxyMultIdRegexp = RegExp.compile("^.*?([^#]+@\\d+@[^#]+)#~#(.+)$");
private boolean containsMultipleProxies(String data) {
MatchResult r = proxyIdRegexp.exec(data);
return r != null && proxyIdRegexp.exec(r.getGroup(2)) != null;
}
public <T extends BaseProxy> T deserialize(Class<T> clz, String payload) {
String keyData[] = splitKeyData(payload);
DefaultProxyStore store = new DefaultProxyStore(keyData[1]);
return requestFactory.getSerializer(store).deserialize(clz, keyData[0]);
}
private String[] splitKeyData(String payload) {
MatchResult r;
r = proxyMultIdRegexp.exec(payload);
if (r != null) {
payload = r.getGroup(2);
} else {
r = proxyIdRegexp.exec(payload);
}
return new String[]{r.getGroup(1), payload};
}
public <T extends BaseProxy> String serialize(T proxy) {
DefaultProxyStore store = new DefaultProxyStore();
String key = requestFactory.getSerializer(store).serialize(proxy);
String data = store.encode();
if (containsMultipleProxies(data)) {
data = key + "#~#" + data;
}
return data;
}
public <T> T deserializeBean(Class<T> clz, String payload) {
AutoBean<T> a = AutoBeanCodex.decode(beanFactory, clz, payload);
assert a != null : "There is no info about AutoBean: " + clz + ", maybe you forgot to include it in the App AutoBeanFactory";
return a.as();
}
public <T> String serializeBean(T proxy) {
AutoBean<T> bean = AutoBeanUtils.getAutoBean(proxy);
String json = AutoBeanCodex.encode(bean).getPayload();
return json;
}
}