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.

ComponentDesignWriterUtility.java 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package com.vaadin.tests.server;
  2. import java.io.File;
  3. import java.lang.reflect.Modifier;
  4. import java.net.URISyntaxException;
  5. import java.util.Arrays;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import java.util.Set;
  9. import java.util.stream.Collectors;
  10. import org.jsoup.nodes.Document;
  11. import org.jsoup.nodes.Element;
  12. import org.junit.Assert;
  13. import org.junit.Test;
  14. import com.vaadin.navigator.Navigator;
  15. import com.vaadin.ui.Component;
  16. import com.vaadin.ui.DragAndDropWrapper;
  17. import com.vaadin.ui.components.colorpicker.ColorPickerGradient;
  18. import com.vaadin.ui.components.colorpicker.ColorPickerGrid;
  19. import com.vaadin.ui.components.colorpicker.ColorPickerHistory;
  20. import com.vaadin.ui.components.colorpicker.ColorPickerPopup;
  21. import com.vaadin.ui.components.colorpicker.ColorPickerPreview;
  22. import com.vaadin.ui.components.colorpicker.ColorPickerSelect;
  23. import com.vaadin.ui.declarative.Design;
  24. import com.vaadin.ui.declarative.DesignContext;
  25. /**
  26. * Utility class for outputting the declarative syntax of Vaadin components.
  27. */
  28. public class ComponentDesignWriterUtility {
  29. private static final Set<String> WHITE_LIST_FQNS = new HashSet<>();
  30. private static final Document document = new Document("");
  31. private static final DesignContext designContext = new DesignContext(
  32. document);
  33. static {
  34. WHITE_LIST_FQNS.add(DragAndDropWrapper.class.getName());
  35. WHITE_LIST_FQNS.add(Navigator.EmptyView.class.getName());
  36. WHITE_LIST_FQNS.add(ColorPickerGradient.class.getName());
  37. WHITE_LIST_FQNS.add(ColorPickerPopup.class.getName());
  38. WHITE_LIST_FQNS.add(ColorPickerPreview.class.getName());
  39. WHITE_LIST_FQNS.add(ColorPickerGrid.class.getName());
  40. WHITE_LIST_FQNS.add(ColorPickerSelect.class.getName());
  41. WHITE_LIST_FQNS.add(ColorPickerHistory.class.getName());
  42. WHITE_LIST_FQNS
  43. .add(com.vaadin.v7.ui.components.colorpicker.ColorPickerGradient.class
  44. .getName());
  45. WHITE_LIST_FQNS
  46. .add(com.vaadin.v7.ui.components.colorpicker.ColorPickerPopup.class
  47. .getName());
  48. WHITE_LIST_FQNS
  49. .add(com.vaadin.v7.ui.components.colorpicker.ColorPickerPreview.class
  50. .getName());
  51. WHITE_LIST_FQNS
  52. .add(com.vaadin.v7.ui.components.colorpicker.ColorPickerGrid.class
  53. .getName());
  54. WHITE_LIST_FQNS
  55. .add(com.vaadin.v7.ui.components.colorpicker.ColorPickerSelect.class
  56. .getName());
  57. WHITE_LIST_FQNS
  58. .add(com.vaadin.v7.ui.components.colorpicker.ColorPickerHistory.class
  59. .getName());
  60. // ==================================================================
  61. // Classes that cannot be loaded
  62. // ==================================================================
  63. WHITE_LIST_FQNS.add(
  64. "com.vaadin.server.communication.PushAtmosphereHandler$AtmosphereResourceListener");
  65. WHITE_LIST_FQNS
  66. .add("com.vaadin.server.communication.PushAtmosphereHandler");
  67. WHITE_LIST_FQNS
  68. .add("com.vaadin.server.communication.PushRequestHandler$1");
  69. WHITE_LIST_FQNS
  70. .add("com.vaadin.server.communication.PushRequestHandler$2");
  71. WHITE_LIST_FQNS.add("com.vaadin.server.LegacyVaadinPortlet");
  72. WHITE_LIST_FQNS.add("com.vaadin.server.RestrictedRenderResponse");
  73. WHITE_LIST_FQNS
  74. .add("com.vaadin.server.VaadinPortlet$VaadinGateInRequest");
  75. WHITE_LIST_FQNS.add(
  76. "com.vaadin.server.VaadinPortlet$VaadinHttpAndPortletRequest");
  77. WHITE_LIST_FQNS
  78. .add("com.vaadin.server.VaadinPortlet$VaadinLiferayRequest");
  79. WHITE_LIST_FQNS.add(
  80. "com.vaadin.server.VaadinPortlet$VaadinWebLogicPortalRequest");
  81. WHITE_LIST_FQNS.add(
  82. "com.vaadin.server.VaadinPortlet$VaadinWebSpherePortalRequest");
  83. WHITE_LIST_FQNS.add("com.vaadin.server.VaadinPortlet");
  84. WHITE_LIST_FQNS.add("com.vaadin.server.VaadinPortletRequest");
  85. designContext.setShouldWriteDefaultValues(true);
  86. }
  87. @SafeVarargs
  88. public static List<String> getDeclarativeSyntax(
  89. Class<? extends Component>... components) {
  90. return getDeclarativeSyntax(Arrays.asList(components));
  91. }
  92. public static List<String> getDeclarativeSyntax(
  93. List<Class<? extends Component>> components) {
  94. List<String> declarativeStrings = components.stream()
  95. .map(ComponentDesignWriterUtility::getDeclarativeSyntax)
  96. .collect(Collectors.toList());
  97. return declarativeStrings;
  98. }
  99. @Test
  100. public void vaadin8ComponentsElementStartsWithVaadinPrefix()
  101. throws URISyntaxException {
  102. Assert.assertTrue(getVaadin8Components().stream()
  103. .map(ComponentDesignWriterUtility::getDeclarativeSyntax)
  104. .allMatch(element -> element.startsWith("<vaadin-")));
  105. }
  106. @Test
  107. public void vaadin7ComponentsElementStartsWithVaadinPrefix()
  108. throws URISyntaxException {
  109. Assert.assertTrue(getVaadin7Components().stream()
  110. .map(ComponentDesignWriterUtility::getDeclarativeSyntax)
  111. .allMatch(element -> element.startsWith("<vaadin7-")));
  112. }
  113. private static String getDeclarativeSyntax(
  114. Class<? extends Component> componentClass) {
  115. try {
  116. Component component = componentClass.newInstance();
  117. Element element = document.createElement(Design.getComponentMapper()
  118. .componentToTag(component, designContext));
  119. component.writeDesign(element, designContext);
  120. return element.toString();
  121. } catch (Exception e) {
  122. throw new RuntimeException(
  123. "Could not write the declarative syntax for component "
  124. + componentClass.getName(),
  125. e);
  126. }
  127. }
  128. public static void main(String[] args) throws URISyntaxException {
  129. System.out.println("Vaadin 8 components:");
  130. printFullDeclarativeSyntax(getVaadin8Components());
  131. System.out.println("Vaadin 7 components:");
  132. printFullDeclarativeSyntax(getVaadin7Components());
  133. System.out.println("\nClases that are explicitely excluded from "
  134. + "the design support introspection:");
  135. WHITE_LIST_FQNS.forEach(System.out::println);
  136. }
  137. private static void printFullDeclarativeSyntax(
  138. List<Class<? extends Component>> components) {
  139. components.stream().forEach(component -> System.out
  140. .println(getDeclarativeSyntax(component)));
  141. }
  142. private static List<Class<? extends Component>> getVaadin8Components()
  143. throws URISyntaxException {
  144. List<Class<? extends Component>> vaadin8Components = getVaadinComponentsFromClasspath(
  145. "/server/target/classes");
  146. if (vaadin8Components.isEmpty()) {
  147. throw new RuntimeException(
  148. "No vaadin 8 components found on your classpath.");
  149. }
  150. return vaadin8Components;
  151. }
  152. private static List<Class<? extends Component>> getVaadin7Components()
  153. throws URISyntaxException {
  154. List<Class<? extends Component>> vaadin7Components = getVaadinComponentsFromClasspath(
  155. "compatibility-server");
  156. if (vaadin7Components.isEmpty()) {
  157. throw new RuntimeException(
  158. "No vaadin 7 components found on your classpath.");
  159. }
  160. return vaadin7Components;
  161. }
  162. @SuppressWarnings("unchecked")
  163. private static List<Class<? extends Component>> getVaadinComponentsFromClasspath(
  164. String classpathFilter) throws URISyntaxException {
  165. File testRoot = new File(
  166. ComponentDesignWriterUtility.class.getResource("/").toURI());
  167. List<Class<? extends Component>> classes = new ClasspathHelper(
  168. WHITE_LIST_FQNS::contains).getVaadinClassesFromClasspath(
  169. entry -> entry.contains(classpathFilter)
  170. && !testRoot.equals(new File(entry)),
  171. cls -> Component.class.isAssignableFrom(cls)
  172. && !cls.isInterface()
  173. && !Modifier.isAbstract(cls.getModifiers()))
  174. .map(cls -> (Class<? extends Component>) cls)
  175. .collect(Collectors.toList());
  176. return classes;
  177. }
  178. }