You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

WidgetInitVisitor.java 3.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.server.widgetsetutils.metadata;
  5. import java.util.Collection;
  6. import com.google.gwt.core.ext.TreeLogger;
  7. import com.google.gwt.core.ext.TreeLogger.Type;
  8. import com.google.gwt.core.ext.UnableToCompleteException;
  9. import com.google.gwt.core.ext.typeinfo.JClassType;
  10. import com.google.gwt.core.ext.typeinfo.JMethod;
  11. import com.vaadin.client.ui.AbstractComponentConnector;
  12. import com.vaadin.shared.annotations.DelegateToWidget;
  13. public class WidgetInitVisitor extends TypeVisitor {
  14. @Override
  15. public void visitConnector(TreeLogger logger, JClassType type,
  16. ConnectorBundle bundle) throws UnableToCompleteException {
  17. if (ConnectorBundle.isConnectedComponentConnector(type)) {
  18. JClassType createWidgetClass = findInheritedMethod(type,
  19. "createWidget").getEnclosingType();
  20. boolean createWidgetOverridden = !createWidgetClass
  21. .getQualifiedSourceName()
  22. .equals(AbstractComponentConnector.class.getCanonicalName());
  23. if (createWidgetOverridden) {
  24. // Don't generate if createWidget is already overridden
  25. return;
  26. }
  27. JMethod getWidget = findInheritedMethod(type, "getWidget");
  28. bundle.setNeedsReturnType(type, getWidget);
  29. JClassType widgetType = getWidget.getReturnType().isClass();
  30. bundle.setNeedsGwtConstructor(widgetType);
  31. JMethod getState = findInheritedMethod(type, "getState");
  32. JClassType stateType = getState.getReturnType().isClass();
  33. Collection<Property> properties = bundle.getProperties(stateType);
  34. for (Property property : properties) {
  35. DelegateToWidget delegateToWidget = property
  36. .getAnnotation(DelegateToWidget.class);
  37. if (delegateToWidget != null) {
  38. bundle.setNeedsDelegateToWidget(property);
  39. String methodName = DelegateToWidget.Helper
  40. .getDelegateTarget(property.getName(),
  41. delegateToWidget.value());
  42. JMethod delegatedSetter = findInheritedMethod(widgetType,
  43. methodName, property.getPropertyType());
  44. if (delegatedSetter == null) {
  45. logger.log(
  46. Type.ERROR,
  47. widgetType.getName()
  48. + "."
  49. + methodName
  50. + "("
  51. + property.getPropertyType()
  52. .getSimpleSourceName()
  53. + ") required by @DelegateToWidget for "
  54. + stateType.getName() + "."
  55. + property.getName()
  56. + " can not be found.");
  57. throw new UnableToCompleteException();
  58. }
  59. bundle.setNeedsInvoker(widgetType, delegatedSetter);
  60. }
  61. }
  62. }
  63. }
  64. }