package net.thesocialos.server.utils; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import com.google.gwt.user.client.rpc.SerializationException; import com.google.gwt.user.server.rpc.SerializationPolicy; import com.google.gwt.user.server.rpc.SerializationPolicyLoader; public class MergedSerializationPolicy extends SerializationPolicy { public static SerializationPolicy createPushSerializationPolicy() { File[] files = new File("thesocialos").listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".gwt.rpc"); } }); List<SerializationPolicy> policies = new ArrayList<SerializationPolicy>(); for (File f : files) try { BufferedInputStream input = new BufferedInputStream(new FileInputStream(f)); policies.add(SerializationPolicyLoader.loadFromStream(input, null)); } catch (Exception e) { throw new RuntimeException("Unable to load a policy file: " + f.getAbsolutePath()); } return new MergedSerializationPolicy(policies); } List<SerializationPolicy> policies; MergedSerializationPolicy(List<SerializationPolicy> policies) { this.policies = policies; } @Override public boolean shouldDeserializeFields(Class<?> clazz) { for (SerializationPolicy p : policies) if (p.shouldDeserializeFields(clazz)) return true; return false; } @Override public boolean shouldSerializeFields(Class<?> clazz) { for (SerializationPolicy p : policies) if (p.shouldSerializeFields(clazz)) return true; return false; } @Override public void validateDeserialize(Class<?> clazz) throws SerializationException { SerializationException se = null; for (SerializationPolicy p : policies) try { p.validateDeserialize(clazz); return; } catch (SerializationException e) { se = e; } throw se; } @Override public void validateSerialize(Class<?> clazz) throws SerializationException { SerializationException se = null; for (SerializationPolicy p : policies) try { p.validateSerialize(clazz); return; } catch (SerializationException e) { se = e; } throw se; } }