From 1bfd63b2b701232e6ade5d0c96ee91e25fd07cce Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 20 Apr 2012 11:49:27 +0300 Subject: [PATCH] Added test to ensure shared classes are Serializable (#8710) Corrected SplitterState to be Serializable. --- .../splitpanel/AbstractSplitPanelState.java | 4 ++- .../SerializerMapGenerator.java | 34 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelState.java b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelState.java index 13f3adbc72..8b80eed840 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelState.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelState.java @@ -3,6 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui.splitpanel; +import java.io.Serializable; + import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.client.Connector; @@ -44,7 +46,7 @@ public class AbstractSplitPanelState extends ComponentState { this.splitterState = splitterState; } - public static class SplitterState { + public static class SplitterState implements Serializable { private float position; private String positionUnit; private boolean positionReversed = false; diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java index e09545962b..013df4710c 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java @@ -5,6 +5,7 @@ package com.vaadin.terminal.gwt.widgetsetutils; import java.io.PrintWriter; +import java.io.Serializable; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -52,6 +53,8 @@ public class SerializerMapGenerator extends Generator { TypeOracle typeOracle = context.getTypeOracle(); Set typesNeedingSerializers = findTypesNeedingSerializers( typeOracle, logger); + warnIfNotJavaSerializable(typesNeedingSerializers, typeOracle, + logger); Set typesWithExistingSerializers = findTypesWithExistingSerializers( typeOracle, logger); Set serializerMappings = new HashSet(); @@ -77,6 +80,34 @@ public class SerializerMapGenerator extends Generator { return packageName + "." + className; } + /** + * Emits a warning for all classes that are used in communication but do not + * implement java.io.Serializable. Implementing java.io.Serializable is not + * needed for communication but for the server side Application to be + * serializable i.e. work in GAE for instance. + * + * @param typesNeedingSerializers + * @param typeOracle + * @param logger + */ + private void warnIfNotJavaSerializable( + Set typesNeedingSerializers, TypeOracle typeOracle, + TreeLogger logger) { + JClassType javaSerializable = typeOracle.findType(Serializable.class + .getName()); + for (JClassType type : typesNeedingSerializers) { + boolean serializable = type.isAssignableTo(javaSerializable); + if (!serializable) { + logger.log( + Type.ERROR, + type + + " is used in RPC or shared state but does not implement " + + Serializable.class.getName() + + ". Communication will work but the Application on server side cannot be serialized if it refers to objects of this type."); + } + } + } + private Set findTypesWithExistingSerializers( TypeOracle typeOracle, TreeLogger logger) { JClassType serializerInterface = typeOracle @@ -233,8 +264,9 @@ public class SerializerMapGenerator extends Generator { return; } - if (serializableTypes.contains(type)) + if (serializableTypes.contains(type)) { return; + } JClassType typeClass = type.isClass(); if (typeClass != null) { -- 2.39.5