您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

TableRemovedQuicklySendsInvalidRpcCalls.java 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /*
  2. * Copyright 2000-2016 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.tests.components.table;
  17. import java.util.ArrayList;
  18. import java.util.Collection;
  19. import com.vaadin.annotations.Push;
  20. import com.vaadin.server.ClientConnector;
  21. import com.vaadin.server.StreamVariable;
  22. import com.vaadin.server.VaadinRequest;
  23. import com.vaadin.tests.components.AbstractReindeerTestUI;
  24. import com.vaadin.ui.Button;
  25. import com.vaadin.ui.Button.ClickEvent;
  26. import com.vaadin.ui.ConnectorTracker;
  27. <<<<<<< HEAD
  28. import com.vaadin.v7.ui.Table;
  29. =======
  30. import com.vaadin.ui.Table;
  31. >>>>>>> 62c0d73... Remove tracking of unregistered connectors (#8153)
  32. import elemental.json.JsonObject;
  33. @Push
  34. public class TableRemovedQuicklySendsInvalidRpcCalls
  35. extends AbstractReindeerTestUI {
  36. public static final String SUCCESS_CAPTION = "Success!";
  37. public static final String BUTTON_ID = "blinkbutton";
  38. public static final String FAILURE_CAPTION = "Test failed";
  39. private class WrappedConnectorTracker extends ConnectorTracker {
  40. private ConnectorTracker tracker;
  41. private boolean initialDirtyHasBeenCalled = false;
  42. public WrappedConnectorTracker(ConnectorTracker tracker) {
  43. super(TableRemovedQuicklySendsInvalidRpcCalls.this);
  44. this.tracker = tracker;
  45. }
  46. @Override
  47. public void markAllConnectorsDirty() {
  48. tracker.markAllConnectorsDirty();
  49. if (initialDirtyHasBeenCalled) {
  50. button.setCaption(FAILURE_CAPTION);
  51. }
  52. initialDirtyHasBeenCalled = true;
  53. }
  54. // DELEGATED METHODS BELOW:
  55. @Override
  56. public void registerConnector(ClientConnector connector) {
  57. tracker.registerConnector(connector);
  58. }
  59. @Override
  60. public void unregisterConnector(ClientConnector connector) {
  61. tracker.unregisterConnector(connector);
  62. }
  63. @Override
  64. public boolean isClientSideInitialized(ClientConnector connector) {
  65. return tracker.isClientSideInitialized(connector);
  66. }
  67. @Override
  68. public void markClientSideInitialized(ClientConnector connector) {
  69. tracker.markClientSideInitialized(connector);
  70. }
  71. @Override
  72. public void markAllClientSidesUninitialized() {
  73. tracker.markAllClientSidesUninitialized();
  74. }
  75. @Override
  76. public ClientConnector getConnector(String connectorId) {
  77. return tracker.getConnector(connectorId);
  78. }
  79. @Override
  80. public void cleanConnectorMap() {
  81. tracker.cleanConnectorMap();
  82. }
  83. @Override
  84. public void markDirty(ClientConnector connector) {
  85. tracker.markDirty(connector);
  86. }
  87. @Override
  88. public void markClean(ClientConnector connector) {
  89. tracker.markClean(connector);
  90. }
  91. @Override
  92. public void markAllConnectorsClean() {
  93. tracker.markAllConnectorsClean();
  94. }
  95. @Override
  96. public Collection<ClientConnector> getDirtyConnectors() {
  97. return tracker.getDirtyConnectors();
  98. }
  99. @Override
  100. public boolean hasDirtyConnectors() {
  101. return tracker.hasDirtyConnectors();
  102. }
  103. @Override
  104. public ArrayList<ClientConnector> getDirtyVisibleConnectors() {
  105. return tracker.getDirtyVisibleConnectors();
  106. }
  107. @Override
  108. public JsonObject getDiffState(ClientConnector connector) {
  109. return tracker.getDiffState(connector);
  110. }
  111. @Override
  112. public void setDiffState(ClientConnector connector,
  113. JsonObject diffState) {
  114. tracker.setDiffState(connector, diffState);
  115. }
  116. @Override
  117. public boolean isDirty(ClientConnector connector) {
  118. return tracker.isDirty(connector);
  119. }
  120. @Override
  121. public boolean isWritingResponse() {
  122. return tracker.isWritingResponse();
  123. }
  124. @Override
  125. public void setWritingResponse(boolean writingResponse) {
  126. tracker.setWritingResponse(writingResponse);
  127. }
  128. @Override
  129. public StreamVariable getStreamVariable(String connectorId,
  130. String variableName) {
  131. return tracker.getStreamVariable(connectorId, variableName);
  132. }
  133. @Override
  134. public void addStreamVariable(String connectorId, String variableName,
  135. StreamVariable variable) {
  136. tracker.addStreamVariable(connectorId, variableName, variable);
  137. }
  138. @Override
  139. public void cleanStreamVariable(String connectorId,
  140. String variableName) {
  141. tracker.cleanStreamVariable(connectorId, variableName);
  142. }
  143. @Override
  144. public String getSeckey(StreamVariable variable) {
  145. return tracker.getSeckey(variable);
  146. }
  147. @Override
  148. public int getCurrentSyncId() {
  149. return tracker.getCurrentSyncId();
  150. }
  151. @Override
  152. public boolean equals(Object obj) {
  153. return tracker.equals(obj);
  154. }
  155. @Override
  156. public int hashCode() {
  157. return tracker.hashCode();
  158. }
  159. @Override
  160. public String toString() {
  161. return tracker.toString();
  162. }
  163. }
  164. private Button button;
  165. private WrappedConnectorTracker wrappedTracker = null;
  166. @Override
  167. protected void setup(VaadinRequest request) {
  168. button = new Button("Blink a table", new Button.ClickListener() {
  169. @Override
  170. public void buttonClick(ClickEvent event) {
  171. blinkTable();
  172. }
  173. });
  174. button.setId(BUTTON_ID);
  175. addComponent(button);
  176. }
  177. @Override
  178. public ConnectorTracker getConnectorTracker() {
  179. if (wrappedTracker == null) {
  180. wrappedTracker = new WrappedConnectorTracker(
  181. super.getConnectorTracker());
  182. }
  183. return wrappedTracker;
  184. }
  185. private void blinkTable() {
  186. final Table table = new Table();
  187. table.setPageLength(5);
  188. table.addContainerProperty(new Object(), String.class, null);
  189. for (int i = 0; i < 50; i++) {
  190. table.addItem(new Object[] { "Row" }, new Object());
  191. }
  192. System.out.println("adding component");
  193. addComponent(table);
  194. new Thread() {
  195. @Override
  196. public void run() {
  197. getSession().lock();
  198. try {
  199. Thread.sleep(500);
  200. access(new Runnable() {
  201. @Override
  202. public void run() {
  203. System.out.println("removing component");
  204. removeComponent(table);
  205. button.setCaption(SUCCESS_CAPTION);
  206. }
  207. });
  208. } catch (InterruptedException e) {
  209. e.printStackTrace();
  210. } finally {
  211. getSession().unlock();
  212. }
  213. }
  214. }.start();
  215. }
  216. @Override
  217. protected String getTestDescription() {
  218. return "Adding and subsequently quickly removing a table "
  219. + "should not leave any pending RPC calls waiting "
  220. + "in a Timer. Issue can be reproduced by "
  221. + "1) pressing the button 2) checking the server "
  222. + "log for any error messages starting with "
  223. + "\"RPC call to...\" .";
  224. }
  225. @Override
  226. protected Integer getTicketNumber() {
  227. return 12337;
  228. }
  229. }