summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorArtur Signell <artur@vaadin.com>2012-04-03 00:08:53 +0300
committerArtur Signell <artur@vaadin.com>2012-04-05 00:08:23 +0300
commitdab7c9fa82c4d9301e00e1c24e46890fa130c7e5 (patch)
tree129cb1c35402fcb3bd25e126d17936d8c6b30552 /src/com
parent8079a7d0148a96d1048904c4b4eba25708a22a15 (diff)
downloadvaadin-framework-dab7c9fa82c4d9301e00e1c24e46890fa130c7e5.tar.gz
vaadin-framework-dab7c9fa82c4d9301e00e1c24e46890fa130c7e5.zip
Generator to ease initialization of client to server rpc proxies
Diffstat (limited to 'src/com')
-rw-r--r--src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml7
-rw-r--r--src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java34
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java6
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java15
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java11
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/ButtonConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/CssLayoutConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/EmbeddedConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/NativeButtonConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/PanelConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/RootConnector.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/WindowConnector.java6
-rw-r--r--src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java130
15 files changed, 207 insertions, 42 deletions
diff --git a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml
index db273271e9..854464f1ee 100644
--- a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml
+++ b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml
@@ -54,6 +54,13 @@
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">
diff --git a/src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java b/src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java
new file mode 100644
index 0000000000..7742d82441
--- /dev/null
+++ b/src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java
@@ -0,0 +1,34 @@
+package com.vaadin.terminal.gwt.client.communication;
+
+import com.google.gwt.core.client.GWT;
+import com.vaadin.terminal.gwt.client.ServerConnector;
+
+/**
+ * Class for creating proxy instances for Client to Server RPC.
+ *
+ * @since 7.0
+ */
+public class RpcProxy {
+
+ private static RpcProxyCreator impl = GWT.create(RpcProxyCreator.class);
+
+ /**
+ * Create a proxy class for the given Rpc interface and assign it to the
+ * given connector.
+ *
+ * @param rpcInterface
+ * The rpc interface to construct a proxy for
+ * @param connector
+ * The connector this proxy is connected to
+ * @return A proxy class used for calling Rpc methods.
+ */
+ public static <T extends ServerRpc> T create(Class<T> rpcInterface,
+ ServerConnector connector) {
+ return impl.create(rpcInterface, connector);
+ }
+
+ public interface RpcProxyCreator {
+ <T extends ServerRpc> T create(Class<T> rpcInterface,
+ ServerConnector connector);
+ }
+}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java
index c600cf1500..72386400fe 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java
@@ -15,6 +15,7 @@ import com.vaadin.terminal.gwt.client.ApplicationConnection;
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;
@@ -42,13 +43,12 @@ public class AbsoluteLayoutConnector extends
};
- 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
diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java
index cc357cf772..78a6ce889b 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java
@@ -20,7 +20,6 @@ import com.vaadin.terminal.gwt.client.TooltipInfo;
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;
@@ -357,20 +356,6 @@ public abstract class AbstractComponentConnector extends AbstractConnector
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());
}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java
index e58dce5223..046767a88d 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java
@@ -5,7 +5,6 @@ package com.vaadin.terminal.gwt.client.ui;
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;
@@ -17,6 +16,7 @@ import com.vaadin.terminal.gwt.client.UIDL;
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;
@@ -24,13 +24,12 @@ 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) {
@@ -50,7 +49,7 @@ public abstract class AbstractOrderedLayoutConnector extends
@Override
public void init() {
- initRPC(rpc);
+ rpc = RpcProxy.create(AbstractOrderedLayoutServerRPC.class, this);
getLayoutManager().registerDependency(this,
getWidget().spacingMeasureElement);
}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java
index 65018aaadf..827490524a 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java
@@ -19,6 +19,7 @@ import com.vaadin.terminal.gwt.client.ComponentState;
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;
@@ -127,12 +128,12 @@ public abstract class AbstractSplitPanelConnector extends
}
- 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();
diff --git a/src/com/vaadin/terminal/gwt/client/ui/ButtonConnector.java b/src/com/vaadin/terminal/gwt/client/ui/ButtonConnector.java
index 1549aa873d..07d62a10e7 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/ButtonConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/ButtonConnector.java
@@ -12,6 +12,7 @@ import com.vaadin.terminal.gwt.client.ComponentState;
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;
@@ -48,8 +49,8 @@ public class ButtonConnector extends AbstractComponentConnector {
@Override
public void init() {
super.init();
- ButtonServerRpc rpcProxy = GWT.create(ButtonServerRpc.class);
- getWidget().buttonRpcProxy = initRPC(rpcProxy);
+ getWidget().buttonRpcProxy = RpcProxy.create(ButtonServerRpc.class,
+ this);
}
@Override
diff --git a/src/com/vaadin/terminal/gwt/client/ui/CssLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/CssLayoutConnector.java
index 8bf14fdbdb..b45e238825 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/CssLayoutConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/CssLayoutConnector.java
@@ -9,6 +9,7 @@ import com.google.gwt.user.client.ui.Widget;
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;
@@ -33,12 +34,12 @@ public class CssLayoutConnector extends AbstractComponentContainerConnector {
}
- 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
diff --git a/src/com/vaadin/terminal/gwt/client/ui/EmbeddedConnector.java b/src/com/vaadin/terminal/gwt/client/ui/EmbeddedConnector.java
index bd8a242c67..14fe7bd744 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/EmbeddedConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/EmbeddedConnector.java
@@ -22,6 +22,7 @@ import com.vaadin.terminal.gwt.client.MouseEventDetails;
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;
@@ -33,12 +34,12 @@ public class EmbeddedConnector extends AbstractComponentConnector {
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
diff --git a/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java
index 06e61bf5e9..73dd291f42 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java
@@ -15,6 +15,7 @@ import com.vaadin.terminal.gwt.client.ConnectorMap;
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;
@@ -43,11 +44,11 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector
}
- 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);
}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/NativeButtonConnector.java b/src/com/vaadin/terminal/gwt/client/ui/NativeButtonConnector.java
index 1790a42b21..144b5eb391 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/NativeButtonConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/NativeButtonConnector.java
@@ -10,6 +10,7 @@ import com.vaadin.terminal.gwt.client.ApplicationConnection;
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;
@@ -20,8 +21,8 @@ public class NativeButtonConnector extends AbstractComponentConnector {
public void init() {
super.init();
- ButtonServerRpc rpcProxy = GWT.create(ButtonServerRpc.class);
- getWidget().buttonRpcProxy = initRPC(rpcProxy);
+ getWidget().buttonRpcProxy = RpcProxy.create(ButtonServerRpc.class,
+ this);
}
@Override
diff --git a/src/com/vaadin/terminal/gwt/client/ui/PanelConnector.java b/src/com/vaadin/terminal/gwt/client/ui/PanelConnector.java
index 4dc4098c14..89219f5be8 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/PanelConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/PanelConnector.java
@@ -16,6 +16,7 @@ import com.vaadin.terminal.gwt.client.LayoutManager;
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;
@@ -70,11 +71,11 @@ public class PanelConnector extends AbstractComponentContainerConnector
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();
diff --git a/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java b/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java
index 7db14d73f0..3cff41dbd3 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java
@@ -29,6 +29,7 @@ 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.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;
@@ -42,7 +43,7 @@ public class RootConnector extends AbstractComponentContainerConnector {
}
- private RootServerRPC rpc = GWT.create(RootServerRPC.class);
+ private RootServerRPC rpc;
private HandlerRegistration childStateChangeHandlerRegistration;
@@ -57,7 +58,7 @@ public class RootConnector extends AbstractComponentContainerConnector {
@Override
protected void init() {
super.init();
- initRPC(rpc);
+ rpc = RpcProxy.create(RootServerRPC.class, this);
}
@Override
diff --git a/src/com/vaadin/terminal/gwt/client/ui/WindowConnector.java b/src/com/vaadin/terminal/gwt/client/ui/WindowConnector.java
index 8c824b89a9..811b00d929 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/WindowConnector.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/WindowConnector.java
@@ -21,6 +21,7 @@ import com.vaadin.terminal.gwt.client.LayoutManager;
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;
@@ -45,7 +46,7 @@ public class WindowConnector extends AbstractComponentContainerConnector
}
};
- private WindowServerRPC rpc = GWT.create(WindowServerRPC.class);
+ private WindowServerRPC rpc;
@Override
protected boolean delegateCaptionHandling() {
@@ -55,7 +56,8 @@ public class WindowConnector extends AbstractComponentContainerConnector
@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);
diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java
new file mode 100644
index 0000000000..ad4dd8a3c8
--- /dev/null
+++ b/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java
@@ -0,0 +1,130 @@
+package com.vaadin.terminal.gwt.widgetsetutils;
+
+import java.io.PrintWriter;
+import java.util.Date;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.ext.Generator;
+import com.google.gwt.core.ext.GeneratorContext;
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.TreeLogger.Type;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
+import com.google.gwt.user.rebind.SourceWriter;
+import com.vaadin.terminal.gwt.client.ServerConnector;
+import com.vaadin.terminal.gwt.client.communication.RpcProxy.RpcProxyCreator;
+import com.vaadin.terminal.gwt.client.communication.ServerRpc;
+import com.vaadin.terminal.gwt.client.communication.ServerRpc.InitializableClientToServerRpc;
+
+public class RpcProxyCreatorGenerator extends Generator {
+
+ @Override
+ public String generate(TreeLogger logger, GeneratorContext ctx,
+ String requestedClassName) throws UnableToCompleteException {
+ logger.log(TreeLogger.DEBUG, "Running RpcProxyCreatorGenerator");
+ TypeOracle typeOracle = ctx.getTypeOracle();
+ assert (typeOracle != null);
+
+ JClassType requestedType = typeOracle.findType(requestedClassName);
+ String packageName = requestedType.getPackage().getName();
+ String className = requestedType.getSimpleSourceName() + "Impl";
+ if (requestedType == null) {
+ logger.log(TreeLogger.ERROR, "Unable to find metadata for type '"
+ + requestedClassName + "'", null);
+ throw new UnableToCompleteException();
+ }
+
+ createType(logger, ctx, packageName, className);
+ return packageName + "." + className;
+ }
+
+ private void createType(TreeLogger logger, GeneratorContext context,
+ String packageName, String className) {
+ ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(
+ packageName, className);
+
+ PrintWriter printWriter = context.tryCreate(logger,
+ composer.getCreatedPackage(),
+ composer.getCreatedClassShortName());
+ if (printWriter == null) {
+ // print writer is null if source code has already been generated
+ return;
+ }
+ Date date = new Date();
+ TypeOracle typeOracle = context.getTypeOracle();
+
+ // init composer, set class properties, create source writer
+ composer.addImport(GWT.class.getCanonicalName());
+ composer.addImport(ServerRpc.class.getCanonicalName());
+ composer.addImport(ServerConnector.class.getCanonicalName());
+ composer.addImport(InitializableClientToServerRpc.class
+ .getCanonicalName());
+ composer.addImport(IllegalArgumentException.class.getCanonicalName());
+ composer.addImplementedInterface(RpcProxyCreator.class
+ .getCanonicalName());
+
+ SourceWriter sourceWriter = composer.createSourceWriter(context,
+ printWriter);
+ sourceWriter.indent();
+
+ sourceWriter
+ .println("public <T extends ServerRpc> T create(Class<T> rpcInterface, ServerConnector connector) {");
+ sourceWriter.indent();
+
+ sourceWriter
+ .println("if (rpcInterface == null || connector == null) {");
+ sourceWriter.indent();
+ sourceWriter
+ .println("throw new IllegalArgumentException(\"RpcInterface and/or connector cannot be null\");");
+ sourceWriter.outdent();
+ sourceWriter
+ .println("} else if (connector.getConnectorId() == null) {");
+ sourceWriter.indent();
+ sourceWriter
+ .println("throw new IllegalArgumentException(\"Connector must be initialized before creating Rpc instances.\");");
+ sourceWriter.outdent();
+
+ JClassType initializableInterface = typeOracle.findType(ServerRpc.class
+ .getCanonicalName());
+
+ for (JClassType rpcType : initializableInterface.getSubtypes()) {
+ String rpcClassName = rpcType.getQualifiedSourceName();
+ if (InitializableClientToServerRpc.class.getCanonicalName().equals(
+ rpcClassName)) {
+ // InitializableClientToServerRpc is a special marker interface
+ // that should not get a generated class
+ continue;
+ }
+ sourceWriter.println("} else if (rpcInterface == " + rpcClassName
+ + ".class) {");
+ sourceWriter.indent();
+ sourceWriter.println(rpcClassName + " rpc = GWT.create("
+ + rpcClassName + ".class);");
+ sourceWriter
+ .println("((InitializableClientToServerRpc) rpc).initRpc(connector.getConnectorId(), connector.getConnection());");
+ sourceWriter.println("return (T) rpc;");
+ sourceWriter.outdent();
+ }
+
+ sourceWriter.println("} else {");
+ sourceWriter.indent();
+ sourceWriter
+ .println("throw new IllegalArgumentException(\"No RpcInterface of type \"+ rpcInterface.getName() + \" was found.\");");
+ sourceWriter.outdent();
+ // End of if
+ sourceWriter.println("}");
+ // End of method
+ sourceWriter.println("}");
+
+ // close generated class
+ sourceWriter.outdent();
+ sourceWriter.println("}");
+ // commit generated class
+ context.commit(logger, printWriter);
+ logger.log(Type.INFO, composer.getCreatedClassName() + " created in "
+ + (new Date().getTime() - date.getTime()) / 1000 + "seconds");
+
+ }
+}