summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2015-01-08 22:21:42 +0200
committerHenri Sara <hesara@vaadin.com>2015-01-12 10:36:59 +0000
commit7efa1d6ec145aa48fc75fbdc9e403faf478e7f96 (patch)
treeaa02e97fe9c0e63e24eb6c1c5ef6a45d4a170a18
parent2286f9871f7f77dea6139d0cd1dfc6754b1946d5 (diff)
downloadvaadin-framework-7efa1d6ec145aa48fc75fbdc9e403faf478e7f96.tar.gz
vaadin-framework-7efa1d6ec145aa48fc75fbdc9e403faf478e7f96.zip
Handle generated method flags in a unified way (#15373)
Refactor existing functionality without functional changes to make it easier to add support for the @BackgroundMessage annotation added in a separate commit. Change-Id: I27454ba44af4b7b3b7beccf29b12e22bf9f75a86
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java61
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ClientRpcVisitor.java4
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java52
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java14
-rw-r--r--client/src/com/vaadin/client/metadata/TypeDataStore.java51
5 files changed, 79 insertions, 103 deletions
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
index f946d87638..884852f7c8 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
@@ -55,6 +55,7 @@ import com.vaadin.client.metadata.OnStateChangeMethod;
import com.vaadin.client.metadata.ProxyHandler;
import com.vaadin.client.metadata.TypeData;
import com.vaadin.client.metadata.TypeDataStore;
+import com.vaadin.client.metadata.TypeDataStore.MethodAttribute;
import com.vaadin.client.ui.UnknownComponentConnector;
import com.vaadin.server.widgetsetutils.metadata.ClientRpcVisitor;
import com.vaadin.server.widgetsetutils.metadata.ConnectorBundle;
@@ -67,7 +68,6 @@ import com.vaadin.server.widgetsetutils.metadata.ServerRpcVisitor;
import com.vaadin.server.widgetsetutils.metadata.StateInitVisitor;
import com.vaadin.server.widgetsetutils.metadata.TypeVisitor;
import com.vaadin.server.widgetsetutils.metadata.WidgetInitVisitor;
-import com.vaadin.shared.annotations.Delayed;
import com.vaadin.shared.annotations.DelegateToWidget;
import com.vaadin.shared.annotations.NoLayout;
import com.vaadin.shared.communication.ClientRpc;
@@ -502,8 +502,7 @@ public class ConnectorBundleLoaderFactory extends Generator {
writeInvokers(logger, w, bundle);
writeParamTypes(w, bundle);
writeProxys(w, bundle);
- writeDelayedInfo(w, bundle);
- writeNoLayoutRpcMethods(w, bundle);
+ writeMethodAttributes(logger, w, bundle);
w.println("%s(store);", loadNativeJsMethodName);
@@ -516,22 +515,6 @@ public class ConnectorBundleLoaderFactory extends Generator {
writeOnStateChangeHandlers(logger, w, bundle);
}
- private void writeNoLayoutRpcMethods(SplittingSourceWriter w,
- ConnectorBundle bundle) {
- Map<JClassType, Set<JMethod>> needsNoLayout = bundle
- .getNeedsNoLayoutRpcMethods();
- for (Entry<JClassType, Set<JMethod>> entry : needsNoLayout.entrySet()) {
- JClassType type = entry.getKey();
-
- for (JMethod method : entry.getValue()) {
- w.println("store.setNoLayoutRpcMethod(%s, \"%s\");",
- getClassLiteralString(type), method.getName());
- }
-
- w.splitIfNeeded();
- }
- }
-
private void writeOnStateChangeHandlers(TreeLogger logger,
SplittingSourceWriter w, ConnectorBundle bundle)
throws UnableToCompleteException {
@@ -740,32 +723,20 @@ public class ConnectorBundleLoaderFactory extends Generator {
}
}
- private void writeDelayedInfo(SplittingSourceWriter w,
- ConnectorBundle bundle) {
- Map<JClassType, Set<JMethod>> needsDelayedInfo = bundle
- .getNeedsDelayedInfo();
- Set<Entry<JClassType, Set<JMethod>>> entrySet = needsDelayedInfo
- .entrySet();
- for (Entry<JClassType, Set<JMethod>> entry : entrySet) {
- JClassType type = entry.getKey();
- Set<JMethod> methods = entry.getValue();
- for (JMethod method : methods) {
- Delayed annotation = method.getAnnotation(Delayed.class);
- if (annotation != null) {
- w.print("store.setDelayed(");
- writeClassLiteral(w, type);
- w.print(", \"");
- w.print(escape(method.getName()));
- w.println("\");");
-
- if (annotation.lastOnly()) {
- w.print("store.setLastOnly(");
- writeClassLiteral(w, type);
- w.print(", \"");
- w.print(escape(method.getName()));
- w.println("\");");
- }
-
+ private void writeMethodAttributes(TreeLogger logger,
+ SplittingSourceWriter w, ConnectorBundle bundle) {
+ for (Entry<JClassType, Map<JMethod, Set<MethodAttribute>>> typeEntry : bundle
+ .getMethodAttributes().entrySet()) {
+ JClassType type = typeEntry.getKey();
+ for (Entry<JMethod, Set<MethodAttribute>> methodEntry : typeEntry
+ .getValue().entrySet()) {
+ JMethod method = methodEntry.getKey();
+ Set<MethodAttribute> attributes = methodEntry.getValue();
+ for (MethodAttribute attribute : attributes) {
+ w.println("store.setMethodAttribute(%s, \"%s\", %s.%s);",
+ getClassLiteralString(type), method.getName(),
+ MethodAttribute.class.getCanonicalName(),
+ attribute.name());
w.splitIfNeeded();
}
}
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ClientRpcVisitor.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ClientRpcVisitor.java
index 1df3d78588..992a012005 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ClientRpcVisitor.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ClientRpcVisitor.java
@@ -24,6 +24,7 @@ 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.google.gwt.core.ext.typeinfo.JType;
+import com.vaadin.client.metadata.TypeDataStore.MethodAttribute;
import com.vaadin.shared.annotations.NoLayout;
public class ClientRpcVisitor extends TypeVisitor {
@@ -41,7 +42,8 @@ public class ClientRpcVisitor extends TypeVisitor {
bundle.setNeedsInvoker(type, method);
bundle.setNeedsParamTypes(type, method);
if (method.getAnnotation(NoLayout.class) != null) {
- bundle.setNeedsNoLayoutRpcMethod(type, method);
+ bundle.setMethodAttribute(type, method,
+ MethodAttribute.NO_LAYOUT);
}
JType[] parameterTypes = method.getParameterTypes();
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
index 31f59ddee4..405925a920 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
@@ -43,6 +43,7 @@ import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ServerConnector;
import com.vaadin.client.communication.JSONSerializer;
import com.vaadin.client.connectors.AbstractRendererConnector;
+import com.vaadin.client.metadata.TypeDataStore.MethodAttribute;
import com.vaadin.client.ui.UnknownComponentConnector;
import com.vaadin.shared.communication.ClientRpc;
import com.vaadin.shared.communication.ServerRpc;
@@ -71,9 +72,9 @@ public class ConnectorBundle {
private final Map<JClassType, Set<JMethod>> needsReturnType = new HashMap<JClassType, Set<JMethod>>();
private final Map<JClassType, Set<JMethod>> needsInvoker = new HashMap<JClassType, Set<JMethod>>();
private final Map<JClassType, Set<JMethod>> needsParamTypes = new HashMap<JClassType, Set<JMethod>>();
- private final Map<JClassType, Set<JMethod>> needsDelayedInfo = new HashMap<JClassType, Set<JMethod>>();
private final Map<JClassType, Set<JMethod>> needsOnStateChange = new HashMap<JClassType, Set<JMethod>>();
- private final Map<JClassType, Set<JMethod>> needsNoLayoutRpcMethods = new HashMap<JClassType, Set<JMethod>>();
+
+ private final Map<JClassType, Map<JMethod, Set<MethodAttribute>>> methodAttributes = new HashMap<JClassType, Map<JMethod, Set<MethodAttribute>>>();
private final Set<Property> needsProperty = new HashSet<Property>();
private final Map<JClassType, Set<Property>> needsDelegateToWidget = new HashMap<JClassType, Set<Property>>();
@@ -525,23 +526,35 @@ public class ConnectorBundle {
return Collections.unmodifiableSet(needsProxySupport);
}
- public void setNeedsDelayedInfo(JClassType type, JMethod method) {
- if (!isNeedsDelayedInfo(type, method)) {
- addMapping(needsDelayedInfo, type, method);
+ public void setMethodAttribute(JClassType type, JMethod method,
+ MethodAttribute methodAttribute) {
+ if (!hasMethodAttribute(type, method, methodAttribute)) {
+ Map<JMethod, Set<MethodAttribute>> typeData = methodAttributes
+ .get(type);
+ if (typeData == null) {
+ typeData = new HashMap<JMethod, Set<MethodAttribute>>();
+ methodAttributes.put(type, typeData);
+ }
+
+ addMapping(typeData, method, methodAttribute);
}
}
- private boolean isNeedsDelayedInfo(JClassType type, JMethod method) {
- if (hasMapping(needsDelayedInfo, type, method)) {
+ private boolean hasMethodAttribute(JClassType type, JMethod method,
+ MethodAttribute methodAttribute) {
+ Map<JMethod, Set<MethodAttribute>> typeData = methodAttributes
+ .get(type);
+ if (typeData != null && hasMapping(typeData, method, methodAttribute)) {
return true;
} else {
return previousBundle != null
- && previousBundle.isNeedsDelayedInfo(type, method);
+ && previousBundle.hasMethodAttribute(type, method,
+ methodAttribute);
}
}
- public Map<JClassType, Set<JMethod>> getNeedsDelayedInfo() {
- return Collections.unmodifiableMap(needsDelayedInfo);
+ public Map<JClassType, Map<JMethod, Set<MethodAttribute>>> getMethodAttributes() {
+ return Collections.unmodifiableMap(methodAttributes);
}
public void setNeedsSerialize(JType type) {
@@ -635,25 +648,6 @@ public class ConnectorBundle {
return Collections.unmodifiableMap(needsOnStateChange);
}
- public void setNeedsNoLayoutRpcMethod(JClassType type, JMethod method) {
- if (!isNeedsNoLayoutRpcMethod(type, method)) {
- addMapping(needsNoLayoutRpcMethods, type, method);
- }
- }
-
- private boolean isNeedsNoLayoutRpcMethod(JClassType type, JMethod method) {
- if (hasMapping(needsNoLayoutRpcMethods, type, method)) {
- return true;
- } else {
- return previousBundle != null
- && previousBundle.isNeedsNoLayoutRpcMethod(type, method);
- }
- }
-
- public Map<JClassType, Set<JMethod>> getNeedsNoLayoutRpcMethods() {
- return Collections.unmodifiableMap(needsNoLayoutRpcMethods);
- }
-
public static JMethod findInheritedMethod(JClassType type,
String methodName, JType... params) {
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java
index 6ad0d2fd98..a1852d5b32 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java
@@ -23,6 +23,8 @@ 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.google.gwt.core.ext.typeinfo.JType;
+import com.vaadin.client.metadata.TypeDataStore.MethodAttribute;
+import com.vaadin.shared.annotations.Delayed;
public class ServerRpcVisitor extends TypeVisitor {
@Override
@@ -38,7 +40,17 @@ public class ServerRpcVisitor extends TypeVisitor {
JMethod[] methods = subType.getMethods();
for (JMethod method : methods) {
ClientRpcVisitor.checkReturnType(logger, method);
- bundle.setNeedsDelayedInfo(type, method);
+
+ Delayed delayed = method.getAnnotation(Delayed.class);
+ if (delayed != null) {
+ bundle.setMethodAttribute(type, method,
+ MethodAttribute.DELAYED);
+ if (delayed.lastOnly()) {
+ bundle.setMethodAttribute(type, method,
+ MethodAttribute.LAST_ONLY);
+ }
+ }
+
bundle.setNeedsParamTypes(type, method);
JType[] parameterTypes = method.getParameterTypes();
diff --git a/client/src/com/vaadin/client/metadata/TypeDataStore.java b/client/src/com/vaadin/client/metadata/TypeDataStore.java
index 6d46ed1365..e3db0ccded 100644
--- a/client/src/com/vaadin/client/metadata/TypeDataStore.java
+++ b/client/src/com/vaadin/client/metadata/TypeDataStore.java
@@ -28,6 +28,10 @@ import com.vaadin.client.communication.JSONSerializer;
import com.vaadin.shared.annotations.NoLayout;
public class TypeDataStore {
+ public static enum MethodAttribute {
+ DELAYED, LAST_ONLY, NO_LAYOUT;
+ }
+
private static final String CONSTRUCTOR_NAME = "!new";
private final FastStringMap<Class<?>> identifiers = FastStringMap.create();
@@ -47,9 +51,8 @@ public class TypeDataStore {
private final FastStringMap<FastStringMap<JsArrayObject<OnStateChangeMethod>>> onStateChangeMethods = FastStringMap
.create();
- private final FastStringSet delayedMethods = FastStringSet.create();
- private final FastStringSet lastOnlyMethods = FastStringSet.create();
- private final FastStringSet noLayoutRpcMethods = FastStringSet.create();
+ private final FastStringMap<FastStringSet> methodAttributes = FastStringMap
+ .create();
private final FastStringMap<Type> returnTypes = FastStringMap.create();
private final FastStringMap<Invoker> invokers = FastStringMap.create();
@@ -213,20 +216,29 @@ public class TypeDataStore {
}
public static boolean isDelayed(Method method) {
- return get().delayedMethods.contains(method.getLookupKey());
+ return hasMethodAttribute(method, MethodAttribute.DELAYED);
}
- public void setDelayed(Class<?> type, String methodName) {
- delayedMethods.add(getType(type).getMethod(methodName).getLookupKey());
+ private static boolean hasMethodAttribute(Method method,
+ MethodAttribute attribute) {
+ FastStringSet attributes = get().methodAttributes.get(method
+ .getLookupKey());
+ return attributes != null && attributes.contains(attribute.name());
}
- public static boolean isLastOnly(Method method) {
- return get().lastOnlyMethods.contains(method.getLookupKey());
+ public void setMethodAttribute(Class<?> type, String methodName,
+ MethodAttribute attribute) {
+ String key = getType(type).getMethod(methodName).getLookupKey();
+ FastStringSet attributes = methodAttributes.get(key);
+ if (attributes == null) {
+ attributes = FastStringSet.create();
+ methodAttributes.put(key, attributes);
+ }
+ attributes.add(attribute.name());
}
- public void setLastOnly(Class<?> clazz, String methodName) {
- lastOnlyMethods
- .add(getType(clazz).getMethod(methodName).getLookupKey());
+ public static boolean isLastOnly(Method method) {
+ return hasMethodAttribute(method, MethodAttribute.LAST_ONLY);
}
/**
@@ -450,22 +462,7 @@ public class TypeDataStore {
* otherwise <code>false</code>
*/
public static boolean isNoLayoutRpcMethod(Method method) {
- return get().noLayoutRpcMethods.contains(method.getLookupKey());
- }
-
- /**
- * Defines that a method is annotated with {@link NoLayout}.
- *
- * @since 7.4
- *
- * @param type
- * the where the method is defined
- * @param methodName
- * the name of the method
- */
- public void setNoLayoutRpcMethod(Class<?> type, String methodName) {
- noLayoutRpcMethods.add(new Method(getType(type), methodName)
- .getLookupKey());
+ return hasMethodAttribute(method, MethodAttribute.NO_LAYOUT);
}
/**