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.

AbstractConnectorClassBasedFactoryGenerator.java 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.widgetsetutils;
  5. import java.io.PrintWriter;
  6. import java.util.Date;
  7. import com.google.gwt.core.client.GWT;
  8. import com.google.gwt.core.ext.Generator;
  9. import com.google.gwt.core.ext.GeneratorContext;
  10. import com.google.gwt.core.ext.TreeLogger;
  11. import com.google.gwt.core.ext.TreeLogger.Type;
  12. import com.google.gwt.core.ext.UnableToCompleteException;
  13. import com.google.gwt.core.ext.typeinfo.JClassType;
  14. import com.google.gwt.core.ext.typeinfo.JMethod;
  15. import com.google.gwt.core.ext.typeinfo.JType;
  16. import com.google.gwt.core.ext.typeinfo.NotFoundException;
  17. import com.google.gwt.core.ext.typeinfo.TypeOracle;
  18. import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
  19. import com.google.gwt.user.rebind.SourceWriter;
  20. import com.vaadin.terminal.gwt.client.ServerConnector;
  21. import com.vaadin.terminal.gwt.client.ui.ConnectorClassBasedFactory;
  22. import com.vaadin.terminal.gwt.client.ui.ConnectorClassBasedFactory.Creator;
  23. /**
  24. * GWT generator that creates a lookup method for
  25. * {@link ConnectorClassBasedFactory} instances.
  26. *
  27. * @since 7.0
  28. */
  29. public abstract class AbstractConnectorClassBasedFactoryGenerator extends
  30. Generator {
  31. @Override
  32. public String generate(TreeLogger logger, GeneratorContext context,
  33. String typeName) throws UnableToCompleteException {
  34. try {
  35. // get classType and save instance variables
  36. return generateConnectorClassBasedFactory(typeName, logger, context);
  37. } catch (Exception e) {
  38. logger.log(TreeLogger.ERROR, typeName + " creation failed", e);
  39. throw new UnableToCompleteException();
  40. }
  41. }
  42. private String generateConnectorClassBasedFactory(String typeName,
  43. TreeLogger logger, GeneratorContext context)
  44. throws NotFoundException {
  45. TypeOracle typeOracle = context.getTypeOracle();
  46. JClassType classType = typeOracle.getType(typeName);
  47. String superName = classType.getSimpleSourceName();
  48. String packageName = classType.getPackage().getName();
  49. String className = superName + "Impl";
  50. // get print writer that receives the source code
  51. PrintWriter printWriter = null;
  52. printWriter = context.tryCreate(logger, packageName, className);
  53. // print writer if null, source code has ALREADY been generated
  54. if (printWriter == null) {
  55. return packageName + "." + className;
  56. }
  57. Date date = new Date();
  58. // init composer, set class properties, create source writer
  59. ClassSourceFileComposerFactory composer = null;
  60. composer = new ClassSourceFileComposerFactory(packageName, className);
  61. composer.addImport(GWT.class.getName());
  62. composer.addImport(Creator.class.getCanonicalName());
  63. composer.setSuperclass(superName);
  64. SourceWriter sourceWriter = composer.createSourceWriter(context,
  65. printWriter);
  66. sourceWriter.indent();
  67. // public ConnectorStateFactoryImpl() {
  68. sourceWriter.println("public " + className + "() {");
  69. sourceWriter.indent();
  70. JClassType serverConnectorType = typeOracle.getType(getConnectorType()
  71. .getCanonicalName());
  72. for (JClassType connector : serverConnectorType.getSubtypes()) {
  73. // addCreator(TextAreaConnector.class, new Creator<SharedState>() {
  74. if (connector.isInterface() != null || connector.isAbstract()) {
  75. continue;
  76. }
  77. JClassType targetType = getTargetType(connector);
  78. if (targetType.isAbstract()) {
  79. continue;
  80. }
  81. sourceWriter.println("addCreator("
  82. + connector.getQualifiedSourceName()
  83. + ".class, new Creator<"
  84. + targetType.getQualifiedSourceName() + ">() {");
  85. // public SharedState create() {
  86. sourceWriter.println("public "
  87. + targetType.getQualifiedSourceName() + " create() {");
  88. // return GWT.create(TextAreaState.class);
  89. sourceWriter.println("return GWT.create("
  90. + targetType.getQualifiedSourceName() + ".class);");
  91. // }
  92. sourceWriter.println("}");
  93. // });
  94. sourceWriter.println("});");
  95. }
  96. // End of constructor
  97. sourceWriter.outdent();
  98. sourceWriter.println("}");
  99. // close generated class
  100. sourceWriter.outdent();
  101. sourceWriter.println("}");
  102. // commit generated class
  103. context.commit(logger, printWriter);
  104. logger.log(Type.INFO,
  105. "Done. (" + (new Date().getTime() - date.getTime()) / 1000
  106. + "seconds)");
  107. return packageName + "." + className;
  108. }
  109. protected abstract Class<? extends ServerConnector> getConnectorType();
  110. protected abstract JClassType getTargetType(JClassType connectorType);
  111. protected JClassType getGetterReturnType(JClassType connector,
  112. String getterName) {
  113. try {
  114. JMethod getMethod = connector.getMethod(getterName, new JType[] {});
  115. return (JClassType) getMethod.getReturnType();
  116. } catch (NotFoundException e) {
  117. return getGetterReturnType(connector.getSuperclass(), getterName);
  118. }
  119. }
  120. }