KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > nextapp > echo2 > testapp > interactive > testscreen > ClientExceptionTest


1 package nextapp.echo2.testapp.interactive.testscreen;
2
3 import org.w3c.dom.Document JavaDoc;
4 import org.w3c.dom.DocumentFragment JavaDoc;
5 import org.w3c.dom.Element JavaDoc;
6 import org.w3c.dom.Node JavaDoc;
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 /**
28  * A test to examine failure behavior with client script exceptions.
29  */

30 public class ClientExceptionTest extends Column {
31
32     /**
33      * Component that can be configured to throw JavaScript
34      * exception on client/server sync.
35      */

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     /**
61      * Peer class for <code>ExComponent</code> that will throw a JavaScript
62      * error depending on component state.
63      */

64     public static class ExPeer implements ComponentSynchronizePeer, DomUpdateSupport {
65
66         /**
67          * Service to provide supporting JavaScript library.
68          */

69         private static final Service EXCOMPONENT_SERVICE = JavaScriptService.forResource("EchoTestApp.ExComponent",
70                 "/nextapp/echo2/testapp/interactive/resource/js/ExComponent.js");
71         
72         /**
73          * Service to provide supporting JavaScript library.
74          */

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         /**
84          * @see nextapp.echo2.webcontainer.ComponentSynchronizePeer#getContainerId(nextapp.echo2.app.Component)
85          */

86         public String JavaDoc getContainerId(Component child) {
87             throw new UnsupportedOperationException JavaDoc("Component does not support children.");
88         }
89
90         /**
91          * @see nextapp.echo2.webcontainer.ComponentSynchronizePeer#renderAdd(nextapp.echo2.webcontainer.RenderContext,
92          * nextapp.echo2.app.update.ServerComponentUpdate, java.lang.String, nextapp.echo2.app.Component)
93          */

94         public void renderAdd(RenderContext rc, ServerComponentUpdate update, String JavaDoc targetId, Component component) {
95             Element JavaDoc domAddElement = DomUpdate.renderElementAdd(rc.getServerMessage());
96             DocumentFragment JavaDoc htmlFragment = rc.getServerMessage().getDocument().createDocumentFragment();
97             renderHtml(rc, update, htmlFragment, component);
98             DomUpdate.renderElementAddContent(rc.getServerMessage(), domAddElement, targetId, htmlFragment);
99         }
100         
101         /**
102          * Renders a directive to dynamically load a broken script module.
103          *
104          * @param rc the relevant <code>RenderContext</code>
105          */

106         private void renderBrokenScriptModule(RenderContext rc) {
107             rc.getServerMessage().addLibrary(EXCOMPONENT_BROKEN_SERVICE.getId());
108         }
109
110         /**
111          * @see nextapp.echo2.webcontainer.ComponentSynchronizePeer#renderDispose(
112          * nextapp.echo2.webcontainer.RenderContext, nextapp.echo2.app.update.ServerComponentUpdate,
113          * nextapp.echo2.app.Component)
114          */

115         public void renderDispose(RenderContext rc, ServerComponentUpdate update, Component component) { }
116         
117         /**
118          * Renders a directive that will fail during processing.
119          *
120          * @param rc the relevant <code>RenderContext</code>
121          */

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         /**
128          * @see nextapp.echo2.webcontainer.DomUpdateSupport#renderHtml(nextapp.echo2.webcontainer.RenderContext,
129          * nextapp.echo2.app.update.ServerComponentUpdate,
130          * org.w3c.dom.Node, nextapp.echo2.app.Component)
131          */

132         public void renderHtml(RenderContext rc, ServerComponentUpdate update, Node JavaDoc parentNode, Component component) {
133             ExComponent exComponent = (ExComponent) component;
134             Document JavaDoc document = rc.getServerMessage().getDocument();
135             Element JavaDoc 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         /**
164          * @see nextapp.echo2.webcontainer.ComponentSynchronizePeer#renderUpdate(
165          * nextapp.echo2.webcontainer.RenderContext, nextapp.echo2.app.update.ServerComponentUpdate,
166          * java.lang.String)
167          */

168         public boolean renderUpdate(RenderContext rc, ServerComponentUpdate update, String JavaDoc targetId) {
169             String JavaDoc 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     /**
177      * Creates a new <code>ClientExceptionTest</code>.
178      */

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