]> source.dussan.org Git - vaadin-framework.git/commitdiff
Do not create default instances while reading designs (#7749)
authorArtur Signell <artur@vaadin.com>
Mon, 15 Dec 2014 06:41:45 +0000 (08:41 +0200)
committerMatti Hosio <mhosio@vaadin.com>
Mon, 15 Dec 2014 14:35:54 +0000 (16:35 +0200)
Change-Id: I26cb6d8d43200d10ebf8c0ac22c538b4272f5ecd

14 files changed:
common.xml
server/src/com/vaadin/ui/AbstractComponent.java
server/src/com/vaadin/ui/AbstractField.java
server/src/com/vaadin/ui/AbstractOrderedLayout.java
server/src/com/vaadin/ui/AbstractSplitPanel.java
server/src/com/vaadin/ui/AbstractTextField.java
server/src/com/vaadin/ui/Button.java
server/src/com/vaadin/ui/Panel.java
server/src/com/vaadin/ui/PasswordField.java
server/src/com/vaadin/ui/TabSheet.java
server/src/com/vaadin/ui/TextField.java
server/src/com/vaadin/ui/declarative/DesignAttributeHandler.java
server/tests/src/com/vaadin/tests/design/designroot/DesignRootTest.java
server/tests/src/com/vaadin/tests/server/component/abstractsplitpanel/TestReadDesign.java

index 6e28ab6a608d05001514fa0c240219a61c70704e..edd941c5e3d80f52dc1a4e290d840f855f7db7e8 100644 (file)
         <!-- Copy resources -->
         <copy todir="${test.classes}" failonerror="false">
             <fileset dir="${test.resources}" />
+                <!-- include html templates used in declarative tests --> 
+               <fileset dir="${test.src}">
+                <include name="**/*.html"/>
+               </fileset>
         </copy>
     </target>
 
index 3c68fde9b234fa4147e6d92c42d5673b943b250b..0b9f8bd2442025544528306c49cbd8810a4cbb9a 100644 (file)
@@ -920,11 +920,13 @@ public abstract class AbstractComponent extends AbstractClientConnector
     @Override
     public void readDesign(Element design, DesignContext designContext) {
         Attributes attr = design.attributes();
-        AbstractComponent def = designContext.getDefaultInstance(this
-                .getClass());
         // handle default attributes
         for (String attribute : getDefaultAttributes()) {
-            DesignAttributeHandler.readAttribute(this, attribute, attr, def);
+            if (!design.hasAttr(attribute)) {
+                continue;
+            }
+
+            DesignAttributeHandler.readAttribute(this, attribute, attr);
         }
         // handle immediate
         if (attr.hasKey("immediate")) {
@@ -941,14 +943,12 @@ public abstract class AbstractComponent extends AbstractClientConnector
             setLocale(null);
         }
         // handle width and height
-        readSize(attr, def);
+        readSize(attr);
         // handle component error
         if (attr.hasKey("error")) {
             UserError error = new UserError(attr.get("error"),
                     ContentMode.HTML, ErrorLevel.ERROR);
             setComponentError(error);
-        } else {
-            setComponentError(def.getComponentError());
         }
         // handle responsive
         setResponsive(attr.hasKey("responsive")
@@ -1045,8 +1045,7 @@ public abstract class AbstractComponent extends AbstractClientConnector
      * @param defaultInstance
      *            instance of the class that has default sizing.
      */
-    private void readSize(Attributes attributes,
-            AbstractComponent defaultInstance) {
+    private void readSize(Attributes attributes) {
         // read width
         if (attributes.hasKey("width-auto") || attributes.hasKey("size-auto")) {
             this.setWidth(null);
@@ -1055,9 +1054,6 @@ public abstract class AbstractComponent extends AbstractClientConnector
             this.setWidth("100%");
         } else if (attributes.hasKey("width")) {
             this.setWidth(attributes.get("width"));
-        } else {
-            this.setWidth(defaultInstance.getWidth(),
-                    defaultInstance.getWidthUnits());
         }
 
         // read height
@@ -1068,9 +1064,6 @@ public abstract class AbstractComponent extends AbstractClientConnector
             this.setHeight("100%");
         } else if (attributes.hasKey("height")) {
             this.setHeight(attributes.get("height"));
-        } else {
-            this.setHeight(defaultInstance.getHeight(),
-                    defaultInstance.getHeightUnits());
         }
     }
 
index ba518000d62173f76eb0601ad07fcaab64f20ada..c3e203693675a19c700380870786720723d07c25 100644 (file)
@@ -1767,15 +1767,16 @@ public abstract class AbstractField<T> extends AbstractComponent implements
     @Override
     public void readDesign(Element design, DesignContext designContext) {
         super.readDesign(design, designContext);
-        AbstractField def = designContext.getDefaultInstance(this.getClass());
         Attributes attr = design.attributes();
-        boolean readOnly = DesignAttributeHandler.readAttribute("readonly",
-                attr, def.isReadOnly(), Boolean.class);
-        setReadOnly(readOnly);
+        if (design.hasAttr("readonly")) {
+            setReadOnly(DesignAttributeHandler.readAttribute("readonly", attr,
+                    Boolean.class));
+        }
         // tabindex
-        int tabIndex = DesignAttributeHandler.readAttribute("tabindex", attr,
-                def.getTabIndex(), Integer.class);
-        setTabIndex(tabIndex);
+        if (design.hasAttr("tabindex")) {
+            setTabIndex(DesignAttributeHandler.readAttribute("tabindex", attr,
+                    Integer.class));
+        }
     }
 
     /*
index e99641a9ab4cd3f344d8277bbe4a1e56bc92ceb8..cd5609f0912e8ee951ff76c4c400e6357e4fa765 100644 (file)
@@ -477,18 +477,10 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
     public void readDesign(Element design, DesignContext designContext) {
         // process default attributes
         super.readDesign(design, designContext);
-        // remove current children
-        removeAllComponents();
         // handle margin
-        AbstractOrderedLayout def = designContext.getDefaultInstance(this
-                .getClass());
         if (design.hasAttr("margin")) {
-            String value = design.attr("margin");
-            setMargin(value.isEmpty() || value.equalsIgnoreCase("true"));
-
-        } else {
-            // we currently support only on-off margins
-            setMargin(def.getMargin().getBitMask() != 0);
+            setMargin(DesignAttributeHandler.readAttribute("margin",
+                    design.attributes(), Boolean.class));
         }
         // handle children
         for (Element childComponent : design.children()) {
index 66d01084d185adeb6ad43f774ab042ec2ba68658..9c33665c1cbd94ffdc14f27e51704f6ea3d5bf8a 100644 (file)
@@ -566,41 +566,31 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer {
         super.readDesign(design, designContext);
         // handle custom attributes, use default values if no explicit value
         // set
-        AbstractSplitPanel def = designContext.getDefaultInstance(this
-                .getClass());
         // There is no setter for reversed, so it will be handled using
         // setSplitPosition.
-        boolean reversed = DesignAttributeHandler.readAttribute("reversed",
-                design.attributes(), def.getSplitterState().positionReversed,
-                Boolean.class);
+        boolean reversed = false;
+        if (design.hasAttr("reversed")) {
+            reversed = DesignAttributeHandler.readAttribute("reversed",
+                    design.attributes(), Boolean.class);
+            setSplitPosition(getSplitPosition(), reversed);
+        }
         if (design.hasAttr("split-position")) {
             SizeWithUnit splitPosition = SizeWithUnit.parseStringSize(
-                    design.attr("split-position"), def.getSplitPositionUnit());
+                    design.attr("split-position"), Unit.PERCENTAGE);
             setSplitPosition(splitPosition.getSize(), splitPosition.getUnit(),
                     reversed);
-        } else { // default value for split position
-            setSplitPosition(def.getSplitPosition(),
-                    def.getSplitPositionUnit(), reversed);
         }
         if (design.hasAttr("min-split-position")) {
             SizeWithUnit minSplitPosition = SizeWithUnit.parseStringSize(
-                    design.attr("min-split-position"),
-                    def.getMinSplitPositionUnit());
+                    design.attr("min-split-position"), Unit.PERCENTAGE);
             setMinSplitPosition(minSplitPosition.getSize(),
                     minSplitPosition.getUnit());
-        } else { // default value for min-split-position
-            setMinSplitPosition(def.getMinSplitPosition(),
-                    def.getMinSplitPositionUnit());
         }
         if (design.hasAttr("max-split-position")) {
             SizeWithUnit maxSplitPosition = SizeWithUnit.parseStringSize(
-                    design.attr("max-split-position"),
-                    def.getMaxSplitPositionUnit());
+                    design.attr("max-split-position"), Unit.PERCENTAGE);
             setMaxSplitPosition(maxSplitPosition.getSize(),
                     maxSplitPosition.getUnit());
-        } else { // default value for max-split-position
-            setMaxSplitPosition(def.getMaxSplitPosition(),
-                    def.getMaxSplitPositionUnit());
         }
         // remove current children
         removeAllComponents();
index 79492ecf5e0055c8fb1fc2fce2aa2331ab33d76d..8bca74936ad543f52063c9f20caf8492e92f3e27 100644 (file)
@@ -772,12 +772,11 @@ public abstract class AbstractTextField extends AbstractField<String> implements
     @Override
     public void readDesign(Element design, DesignContext designContext) {
         super.readDesign(design, designContext);
-        AbstractTextField def = designContext.getDefaultInstance(this
-                .getClass());
         Attributes attr = design.attributes();
-        int maxLength = DesignAttributeHandler.readAttribute("maxlength", attr,
-                def.getMaxLength(), Integer.class);
-        setMaxLength(maxLength);
+        if (attr.hasKey("maxlength")) {
+            setMaxLength(DesignAttributeHandler.readAttribute("maxlength",
+                    attr, Integer.class));
+        }
     }
 
     /*
index 2d0a0cf8dabc75961e85f3d7d0606d128e80540f..9b50b5eebcc18b181683ddf0f12dfabf0dcace86 100644 (file)
@@ -675,22 +675,26 @@ public class Button extends AbstractComponent implements
     @Override
     public void readDesign(Element design, DesignContext designContext) {
         super.readDesign(design, designContext);
-        Button def = designContext.getDefaultInstance(this.getClass());
         Attributes attr = design.attributes();
         String content = design.html();
         setCaption(content);
         // tabindex
-        setTabIndex(DesignAttributeHandler.readAttribute("tabindex", attr,
-                def.getTabIndex(), Integer.class));
+        if (attr.hasKey("tabindex")) {
+            setTabIndex(DesignAttributeHandler.readAttribute("tabindex", attr,
+                    Integer.class));
+        }
         // plain-text (default is html)
-        setHtmlContentAllowed(!DesignAttributeHandler.readAttribute(
-                DESIGN_ATTR_PLAIN_TEXT, attr, false, Boolean.class));
+        Boolean plain = DesignAttributeHandler.readAttribute(
+                DESIGN_ATTR_PLAIN_TEXT, attr, Boolean.class);
+        if (plain == null || !plain) {
+            setHtmlContentAllowed(true);
+        }
         setIconAlternateText(DesignAttributeHandler.readAttribute("icon-alt",
-                attr, def.getIconAlternateText(), String.class));
+                attr, String.class));
         // click-shortcut
         removeClickShortcut();
         ShortcutAction action = DesignAttributeHandler.readAttribute(
-                "click-shortcut", attr, null, ShortcutAction.class);
+                "click-shortcut", attr, ShortcutAction.class);
         if (action != null) {
             setClickShortcut(action.getKeyCode(), action.getModifiers());
         }
index 5112a732acf422b519c61de0499eb28b7e07893f..b0242cc32db8f2cbff38f28096b9257adedf8952 100644 (file)
@@ -348,9 +348,8 @@ public class Panel extends AbstractSingleComponentContainer implements
     public void readDesign(Element design, DesignContext designContext) {
         super.readDesign(design, designContext);
         // handle tabindex
-        Panel def = designContext.getDefaultInstance(this.getClass());
         int tabIndex = DesignAttributeHandler.readAttribute("tabindex",
-                design.attributes(), def.getTabIndex(), Integer.class);
+                design.attributes(), Integer.class);
         setTabIndex(tabIndex);
     }
 
index 5f27eb59c978d5c22015304d532ba8af978e127a..974a1c2c10ac42eafd9b195189a7a1d1e491c69e 100644 (file)
@@ -91,12 +91,11 @@ public class PasswordField extends AbstractTextField {
     @Override
     public void readDesign(Element design, DesignContext designContext) {
         super.readDesign(design, designContext);
-        AbstractTextField def = designContext.getDefaultInstance(this
-                .getClass());
         Attributes attr = design.attributes();
-        String value = DesignAttributeHandler.readAttribute("value", attr,
-                def.getValue(), String.class);
-        setValue(value);
+        if (attr.hasKey("value")) {
+            setValue(DesignAttributeHandler.readAttribute("value", attr,
+                    String.class));
+        }
     }
 
     /*
index 94bcb8027994295e8d5426cdae2c3b734e608ac2..330acacfd0b7b7cb1610327e9a7c72b096c66a85 100644 (file)
@@ -1464,12 +1464,8 @@ public class TabSheet extends AbstractComponentContainer implements Focusable,
     @Override
     public void readDesign(Element design, DesignContext designContext) {
         super.readDesign(design, designContext);
-        Attributes attr = design.attributes();
-        TabSheet def = designContext.getDefaultInstance(this.getClass());
         // handle tab index
-        int tabIndex = DesignAttributeHandler.readAttribute("tabindex", attr,
-                def.getTabIndex(), Integer.class);
-        setTabIndex(tabIndex);
+        readTabIndex(design);
         // clear old tabs
         removeAllComponents();
         // create new tabs
@@ -1482,6 +1478,15 @@ public class TabSheet extends AbstractComponentContainer implements Focusable,
         }
     }
 
+    private void readTabIndex(Element design) {
+        // Could be in AbstractComponent as if (this implements Focusable)
+        if (design.hasAttr("tabindex")) {
+            setTabIndex(DesignAttributeHandler.readAttribute("tabindex",
+                    design.attributes(), Integer.class));
+        }
+
+    }
+
     /**
      * Reads the given tab element from design
      * 
@@ -1503,28 +1508,48 @@ public class TabSheet extends AbstractComponentContainer implements Focusable,
         Element content = tabElement.child(0);
         Component child = designContext.createChild(content);
         Tab tab = this.addTab(child);
-        tab.setVisible(DesignAttributeHandler.readAttribute("visible", attr,
-                tab.isVisible(), Boolean.class));
-        tab.setClosable(DesignAttributeHandler.readAttribute("closable", attr,
-                tab.isClosable(), Boolean.class));
-        tab.setCaption(DesignAttributeHandler.readAttribute("caption", attr,
-                tab.getCaption(), String.class));
-        tab.setEnabled(DesignAttributeHandler.readAttribute("enabled", attr,
-                tab.isEnabled(), Boolean.class));
-        tab.setIcon(DesignAttributeHandler.readAttribute("icon", attr,
-                tab.getIcon(), Resource.class));
-        tab.setIconAlternateText(DesignAttributeHandler.readAttribute(
-                "icon-alt", attr, tab.getIconAlternateText(), String.class));
-        tab.setDescription(DesignAttributeHandler.readAttribute("description",
-                attr, tab.getDescription(), String.class));
-        tab.setStyleName(DesignAttributeHandler.readAttribute("style-name",
-                attr, tab.getStyleName(), String.class));
-        tab.setId(DesignAttributeHandler.readAttribute("id", attr, tab.getId(),
-                String.class));
-        boolean selected = DesignAttributeHandler.readAttribute("selected",
-                attr, false, Boolean.class);
-        if (selected) {
-            this.setSelectedTab(tab.getComponent());
+        if (attr.hasKey("visible")) {
+            tab.setVisible(DesignAttributeHandler.readAttribute("visible",
+                    attr, Boolean.class));
+        }
+        if (attr.hasKey("closable")) {
+            tab.setClosable(DesignAttributeHandler.readAttribute("closable",
+                    attr, Boolean.class));
+        }
+        if (attr.hasKey("caption")) {
+            tab.setCaption(DesignAttributeHandler.readAttribute("caption",
+                    attr, String.class));
+        }
+        if (attr.hasKey("enabled")) {
+            tab.setEnabled(DesignAttributeHandler.readAttribute("enabled",
+                    attr, Boolean.class));
+        }
+        if (attr.hasKey("icon")) {
+            tab.setIcon(DesignAttributeHandler.readAttribute("icon", attr,
+                    Resource.class));
+        }
+        if (attr.hasKey("icon-alt")) {
+            tab.setIconAlternateText(DesignAttributeHandler.readAttribute(
+                    "icon-alt", attr, String.class));
+        }
+        if (attr.hasKey("description")) {
+            tab.setDescription(DesignAttributeHandler.readAttribute(
+                    "description", attr, String.class));
+        }
+        if (attr.hasKey("style-name")) {
+            tab.setStyleName(DesignAttributeHandler.readAttribute("style-name",
+                    attr, String.class));
+        }
+        if (attr.hasKey("id")) {
+            tab.setId(DesignAttributeHandler.readAttribute("id", attr,
+                    String.class));
+        }
+        if (attr.hasKey("selected")) {
+            boolean selected = DesignAttributeHandler.readAttribute("selected",
+                    attr, Boolean.class);
+            if (selected) {
+                this.setSelectedTab(tab.getComponent());
+            }
         }
     }
 
index 03bbfd2d8f8f4863f4b26a210c6d66f233fdc626..cd919ded9c4b305df4ecc599987dd4b8b49cbc7d 100644 (file)
@@ -113,12 +113,11 @@ public class TextField extends AbstractTextField {
     @Override
     public void readDesign(Element design, DesignContext designContext) {
         super.readDesign(design, designContext);
-        AbstractTextField def = designContext.getDefaultInstance(this
-                .getClass());
         Attributes attr = design.attributes();
-        String value = DesignAttributeHandler.readAttribute("value", attr,
-                def.getValue(), String.class);
-        setValue(value);
+        if (attr.hasKey("value")) {
+            setValue(DesignAttributeHandler.readAttribute("value", attr,
+                    String.class));
+        }
     }
 
     /*
index b410fd00016dc89f19a0353b8c2b039b3145198a..0a58fc549ff0d7fe904aedac38e7ef751616d16a 100644 (file)
@@ -99,16 +99,12 @@ public class DesignAttributeHandler implements Serializable {
      *            the attribute map. If the attributes does not contain the
      *            requested attribute, the value is retrieved from the
      *            <code> defaultInstance</code>
-     * @param defaultInstance
-     *            the default instance of the class for fetching the default
-     *            values
      * @return true on success
      */
     public static boolean readAttribute(Component component, String attribute,
-            Attributes attributes, Component defaultInstance) {
+            Attributes attributes) {
         String value = null;
-        if (component == null || attribute == null || attributes == null
-                || defaultInstance == null) {
+        if (component == null || attribute == null || attributes == null) {
             throw new IllegalArgumentException(
                     "Parameters with null value not allowed");
         }
@@ -129,13 +125,10 @@ public class DesignAttributeHandler implements Serializable {
                 setter.invoke(component, param);
                 success = true;
             } else {
-                // otherwise find the getter for the attribute
-                Method getter = findGetterForAttribute(component.getClass(),
-                        attribute);
-                // read the default value from defaults
-                Object defaultValue = getter.invoke(defaultInstance);
-                setter.invoke(component, defaultValue);
-                success = true;
+                getLogger().log(
+                        Level.WARNING,
+                        "Attribute value for " + attribute
+                                + " is null, this should not happen");
             }
         } catch (Exception e) {
             getLogger().log(Level.WARNING,
@@ -256,13 +249,13 @@ public class DesignAttributeHandler implements Serializable {
      */
     @SuppressWarnings("unchecked")
     public static <T> T readAttribute(String attribute, Attributes attributes,
-            T defaultValue, Class<T> outputType) {
+            Class<T> outputType) {
         if (!isSupported(outputType)) {
             throw new IllegalArgumentException("output type: "
                     + outputType.getName() + " not supported");
         }
         if (!attributes.hasKey(attribute)) {
-            return defaultValue;
+            return null;
         } else {
             try {
                 String value = attributes.get(attribute);
index 0d390ba18452d9fd09cf860efbde51f022bc597b..300d293e66ed43ec87c6f8d29f14380e983978e8 100644 (file)
 package com.vaadin.tests.design.designroot;
 
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 
-// This test will not pass until default instance creation is changed. Will leave it ignored for now.
-@Ignore
 public class DesignRootTest {
     @Test
     public void designAnnotationWithoutFilename() {
index c57f18cbf9cf2531c827017cb14b6747d6e80a9b..db30f05c5fa1ab0601e0f5c05d64962784cc66b9 100644 (file)
@@ -60,21 +60,6 @@ public class TestReadDesign extends TestCase {
         assertEquals(Unit.PIXELS, sp.getMaxSplitPositionUnit());
         assertEquals(true, sp.isLocked());
         checkReversed(sp, true);
-        // check that the properties get the default values if the design
-        // does not have attributes corresponding to those properties
-        design = createDesign(true, true, true, true);
-        sp.readDesign(design, ctx);
-        HorizontalSplitPanel def = new HorizontalSplitPanel();
-        assertEquals(def.getSplitPosition(), sp.getSplitPosition());
-        assertEquals(def.getSplitPositionUnit(), sp.getSplitPositionUnit());
-        assertEquals(def.getMinSplitPosition(), sp.getMinSplitPosition());
-        assertEquals(def.getMinSplitPositionUnit(),
-                sp.getMinSplitPositionUnit());
-        assertEquals(def.getMaxSplitPosition(), sp.getMaxSplitPosition());
-        assertEquals(def.getMaxSplitPositionUnit(),
-                sp.getMaxSplitPositionUnit());
-        assertEquals(def.isLocked(), sp.isLocked());
-        checkReversed(sp, false);
     }
 
     public void testWithNoChildren() {