]> source.dussan.org Git - vaadin-framework.git/commitdiff
Automatically create state on server side based on getState return type
authorArtur Signell <artur@vaadin.com>
Mon, 2 Apr 2012 21:29:44 +0000 (00:29 +0300)
committerArtur Signell <artur@vaadin.com>
Wed, 4 Apr 2012 21:08:25 +0000 (00:08 +0300)
src/com/vaadin/ui/AbstractComponent.java
src/com/vaadin/ui/AbstractField.java
src/com/vaadin/ui/AbstractSplitPanel.java
src/com/vaadin/ui/Button.java
src/com/vaadin/ui/Panel.java
src/com/vaadin/ui/Window.java

index 189142519d05a31b07c19e949edc36b055608656..8c26911a9a42daa2a9c13267d7dfb13f4834da87 100644 (file)
@@ -18,6 +18,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -879,18 +881,34 @@ public abstract class AbstractComponent implements Component, MethodEventSource
     /**
      * Creates the shared state bean to be used in server to client
      * communication.
-     * 
-     * Subclasses should implement this method and return a new instance of the
-     * correct state class.
-     * 
-     * All configuration of the values of the state should be performed in
-     * {@link #getState()}, not in {@link #createState()}.
+     * <p>
+     * By default a state object of the defined return type of
+     * {@link #getState()} is created. Subclasses can override this method and
+     * return a new instance of the correct state class but this should rarely
+     * be necessary.
+     * </p>
+     * <p>
+     * No configuration of the values of the state should be performed in
+     * {@link #createState()}.
      * 
      * @since 7.0
      * 
      * @return new shared state object
      */
     protected ComponentState createState() {
+        try {
+            Method m = getClass().getMethod("getState", (Class[]) null);
+            Class<? extends ComponentState> type = (Class<? extends ComponentState>) m
+                    .getReturnType();
+            return type.newInstance();
+        } catch (Exception e) {
+            getLogger().log(
+                    Level.INFO,
+                    "Error determining state object class for "
+                            + getClass().getName());
+        }
+
+        // Fall back to ComponentState if detection fails for some reason.
         return new ComponentState();
     }
 
@@ -1743,4 +1761,8 @@ public abstract class AbstractComponent implements Component, MethodEventSource
         }
         return connectorId;
     }
+
+    private Logger getLogger() {
+        return Logger.getLogger(AbstractComponent.class.getName());
+    }
 }
index aecb07e108e28880e9e328e4b0b1b8369113464c..361e65fa341820f213011565e63f38a294d82972 100644 (file)
@@ -1592,8 +1592,4 @@ public abstract class AbstractField<T> extends AbstractComponent implements
         getState().setHideErrors(shouldHideErrors());
     }
 
-    @Override
-    protected AbstractFieldState createState() {
-        return new AbstractFieldState();
-    }
 }
index 2e31436ee23a6c2936238e0b2b01594b1749873e..b57600834407c447115ad2e88f8452dd8a7107a5 100644 (file)
@@ -11,7 +11,6 @@ import java.util.Iterator;
 import com.vaadin.event.ComponentEventListener;
 import com.vaadin.event.MouseEvents.ClickEvent;
 import com.vaadin.terminal.Sizeable;
-import com.vaadin.terminal.gwt.client.ComponentState;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.AbstractSplitPanelConnector.AbstractSplitPanelRPC;
 import com.vaadin.terminal.gwt.client.ui.AbstractSplitPanelConnector.AbstractSplitPanelState;
@@ -388,8 +387,4 @@ public abstract class AbstractSplitPanel extends AbstractLayout {
         return (AbstractSplitPanelState) super.getState();
     }
 
-    @Override
-    protected ComponentState createState() {
-        return new AbstractSplitPanelState();
-    }
 }
index 7deb0486554a0dd35c03f7f917722498239cdfdb..5c66d57939a7f4dfde2ddec29e11b753f636eb09 100644 (file)
@@ -18,7 +18,6 @@ import com.vaadin.event.ShortcutAction;
 import com.vaadin.event.ShortcutAction.KeyCode;
 import com.vaadin.event.ShortcutAction.ModifierKey;
 import com.vaadin.event.ShortcutListener;
-import com.vaadin.terminal.gwt.client.ComponentState;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.ButtonConnector.ButtonServerRpc;
 import com.vaadin.terminal.gwt.client.ui.ButtonState;
@@ -496,11 +495,6 @@ public class Button extends AbstractComponent implements
         super.focus();
     }
 
-    @Override
-    protected ComponentState createState() {
-        return new ButtonState();
-    }
-
     @Override
     public ButtonState getState() {
         return (ButtonState) super.getState();
index 26c7e63908f06cac75fdc61cf93c7b77e6421f20..ad0ff4222f638444da166260215f755cdfa79d25 100644 (file)
@@ -546,8 +546,4 @@ public class Panel extends AbstractComponentContainer implements Scrollable,
         return (PanelState) super.getState();
     }
 
-    @Override
-    protected PanelState createState() {
-        return new PanelState();
-    }
 }
index aa49a36b55bc553f65e7d94fdc159f59e801ce4d..f15b46ce1d053b465bf1040b02a95fe99b0eb756 100644 (file)
@@ -903,8 +903,4 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier {
         return (WindowState) super.getState();
     }
 
-    @Override
-    protected WindowState createState() {
-        return new WindowState();
-    }
 }