]> source.dussan.org Git - vaadin-framework.git/commitdiff
Generate type data for AbstractRendererConnector.createRenderer (#13334)
authorJohannes Dahlström <johannesd@vaadin.com>
Thu, 10 Jul 2014 13:26:01 +0000 (16:26 +0300)
committerVaadin Code Review <review@vaadin.com>
Thu, 10 Jul 2014 16:05:59 +0000 (16:05 +0000)
The declared return type of the most-derived getRenderer method is stored
to make the default createRenderer implementation work. This is identical
to the way AbstractComponentConnector getWidget and createWidget work.

Change-Id: I879e9e6739e366bd81773a1e65195336e0cdac6d

client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
client-compiler/src/com/vaadin/server/widgetsetutils/metadata/RendererInitVisitor.java [new file with mode: 0644]
client/src/com/vaadin/client/ui/grid/renderers/TextRendererConnector.java
client/src/com/vaadin/client/ui/grid/renderers/UnsafeHtmlRendererConnector.java
uitest/src/com/vaadin/tests/widgetset/client/grid/IntArrayRendererConnector.java
uitest/src/com/vaadin/tests/widgetset/client/grid/RowAwareRendererConnector.java

index 5519dd1aaeed0d3f492c385e11ad0e4e0ed4237e..e02317be78df469b05ce6b2b9eed5cbdbbc69343 100644 (file)
@@ -61,6 +61,7 @@ import com.vaadin.server.widgetsetutils.metadata.ConnectorInitVisitor;
 import com.vaadin.server.widgetsetutils.metadata.GeneratedSerializer;
 import com.vaadin.server.widgetsetutils.metadata.OnStateChangeVisitor;
 import com.vaadin.server.widgetsetutils.metadata.Property;
+import com.vaadin.server.widgetsetutils.metadata.RendererInitVisitor;
 import com.vaadin.server.widgetsetutils.metadata.ServerRpcVisitor;
 import com.vaadin.server.widgetsetutils.metadata.StateInitVisitor;
 import com.vaadin.server.widgetsetutils.metadata.TypeVisitor;
@@ -1235,8 +1236,9 @@ public class ConnectorBundleLoaderFactory extends Generator {
             throws NotFoundException {
         List<TypeVisitor> visitors = Arrays.<TypeVisitor> asList(
                 new ConnectorInitVisitor(), new StateInitVisitor(),
-                new WidgetInitVisitor(), new ClientRpcVisitor(),
-                new ServerRpcVisitor(), new OnStateChangeVisitor());
+                new WidgetInitVisitor(), new RendererInitVisitor(),
+                new ClientRpcVisitor(), new ServerRpcVisitor(),
+                new OnStateChangeVisitor());
         for (TypeVisitor typeVisitor : visitors) {
             typeVisitor.init(oracle);
         }
index 8bbcac4ecb516d9dffe6d2ac8cb90245b92042ba..463bf0002704cd9e6aa2858d698da97a509438f9 100644 (file)
@@ -43,6 +43,7 @@ import com.vaadin.client.ComponentConnector;
 import com.vaadin.client.ServerConnector;
 import com.vaadin.client.communication.JSONSerializer;
 import com.vaadin.client.ui.UnknownComponentConnector;
+import com.vaadin.client.ui.grid.renderers.AbstractRendererConnector;
 import com.vaadin.shared.communication.ClientRpc;
 import com.vaadin.shared.communication.ServerRpc;
 import com.vaadin.shared.ui.Connect;
@@ -414,6 +415,11 @@ public class ConnectorBundle {
         return isConnected(type) && isType(type, ComponentConnector.class);
     }
 
+    public static boolean isConnectedRendererConnector(JClassType type) {
+        return isConnected(type)
+                && isType(type, AbstractRendererConnector.class);
+    }
+
     private static boolean isInterfaceType(JClassType type, Class<?> class1) {
         return type.isInterface() != null && isType(type, class1);
     }
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/RendererInitVisitor.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/RendererInitVisitor.java
new file mode 100644 (file)
index 0000000..ec68f05
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.server.widgetsetutils.metadata;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.JMethod;
+import com.vaadin.client.ui.grid.renderers.AbstractRendererConnector;
+
+/**
+ * Generates type data for renderer connectors. Specifically, stores the return
+ * type of the overridden {@link AbstractRendererConnector#getRenderer()
+ * getRenderer} method to enable automatic creation of an instance of the proper
+ * renderer type.
+ * 
+ * @see WidgetInitVisitor
+ * 
+ * @since
+ * @author Vaadin Ltd
+ */
+public class RendererInitVisitor extends TypeVisitor {
+
+    @Override
+    public void visitConnector(TreeLogger logger, JClassType type,
+            ConnectorBundle bundle) throws UnableToCompleteException {
+
+        if (ConnectorBundle.isConnectedRendererConnector(type)) {
+
+            // The class in which createRenderer is implemented
+            JClassType createRendererClass = ConnectorBundle
+                    .findInheritedMethod(type, "createRenderer")
+                    .getEnclosingType();
+
+            JMethod getRenderer = ConnectorBundle.findInheritedMethod(type,
+                    "getRenderer");
+            JClassType rendererType = getRenderer.getReturnType().isClass();
+
+            // Needs GWT constructor if createRenderer is not overridden
+            if (createRendererClass.getQualifiedSourceName().equals(
+                    AbstractRendererConnector.class.getCanonicalName())) {
+
+                bundle.setNeedsGwtConstructor(rendererType);
+
+                // Also needs renderer type to find the right GWT constructor
+                bundle.setNeedsReturnType(type, getRenderer);
+            }
+        }
+    }
+}
index 18cc84cd34a49fe41dde555694890e3a10a80a45..84b261415b758be6394763c3f07ebbe6d54a398a 100644 (file)
@@ -31,11 +31,6 @@ public class TextRendererConnector extends AbstractRendererConnector<String> {
         return (TextRenderer) super.getRenderer();
     }
 
-    @Override
-    public TextRenderer createRenderer() {
-        return new TextRenderer();
-    }
-
     @Override
     public Class<String> getType() {
         return String.class;
index 1816ac974ab7fa9a771e93b0832df3818465c2eb..7d5b9e1c60c31623c62ee27a0ddd15495a6dddf6 100644 (file)
@@ -29,7 +29,7 @@ import com.vaadin.shared.ui.Connect;
 public class UnsafeHtmlRendererConnector extends
         AbstractRendererConnector<String> {
 
-    public class UnsafeHtmlRenderer implements Renderer<String> {
+    public static class UnsafeHtmlRenderer implements Renderer<String> {
         @Override
         public void render(FlyweightCell cell, String data) {
             cell.getElement().setInnerHTML(data);
@@ -41,11 +41,6 @@ public class UnsafeHtmlRendererConnector extends
         return (UnsafeHtmlRenderer) super.getRenderer();
     }
 
-    @Override
-    protected UnsafeHtmlRenderer createRenderer() {
-        return new UnsafeHtmlRenderer();
-    }
-
     @Override
     public Class<String> getType() {
         return String.class;
index be358c2738b3b1bae92827a29b0fd3c5bd3d796c..dc424e7606ac6c9db13dbaeee3bbc37e800976cb 100644 (file)
@@ -23,7 +23,7 @@ import com.vaadin.shared.ui.Connect;
 @Connect(com.vaadin.tests.components.grid.IntArrayRenderer.class)
 public class IntArrayRendererConnector extends AbstractRendererConnector<int[]> {
 
-    public class IntArrayRenderer implements Renderer<int[]> {
+    public static class IntArrayRenderer implements Renderer<int[]> {
         private static final String JOINER = " :: ";
 
         @Override
@@ -40,8 +40,8 @@ public class IntArrayRendererConnector extends AbstractRendererConnector<int[]>
     }
 
     @Override
-    protected IntArrayRenderer createRenderer() {
-        return new IntArrayRenderer();
+    public IntArrayRenderer getRenderer() {
+        return (IntArrayRenderer) super.getRenderer();
     }
 
     @Override
index c82c6c9a18219e1562d33e10f996950c2ff57b02..40dbbeb37001eedc00c22c315f38648b8b62e909 100644 (file)
@@ -73,6 +73,8 @@ public class RowAwareRendererConnector extends AbstractRendererConnector<Void> {
 
     @Override
     protected Renderer<Void> createRenderer() {
+        // cannot use the default createRenderer as RowAwareRenderer needs a
+        // reference to its connector - it has no "real" no-argument constructor
         return new RowAwareRenderer();
     }
 }