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.

TableRemovedQuicklySendsInvalidRpcCalls.java 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package com.vaadin.tests.components.table;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import com.vaadin.annotations.Push;
  5. import com.vaadin.server.ClientConnector;
  6. import com.vaadin.server.StreamVariable;
  7. import com.vaadin.server.VaadinRequest;
  8. import com.vaadin.tests.components.AbstractReindeerTestUI;
  9. import com.vaadin.ui.Button;
  10. import com.vaadin.ui.ConnectorTracker;
  11. import com.vaadin.v7.ui.Table;
  12. import elemental.json.JsonObject;
  13. @Push
  14. public class TableRemovedQuicklySendsInvalidRpcCalls
  15. extends AbstractReindeerTestUI {
  16. public static final String SUCCESS_CAPTION = "Success!";
  17. public static final String BUTTON_ID = "blinkbutton";
  18. public static final String FAILURE_CAPTION = "Test failed";
  19. private class WrappedConnectorTracker extends ConnectorTracker {
  20. private ConnectorTracker tracker;
  21. private boolean initialDirtyHasBeenCalled = false;
  22. public WrappedConnectorTracker(ConnectorTracker tracker) {
  23. super(TableRemovedQuicklySendsInvalidRpcCalls.this);
  24. this.tracker = tracker;
  25. }
  26. @Override
  27. public void markAllConnectorsDirty() {
  28. tracker.markAllConnectorsDirty();
  29. if (initialDirtyHasBeenCalled) {
  30. button.setCaption(FAILURE_CAPTION);
  31. }
  32. initialDirtyHasBeenCalled = true;
  33. }
  34. // DELEGATED METHODS BELOW:
  35. @Override
  36. public void registerConnector(ClientConnector connector) {
  37. tracker.registerConnector(connector);
  38. }
  39. @Override
  40. public void unregisterConnector(ClientConnector connector) {
  41. tracker.unregisterConnector(connector);
  42. }
  43. @Override
  44. public boolean isClientSideInitialized(ClientConnector connector) {
  45. return tracker.isClientSideInitialized(connector);
  46. }
  47. @Override
  48. public void markClientSideInitialized(ClientConnector connector) {
  49. tracker.markClientSideInitialized(connector);
  50. }
  51. @Override
  52. public void markAllClientSidesUninitialized() {
  53. tracker.markAllClientSidesUninitialized();
  54. }
  55. @Override
  56. public ClientConnector getConnector(String connectorId) {
  57. return tracker.getConnector(connectorId);
  58. }
  59. @Override
  60. public void cleanConnectorMap(boolean force) {
  61. tracker.cleanConnectorMap(force);
  62. }
  63. @Override
  64. public void cleanConnectorMap() {
  65. tracker.cleanConnectorMap();
  66. }
  67. @Override
  68. public void markDirty(ClientConnector connector) {
  69. tracker.markDirty(connector);
  70. }
  71. @Override
  72. public void markClean(ClientConnector connector) {
  73. tracker.markClean(connector);
  74. }
  75. @Override
  76. public void markAllConnectorsClean() {
  77. tracker.markAllConnectorsClean();
  78. }
  79. @Override
  80. public Collection<ClientConnector> getDirtyConnectors() {
  81. return tracker.getDirtyConnectors();
  82. }
  83. @Override
  84. public boolean hasDirtyConnectors() {
  85. return tracker.hasDirtyConnectors();
  86. }
  87. @Override
  88. public ArrayList<ClientConnector> getDirtyVisibleConnectors() {
  89. return tracker.getDirtyVisibleConnectors();
  90. }
  91. @Override
  92. public JsonObject getDiffState(ClientConnector connector) {
  93. return tracker.getDiffState(connector);
  94. }
  95. @Override
  96. public void setDiffState(ClientConnector connector,
  97. JsonObject diffState) {
  98. tracker.setDiffState(connector, diffState);
  99. }
  100. @Override
  101. public boolean isDirty(ClientConnector connector) {
  102. return tracker.isDirty(connector);
  103. }
  104. @Override
  105. public boolean isWritingResponse() {
  106. return tracker.isWritingResponse();
  107. }
  108. @Override
  109. public void setWritingResponse(boolean writingResponse) {
  110. tracker.setWritingResponse(writingResponse);
  111. }
  112. @Override
  113. public StreamVariable getStreamVariable(String connectorId,
  114. String variableName) {
  115. return tracker.getStreamVariable(connectorId, variableName);
  116. }
  117. @Override
  118. public void addStreamVariable(String connectorId, String variableName,
  119. StreamVariable variable) {
  120. tracker.addStreamVariable(connectorId, variableName, variable);
  121. }
  122. @Override
  123. public void cleanStreamVariable(String connectorId,
  124. String variableName) {
  125. tracker.cleanStreamVariable(connectorId, variableName);
  126. }
  127. @Override
  128. public String getSeckey(StreamVariable variable) {
  129. return tracker.getSeckey(variable);
  130. }
  131. @Override
  132. public int getCurrentSyncId() {
  133. return tracker.getCurrentSyncId();
  134. }
  135. @Override
  136. public boolean equals(Object obj) {
  137. return tracker.equals(obj);
  138. }
  139. @Override
  140. public int hashCode() {
  141. return tracker.hashCode();
  142. }
  143. @Override
  144. public String toString() {
  145. return tracker.toString();
  146. }
  147. }
  148. private Button button;
  149. private WrappedConnectorTracker wrappedTracker = null;
  150. @Override
  151. protected void setup(VaadinRequest request) {
  152. button = new Button("Blink a table", event -> blinkTable());
  153. button.setId(BUTTON_ID);
  154. addComponent(button);
  155. }
  156. @Override
  157. public ConnectorTracker getConnectorTracker() {
  158. if (wrappedTracker == null) {
  159. wrappedTracker = new WrappedConnectorTracker(
  160. super.getConnectorTracker());
  161. }
  162. return wrappedTracker;
  163. }
  164. private void blinkTable() {
  165. final Table table = new Table();
  166. table.setPageLength(5);
  167. table.addContainerProperty(new Object(), String.class, null);
  168. for (int i = 0; i < 50; i++) {
  169. table.addItem(new Object[] { "Row" }, new Object());
  170. }
  171. System.out.println("adding component");
  172. addComponent(table);
  173. new Thread() {
  174. @Override
  175. public void run() {
  176. getSession().lock();
  177. try {
  178. Thread.sleep(500);
  179. access(() -> {
  180. System.out.println("removing component");
  181. removeComponent(table);
  182. button.setCaption(SUCCESS_CAPTION);
  183. });
  184. } catch (InterruptedException e) {
  185. e.printStackTrace();
  186. } finally {
  187. getSession().unlock();
  188. }
  189. }
  190. }.start();
  191. }
  192. @Override
  193. protected String getTestDescription() {
  194. return "Adding and subsequently quickly removing a table "
  195. + "should not leave any pending RPC calls waiting "
  196. + "in a Timer. Issue can be reproduced by "
  197. + "1) pressing the button 2) checking the server "
  198. + "log for any error messages starting with "
  199. + "\"RPC call to...\" .";
  200. }
  201. @Override
  202. protected Integer getTicketNumber() {
  203. return 12337;
  204. }
  205. }