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;
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;
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);
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 {
}
}
- 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();
}
}
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 {
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();
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;
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>>();
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) {
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) {
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
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();
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();
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();
}
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);
}
/**
* 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);
}
/**