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.

Components.java 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package com.vaadin.tests;
  2. import java.lang.reflect.Modifier;
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import com.vaadin.data.Item;
  11. import com.vaadin.data.util.DefaultItemSorter;
  12. import com.vaadin.data.util.HierarchicalContainer;
  13. import com.vaadin.event.ItemClickEvent;
  14. import com.vaadin.event.ItemClickEvent.ItemClickListener;
  15. import com.vaadin.server.ExternalResource;
  16. import com.vaadin.server.LegacyApplication;
  17. import com.vaadin.server.Sizeable;
  18. import com.vaadin.shared.MouseEventDetails.MouseButton;
  19. import com.vaadin.shared.ui.label.ContentMode;
  20. import com.vaadin.tests.components.AbstractComponentTest;
  21. import com.vaadin.ui.AbstractComponent;
  22. import com.vaadin.ui.Component;
  23. import com.vaadin.ui.Embedded;
  24. import com.vaadin.ui.HorizontalSplitPanel;
  25. import com.vaadin.ui.Label;
  26. import com.vaadin.ui.LegacyWindow;
  27. import com.vaadin.ui.Tree;
  28. import com.vaadin.ui.Tree.ItemStyleGenerator;
  29. import com.vaadin.ui.VerticalLayout;
  30. public class Components extends LegacyApplication {
  31. private static final Object CAPTION = "c";
  32. private Map<Class<? extends AbstractComponentTest>, String> tests = new HashMap<Class<? extends AbstractComponentTest>, String>();
  33. private Tree naviTree;
  34. private HorizontalSplitPanel sp;
  35. private LegacyWindow mainWindow;
  36. private final Embedded applicationEmbedder = new Embedded();
  37. private String baseUrl;
  38. private List<Class<? extends Component>> componentsWithoutTests = new ArrayList<Class<? extends Component>>();
  39. {
  40. for (Class<?> c : VaadinClasses.getBasicComponentTests()) {
  41. String testClass = c.getSimpleName();
  42. tests.put((Class<? extends AbstractComponentTest>) c, testClass);
  43. }
  44. List<Class<? extends Component>> componentsWithoutTest = VaadinClasses
  45. .getComponents();
  46. Set<String> availableTests = new HashSet<String>();
  47. for (String testName : tests.values()) {
  48. availableTests.add(testName);
  49. }
  50. for (Class<? extends Component> component : componentsWithoutTest) {
  51. String baseName = component.getSimpleName();
  52. if (availableTests.contains(baseName + "es")) {
  53. continue;
  54. }
  55. if (availableTests.contains(baseName + "es2")) {
  56. continue;
  57. }
  58. if (availableTests.contains(baseName + "s2")) {
  59. continue;
  60. }
  61. if (availableTests.contains(baseName + "s")) {
  62. continue;
  63. }
  64. if (availableTests.contains(baseName + "Test")) {
  65. continue;
  66. }
  67. componentsWithoutTests.add(component);
  68. }
  69. }
  70. class MissingTest extends AbstractComponentTest<AbstractComponent> {
  71. @Override
  72. protected Class<AbstractComponent> getTestClass() {
  73. return null;
  74. }
  75. }
  76. @Override
  77. public void init() {
  78. mainWindow = new LegacyWindow();
  79. setTheme("tests-components");
  80. mainWindow.getContent().setSizeFull();
  81. setMainWindow(mainWindow);
  82. sp = new HorizontalSplitPanel();
  83. sp.setSizeFull();
  84. VerticalLayout naviLayout = new VerticalLayout();
  85. naviLayout
  86. .addComponent(new Label(
  87. "Click to open a test case.<br/>Right click to open test in a new window<br/><br/>",
  88. ContentMode.HTML));
  89. naviLayout.addComponent(createMenu());
  90. naviLayout.addComponent(createMissingTestsList());
  91. sp.setFirstComponent(naviLayout);
  92. sp.setSplitPosition(250, Sizeable.UNITS_PIXELS);
  93. VerticalLayout embeddingLayout = new VerticalLayout();
  94. embeddingLayout.setSizeFull();
  95. embeddingLayout
  96. .addComponent(new Label(
  97. "<b>Do not use the embedded version for creating automated tests. Open the test in a new window before recording.</b><br/>",
  98. ContentMode.HTML));
  99. applicationEmbedder.setSizeFull();
  100. embeddingLayout.addComponent(applicationEmbedder);
  101. embeddingLayout.setExpandRatio(applicationEmbedder, 1);
  102. sp.setSecondComponent(embeddingLayout);
  103. mainWindow.addComponent(sp);
  104. applicationEmbedder.setType(Embedded.TYPE_BROWSER);
  105. baseUrl = getURL().toString().replace(getClass().getName(), "")
  106. .replaceAll("//$", "/");
  107. }
  108. private Component createMissingTestsList() {
  109. String missingTests = "";
  110. for (Class<? extends Component> component : componentsWithoutTests) {
  111. String cls = "missing";
  112. if (component.getAnnotation(Deprecated.class) != null) {
  113. cls = "missing-deprecated";
  114. }
  115. missingTests += "<font class=\"" + cls + "\">"
  116. + component.getSimpleName() + "</font><br/>";
  117. }
  118. return new Label("<b>Components without a test:</B><br/>"
  119. + missingTests, ContentMode.HTML);
  120. }
  121. private Component createMenu() {
  122. naviTree = new Tree();
  123. naviTree.setItemStyleGenerator(new ItemStyleGenerator() {
  124. @Override
  125. public String getStyle(Tree source, Object itemId) {
  126. Class<?> cls = (Class<?>) itemId;
  127. if (!isAbstract(cls)) {
  128. return "blue";
  129. }
  130. return null;
  131. }
  132. });
  133. HierarchicalContainer hc = new HierarchicalContainer();
  134. naviTree.setContainerDataSource(hc);
  135. DefaultItemSorter sorter = new DefaultItemSorter() {
  136. @SuppressWarnings("rawtypes")
  137. @Override
  138. public int compare(Object o1, Object o2) {
  139. if (o1 instanceof Class && o2 instanceof Class && o1 != null
  140. && o2 != null) {
  141. Class<?> c1 = (Class) o1;
  142. Class<?> c2 = (Class) o2;
  143. boolean a1 = isAbstract(c1);
  144. boolean a2 = isAbstract(c2);
  145. if (a1 && !a2) {
  146. return 1;
  147. } else if (!a1 && a2) {
  148. return -1;
  149. }
  150. }
  151. return super.compare(o1, o2);
  152. }
  153. };
  154. hc.setItemSorter(sorter);
  155. naviTree.addContainerProperty(CAPTION, String.class, "");
  156. naviTree.setItemCaptionPropertyId(CAPTION);
  157. for (Class<? extends AbstractComponentTest> cls : tests.keySet()) {
  158. addTreeItem(cls);
  159. }
  160. hc.sort(new Object[] { CAPTION }, new boolean[] { true });
  161. naviTree.setSelectable(false);
  162. for (Object o : naviTree.rootItemIds()) {
  163. expandAndSetChildrenAllowed(o);
  164. }
  165. naviTree.addListener(new ItemClickListener() {
  166. @Override
  167. public void itemClick(ItemClickEvent event) {
  168. Class<?> cls = (Class<?>) event.getItemId();
  169. if (!isAbstract(cls)) {
  170. String url = baseUrl + cls.getName()
  171. + "?restartApplication";
  172. if (event.getButton() == MouseButton.LEFT) {
  173. openEmbedded(url);
  174. naviTree.setValue(event.getItemId());
  175. } else if (event.getButton() == MouseButton.RIGHT) {
  176. openInNewTab(url);
  177. }
  178. }
  179. }
  180. });
  181. return naviTree;
  182. }
  183. protected void openInNewTab(String url) {
  184. getMainWindow().open(new ExternalResource(url), "_blank");
  185. }
  186. protected void openEmbedded(String url) {
  187. applicationEmbedder.setSource(new ExternalResource(url));
  188. }
  189. private void expandAndSetChildrenAllowed(Object o) {
  190. Collection<?> children = naviTree.getChildren(o);
  191. if (children == null || children.size() == 0) {
  192. naviTree.setChildrenAllowed(o, false);
  193. } else {
  194. naviTree.expandItem(o);
  195. for (Object c : children) {
  196. expandAndSetChildrenAllowed(c);
  197. }
  198. }
  199. }
  200. protected boolean isAbstract(Class<?> cls) {
  201. return Modifier.isAbstract(cls.getModifiers());
  202. }
  203. @SuppressWarnings("unchecked")
  204. private void addTreeItem(Class<? extends AbstractComponentTest> cls) {
  205. String name = tests.get(cls);
  206. if (name == null) {
  207. name = cls.getSimpleName();
  208. }
  209. Class<? extends AbstractComponentTest> superClass = (Class<? extends AbstractComponentTest>) cls
  210. .getSuperclass();
  211. // This cast is needed only to make compilation through Ant work ..
  212. if (((Class<?>) cls) != AbstractComponentTest.class) {
  213. addTreeItem(superClass);
  214. }
  215. if (naviTree.containsId(cls)) {
  216. return;
  217. }
  218. Item i = naviTree.addItem(cls);
  219. i.getItemProperty(CAPTION).setValue(name);
  220. naviTree.setParent(cls, superClass);
  221. }
  222. protected Component createTestComponent(
  223. Class<? extends AbstractComponentTest> cls) {
  224. try {
  225. AbstractComponentTest t = cls.newInstance();
  226. t.init();
  227. Component c = t.getMainWindow().getContent();
  228. t.getMainWindow().setContent(null);
  229. return c;
  230. } catch (InstantiationException e) {
  231. // TODO Auto-generated catch block
  232. e.printStackTrace();
  233. } catch (IllegalAccessException e) {
  234. // TODO Auto-generated catch block
  235. e.printStackTrace();
  236. }
  237. return null;
  238. }
  239. }