1 package nextapp.echo2.testapp.interactive.testscreen; 2 3 import org.w3c.dom.Document ; 4 import org.w3c.dom.DocumentFragment ; 5 import org.w3c.dom.Element ; 6 import org.w3c.dom.Node ; 7 8 import nextapp.echo2.app.Button; 9 import nextapp.echo2.app.Column; 10 import nextapp.echo2.app.Component; 11 import nextapp.echo2.app.Insets; 12 import nextapp.echo2.app.event.ActionEvent; 13 import nextapp.echo2.app.event.ActionListener; 14 import nextapp.echo2.app.layout.SplitPaneLayoutData; 15 import nextapp.echo2.app.update.ServerComponentUpdate; 16 import nextapp.echo2.app.util.DomUtil; 17 import nextapp.echo2.webcontainer.ComponentSynchronizePeer; 18 import nextapp.echo2.webcontainer.ContainerInstance; 19 import nextapp.echo2.webcontainer.DomUpdateSupport; 20 import nextapp.echo2.webcontainer.RenderContext; 21 import nextapp.echo2.webrender.ServerMessage; 22 import nextapp.echo2.webrender.Service; 23 import nextapp.echo2.webrender.WebRenderServlet; 24 import nextapp.echo2.webrender.servermessage.DomUpdate; 25 import nextapp.echo2.webrender.service.JavaScriptService; 26 27 30 public class ClientExceptionTest extends Column { 31 32 36 public static class ExComponent extends Component { 37 38 public static final int MODE_WORKING = 0; 39 public static final int MODE_FAIL_ON_RENDER_ONCE = 1; 40 public static final int MODE_FAIL_ON_RENDER_EVERY_TIME = 2; 41 public static final int MODE_LOAD_BROKEN_JS_ONCE = 3; 42 public static final int MODE_LOAD_BROKEN_JS_EVERY_TIME = 4; 43 44 private int mode; 45 46 public ExComponent(int mode) { 47 super(); 48 this.mode = mode; 49 } 50 51 public int getMode() { 52 return mode; 53 } 54 55 public void setMode(int mode) { 56 this.mode = mode; 57 } 58 } 59 60 64 public static class ExPeer implements ComponentSynchronizePeer, DomUpdateSupport { 65 66 69 private static final Service EXCOMPONENT_SERVICE = JavaScriptService.forResource("EchoTestApp.ExComponent", 70 "/nextapp/echo2/testapp/interactive/resource/js/ExComponent.js"); 71 72 75 private static final Service EXCOMPONENT_BROKEN_SERVICE = JavaScriptService.forResource("EchoTestApp.ExComponentBroken", 76 "/nextapp/echo2/testapp/interactive/resource/js/ExComponentBroken.js"); 77 78 static { 79 WebRenderServlet.getServiceRegistry().add(EXCOMPONENT_SERVICE); 80 WebRenderServlet.getServiceRegistry().add(EXCOMPONENT_BROKEN_SERVICE); 81 } 82 83 86 public String getContainerId(Component child) { 87 throw new UnsupportedOperationException ("Component does not support children."); 88 } 89 90 94 public void renderAdd(RenderContext rc, ServerComponentUpdate update, String targetId, Component component) { 95 Element domAddElement = DomUpdate.renderElementAdd(rc.getServerMessage()); 96 DocumentFragment htmlFragment = rc.getServerMessage().getDocument().createDocumentFragment(); 97 renderHtml(rc, update, htmlFragment, component); 98 DomUpdate.renderElementAddContent(rc.getServerMessage(), domAddElement, targetId, htmlFragment); 99 } 100 101 106 private void renderBrokenScriptModule(RenderContext rc) { 107 rc.getServerMessage().addLibrary(EXCOMPONENT_BROKEN_SERVICE.getId()); 108 } 109 110 115 public void renderDispose(RenderContext rc, ServerComponentUpdate update, Component component) { } 116 117 122 private void renderFailDirective(RenderContext rc) { 123 rc.getServerMessage().addLibrary(EXCOMPONENT_SERVICE.getId()); 124 rc.getServerMessage().appendPartDirective(ServerMessage.GROUP_ID_POSTUPDATE, "ExComponent.MessageProcessor", "fail"); 125 } 126 127 132 public void renderHtml(RenderContext rc, ServerComponentUpdate update, Node parentNode, Component component) { 133 ExComponent exComponent = (ExComponent) component; 134 Document document = rc.getServerMessage().getDocument(); 135 Element spanElement = document.createElement("span"); 136 spanElement.setAttribute("id", ContainerInstance.getElementId(component)); 137 parentNode.appendChild(spanElement); 138 139 switch (exComponent.getMode()) { 140 case ExComponent.MODE_FAIL_ON_RENDER_ONCE: 141 DomUtil.setElementText(spanElement, "[fail on render once]"); 142 renderFailDirective(rc); 143 exComponent.setMode(ExComponent.MODE_WORKING); 144 break; 145 case ExComponent.MODE_FAIL_ON_RENDER_EVERY_TIME: 146 DomUtil.setElementText(spanElement, "[fail on render every time]"); 147 renderFailDirective(rc); 148 break; 149 case ExComponent.MODE_LOAD_BROKEN_JS_ONCE: 150 DomUtil.setElementText(spanElement, "[load broken script module]"); 151 renderBrokenScriptModule(rc); 152 exComponent.setMode(ExComponent.MODE_WORKING); 153 break; 154 case ExComponent.MODE_LOAD_BROKEN_JS_EVERY_TIME: 155 DomUtil.setElementText(spanElement, "[load broken script module]"); 156 renderBrokenScriptModule(rc); 157 break; 158 default: 159 DomUtil.setElementText(spanElement, "[non-broken]"); 160 } 161 } 162 163 168 public boolean renderUpdate(RenderContext rc, ServerComponentUpdate update, String targetId) { 169 String parentId = ContainerInstance.getElementId(update.getParent()); 170 DomUpdate.renderElementRemove(rc.getServerMessage(), parentId); 171 renderAdd(rc, update, targetId, update.getParent()); 172 return true; 173 } 174 } 175 176 179 public ClientExceptionTest() { 180 super(); 181 182 SplitPaneLayoutData splitPaneLayoutData = new SplitPaneLayoutData(); 183 splitPaneLayoutData.setInsets(new Insets(10)); 184 setLayoutData(splitPaneLayoutData); 185 186 Button button; 187 188 button = new Button("Add working component (Control Case)"); 189 button.setStyleName("Default"); 190 button.addActionListener(new ActionListener() { 191 public void actionPerformed(ActionEvent e) { 192 add(new ExComponent(ExComponent.MODE_WORKING)); 193 } 194 }); 195 add(button); 196 197 button = new Button("Add broken component that fails to render (ONCE)."); 198 button.setStyleName("Default"); 199 button.addActionListener(new ActionListener() { 200 public void actionPerformed(ActionEvent e) { 201 add(new ExComponent(ExComponent.MODE_FAIL_ON_RENDER_ONCE)); 202 } 203 }); 204 add(button); 205 206 button = new Button("Add broken component that will dynamically load broken JavaScript module (ONCE)."); 207 button.setStyleName("Default"); 208 button.addActionListener(new ActionListener() { 209 public void actionPerformed(ActionEvent e) { 210 add(new ExComponent(ExComponent.MODE_LOAD_BROKEN_JS_ONCE)); 211 } 212 }); 213 add(button); 214 215 button = new Button("Add broken component that fails to render (EVERY TIME)."); 216 button.setStyleName("Default"); 217 button.addActionListener(new ActionListener() { 218 public void actionPerformed(ActionEvent e) { 219 add(new ExComponent(ExComponent.MODE_FAIL_ON_RENDER_EVERY_TIME)); 220 } 221 }); 222 add(button); 223 224 button = new Button("Add broken component that will dynamically load broken JavaScript module (EVERY TIME)."); 225 button.setStyleName("Default"); 226 button.addActionListener(new ActionListener() { 227 public void actionPerformed(ActionEvent e) { 228 add(new ExComponent(ExComponent.MODE_LOAD_BROKEN_JS_EVERY_TIME)); 229 } 230 }); 231 add(button); 232 } 233 } | Popular Tags |