class="com.vaadin.terminal.gwt.client.communication.ServerRpc" />
</generate-with>
+ <!-- Generate client side proxies for client to server RPC interfaces -->
+ <generate-with
+ class="com.vaadin.terminal.gwt.widgetsetutils.RpcProxyCreatorGenerator">
+ <when-type-assignable
+ class="com.vaadin.terminal.gwt.client.communication.RpcProxy.RpcProxyCreator" />
+ </generate-with>
+
<!-- Generate client side RPC manager for server to client RPC -->
<generate-with
class="com.vaadin.terminal.gwt.widgetsetutils.RpcManagerGenerator">
--- /dev/null
+package com.vaadin.terminal.gwt.client.communication;\r
+\r
+import com.google.gwt.core.client.GWT;\r
+import com.vaadin.terminal.gwt.client.ServerConnector;\r
+\r
+/**\r
+ * Class for creating proxy instances for Client to Server RPC.\r
+ * \r
+ * @since 7.0\r
+ */\r
+public class RpcProxy {\r
+\r
+ private static RpcProxyCreator impl = GWT.create(RpcProxyCreator.class);\r
+\r
+ /**\r
+ * Create a proxy class for the given Rpc interface and assign it to the\r
+ * given connector.\r
+ * \r
+ * @param rpcInterface\r
+ * The rpc interface to construct a proxy for\r
+ * @param connector\r
+ * The connector this proxy is connected to\r
+ * @return A proxy class used for calling Rpc methods.\r
+ */\r
+ public static <T extends ServerRpc> T create(Class<T> rpcInterface,\r
+ ServerConnector connector) {\r
+ return impl.create(rpcInterface, connector);\r
+ }\r
+\r
+ public interface RpcProxyCreator {\r
+ <T extends ServerRpc> T create(Class<T> rpcInterface,\r
+ ServerConnector connector);\r
+ }\r
+}\r
import com.vaadin.terminal.gwt.client.ComponentConnector;
import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout.AbsoluteWrapper;
import com.vaadin.ui.AbsoluteLayout;
};
- private AbsoluteLayoutServerRPC rpc = GWT
- .create(AbsoluteLayoutServerRPC.class);
+ private AbsoluteLayoutServerRPC rpc;
@Override
protected void init() {
super.init();
- initRPC(rpc);
+ rpc = RpcProxy.create(AbsoluteLayoutServerRPC.class, this);
}
@Override
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.VConsole;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
-import com.vaadin.terminal.gwt.client.communication.ServerRpc.InitializableClientToServerRpc;
import com.vaadin.terminal.gwt.client.communication.SharedState;
import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
this.state = (ComponentState) state;
}
- /**
- * Initialize the given RPC proxy object so it is connected to this
- * paintable.
- *
- * @param clientToServerRpc
- * The RPC instance to initialize. Must have been created using
- * GWT.create().
- */
- protected <T extends ServerRpc> T initRPC(T clientToServerRpc) {
- ((InitializableClientToServerRpc) clientToServerRpc).initRpc(
- getConnectorId(), getConnection());
- return clientToServerRpc;
- }
-
public LayoutManager getLayoutManager() {
return LayoutManager.get(getConnection());
}
import java.util.List;
-import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.terminal.gwt.client.Util;
import com.vaadin.terminal.gwt.client.VCaption;
import com.vaadin.terminal.gwt.client.ValueMap;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.ui.layout.ComponentConnectorLayoutSlot;
import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot;
public abstract class AbstractOrderedLayoutConnector extends
AbstractComponentContainerConnector implements DirectionalManagedLayout {
- public interface AbstractOrderedLayoutServerRPC extends
- LayoutClickRPC, ServerRpc {
+ public interface AbstractOrderedLayoutServerRPC extends LayoutClickRPC,
+ ServerRpc {
}
- AbstractOrderedLayoutServerRPC rpc = GWT
- .create(AbstractOrderedLayoutServerRPC.class);
+ AbstractOrderedLayoutServerRPC rpc;
private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler(
this) {
@Override
public void init() {
- initRPC(rpc);
+ rpc = RpcProxy.create(AbstractOrderedLayoutServerRPC.class, this);
getLayoutManager().registerDependency(this,
getWidget().spacingMeasureElement);
}
import com.vaadin.terminal.gwt.client.Connector;
import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangedEvent;
import com.vaadin.terminal.gwt.client.MouseEventDetails;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
import com.vaadin.terminal.gwt.client.ui.VAbstractSplitPanel.SplitterMoveHandler;
}
- private AbstractSplitPanelRPC rpc = GWT.create(AbstractSplitPanelRPC.class);
+ private AbstractSplitPanelRPC rpc;
@Override
protected void init() {
super.init();
- initRPC(rpc);
+ rpc = RpcProxy.create(AbstractSplitPanelRPC.class, this);
// TODO Remove
getWidget().client = getConnection();
import com.vaadin.terminal.gwt.client.EventHelper;
import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.ui.Component.LoadStyle;
import com.vaadin.ui.Button;
@Override
public void init() {
super.init();
- ButtonServerRpc rpcProxy = GWT.create(ButtonServerRpc.class);
- getWidget().buttonRpcProxy = initRPC(rpcProxy);
+ getWidget().buttonRpcProxy = RpcProxy.create(ButtonServerRpc.class,
+ this);
}
@Override
import com.vaadin.terminal.gwt.client.ApplicationConnection;
import com.vaadin.terminal.gwt.client.ComponentConnector;
import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.ui.CssLayout;
}
- private CssLayoutServerRPC rpc = GWT.create(CssLayoutServerRPC.class);
+ private CssLayoutServerRPC rpc;
@Override
protected void init() {
super.init();
- initRPC(rpc);
+ rpc = RpcProxy.create(CssLayoutServerRPC.class, this);
}
@Override
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.VConsole;
import com.vaadin.terminal.gwt.client.VTooltip;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.ui.Embedded;
public static final String ALTERNATE_TEXT = "alt";
- EmbeddedServerRPC rpc = GWT.create(EmbeddedServerRPC.class);
+ EmbeddedServerRPC rpc;
@Override
protected void init() {
super.init();
- initRPC(rpc);
+ rpc = RpcProxy.create(EmbeddedServerRPC.class, this);
}
@Override
import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.VCaption;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.ui.VGridLayout.Cell;
import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot;
}
- private GridLayoutServerRPC rpc = GWT.create(GridLayoutServerRPC.class);
+ private GridLayoutServerRPC rpc;
@Override
public void init() {
- initRPC(rpc);
+ rpc = RpcProxy.create(GridLayoutServerRPC.class, this);
getLayoutManager().registerDependency(this,
getWidget().spacingMeasureElement);
}
import com.vaadin.terminal.gwt.client.ComponentState;
import com.vaadin.terminal.gwt.client.EventHelper;
import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.ui.ButtonConnector.ButtonServerRpc;
import com.vaadin.ui.NativeButton;
public void init() {
super.init();
- ButtonServerRpc rpcProxy = GWT.create(ButtonServerRpc.class);
- getWidget().buttonRpcProxy = initRPC(rpcProxy);
+ getWidget().buttonRpcProxy = RpcProxy.create(ButtonServerRpc.class,
+ this);
}
@Override
import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.Util;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.ui.Panel;
private Integer uidlScrollLeft;
- private PanelServerRPC rpc = GWT.create(PanelServerRPC.class);
+ private PanelServerRPC rpc;
@Override
public void init() {
- initRPC(rpc);
+ rpc = RpcProxy.create(PanelServerRPC.class, this);
VPanel panel = getWidget();
LayoutManager layoutManager = getLayoutManager();
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.Util;
import com.vaadin.terminal.gwt.client.VConsole;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler;
}
- private RootServerRPC rpc = GWT.create(RootServerRPC.class);
+ private RootServerRPC rpc;
private HandlerRegistration childStateChangeHandlerRegistration;
@Override
protected void init() {
super.init();
- initRPC(rpc);
+ rpc = RpcProxy.create(RootServerRPC.class, this);
}
@Override
import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.Util;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy;
import com.vaadin.terminal.gwt.client.communication.ServerRpc;
import com.vaadin.terminal.gwt.client.ui.PanelConnector.PanelState;
import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener;
}
};
- private WindowServerRPC rpc = GWT.create(WindowServerRPC.class);
+ private WindowServerRPC rpc;
@Override
protected boolean delegateCaptionHandling() {
@Override
protected void init() {
super.init();
- initRPC(rpc);
+ rpc = RpcProxy.create(WindowServerRPC.class, this);
+
getLayoutManager().registerDependency(this,
getWidget().contentPanel.getElement());
getLayoutManager().registerDependency(this, getWidget().header);
--- /dev/null
+package com.vaadin.terminal.gwt.widgetsetutils;\r
+\r
+import java.io.PrintWriter;\r
+import java.util.Date;\r
+\r
+import com.google.gwt.core.client.GWT;\r
+import com.google.gwt.core.ext.Generator;\r
+import com.google.gwt.core.ext.GeneratorContext;\r
+import com.google.gwt.core.ext.TreeLogger;\r
+import com.google.gwt.core.ext.TreeLogger.Type;\r
+import com.google.gwt.core.ext.UnableToCompleteException;\r
+import com.google.gwt.core.ext.typeinfo.JClassType;\r
+import com.google.gwt.core.ext.typeinfo.TypeOracle;\r
+import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;\r
+import com.google.gwt.user.rebind.SourceWriter;\r
+import com.vaadin.terminal.gwt.client.ServerConnector;\r
+import com.vaadin.terminal.gwt.client.communication.RpcProxy.RpcProxyCreator;\r
+import com.vaadin.terminal.gwt.client.communication.ServerRpc;\r
+import com.vaadin.terminal.gwt.client.communication.ServerRpc.InitializableClientToServerRpc;\r
+\r
+public class RpcProxyCreatorGenerator extends Generator {\r
+\r
+ @Override\r
+ public String generate(TreeLogger logger, GeneratorContext ctx,\r
+ String requestedClassName) throws UnableToCompleteException {\r
+ logger.log(TreeLogger.DEBUG, "Running RpcProxyCreatorGenerator");\r
+ TypeOracle typeOracle = ctx.getTypeOracle();\r
+ assert (typeOracle != null);\r
+\r
+ JClassType requestedType = typeOracle.findType(requestedClassName);\r
+ String packageName = requestedType.getPackage().getName();\r
+ String className = requestedType.getSimpleSourceName() + "Impl";\r
+ if (requestedType == null) {\r
+ logger.log(TreeLogger.ERROR, "Unable to find metadata for type '"\r
+ + requestedClassName + "'", null);\r
+ throw new UnableToCompleteException();\r
+ }\r
+\r
+ createType(logger, ctx, packageName, className);\r
+ return packageName + "." + className;\r
+ }\r
+\r
+ private void createType(TreeLogger logger, GeneratorContext context,\r
+ String packageName, String className) {\r
+ ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(\r
+ packageName, className);\r
+\r
+ PrintWriter printWriter = context.tryCreate(logger,\r
+ composer.getCreatedPackage(),\r
+ composer.getCreatedClassShortName());\r
+ if (printWriter == null) {\r
+ // print writer is null if source code has already been generated\r
+ return;\r
+ }\r
+ Date date = new Date();\r
+ TypeOracle typeOracle = context.getTypeOracle();\r
+\r
+ // init composer, set class properties, create source writer\r
+ composer.addImport(GWT.class.getCanonicalName());\r
+ composer.addImport(ServerRpc.class.getCanonicalName());\r
+ composer.addImport(ServerConnector.class.getCanonicalName());\r
+ composer.addImport(InitializableClientToServerRpc.class\r
+ .getCanonicalName());\r
+ composer.addImport(IllegalArgumentException.class.getCanonicalName());\r
+ composer.addImplementedInterface(RpcProxyCreator.class\r
+ .getCanonicalName());\r
+\r
+ SourceWriter sourceWriter = composer.createSourceWriter(context,\r
+ printWriter);\r
+ sourceWriter.indent();\r
+\r
+ sourceWriter\r
+ .println("public <T extends ServerRpc> T create(Class<T> rpcInterface, ServerConnector connector) {");\r
+ sourceWriter.indent();\r
+\r
+ sourceWriter\r
+ .println("if (rpcInterface == null || connector == null) {");\r
+ sourceWriter.indent();\r
+ sourceWriter\r
+ .println("throw new IllegalArgumentException(\"RpcInterface and/or connector cannot be null\");");\r
+ sourceWriter.outdent();\r
+ sourceWriter\r
+ .println("} else if (connector.getConnectorId() == null) {");\r
+ sourceWriter.indent();\r
+ sourceWriter\r
+ .println("throw new IllegalArgumentException(\"Connector must be initialized before creating Rpc instances.\");");\r
+ sourceWriter.outdent();\r
+\r
+ JClassType initializableInterface = typeOracle.findType(ServerRpc.class\r
+ .getCanonicalName());\r
+\r
+ for (JClassType rpcType : initializableInterface.getSubtypes()) {\r
+ String rpcClassName = rpcType.getQualifiedSourceName();\r
+ if (InitializableClientToServerRpc.class.getCanonicalName().equals(\r
+ rpcClassName)) {\r
+ // InitializableClientToServerRpc is a special marker interface\r
+ // that should not get a generated class\r
+ continue;\r
+ }\r
+ sourceWriter.println("} else if (rpcInterface == " + rpcClassName\r
+ + ".class) {");\r
+ sourceWriter.indent();\r
+ sourceWriter.println(rpcClassName + " rpc = GWT.create("\r
+ + rpcClassName + ".class);");\r
+ sourceWriter\r
+ .println("((InitializableClientToServerRpc) rpc).initRpc(connector.getConnectorId(), connector.getConnection());");\r
+ sourceWriter.println("return (T) rpc;");\r
+ sourceWriter.outdent();\r
+ }\r
+\r
+ sourceWriter.println("} else {");\r
+ sourceWriter.indent();\r
+ sourceWriter\r
+ .println("throw new IllegalArgumentException(\"No RpcInterface of type \"+ rpcInterface.getName() + \" was found.\");");\r
+ sourceWriter.outdent();\r
+ // End of if\r
+ sourceWriter.println("}");\r
+ // End of method\r
+ sourceWriter.println("}");\r
+\r
+ // close generated class\r
+ sourceWriter.outdent();\r
+ sourceWriter.println("}");\r
+ // commit generated class\r
+ context.commit(logger, printWriter);\r
+ logger.log(Type.INFO, composer.getCreatedClassName() + " created in "\r
+ + (new Date().getTime() - date.getTime()) / 1000 + "seconds");\r
+\r
+ }\r
+}\r