1 /*
2 * ========================================================================
3 *
4 * Copyright 2003-2004 The Apache Software Foundation.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * ========================================================================
19 */
20 package org.apache.cactus.integration.ant.deployment.webapp;
21
22 import java.io.ByteArrayInputStream;
23 import java.io.StringReader;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.Iterator;
27 import java.util.List;
28
29 import javax.xml.parsers.DocumentBuilder;
30 import javax.xml.parsers.DocumentBuilderFactory;
31 import javax.xml.parsers.ParserConfigurationException;
32
33 import junit.framework.TestCase;
34
35 import org.w3c.dom.Document;
36 import org.w3c.dom.Element;
37 import org.w3c.dom.NodeList;
38 import org.xml.sax.EntityResolver;
39 import org.xml.sax.InputSource;
40 import org.xml.sax.SAXException;
41
42 /**
43 * Unit tests for {@link WebXml}.
44 *
45 * @version $Id: TestWebXml.java,v 1.2 2005/02/11 09:17:14 vmassol Exp $
46 */
47 public final class TestWebXml extends TestCase
48 {
49 /**
50 * The document builder factory.
51 */
52 private DocumentBuilderFactory factory;
53
54 /**
55 * The JAXP document builder.
56 */
57 private DocumentBuilder builder;
58
59 /**
60 * @see TestCase#setUp
61 */
62 public void setUp() throws ParserConfigurationException
63 {
64 factory = DocumentBuilderFactory.newInstance();
65 factory.setValidating(false);
66 factory.setNamespaceAware(false);
67
68 builder = factory.newDocumentBuilder();
69 builder.setEntityResolver(new EntityResolver()
70 {
71 public InputSource resolveEntity(String thePublicId,
72 String theSystemId) throws SAXException
73 {
74 return new InputSource(new StringReader(""));
75 }
76 });
77 }
78
79 /**
80 * Tests whether the construction of a WebXml object with a
81 * <code>null</code> parameter for the DOM document throws a
82 * <code>NullPointerException</code>.
83 *
84 * @throws Exception If an unexpected error occurs
85 */
86 public void testConstructionWithNullDocument() throws Exception
87 {
88 try
89 {
90 new WebXml(null);
91 fail("Expected NullPointerException");
92 }
93 catch (NullPointerException npe)
94 {
95 // expected
96 }
97
98 }
99
100 /**
101 * Tests whether a servlet API version 2.2 descriptor is correctly detected.
102 *
103 * @throws Exception If an unexpected error occurs
104 */
105 public void testGetVersion22() throws Exception
106 {
107 String xml = "<!DOCTYPE web-app "
108 + "PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN' "
109 + "'http://java.sun.com/j2ee/dtds/web-app_2.2.dtd'>"
110 + "<web-app></web-app>";
111 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
112 WebXml webXml = new WebXml(doc);
113 assertEquals(WebXmlVersion.V2_2, webXml.getVersion());
114 }
115
116 /**
117 * Tests whether a servlet API version 2.3 descriptor is correctly detected.
118 *
119 * @throws Exception If an unexpected error occurs
120 */
121 public void testGetVersion23() throws Exception
122 {
123 String xml = "<!DOCTYPE web-app "
124 + "PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' "
125 + "'http://java.sun.com/dtd/web-app_2_3.dtd'>"
126 + "<web-app></web-app>";
127 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
128 WebXml webXml = new WebXml(doc);
129 assertEquals(WebXmlVersion.V2_3, webXml.getVersion());
130 }
131
132 /**
133 * Tests whether WebXml#getVersion returns <code>null</code> when the public
134 * ID of the <code>DOCTYPE</code> is not recognized.
135 *
136 * @throws Exception If an unexpected error occurs
137 */
138 public void testGetVersionUnknown() throws Exception
139 {
140 String xml = "<!DOCTYPE web-app "
141 + "PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 1.9//EN' "
142 + "'http://java.sun.com/dtd/web-app_1_9.dtd'>"
143 + "<web-app></web-app>";
144 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
145 WebXml webXml = new WebXml(doc);
146 assertNull(webXml.getVersion());
147 }
148
149 /**
150 * Tests whether WebXml#getVersion returns <code>null</code> when the
151 * <code>DOCTYPE</code> is missing.
152 *
153 * @throws Exception If an unexpected error occurs
154 */
155 public void testGetVersionWithoutDoctype() throws Exception
156 {
157 String xml = "<web-app></web-app>";
158 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
159 WebXml webXml = new WebXml(doc);
160 assertNull(webXml.getVersion());
161 }
162
163 /**
164 * Tests whether calling {@link WebXml.hasFilter} with <code>null</code> as
165 * filter name parameter results in a <code>NullPointerException</code>
166 * being thrown.
167 *
168 * @throws Exception If an unexpected error occurs
169 */
170 public void testHasFilterWithNullName() throws Exception
171 {
172 String xml = "<web-app></web-app>";
173 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
174 WebXml webXml = new WebXml(doc);
175 try
176 {
177 webXml.hasFilter(null);
178 fail("Expected NullPointerException");
179 }
180 catch (NullPointerException npe)
181 {
182 // expected
183 }
184
185 }
186
187 /**
188 * Tests whether {@link WebXml.hasFilter} returns the correct value for
189 * a descriptor containing one filter definition.
190 *
191 * @throws Exception If an unexpected error occurs
192 */
193 public void testHasFilterWithOneFilter() throws Exception
194 {
195 String xml = "<web-app>"
196 + " <filter>"
197 + " <filter-name>f1</filter-name>"
198 + " <filter-class>fclass1</filter-class>"
199 + " </filter>"
200 + "</web-app>";
201 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
202 WebXml webXml = new WebXml(doc);
203 assertTrue(webXml.hasFilter("f1"));
204 assertTrue(!webXml.hasFilter("f2"));
205 }
206
207 /**
208 * Tests whether {@link WebXml.hasFilter} returns the correct values for
209 * a descriptor containing multiple filter definitions.
210 *
211 * @throws Exception If an unexpected error occurs
212 */
213 public void testHasFilterWithMultipleFilters() throws Exception
214 {
215 String xml = "<web-app>"
216 + " <filter>"
217 + " <filter-name>f1</filter-name>"
218 + " <filter-class>fclass1</filter-class>"
219 + " </filter>"
220 + " <filter>"
221 + " <filter-name>f2</filter-name>"
222 + " <filter-class>fclass2</filter-class>"
223 + " </filter>"
224 + " <filter>"
225 + " <filter-name>f3</filter-name>"
226 + " <filter-class>fclass3</filter-class>"
227 + " </filter>"
228 + "</web-app>";
229 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
230 WebXml webXml = new WebXml(doc);
231 assertTrue(webXml.hasFilter("f1"));
232 assertTrue(webXml.hasFilter("f2"));
233 assertTrue(webXml.hasFilter("f3"));
234 assertTrue(!webXml.hasFilter("f4"));
235 }
236
237 /**
238 * Tests whether a DOM element representing a single filter definition can
239 * be correctly retrieved from a descriptor containing only that filter.
240 *
241 * @throws Exception If an unexpected error occurs
242 */
243 public void testGetFilterElementWithOneFilter() throws Exception
244 {
245 String xml = "<web-app>"
246 + " <filter>".trim()
247 + " <filter-name>f1</filter-name>".trim()
248 + " <filter-class>fclass1</filter-class>".trim()
249 + " </filter>".trim()
250 + "</web-app>";
251 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
252 WebXml webXml = new WebXml(doc);
253 Element servletElement = webXml.getFilter("f1");
254 assertNotNull(servletElement);
255 assertEquals("filter", servletElement.getNodeName());
256 assertEquals("filter-name",
257 servletElement.getFirstChild().getNodeName());
258 assertEquals("f1",
259 servletElement.getFirstChild().getFirstChild().getNodeValue());
260 assertEquals("filter-class",
261 servletElement.getLastChild().getNodeName());
262 assertEquals("fclass1",
263 servletElement.getLastChild().getFirstChild().getNodeValue());
264 }
265
266 /**
267 * Tests whether the filter names are retrieved in the expected order.
268 *
269 * @throws Exception If an unexpected error occurs
270 */
271 public void testGetFilterNames() throws Exception
272 {
273 String xml = "<web-app>"
274 + " <filter>"
275 + " <filter-name>f1</filter-name>"
276 + " <filter-class>fclass1</filter-class>"
277 + " </filter>"
278 + " <filter>"
279 + " <filter-name>f2</filter-name>"
280 + " <filter-class>fclass2</filter-class>"
281 + " </filter>"
282 + " <filter>"
283 + " <filter-name>f3</filter-name>"
284 + " <filter-class>fclass3</filter-class>"
285 + " </filter>"
286 + "</web-app>";
287 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
288 WebXml webXml = new WebXml(doc);
289 Iterator filterNames = webXml.getFilterNames();
290 assertEquals("f1", filterNames.next());
291 assertEquals("f2", filterNames.next());
292 assertEquals("f3", filterNames.next());
293 assertTrue(!filterNames.hasNext());
294 }
295
296 /**
297 * Tests whether a retrieving a filter name by the name of the class
298 * implementing the filter works correctly for a descriptor with a single
299 * filter definition.
300 *
301 * @throws Exception If an unexpected error occurs
302 */
303 public void testGetFilterNamesForClassWithSingleFilter() throws Exception
304 {
305 String xml = "<web-app>"
306 + " <filter>"
307 + " <filter-name>f1</filter-name>"
308 + " <filter-class>f1class</filter-class>"
309 + " </filter>"
310 + "</web-app>";
311 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
312 WebXml webXml = new WebXml(doc);
313 Iterator filterNames = webXml.getFilterNamesForClass("f1class");
314 assertEquals("f1", filterNames.next());
315 assertTrue(!filterNames.hasNext());
316 }
317
318 /**
319 * Tests whether a retrieving the filter names by the name of the class
320 * implementing the filter works correctly for a descriptor with multiple
321 * filter definitions.
322 *
323 * @throws Exception If an unexpected error occurs
324 */
325 public void testGetFilterNamesForClassWithMultipleFilters() throws Exception
326 {
327 String xml = "<web-app>"
328 + " <filter>"
329 + " <filter-name>f1</filter-name>"
330 + " <filter-class>f1class</filter-class>"
331 + " </filter>"
332 + " <filter>"
333 + " <filter-name>f2</filter-name>"
334 + " <filter-class>f2class</filter-class>"
335 + " </filter>"
336 + " <filter>"
337 + " <filter-name>f3</filter-name>"
338 + " <filter-class>f1class</filter-class>"
339 + " </filter>"
340 + "</web-app>";
341 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
342 WebXml webXml = new WebXml(doc);
343 Iterator filterNames = webXml.getFilterNamesForClass("f1class");
344 assertEquals("f1", filterNames.next());
345 assertEquals("f3", filterNames.next());
346 assertTrue(!filterNames.hasNext());
347 }
348
349 /**
350 * Tests whether a filter-mapping is correctly retrieved from a descriptor.
351 *
352 * @throws Exception If an unexpected error occurs
353 */
354 public void testGetFilterMappingsWithOneMapping() throws Exception
355 {
356 String xml = "<web-app>"
357 + " <filter-mapping>"
358 + " <filter-name>f1</filter-name>"
359 + " <url-pattern>/f1mapping</url-pattern>"
360 + " </filter-mapping>"
361 + "</web-app>";
362 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
363 WebXml webXml = new WebXml(doc);
364 Iterator filterMappings = webXml.getFilterMappings("f1");
365 assertEquals("/f1mapping", filterMappings.next());
366 assertTrue(!filterMappings.hasNext());
367 }
368
369 /**
370 * Tests whether multiple filter-mappings are correctly retrieved from a
371 * descriptor.
372 *
373 * @throws Exception If an unexpected error occurs
374 */
375 public void testGetFilterMappingsWithMultipleMappings() throws Exception
376 {
377 String xml = "<web-app>"
378 + " <filter-mapping>"
379 + " <filter-name>f1</filter-name>"
380 + " <url-pattern>/f1mapping1</url-pattern>"
381 + " </filter-mapping>"
382 + " <filter-mapping>"
383 + " <filter-name>f1</filter-name>"
384 + " <url-pattern>/f1mapping2</url-pattern>"
385 + " </filter-mapping>"
386 + " <filter-mapping>"
387 + " <filter-name>f1</filter-name>"
388 + " <url-pattern>/f1mapping3</url-pattern>"
389 + " </filter-mapping>"
390 + "</web-app>";
391 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
392 WebXml webXml = new WebXml(doc);
393 Iterator filterMappings = webXml.getFilterMappings("f1");
394 assertEquals("/f1mapping1", filterMappings.next());
395 assertEquals("/f1mapping2", filterMappings.next());
396 assertEquals("/f1mapping3", filterMappings.next());
397 assertTrue(!filterMappings.hasNext());
398 }
399
400 /**
401 * Tests whether a filter-mapping is correctly retrieved from a descriptor.
402 *
403 * @throws Exception If an unexpected error occurs
404 */
405 public void testGetFilterMappingsWithFilter() throws Exception
406 {
407 String xml = "<web-app>"
408 + " <filter>"
409 + " <filter-name>f1</filter-name>"
410 + " <filter-class>f1class</filter-class>"
411 + " </filter>"
412 + " <filter-mapping>"
413 + " <filter-name>f1</filter-name>"
414 + " <url-pattern>/f1mapping</url-pattern>"
415 + " </filter-mapping>"
416 + "</web-app>";
417 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
418 WebXml webXml = new WebXml(doc);
419 Iterator filterMappings = webXml.getFilterMappings("f1");
420 assertEquals("/f1mapping", filterMappings.next());
421 assertTrue(!filterMappings.hasNext());
422 }
423
424 /**
425 * Tests whether a single context-param is correctly inserted into an empty
426 * descriptor.
427 *
428 * @throws Exception If an unexpected error occurs
429 */
430 public void testAddContextParamToEmptyDocument() throws Exception
431 {
432 String xml = "<web-app></web-app>";
433 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
434 WebXml webXml = new WebXml(doc);
435 Element contextParamElement =
436 createContextParamElement(doc, "param", "value");
437 webXml.addContextParam(contextParamElement);
438 assertTrue(webXml.hasContextParam("param"));
439 }
440
441 /**
442 * Tests whether a single filter is correctly inserted into an empty
443 * descriptor.
444 *
445 * @throws Exception If an unexpected error occurs
446 */
447 public void testAddFilterToEmptyDocument() throws Exception
448 {
449 String xml = "<web-app></web-app>";
450 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
451 WebXml webXml = new WebXml(doc);
452 Element filterElement = createFilterElement(doc, "f1", "f1class");
453 webXml.addFilter(filterElement);
454 assertTrue(webXml.hasFilter("f1"));
455 }
456
457 /**
458 * Tests whether a single context param is correctly inserted into a
459 * descriptor that already contains an other context param definition.
460 *
461 * @throws Exception If an unexpected error occurs
462 */
463 public void testAddContextParamToDocumentWithAnotherContextParam()
464 throws Exception
465 {
466 String xml = "<web-app>"
467 + " <context-param>"
468 + " <param-name>param1</param-name>"
469 + " <param-value>value1</param-value>"
470 + " </context-param>"
471 + "</web-app>";
472 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
473 WebXml webXml = new WebXml(doc);
474 Element contextParamElement =
475 createContextParamElement(doc, "param2", "value2");
476 webXml.addContextParam(contextParamElement);
477 assertTrue(webXml.hasContextParam("param1"));
478 assertTrue(webXml.hasContextParam("param2"));
479 }
480
481 /**
482 * Tests whether a single filter is correctly inserted into a descriptor
483 * that already contains an other filter definition.
484 *
485 * @throws Exception If an unexpected error occurs
486 */
487 public void testAddFilterToDocumentWithAnotherFilter() throws Exception
488 {
489 String xml = "<web-app>"
490 + " <filter>"
491 + " <filter-name>f1</filter-name>"
492 + " <filter-class>fclass1</filter-class>"
493 + " </filter>"
494 + "</web-app>";
495 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
496 WebXml webXml = new WebXml(doc);
497 Element filterElement = createFilterElement(doc, "f2", "f2class");
498 webXml.addFilter(filterElement);
499 assertTrue(webXml.hasFilter("f1"));
500 assertTrue(webXml.hasFilter("f2"));
501 }
502
503 /**
504 * Tests whether trying to add a context param to a descriptor that already
505 * contains a context param definition with the same name results in an
506 * exception.
507 *
508 * @throws Exception If an unexpected error occurs
509 */
510 public void testAddContextParamToDocumentWithTheSameContextParam()
511 throws Exception
512 {
513 String xml = "<web-app>"
514 + " <context-param>"
515 + " <param-name>param</param-name>"
516 + " <param-value>value</param-value>"
517 + " </context-param>"
518 + "</web-app>";
519 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
520 WebXml webXml = new WebXml(doc);
521 Element contextParamElement =
522 createContextParamElement(doc, "param", "value");
523 try
524 {
525 webXml.addContextParam(contextParamElement);
526 fail("Expected IllegalStateException");
527 }
528 catch (IllegalStateException ise)
529 {
530 // expected
531 }
532 }
533
534 /**
535 * Tests whether trying to add a filter to a descriptor that already
536 * contains a filter definition with the same name results in a exception.
537 *
538 * @throws Exception If an unexpected error occurs
539 */
540 public void testAddFilterToDocumentWithTheSameFilter() throws Exception
541 {
542 String xml = "<web-app>"
543 + " <filter>"
544 + " <filter-name>f1</filter-name>"
545 + " <filter-class>fclass1</filter-class>"
546 + " </filter>"
547 + "</web-app>";
548 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
549 WebXml webXml = new WebXml(doc);
550 Element filterElement = createFilterElement(doc, "f1", "f1class");
551 try
552 {
553 webXml.addFilter(filterElement);
554 fail("Expected IllegalStateException");
555 }
556 catch (IllegalStateException ise)
557 {
558 // expected
559 }
560 }
561
562 /**
563 * Tests whether a single initialization parameter can be added to a filter
564 * definition.
565 *
566 * @throws Exception If an unexpected error occurs
567 */
568 public void testAddOneFilterInitParam() throws Exception
569 {
570 String xml = "<web-app>"
571 + " <filter>"
572 + " <filter-name>f1</filter-name>"
573 + " <filter-class>fclass1</filter-class>"
574 + " </filter>"
575 + "</web-app>";
576 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
577 WebXml webXml = new WebXml(doc);
578 webXml.addFilterInitParam("f1", "f1param1", "f1param1value");
579 Iterator initParams = webXml.getFilterInitParamNames("f1");
580 assertEquals("f1param1", initParams.next());
581 assertTrue(!initParams.hasNext());
582 }
583
584 /**
585 * Tests whether multiple initialization parameter can be added to a filter
586 * definition.
587 *
588 * @throws Exception If an unexpected error occurs
589 */
590 public void testAddMultipleFilterInitParams() throws Exception
591 {
592 String xml = "<web-app>"
593 + " <filter>"
594 + " <filter-name>f1</filter-name>"
595 + " <filter-class>fclass1</filter-class>"
596 + " </filter>"
597 + "</web-app>";
598 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
599 WebXml webXml = new WebXml(doc);
600 webXml.addFilterInitParam("f1", "f1param1", "f1param1value");
601 webXml.addFilterInitParam("f1", "f1param2", "f1param2value");
602 webXml.addFilterInitParam("f1", "f1param3", "f1param3value");
603 Iterator initParams = webXml.getFilterInitParamNames("f1");
604 assertEquals("f1param1", initParams.next());
605 assertEquals("f1param2", initParams.next());
606 assertEquals("f1param3", initParams.next());
607 assertTrue(!initParams.hasNext());
608 }
609
610 /**
611 * Tests whether a single filter can be added using the method that takes
612 * a string for the filter name and a string for the filter class.
613 *
614 * @throws Exception If an unexpected error occurs
615 */
616 public void testAddFilterWithNameAndClass() throws Exception
617 {
618 String xml = "<web-app>"
619 + "</web-app>";
620 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
621 WebXml webXml = new WebXml(doc);
622 webXml.addServlet("f1", "f1class");
623 assertTrue(webXml.hasServlet("f1"));
624 }
625
626 /**
627 * Tests whether calling {@link WebXml#hasServlet} with a <code>null</code>
628 * parameter as servlet name throws a <code>NullPointerException</code>.
629 *
630 * @throws Exception If an unexpected error occurs
631 */
632 public void testHasServletWithNullName() throws Exception
633 {
634 String xml = "<web-app></web-app>";
635 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
636 WebXml webXml = new WebXml(doc);
637 try
638 {
639 webXml.hasServlet(null);
640 fail("Expected NullPointerException");
641 }
642 catch (NullPointerException npe)
643 {
644 // expected
645 }
646
647 }
648
649 /**
650 * Tests whether {@link WebXml#hasServlet} reports the correct values for a
651 * descriptor containing a single servlet definition.
652 *
653 * @throws Exception If an unexpected error occurs
654 */
655 public void testHasServletWithOneServlet() throws Exception
656 {
657 String xml = "<web-app>"
658 + " <servlet>"
659 + " <servlet-name>s1</servlet-name>"
660 + " <servlet-class>sclass1</servlet-class>"
661 + " </servlet>"
662 + "</web-app>";
663 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
664 WebXml webXml = new WebXml(doc);
665 assertTrue(webXml.hasServlet("s1"));
666 assertTrue(!webXml.hasServlet("s2"));
667 }
668
669 /**
670 * Tests whether {@link WebXml#hasServlet} reports the correct values for a
671 * descriptor containing multiple servlet definitions.
672 *
673 * @throws Exception If an unexpected error occurs
674 */
675 public void testHasServletWithMultipleServlets() throws Exception
676 {
677 String xml = "<web-app>"
678 + " <servlet>"
679 + " <servlet-name>s1</servlet-name>"
680 + " <servlet-class>sclass1</servlet-class>"
681 + " </servlet>"
682 + " <servlet>"
683 + " <servlet-name>s2</servlet-name>"
684 + " <servlet-class>sclass2</servlet-class>"
685 + " </servlet>"
686 + " <servlet>"
687 + " <servlet-name>s3</servlet-name>"
688 + " <servlet-class>sclass3</servlet-class>"
689 + " </servlet>"
690 + "</web-app>";
691 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
692 WebXml webXml = new WebXml(doc);
693 assertTrue(webXml.hasServlet("s1"));
694 assertTrue(webXml.hasServlet("s2"));
695 assertTrue(webXml.hasServlet("s3"));
696 assertTrue(!webXml.hasServlet("s4"));
697 }
698
699 /**
700 * Tests whether a servlet element is correctly retrieved from a descriptor
701 * containing only one servlet definition.
702 *
703 * @throws Exception If an unexpected error occurs
704 */
705 public void testGetServletElementWithOneServlet() throws Exception
706 {
707 String xml = "<web-app>"
708 + " <servlet>".trim()
709 + " <servlet-name>s1</servlet-name>".trim()
710 + " <servlet-class>sclass1</servlet-class>".trim()
711 + " </servlet>".trim()
712 + "</web-app>";
713 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
714 WebXml webXml = new WebXml(doc);
715 Element servletElement = webXml.getServlet("s1");
716 assertNotNull(servletElement);
717 assertEquals("servlet", servletElement.getNodeName());
718 assertEquals("servlet-name",
719 servletElement.getFirstChild().getNodeName());
720 assertEquals("s1",
721 servletElement.getFirstChild().getFirstChild().getNodeValue());
722 assertEquals("servlet-class",
723 servletElement.getLastChild().getNodeName());
724 assertEquals("sclass1",
725 servletElement.getLastChild().getFirstChild().getNodeValue());
726 }
727
728 /**
729 * Tests whether the names of the servlets defined in a descriptor are
730 * correctly returned in the expected order.
731 *
732 * @throws Exception If an unexpected error occurs
733 */
734 public void testGetServletNames() throws Exception
735 {
736 String xml = "<web-app>"
737 + " <servlet>"
738 + " <servlet-name>s1</servlet-name>"
739 + " <servlet-class>sclass1</servlet-class>"
740 + " </servlet>"
741 + " <servlet>"
742 + " <servlet-name>s2</servlet-name>"
743 + " <servlet-class>sclass2</servlet-class>"
744 + " </servlet>"
745 + " <servlet>"
746 + " <servlet-name>s3</servlet-name>"
747 + " <servlet-class>sclass3</servlet-class>"
748 + " </servlet>"
749 + "</web-app>";
750 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
751 WebXml webXml = new WebXml(doc);
752 Iterator servletNames = webXml.getServletNames();
753 assertEquals("s1", servletNames.next());
754 assertEquals("s2", servletNames.next());
755 assertEquals("s3", servletNames.next());
756 assertTrue(!servletNames.hasNext());
757 }
758
759 /**
760 * Tests whether a retrieving a servlet name by the name of the class
761 * implementing the servlet works correctly for a descriptor with a single
762 * servlet definition.
763 *
764 * @throws Exception If an unexpected error occurs
765 */
766 public void testGetServletNamesForClassWithSingleServlet() throws Exception
767 {
768 String xml = "<web-app>"
769 + " <servlet>"
770 + " <servlet-name>s1</servlet-name>"
771 + " <servlet-class>s1class</servlet-class>"
772 + " </servlet>"
773 + "</web-app>";
774 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
775 WebXml webXml = new WebXml(doc);
776 Iterator servletNames = webXml.getServletNamesForClass("s1class");
777 assertEquals("s1", servletNames.next());
778 assertTrue(!servletNames.hasNext());
779 }
780
781 /**
782 * Tests whether a retrieving the servlet names by the name of the class
783 * implementing the servlet works correctly for a descriptor with multiple
784 * servlet definitions.
785 *
786 * @throws Exception If an unexpected error occurs
787 */
788 public void testGetServletNamesForClassWithMultipleServlets()
789 throws Exception
790 {
791 String xml = "<web-app>"
792 + " <servlet>"
793 + " <servlet-name>s1</servlet-name>"
794 + " <servlet-class>sclass1</servlet-class>"
795 + " </servlet>"
796 + " <servlet>"
797 + " <servlet-name>s2</servlet-name>"
798 + " <servlet-class>sclass2</servlet-class>"
799 + " </servlet>"
800 + " <servlet>"
801 + " <servlet-name>s3</servlet-name>"
802 + " <servlet-class>sclass1</servlet-class>"
803 + " </servlet>"
804 + "</web-app>";
805 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
806 WebXml webXml = new WebXml(doc);
807 Iterator servletNames = webXml.getServletNamesForClass("sclass1");
808 assertEquals("s1", servletNames.next());
809 assertEquals("s3", servletNames.next());
810 assertTrue(!servletNames.hasNext());
811 }
812
813 /**
814 * Tests whether a retrieving a servlet name by the path of the JSP file
815 * implementing the servlet works correctly for a descriptor with a single
816 * servlet definition.
817 *
818 * @throws Exception If an unexpected error occurs
819 */
820 public void testGetServletNamesForJspFileWithSingleServlet()
821 throws Exception
822 {
823 String xml = "<web-app>"
824 + " <servlet>"
825 + " <servlet-name>s1</servlet-name>"
826 + " <jsp-file>/s1.jsp</jsp-file>"
827 + " </servlet>"
828 + "</web-app>";
829 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
830 WebXml webXml = new WebXml(doc);
831 Iterator servletNames = webXml.getServletNamesForJspFile("/s1.jsp");
832 assertEquals("s1", servletNames.next());
833 assertTrue(!servletNames.hasNext());
834 }
835
836 /**
837 * Tests whether a retrieving the servlet names by the path of the JSP file
838 * implementing the servlet works correctly for a descriptor with multiple
839 * servlet definitions.
840 *
841 * @throws Exception If an unexpected error occurs
842 */
843 public void testGetServletNamesForJspFileWithMultipleServlets()
844 throws Exception
845 {
846 String xml = "<web-app>"
847 + " <servlet>"
848 + " <servlet-name>s1</servlet-name>"
849 + " <jsp-file>/s1.jsp</jsp-file>"
850 + " </servlet>"
851 + " <servlet>"
852 + " <servlet-name>s2</servlet-name>"
853 + " <servlet-class>sclass2</servlet-class>"
854 + " </servlet>"
855 + " <servlet>"
856 + " <servlet-name>s3</servlet-name>"
857 + " <jsp-file>/s3.jsp</jsp-file>"
858 + " </servlet>"
859 + "</web-app>";
860 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
861 WebXml webXml = new WebXml(doc);
862 Iterator servletNames = webXml.getServletNamesForJspFile("/s3.jsp");
863 assertEquals("s3", servletNames.next());
864 assertTrue(!servletNames.hasNext());
865 }
866
867 /**
868 * Tests whether a single serrvlet-mapping is correctly retrieved from a
869 * descriptor.
870 *
871 * @throws Exception If an unexpected error occurs
872 */
873 public void testGetServletMappingsWithOneMapping() throws Exception
874 {
875 String xml = "<web-app>"
876 + " <servlet-mapping>"
877 + " <servlet-name>s1</servlet-name>"
878 + " <url-pattern>/s1mapping</url-pattern>"
879 + " </servlet-mapping>"
880 + "</web-app>";
881 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
882 WebXml webXml = new WebXml(doc);
883 Iterator servletMappings = webXml.getServletMappings("s1");
884 assertEquals("/s1mapping", servletMappings.next());
885 assertTrue(!servletMappings.hasNext());
886 }
887
888 /**
889 * Tests whether multiple servlet mappings are correctly retrieved from a
890 * descriptor.
891 *
892 * @throws Exception If an unexpected error occurs
893 */
894 public void testGetServletMappingsWithMultipleMappings() throws Exception
895 {
896 String xml = "<web-app>"
897 + " <servlet-mapping>"
898 + " <servlet-name>s1</servlet-name>"
899 + " <url-pattern>/s1mapping1</url-pattern>"
900 + " </servlet-mapping>"
901 + " <servlet-mapping>"
902 + " <servlet-name>s1</servlet-name>"
903 + " <url-pattern>/s1mapping2</url-pattern>"
904 + " </servlet-mapping>"
905 + " <servlet-mapping>"
906 + " <servlet-name>s1</servlet-name>"
907 + " <url-pattern>/s1mapping3</url-pattern>"
908 + " </servlet-mapping>"
909 + "</web-app>";
910 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
911 WebXml webXml = new WebXml(doc);
912 Iterator servletMappings = webXml.getServletMappings("s1");
913 assertEquals("/s1mapping1", servletMappings.next());
914 assertEquals("/s1mapping2", servletMappings.next());
915 assertEquals("/s1mapping3", servletMappings.next());
916 assertTrue(!servletMappings.hasNext());
917 }
918
919 /**
920 * Tests whether a single servlet can be added to an empty descriptor.
921 *
922 * @throws Exception If an unexpected error occurs
923 */
924 public void testAddServletToEmptyDocument() throws Exception
925 {
926 String xml = "<web-app></web-app>";
927 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
928 WebXml webXml = new WebXml(doc);
929 webXml.addServlet(createServletElement(doc, "s1", "s1class"));
930 assertTrue(webXml.hasServlet("s1"));
931 }
932
933 /**
934 * Tests whether a single servlet can be added to a descriptor already
935 * containing an other servlet.
936 *
937 * @throws Exception If an unexpected error occurs
938 */
939 public void testAddServletToDocumentWithAnotherServlet() throws Exception
940 {
941 String xml = "<web-app>"
942 + " <servlet>"
943 + " <servlet-name>s1</servlet-name>"
944 + " <servlet-class>sclass1</servlet-class>"
945 + " </servlet>"
946 + "</web-app>";
947 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
948 WebXml webXml = new WebXml(doc);
949 webXml.addServlet(createServletElement(doc, "s2", "s2class"));
950 assertTrue(webXml.hasServlet("s1"));
951 assertTrue(webXml.hasServlet("s2"));
952 }
953
954 /**
955 * Tests whether trying to add a servlet to a descriptor that already
956 * contains a servlet with the same name results in an exception.
957 *
958 * @throws Exception If an unexpected error occurs
959 */
960 public void testAddServletToDocumentWithTheSameServlet() throws Exception
961 {
962 String xml = "<web-app>"
963 + " <servlet>"
964 + " <servlet-name>s1</servlet-name>"
965 + " <servlet-class>sclass1</servlet-class>"
966 + " </servlet>"
967 + "</web-app>";
968 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
969 WebXml webXml = new WebXml(doc);
970 try
971 {
972 webXml.addServlet(createServletElement(doc, "s1", "s1class"));
973 fail("Expected IllegalStateException");
974 }
975 catch (IllegalStateException ise)
976 {
977 // expected
978 }
979 }
980
981 /**
982 * Tests whether a single initialization parameter is correctly added to an
983 * existing servlet definition.
984 *
985 * @throws Exception If an unexpected error occurs
986 */
987 public void testAddOneServletInitParam() throws Exception
988 {
989 String xml = "<web-app>"
990 + " <servlet>"
991 + " <servlet-name>s1</servlet-name>"
992 + " <servlet-class>sclass1</servlet-class>"
993 + " </servlet>"
994 + "</web-app>";
995 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
996 WebXml webXml = new WebXml(doc);
997 webXml.addServletInitParam("s1", "s1param1", "s1param1value");
998 Iterator initParams = webXml.getServletInitParamNames("s1");
999 assertEquals("s1param1", initParams.next());
1000 assertTrue(!initParams.hasNext());
1001 }
1002
1003 /**
1004 * Tests whether multiple initialization parameters are correctly added to
1005 * an existing servlet definition.
1006 *
1007 * @throws Exception If an unexpected error occurs
1008 */
1009 public void testAddMultipleServletInitParams() throws Exception
1010 {
1011 String xml = "<web-app>"
1012 + " <servlet>"
1013 + " <servlet-name>s1</servlet-name>"
1014 + " <servlet-class>sclass1</servlet-class>"
1015 + " </servlet>"
1016 + "</web-app>";
1017 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1018 WebXml webXml = new WebXml(doc);
1019 webXml.addServletInitParam("s1", "s1param1", "s1param1value");
1020 webXml.addServletInitParam("s1", "s1param2", "s1param2value");
1021 webXml.addServletInitParam("s1", "s1param3", "s1param3value");
1022 Iterator initParams = webXml.getServletInitParamNames("s1");
1023 assertEquals("s1param1", initParams.next());
1024 assertEquals("s1param2", initParams.next());
1025 assertEquals("s1param3", initParams.next());
1026 assertTrue(!initParams.hasNext());
1027 }
1028
1029 /**
1030 * Tests whether a single servlet can be added using the method that takes
1031 * a string for the servlet name and a string for the servlet class.
1032 *
1033 * @throws Exception If an unexpected error occurs
1034 */
1035 public void testAddServletWithNameAndClass() throws Exception
1036 {
1037 String xml = "<web-app>"
1038 + "</web-app>";
1039 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1040 WebXml webXml = new WebXml(doc);
1041 webXml.addServlet("s1", "s1class");
1042 assertTrue(webXml.hasServlet("s1"));
1043 }
1044
1045 /**
1046 * Tests whether a single servlet can be added using the method that takes
1047 * a string for the servlet name and a string for the JSP file.
1048 *
1049 * @throws Exception If an unexpected error occurs
1050 */
1051 public void testAddServletWithNameAndJspFile() throws Exception
1052 {
1053 String xml = "<web-app>"
1054 + "</web-app>";
1055 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1056 WebXml webXml = new WebXml(doc);
1057 webXml.addJspFile("s1", "s1.jsp");
1058 assertTrue(webXml.hasServlet("s1"));
1059 }
1060
1061 /**
1062 * Tests whether a security-constraint with no roles is successfully added
1063 * to an empty descriptor.
1064 *
1065 * @throws Exception If an unexpected error occurs
1066 */
1067 public void testAddSecurityConstraint()
1068 throws Exception
1069 {
1070 String xml = "<web-app></web-app>";
1071 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1072 WebXml webXml = new WebXml(doc);
1073 webXml.addSecurityConstraint("wrn", "/url", Collections.EMPTY_LIST);
1074 assertTrue(webXml.hasSecurityConstraint("/url"));
1075 }
1076
1077 /**
1078 * Tests whether a security-constraint with two roles is successfully added
1079 * to an empty descriptor.
1080 *
1081 * @throws Exception If an unexpected error occurs
1082 */
1083 public void testAddSecurityConstraintWithRoles()
1084 throws Exception
1085 {
1086 String xml = "<web-app></web-app>";
1087 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1088 WebXml webXml = new WebXml(doc);
1089 List roles = new ArrayList();
1090 roles.add("role1");
1091 roles.add("role2");
1092 webXml.addSecurityConstraint("wrn", "/url", roles);
1093 assertTrue(webXml.hasSecurityConstraint("/url"));
1094 Element securityConstraintElement =
1095 webXml.getSecurityConstraint("/url");
1096 assertNotNull(securityConstraintElement);
1097 Element authConstraintElement = (Element)
1098 securityConstraintElement.getElementsByTagName(
1099 "auth-constraint").item(0);
1100 assertNotNull(authConstraintElement);
1101 NodeList roleNameElements =
1102 authConstraintElement.getElementsByTagName("role-name");
1103 assertEquals(2, roleNameElements.getLength());
1104 assertEquals("role1",
1105 roleNameElements.item(0).getChildNodes().item(0).getNodeValue());
1106 assertEquals("role2",
1107 roleNameElements.item(1).getChildNodes().item(0).getNodeValue());
1108 }
1109
1110 /**
1111 * Tests whether checking an empty descriptor for a login configuration
1112 * results in <code>false</code>.
1113 *
1114 * @throws Exception If an unexpected error occurs
1115 */
1116 public void testHasLoginConfigEmpty()
1117 throws Exception
1118 {
1119 String xml = "<web-app></web-app>";
1120 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1121 WebXml webXml = new WebXml(doc);
1122 assertTrue(!webXml.hasLoginConfig());
1123 }
1124
1125 /**
1126 * Tests whether checking a descriptor with a login configuration for a
1127 * login configuration results in <code>true</code>.
1128 *
1129 * @throws Exception If an unexpected error occurs
1130 */
1131 public void testHasLoginConfig()
1132 throws Exception
1133 {
1134 String xml = "<web-app>"
1135 + " <login-config>"
1136 + " <auth-method>BASIC</auth-method>"
1137 + " </login-config>"
1138 + "</web-app>";
1139 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1140 WebXml webXml = new WebXml(doc);
1141 assertTrue(webXml.hasLoginConfig());
1142 }
1143
1144 /**
1145 * Tests retrieving the authentication method from a descriptor.
1146 *
1147 * @throws Exception If an unexpected error occurs
1148 */
1149 public void testGetLoginConfigAuthMethod()
1150 throws Exception
1151 {
1152 String xml = "<web-app>"
1153 + " <login-config>"
1154 + " <auth-method>BASIC</auth-method>"
1155 + " </login-config>"
1156 + "</web-app>";
1157 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1158 WebXml webXml = new WebXml(doc);
1159 assertEquals("BASIC", webXml.getLoginConfigAuthMethod());
1160 }
1161
1162 /**
1163 * Tests retrieving the authentication method from a descriptor.
1164 *
1165 * @throws Exception If an unexpected error occurs
1166 */
1167 public void testSetLoginConfigAdding()
1168 throws Exception
1169 {
1170 String xml = "<web-app></web-app>";
1171 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1172 WebXml webXml = new WebXml(doc);
1173 webXml.setLoginConfig("BASIC", "Test Realm");
1174 assertTrue(webXml.hasLoginConfig());
1175 assertEquals("BASIC", webXml.getLoginConfigAuthMethod());
1176 }
1177
1178 /**
1179 * Tests retrieving the authentication method from a descriptor.
1180 *
1181 * @throws Exception If an unexpected error occurs
1182 */
1183 public void testSetLoginConfigReplacing()
1184 throws Exception
1185 {
1186 String xml = "<web-app>"
1187 + " <login-config>"
1188 + " <auth-method>DIGEST</auth-method>"
1189 + " </login-config>"
1190 + "</web-app>";
1191 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1192 WebXml webXml = new WebXml(doc);
1193 webXml.setLoginConfig("BASIC", "Test Realm");
1194 assertTrue(webXml.hasLoginConfig());
1195 assertEquals("BASIC", webXml.getLoginConfigAuthMethod());
1196 }
1197
1198 /**
1199 * Tests whether checking an empty descriptor for some security constraint
1200 * results in <code>false</code>.
1201 *
1202 * @throws Exception If an unexpected error occurs
1203 */
1204 public void testHasSecurityConstraintEmpty()
1205 throws Exception
1206 {
1207 String xml = "<web-app></web-app>";
1208 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1209 WebXml webXml = new WebXml(doc);
1210 assertTrue(!webXml.hasSecurityConstraint("/TestUrl"));
1211 }
1212
1213 /**
1214 * Tests whether a single security-constraint element in the descriptor is
1215 * correctly retrieved.
1216 *
1217 * @throws Exception If an unexpected error occurs
1218 */
1219 public void testGetSingleSecurityConstraint()
1220 throws Exception
1221 {
1222 String xml = "<web-app>"
1223 + " <security-constraint>"
1224 + " <web-resource-collection>"
1225 + " <web-resource-name>wr1</web-resource-name>"
1226 + " <url-pattern>/url1</url-pattern>"
1227 + " </web-resource-collection>"
1228 + " </security-constraint>"
1229 + "</web-app>";
1230 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1231 WebXml webXml = new WebXml(doc);
1232 assertTrue(webXml.hasSecurityConstraint("/url1"));
1233 Element securityConstraintElement =
1234 webXml.getSecurityConstraint("/url1");
1235 assertNotNull(securityConstraintElement);
1236 }
1237
1238 /**
1239 * Tests whether multiple security-constraint elements are returned in
1240 * the expected order.
1241 *
1242 * @throws Exception If an unexpected error occurs
1243 */
1244 public void testGetMutlipleSecurityConstraints()
1245 throws Exception
1246 {
1247 String xml = "<web-app>"
1248 + " <security-constraint>"
1249 + " <web-resource-collection>"
1250 + " <web-resource-name>wr1</web-resource-name>"
1251 + " <url-pattern>/url1</url-pattern>"
1252 + " </web-resource-collection>"
1253 + " </security-constraint>"
1254 + " <security-constraint>"
1255 + " <web-resource-collection>"
1256 + " <web-resource-name>wr2</web-resource-name>"
1257 + " <url-pattern>/url2</url-pattern>"
1258 + " </web-resource-collection>"
1259 + " </security-constraint>"
1260 + " <security-constraint>"
1261 + " <web-resource-collection>"
1262 + " <web-resource-name>wr3</web-resource-name>"
1263 + " <url-pattern>/url3</url-pattern>"
1264 + " </web-resource-collection>"
1265 + " </security-constraint>"
1266 + "</web-app>";
1267 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1268 WebXml webXml = new WebXml(doc);
1269 assertTrue(webXml.hasSecurityConstraint("/url1"));
1270 assertTrue(webXml.hasSecurityConstraint("/url2"));
1271 assertTrue(webXml.hasSecurityConstraint("/url3"));
1272 Iterator securityConstraints =
1273 webXml.getElements(WebXmlTag.SECURITY_CONSTRAINT);
1274 assertNotNull(securityConstraints.next());
1275 assertNotNull(securityConstraints.next());
1276 assertNotNull(securityConstraints.next());
1277 assertTrue(!securityConstraints.hasNext());
1278 }
1279
1280 /**
1281 * Tests whether retrieving the login-config from an empty descriptor
1282 * returns <code>null</code>.
1283 *
1284 * @throws Exception If an unexpected error occurs
1285 */
1286 public void testGetLoginConfigEmpty()
1287 throws Exception
1288 {
1289 String xml = "<web-app></web-app>";
1290 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1291 WebXml webXml = new WebXml(doc);
1292 assertTrue(!webXml.getElements(WebXmlTag.LOGIN_CONFIG).hasNext());
1293 }
1294
1295 /**
1296 * Tests whether the login-config element can be correctly retrieved.
1297 *
1298 * @throws Exception If an unexpected error occurs
1299 */
1300 public void testGetLoginConfig()
1301 throws Exception
1302 {
1303 String xml = "<web-app><login-config/></web-app>";
1304 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1305 WebXml webXml = new WebXml(doc);
1306 assertTrue(webXml.getElements(WebXmlTag.LOGIN_CONFIG).hasNext());
1307 }
1308
1309 /**
1310 * Tests whether checking an empty descriptor for some security roles
1311 * results in <code>false</code>.
1312 *
1313 * @throws Exception If an unexpected error occurs
1314 */
1315 public void testHasSecurityRoleEmpty()
1316 throws Exception
1317 {
1318 String xml = "<web-app></web-app>";
1319 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1320 WebXml webXml = new WebXml(doc);
1321 assertTrue(!webXml.hasSecurityRole("someRole"));
1322 assertTrue(!webXml.getSecurityRoleNames().hasNext());
1323 }
1324
1325 /**
1326 * Tests whether a single security-role element is correctly retrieved.
1327 *
1328 * @throws Exception If an unexpected error occurs
1329 */
1330 public void testGetSingleSecurityRole()
1331 throws Exception
1332 {
1333 String xml = "<web-app>"
1334 + " <security-role>".trim()
1335 + " <role-name>r1</role-name>".trim()
1336 + " </security-role>".trim()
1337 + "</web-app>";
1338 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1339 WebXml webXml = new WebXml(doc);
1340 assertTrue(webXml.hasSecurityRole("r1"));
1341 Element securityRoleElement = webXml.getSecurityRole("r1");
1342 assertNotNull(securityRoleElement);
1343 assertEquals("security-role", securityRoleElement.getNodeName());
1344 assertEquals("role-name",
1345 securityRoleElement.getFirstChild().getNodeName());
1346 assertEquals("r1",
1347 securityRoleElement.getFirstChild().getFirstChild().getNodeValue());
1348 Iterator securityRoleNames = webXml.getSecurityRoleNames();
1349 assertTrue(securityRoleNames.hasNext());
1350 assertEquals("r1", securityRoleNames.next());
1351 assertTrue(!securityRoleNames.hasNext());
1352 }
1353
1354 /**
1355 * Tests whether multiple security-role elements are correctly retrieved
1356 * in the expected order.
1357 *
1358 * @throws Exception If an unexpected error occurs
1359 */
1360 public void testGetMutlipleSecurityRoles()
1361 throws Exception
1362 {
1363 String xml = "<web-app>"
1364 + " <security-role>".trim()
1365 + " <role-name>r1</role-name>".trim()
1366 + " </security-role>".trim()
1367 + " <security-role>".trim()
1368 + " <role-name>r2</role-name>".trim()
1369 + " </security-role>".trim()
1370 + " <security-role>".trim()
1371 + " <role-name>r3</role-name>".trim()
1372 + " </security-role>".trim()
1373 + "</web-app>";
1374 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1375 WebXml webXml = new WebXml(doc);
1376 assertTrue(webXml.hasSecurityRole("r1"));
1377 Element securityRoleElement1 = webXml.getSecurityRole("r1");
1378 assertNotNull(securityRoleElement1);
1379 assertEquals("security-role", securityRoleElement1.getNodeName());
1380 assertEquals("role-name",
1381 securityRoleElement1.getFirstChild().getNodeName());
1382 assertEquals("r1",
1383 securityRoleElement1.getFirstChild().getFirstChild().
1384 getNodeValue());
1385 assertTrue(webXml.hasSecurityRole("r2"));
1386 Element securityRoleElement2 = webXml.getSecurityRole("r2");
1387 assertNotNull(securityRoleElement2);
1388 assertEquals("security-role", securityRoleElement2.getNodeName());
1389 assertEquals("role-name",
1390 securityRoleElement2.getFirstChild().getNodeName());
1391 assertEquals("r2",
1392 securityRoleElement2.getFirstChild().getFirstChild().
1393 getNodeValue());
1394 assertTrue(webXml.hasSecurityRole("r3"));
1395 Element securityRoleElement3 = webXml.getSecurityRole("r3");
1396 assertNotNull(securityRoleElement3);
1397 assertEquals("security-role", securityRoleElement3.getNodeName());
1398 assertEquals("role-name",
1399 securityRoleElement3.getFirstChild().getNodeName());
1400 assertEquals("r3",
1401 securityRoleElement3.getFirstChild().getFirstChild().
1402 getNodeValue());
1403 Iterator securityRoleNames = webXml.getSecurityRoleNames();
1404 assertTrue(securityRoleNames.hasNext());
1405 assertEquals("r1", securityRoleNames.next());
1406 assertTrue(securityRoleNames.hasNext());
1407 assertEquals("r2", securityRoleNames.next());
1408 assertTrue(securityRoleNames.hasNext());
1409 assertEquals("r3", securityRoleNames.next());
1410 assertTrue(!securityRoleNames.hasNext());
1411 }
1412
1413 /**
1414 * Tests whether a filter is inserted before a servlet element.
1415 *
1416 * @throws Exception If an unexpected error occurs
1417 */
1418 public void testElementOrderFilterBeforeServlet() throws Exception
1419 {
1420 String xml = "<web-app>"
1421 + " <servlet>".trim()
1422 + " <servlet-name>s1</servlet-name>".trim()
1423 + " <servlet-class>s1class</servlet-class>".trim()
1424 + " </servlet>".trim()
1425 + "</web-app>";
1426 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1427 WebXml webXml = new WebXml(doc);
1428 webXml.addFilter(createFilterElement(doc, "f1", "f1class"));
1429 NodeList order = doc.getDocumentElement().getChildNodes();
1430 assertEquals("filter", order.item(0).getNodeName());
1431 assertEquals("servlet", order.item(1).getNodeName());
1432 }
1433
1434 /**
1435 * Tests whether a filter is inserted before the comment node preceding a
1436 * servlet definition.
1437 *
1438 * @throws Exception If an unexpected error occurs
1439 */
1440 public void testElementOrderFilterBeforeServletWithComment()
1441 throws Exception
1442 {
1443 String xml = "<web-app>"
1444 + " <!-- My servlets -->".trim()
1445 + " <servlet>".trim()
1446 + " <servlet-name>s1</servlet-name>".trim()
1447 + " <servlet-class>s1class</servlet-class>".trim()
1448 + " </servlet>".trim()
1449 + "</web-app>";
1450 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1451 WebXml webXml = new WebXml(doc);
1452 webXml.addFilter(createFilterElement(doc, "f1", "f1class"));
1453 NodeList order = doc.getDocumentElement().getChildNodes();
1454 assertEquals("filter", order.item(0).getNodeName());
1455 assertEquals("#comment", order.item(1).getNodeName());
1456 assertEquals("servlet", order.item(2).getNodeName());
1457 }
1458
1459 /**
1460 * Tests whether a servlet is inserted after a filter.
1461 *
1462 * @throws Exception If an unexpected error occurs
1463 */
1464 public void testElementOrderServletAfterFilter() throws Exception
1465 {
1466 String xml = "<web-app>"
1467 + " <filter>".trim()
1468 + " <filter-name>f1</filter-name>".trim()
1469 + " <filter-class>f1class</filter-class>".trim()
1470 + " </filter>".trim()
1471 + "</web-app>";
1472 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1473 WebXml webXml = new WebXml(doc);
1474 webXml.addServlet(createServletElement(doc, "s1", "s1class"));
1475 NodeList order = doc.getDocumentElement().getChildNodes();
1476 assertEquals("filter", order.item(0).getNodeName());
1477 assertEquals("servlet", order.item(1).getNodeName());
1478 }
1479
1480 /**
1481 * Tests whether a servlet is inserted after a filter that is preceded by
1482 * a comment node.
1483 *
1484 * @throws Exception If an unexpected error occurs
1485 */
1486 public void testElementOrderServletAfterFilterWithComment()
1487 throws Exception
1488 {
1489 String xml = "<web-app>"
1490 + " <!-- My filters -->".trim()
1491 + " <filter>".trim()
1492 + " <filter-name>f1</filter-name>".trim()
1493 + " <filter-class>f1class</filter-class>".trim()
1494 + " </filter>".trim()
1495 + "</web-app>";
1496 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1497 WebXml webXml = new WebXml(doc);
1498 webXml.addServlet(createServletElement(doc, "s1", "s1class"));
1499 NodeList order = doc.getDocumentElement().getChildNodes();
1500 assertEquals("#comment", order.item(0).getNodeName());
1501 assertEquals("filter", order.item(1).getNodeName());
1502 assertEquals("servlet", order.item(2).getNodeName());
1503 }
1504
1505 /**
1506 * Tests that the a servlets run-as role-name can be extracted
1507 *
1508 * @throws Exception If an unexpected error occurs
1509 */
1510 public void testGetServletRunAsRole() throws Exception
1511 {
1512 String xml = "<web-app>"
1513 + " <servlet>"
1514 + " <servlet-name>s1</servlet-name>"
1515 + " <servlet-class>sclass1</servlet-class>"
1516 + " <run-as>"
1517 + " <role-name>r1</role-name>"
1518 + " </run-as>"
1519 + " </servlet>"
1520 + "</web-app>";
1521 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1522 WebXml webXml = new WebXml(doc);
1523 String roleName = webXml.getServletRunAsRoleName("s1");
1524 assertEquals("r1", roleName);
1525 }
1526
1527 /**
1528 * Tests that a run-as role-name can be added to a servlet
1529 *
1530 * @throws Exception If an unexpected error occurs
1531 */
1532 public void testAddServletRunAsRole() throws Exception
1533 {
1534 String xml = "<web-app>"
1535 + " <servlet>"
1536 + " <servlet-name>s1</servlet-name>"
1537 + " <servlet-class>sclass1</servlet-class>"
1538 + " </servlet>"
1539 + "</web-app>";
1540 Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1541 WebXml webXml = new WebXml(doc);
1542 webXml.addServletRunAsRoleName("s1", "r1");
1543 String roleName = webXml.getServletRunAsRoleName("s1");
1544 assertEquals("r1", roleName);
1545 }
1546
1547 // Private Methods ---------------------------------------------------------
1548
1549 /**
1550 * Create a <code>context-param</code> element containing the specified
1551 * text in the child elements.
1552 *
1553 * @param theDocument The DOM document
1554 * @param theParamName The parameter name
1555 * @param theParamValue The parameter value
1556 * @return The created element
1557 */
1558 public Element createContextParamElement(Document theDocument,
1559 String theParamName, String theParamValue)
1560 {
1561 Element contextParamElement =
1562 theDocument.createElement("context-param");
1563 Element paramNameElement = theDocument.createElement("param-name");
1564 paramNameElement.appendChild(theDocument.createTextNode(theParamName));
1565 contextParamElement.appendChild(paramNameElement);
1566 Element paramValueElement = theDocument.createElement("param-value");
1567 paramValueElement.appendChild(
1568 theDocument.createTextNode(theParamValue));
1569 contextParamElement.appendChild(paramValueElement);
1570 return contextParamElement;
1571 }
1572
1573 /**
1574 * Create a <code>filter</code> element containing the specified text in
1575 * the child elements.
1576 *
1577 * @param theDocument The DOM document
1578 * @param theFilterName The name of the filter
1579 * @param theFilterClass The name of the filter implementation class
1580 * @return The created element
1581 */
1582 public Element createFilterElement(Document theDocument,
1583 String theFilterName, String theFilterClass)
1584 {
1585 Element filterElement = theDocument.createElement("filter");
1586 Element filterNameElement = theDocument.createElement("filter-name");
1587 filterNameElement.appendChild(
1588 theDocument.createTextNode(theFilterName));
1589 filterElement.appendChild(filterNameElement);
1590 Element filterClassElement = theDocument.createElement("filter-class");
1591 filterClassElement.appendChild(
1592 theDocument.createTextNode(theFilterClass));
1593 filterElement.appendChild(filterClassElement);
1594 return filterElement;
1595 }
1596
1597 /**
1598 * Create a <code>servlet</code> element containing the specified text in
1599 * the child elements.
1600 *
1601 * @param theDocument The DOM document
1602 * @param theServletName The name of the servlet
1603 * @param theServletClass The name of the servlet implementation class
1604 * @return The created element
1605 */
1606 public Element createServletElement(Document theDocument,
1607 String theServletName, String theServletClass)
1608 {
1609 Element filterElement = theDocument.createElement("servlet");
1610 Element filterNameElement = theDocument.createElement("servlet-name");
1611 filterNameElement.appendChild(
1612 theDocument.createTextNode(theServletName));
1613 filterElement.appendChild(filterNameElement);
1614 Element filterClassElement = theDocument.createElement("servlet-class");
1615 filterClassElement.appendChild(
1616 theDocument.createTextNode(theServletClass));
1617 filterElement.appendChild(filterClassElement);
1618 return filterElement;
1619 }
1620
1621 }