Browse Source

Generate type data for AbstractRendererConnector.createRenderer (#13334)

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
tags/7.4.0.beta1
Johannes Dahlström 9 years ago
parent
commit
5c93158858

+ 4
- 2
client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java View 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);
}

+ 6
- 0
client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java View 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);
}

+ 63
- 0
client-compiler/src/com/vaadin/server/widgetsetutils/metadata/RendererInitVisitor.java View File

@@ -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);
}
}
}
}

+ 0
- 5
client/src/com/vaadin/client/ui/grid/renderers/TextRendererConnector.java View 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;

+ 1
- 6
client/src/com/vaadin/client/ui/grid/renderers/UnsafeHtmlRendererConnector.java View 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;

+ 3
- 3
uitest/src/com/vaadin/tests/widgetset/client/grid/IntArrayRendererConnector.java View 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

+ 2
- 0
uitest/src/com/vaadin/tests/widgetset/client/grid/RowAwareRendererConnector.java View 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();
}
}

Loading…
Cancel
Save