View | Details | Raw Unified | Return to bug 53737
Collapse All | Expand All

(-)test/org/apache/jasper/servlet/TestJspCServletContext.java (+97 lines)
Line 0 Link Here
1
/*
2
 * Licensed to the Apache Software Foundation (ASF) under one or more
3
 * contributor license agreements.  See the NOTICE file distributed with
4
 * this work for additional information regarding copyright ownership.
5
 * The ASF licenses this file to You under the Apache License, Version 2.0
6
 * (the "License"); you may not use this file except in compliance with
7
 * the License.  You may obtain a copy of the License at
8
 *
9
 *      http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 */
17
package org.apache.jasper.servlet;
18
19
import java.io.File;
20
import java.util.Collection;
21
import java.util.Iterator;
22
23
import javax.servlet.descriptor.JspConfigDescriptor;
24
import javax.servlet.descriptor.JspPropertyGroupDescriptor;
25
26
import org.junit.Assert;
27
import org.junit.Test;
28
29
public class TestJspCServletContext {
30
31
    @Test
32
    public void testWebapp() throws Exception {
33
        File appDir = new File("test/webapp");
34
        JspCServletContext context = new JspCServletContext(null, appDir.toURI().toURL());
35
        Assert.assertEquals(3, context.getEffectiveMajorVersion());
36
        Assert.assertEquals(1, context.getEffectiveMinorVersion());
37
        JspConfigDescriptor jspConfigDescriptor = context.getJspConfigDescriptor();
38
        Assert.assertTrue(jspConfigDescriptor.getTaglibs().isEmpty());
39
        Collection<JspPropertyGroupDescriptor> propertyGroups = jspConfigDescriptor.getJspPropertyGroups();
40
        Assert.assertEquals(1, propertyGroups.size());
41
        JspPropertyGroupDescriptor groupDescriptor = propertyGroups.iterator().next();
42
        Assert.assertEquals("text/plain", groupDescriptor.getDefaultContentType());
43
        Collection<String> urlPatterns = groupDescriptor.getUrlPatterns();
44
        Assert.assertEquals(2, urlPatterns.size());
45
        Iterator<String> iterator = urlPatterns.iterator();
46
        Assert.assertEquals("/bug49nnn/bug49726a.jsp", iterator.next());
47
        Assert.assertEquals("/bug49nnn/bug49726b.jsp", iterator.next());
48
    }
49
50
    @Test
51
    public void testWebapp_2_3() throws Exception {
52
        File appDir = new File("test/webapp-2.3");
53
        JspCServletContext context = new JspCServletContext(null, appDir.toURI().toURL());
54
        Assert.assertEquals(2, context.getEffectiveMajorVersion());
55
        Assert.assertEquals(3, context.getEffectiveMinorVersion());
56
    }
57
58
    @Test
59
    public void testWebapp_2_4() throws Exception {
60
        File appDir = new File("test/webapp-2.4");
61
        JspCServletContext context = new JspCServletContext(null, appDir.toURI().toURL());
62
        Assert.assertEquals(2, context.getEffectiveMajorVersion());
63
        Assert.assertEquals(4, context.getEffectiveMinorVersion());
64
    }
65
66
    @Test
67
    public void testWebapp_2_5() throws Exception {
68
        File appDir = new File("test/webapp-2.5");
69
        JspCServletContext context = new JspCServletContext(null, appDir.toURI().toURL());
70
        Assert.assertEquals(2, context.getEffectiveMajorVersion());
71
        Assert.assertEquals(5, context.getEffectiveMinorVersion());
72
    }
73
74
    @Test
75
    public void testWebapp_3_0() throws Exception {
76
        File appDir = new File("test/webapp-3.0");
77
        JspCServletContext context = new JspCServletContext(null, appDir.toURI().toURL());
78
        Assert.assertEquals(3, context.getEffectiveMajorVersion());
79
        Assert.assertEquals(0, context.getEffectiveMinorVersion());
80
    }
81
82
    @Test
83
    public void testWebapp_3_1() throws Exception {
84
        File appDir = new File("test/webapp-3.1");
85
        JspCServletContext context = new JspCServletContext(null, appDir.toURI().toURL());
86
        Assert.assertEquals(3, context.getEffectiveMajorVersion());
87
        Assert.assertEquals(1, context.getEffectiveMinorVersion());
88
    }
89
90
    @Test
91
    public void testWebresources() throws Exception {
92
        File appDir = new File("test/webresources/dir1");
93
        JspCServletContext context = new JspCServletContext(null, appDir.toURI().toURL());
94
        Assert.assertEquals(3, context.getEffectiveMajorVersion());
95
        Assert.assertEquals(1, context.getEffectiveMinorVersion());
96
    }
97
}
(-)test/webapp/WEB-INF/web.xml (-3 / +3 lines)
Lines 15-24 Link Here
15
  See the License for the specific language governing permissions and
15
  See the License for the specific language governing permissions and
16
  limitations under the License.
16
  limitations under the License.
17
-->
17
-->
18
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
18
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
19
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
19
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
20
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
20
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
21
                      http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
21
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
22
  version="3.1"
22
  version="3.1"
23
  metadata-complete="true">
23
  metadata-complete="true">
24
24
(-)java/org/apache/jasper/JspC.java (-10 / +5 lines)
Lines 30-36 Link Here
30
import java.io.PrintWriter;
30
import java.io.PrintWriter;
31
import java.io.Reader;
31
import java.io.Reader;
32
import java.io.Writer;
32
import java.io.Writer;
33
import java.net.MalformedURLException;
34
import java.net.URL;
33
import java.net.URL;
35
import java.net.URLClassLoader;
34
import java.net.URLClassLoader;
36
import java.util.ArrayList;
35
import java.util.ArrayList;
Lines 1414-1428 Link Here
1414
        }
1413
        }
1415
    }
1414
    }
1416
1415
1417
    protected void initServletContext() {
1416
    protected void initServletContext() throws IOException, JasperException {
1418
        try {
1417
        // TODO: should we use the Ant Project's log?
1419
            context =new JspCServletContext
1418
        PrintWriter log = new PrintWriter(System.out);
1420
                (new PrintWriter(System.out),
1419
        URL resourceBase = new File(uriRoot).getCanonicalFile().toURI().toURL();
1421
                 new URL("file:" + uriRoot.replace('\\','/') + '/'));
1420
        context = new JspCServletContext(log, resourceBase);
1422
            tldLocationsCache = TldLocationsCache.getInstance(context);
1423
        } catch (MalformedURLException me) {
1424
            System.out.println("**" + me);
1425
        }
1426
        rctxt = new JspRuntimeContext(context, this);
1421
        rctxt = new JspRuntimeContext(context, this);
1427
        jspConfig = new JspConfig(context);
1422
        jspConfig = new JspConfig(context);
1428
        tagPluginManager = new TagPluginManager(context);
1423
        tagPluginManager = new TagPluginManager(context);
(-)java/org/apache/jasper/servlet/JspCServletContext.java (-4 / +351 lines)
Lines 19-33 Link Here
19
19
20
20
21
import java.io.File;
21
import java.io.File;
22
import java.io.IOException;
22
import java.io.InputStream;
23
import java.io.InputStream;
23
import java.io.PrintWriter;
24
import java.io.PrintWriter;
24
import java.net.MalformedURLException;
25
import java.net.MalformedURLException;
25
import java.net.URL;
26
import java.net.URL;
27
import java.util.ArrayList;
28
import java.util.Collection;
29
import java.util.Collections;
26
import java.util.EnumSet;
30
import java.util.EnumSet;
27
import java.util.Enumeration;
31
import java.util.Enumeration;
28
import java.util.EventListener;
32
import java.util.EventListener;
29
import java.util.HashSet;
33
import java.util.HashSet;
30
import java.util.Hashtable;
34
import java.util.Hashtable;
35
import java.util.Iterator;
36
import java.util.List;
31
import java.util.Map;
37
import java.util.Map;
32
import java.util.Set;
38
import java.util.Set;
33
import java.util.Vector;
39
import java.util.Vector;
Lines 43-50 Link Here
43
import javax.servlet.SessionCookieConfig;
49
import javax.servlet.SessionCookieConfig;
44
import javax.servlet.SessionTrackingMode;
50
import javax.servlet.SessionTrackingMode;
45
import javax.servlet.descriptor.JspConfigDescriptor;
51
import javax.servlet.descriptor.JspConfigDescriptor;
52
import javax.servlet.descriptor.JspPropertyGroupDescriptor;
53
import javax.servlet.descriptor.TaglibDescriptor;
46
54
55
import org.apache.jasper.JasperException;
47
import org.apache.jasper.util.ExceptionUtils;
56
import org.apache.jasper.util.ExceptionUtils;
57
import org.apache.jasper.xmlparser.ParserUtils;
58
import org.apache.jasper.xmlparser.TreeNode;
48
59
49
60
50
/**
61
/**
Lines 78-88 Link Here
78
    private final URL myResourceBaseURL;
89
    private final URL myResourceBaseURL;
79
90
80
91
92
81
    /**
93
    /**
82
     * Web application class loader.
94
     * Web application class loader.
83
     */
95
     */
84
    private ClassLoader loader;
96
    private ClassLoader loader;
85
97
98
    private final int effectiveMajorVersion;
99
    private final int effectiveMinorVersion;
100
    private final JspConfigDescriptor jspConfigDescriptor;
86
101
87
    // ----------------------------------------------------------- Constructors
102
    // ----------------------------------------------------------- Constructors
88
103
Lines 92-106 Link Here
92
     * @param aLogWriter PrintWriter which is used for <code>log()</code> calls
107
     * @param aLogWriter PrintWriter which is used for <code>log()</code> calls
93
     * @param aResourceBaseURL Resource base URL
108
     * @param aResourceBaseURL Resource base URL
94
     */
109
     */
95
    public JspCServletContext(PrintWriter aLogWriter, URL aResourceBaseURL) {
110
    public JspCServletContext(PrintWriter aLogWriter, URL aResourceBaseURL) throws IOException, JasperException {
96
111
97
        myAttributes = new Hashtable<>();
112
        myAttributes = new Hashtable<>();
98
        myLogWriter = aLogWriter;
113
        myLogWriter = aLogWriter;
99
        myResourceBaseURL = aResourceBaseURL;
114
        myResourceBaseURL = aResourceBaseURL;
100
115
116
        TreeNode mergedWebApp = loadAndMerge();
117
118
        // set effective version for this application
119
        Version version = Version.fromString(mergedWebApp.findAttribute("version"));
120
        effectiveMajorVersion = version.getMajor();
121
        effectiveMinorVersion = version.getMinor();
122
123
        jspConfigDescriptor = new JspCJspConfigDescriptor(mergedWebApp, version);
101
    }
124
    }
102
125
126
    private TreeNode loadAndMerge() throws IOException, JasperException {
127
        ParserUtils pu = new ParserUtils();
128
        TreeNode root = load(pu);
129
        List<TreeNode> libs = getFragments();
130
        for (TreeNode lib : libs) {
131
            merge(root, lib);
132
        }
133
        return root;
134
    }
103
135
136
    private TreeNode load(ParserUtils pu) throws JasperException, IOException {
137
        URL webUrl = getResource("/WEB-INF/web.xml");
138
        if (webUrl == null) {
139
            // No web.xml in the application, use a empty one as default to support Servlet 3.0 applications.
140
            // This avoids inconsistency between compilation triggered by JspServlet which would use the
141
            // container's specification level and JspC which would default to Servlet 2.3 behaviour (including
142
            // unanticipated consequences such as disabling EL evaluation).
143
            webUrl = JspCServletContext.class.getResource("web.xml");
144
        }
145
        try (InputStream is = webUrl.openStream()) {
146
            return pu.parseXMLDocument(webUrl.toExternalForm(), is);
147
        }
148
    }
149
150
    private List<TreeNode> getFragments() {
151
        // TODO: find, parse and order web fragments
152
        // Perhaps the logic for this in ContextConfig could be moved to o.a.tomcat.util and shared.
153
        return Collections.emptyList();
154
    }
155
156
    private void merge(TreeNode root, TreeNode fragment) {
157
        // TODO: merge a web-fragment into the main web.xml
158
    }
159
104
    // --------------------------------------------------------- Public Methods
160
    // --------------------------------------------------------- Public Methods
105
161
106
162
Lines 628-640 Link Here
628
684
629
    @Override
685
    @Override
630
    public int getEffectiveMajorVersion() {
686
    public int getEffectiveMajorVersion() {
631
        return 3;
687
        return effectiveMajorVersion;
632
    }
688
    }
633
689
634
690
635
    @Override
691
    @Override
636
    public int getEffectiveMinorVersion() {
692
    public int getEffectiveMinorVersion() {
637
        return 0;
693
        return effectiveMinorVersion;
638
    }
694
    }
639
695
640
696
Lines 646-652 Link Here
646
702
647
    @Override
703
    @Override
648
    public JspConfigDescriptor getJspConfigDescriptor() {
704
    public JspConfigDescriptor getJspConfigDescriptor() {
649
        return null;
705
        return jspConfigDescriptor;
650
    }
706
    }
651
707
652
708
Lines 660-663 Link Here
660
    public String getVirtualServerName() {
716
    public String getVirtualServerName() {
661
        return null;
717
        return null;
662
    }
718
    }
719
720
    private static enum Version {
721
        VERSION_2_3(2, 3),
722
        VERSION_2_4(2, 4),
723
        VERSION_2_5(2, 5),
724
        VERSION_3_0(3, 0),
725
        VERSION_3_1(3, 1);
726
        private final int major;
727
        private final int minor;
728
        private Version(int major, int minor) {
729
            this.major = major;
730
            this.minor = minor;
731
        }
732
733
        private int getMajor() {
734
            return major;
735
        }
736
737
        private int getMinor() {
738
            return minor;
739
        }
740
741
        private static Version fromString(String version) {
742
            if (version == null) {
743
                return VERSION_2_3;
744
            }
745
            switch (version) {
746
                case "2.4":
747
                    return VERSION_2_4;
748
                case "2.5":
749
                    return VERSION_2_5;
750
                case "3.0":
751
                    return VERSION_3_0;
752
                case "3.1":
753
                    return VERSION_3_1;
754
                default:
755
                    return VERSION_2_3;
756
            }
757
        }
758
    }
759
760
    private static class JspCJspConfigDescriptor implements JspConfigDescriptor {
761
        private final Collection<TaglibDescriptor> taglibs;
762
        private final Collection<JspPropertyGroupDescriptor> jspPropertyGroups;
763
764
        private JspCJspConfigDescriptor(TreeNode webapp, Version version) {
765
            // In Servlet 2.3, <taglib> elements were under the root and there were no property groups
766
            if (version == Version.VERSION_2_3) {
767
                taglibs = taglibDescriptors(webapp);
768
                jspPropertyGroups = Collections.emptyList();
769
                return;
770
            }
771
772
            // In later versions, JSP configuration is under the <jsp-config> element
773
            TreeNode jspConfig = webapp.findChild("jsp-config");
774
            if (jspConfig == null) {
775
                taglibs = Collections.emptyList();
776
                jspPropertyGroups = Collections.emptyList();
777
                return;
778
            }
779
            taglibs = taglibDescriptors(jspConfig);
780
            jspPropertyGroups = propertyGroups(jspConfig);
781
        }
782
783
        private Collection<TaglibDescriptor> taglibDescriptors(TreeNode parent) {
784
            Collection<TaglibDescriptor> descriptors = new ArrayList<>();
785
            Iterator<TreeNode> taglibs = parent.findChildren("taglib");
786
            while (taglibs.hasNext()) {
787
                TreeNode taglib = taglibs.next();
788
                final String tagUri = optionalChild(taglib, "taglib-uri");
789
                final String tagLoc = optionalChild(taglib, "taglib-location");
790
                descriptors.add(new JspCTaglibDescriptor(tagUri, tagLoc));
791
            }
792
            return Collections.unmodifiableCollection(descriptors);
793
        }
794
795
        private Collection<JspPropertyGroupDescriptor> propertyGroups(TreeNode parent) {
796
            List<JspPropertyGroupDescriptor> descriptors = new ArrayList<>();
797
            Iterator<TreeNode> groups = parent.findChildren("jsp-property-group");
798
            while (groups.hasNext()) {
799
                TreeNode group = groups.next();
800
                String buffer = null;
801
                String defaultContentType = null;
802
                String deferedSyntaxAllowedAsLiteral = null;
803
                String elIgnored = null;
804
                String errorOnUndeclaredNamespace = null;
805
                List<String> includeCodas = new ArrayList<>();
806
                List<String> includePreludes = new ArrayList<>();
807
                String isXml = null;
808
                String pageEncoding = null;
809
                String scriptingInvalid = null;
810
                String trimDirectiveWhitespaces = null;
811
                List<String> urlPatterns = new ArrayList<>();
812
                Iterator<TreeNode> child = group.findChildren();
813
                while (child.hasNext()) {
814
                    TreeNode node = child.next();
815
                    String body = node.getBody();
816
                    switch (node.getName()) {
817
                        case "buffer":
818
                            buffer = body;
819
                            break;
820
                        case "default-content-type":
821
                            defaultContentType = body;
822
                            break;
823
                        case "deferred-syntax-allowed-as-literal":
824
                            deferedSyntaxAllowedAsLiteral = body;
825
                            break;
826
                        case "el-ignored":
827
                            elIgnored = body;
828
                            break;
829
                        case "error-on-undeclared-namespace":
830
                            errorOnUndeclaredNamespace = body;
831
                            break;
832
                        case "include-coda":
833
                            includeCodas.add(body);
834
                            break;
835
                        case "include-prelude":
836
                            includePreludes.add(body);
837
                            break;
838
                        case "is-xml":
839
                            isXml = body;
840
                            break;
841
                        case "page-encoding":
842
                            pageEncoding = body;
843
                            break;
844
                        case "scripting-invalid":
845
                            scriptingInvalid = body;
846
                            break;
847
                        case "trim-directive-whitespaces":
848
                            buffer = body;
849
                            break;
850
                        case "url-pattern":
851
                            urlPatterns.add(body);
852
                            break;
853
                    }
854
                }
855
                descriptors.add(new JspCPropertyGroupDescriptor(
856
                        buffer,
857
                        defaultContentType,
858
                        deferedSyntaxAllowedAsLiteral,
859
                        elIgnored,
860
                        errorOnUndeclaredNamespace,
861
                        Collections.unmodifiableCollection(includeCodas),
862
                        Collections.unmodifiableCollection(includePreludes),
863
                        isXml,
864
                        pageEncoding,
865
                        scriptingInvalid,
866
                        trimDirectiveWhitespaces,
867
                        Collections.unmodifiableCollection(urlPatterns)));
868
            }
869
            return Collections.unmodifiableList(descriptors);
870
        }
871
872
        private static String optionalChild(TreeNode parent, String name) {
873
            TreeNode child = parent.findChild(name);
874
            return child == null ? null : child.getBody();
875
        }
876
877
        @Override
878
        public Collection<TaglibDescriptor> getTaglibs() {
879
            return taglibs;
880
        }
881
882
        @Override
883
        public Collection<JspPropertyGroupDescriptor> getJspPropertyGroups() {
884
            return jspPropertyGroups;
885
        }
886
887
        // TODO: share with org.apache.catalina.core.ApplicationTaglibDescriptor
888
        private static class JspCTaglibDescriptor implements TaglibDescriptor {
889
            private final String tagUri;
890
            private final String tagLoc;
891
892
            public JspCTaglibDescriptor(String tagUri, String tagLoc) {
893
                this.tagUri = tagUri;
894
                this.tagLoc = tagLoc;
895
            }
896
897
            @Override
898
            public String getTaglibURI() {
899
                return tagUri;
900
            }
901
902
            @Override
903
            public String getTaglibLocation() {
904
                return tagLoc;
905
            }
906
        }
907
908
        // TODO: share with org.apache.catalina.core.ApplicationJspPropertyGroupDescriptor
909
        private static class JspCPropertyGroupDescriptor implements JspPropertyGroupDescriptor {
910
            private final String buffer;
911
            private final String defaultContentType;
912
            private final String deferedSyntaxAllowedAsLiteral;
913
            private final String elIgnored;
914
            private final String errorOnUndeclaredNamespace;
915
            private final Collection<String> includeCodas;
916
            private final Collection<String> includePreludes;
917
            private final String isXml;
918
            private final String pageEncoding;
919
            private final String scriptingInvalid;
920
            private final String trimDirectiveWhitespaces;
921
            private final Collection<String> urlPatterns;
922
923
            private JspCPropertyGroupDescriptor(String buffer,
924
                                                String defaultContentType,
925
                                                String deferedSyntaxAllowedAsLiteral,
926
                                                String elIgnored,
927
                                                String errorOnUndeclaredNamespace,
928
                                                Collection<String> includeCodas,
929
                                                Collection<String> includePreludes,
930
                                                String isXml,
931
                                                String pageEncoding,
932
                                                String scriptingInvalid,
933
                                                String trimDirectiveWhitespaces,
934
                                                Collection<String> urlPatterns) {
935
                this.buffer = buffer;
936
                this.defaultContentType = defaultContentType;
937
                this.deferedSyntaxAllowedAsLiteral = deferedSyntaxAllowedAsLiteral;
938
                this.elIgnored = elIgnored;
939
                this.errorOnUndeclaredNamespace = errorOnUndeclaredNamespace;
940
                this.includeCodas = includeCodas;
941
                this.includePreludes = includePreludes;
942
                this.isXml = isXml;
943
                this.pageEncoding = pageEncoding;
944
                this.scriptingInvalid = scriptingInvalid;
945
                this.trimDirectiveWhitespaces = trimDirectiveWhitespaces;
946
                this.urlPatterns = urlPatterns;
947
            }
948
949
            @Override
950
            public Collection<String> getUrlPatterns() {
951
                return urlPatterns;
952
            }
953
954
            @Override
955
            public String getElIgnored() {
956
                return elIgnored;
957
            }
958
959
            @Override
960
            public String getPageEncoding() {
961
                return pageEncoding;
962
            }
963
964
            @Override
965
            public String getScriptingInvalid() {
966
                return scriptingInvalid;
967
            }
968
969
            @Override
970
            public String getIsXml() {
971
                return isXml;
972
            }
973
974
            @Override
975
            public Collection<String> getIncludePreludes() {
976
                return includePreludes;
977
            }
978
979
            @Override
980
            public Collection<String> getIncludeCodas() {
981
                return includeCodas;
982
            }
983
984
            @Override
985
            public String getDeferredSyntaxAllowedAsLiteral() {
986
                return deferedSyntaxAllowedAsLiteral;
987
            }
988
989
            @Override
990
            public String getTrimDirectiveWhitespaces() {
991
                return trimDirectiveWhitespaces;
992
            }
993
994
            @Override
995
            public String getDefaultContentType() {
996
                return defaultContentType;
997
            }
998
999
            @Override
1000
            public String getBuffer() {
1001
                return buffer;
1002
            }
1003
1004
            @Override
1005
            public String getErrorOnUndeclaredNamespace() {
1006
                return errorOnUndeclaredNamespace;
1007
            }
1008
        }
1009
    }
663
}
1010
}
(-)java/org/apache/jasper/servlet/web.xml (+25 lines)
Line 0 Link Here
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
<!--
3
  Licensed to the Apache Software Foundation (ASF) under one or more
4
  contributor license agreements.  See the NOTICE file distributed with
5
  this work for additional information regarding copyright ownership.
6
  The ASF licenses this file to You under the Apache License, Version 2.0
7
  (the "License"); you may not use this file except in compliance with
8
  the License.  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
  Default web.xml used by Jasper if one is not provided in the application.
20
-->
21
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
22
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
23
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
24
         version="3.1">
25
</web-app>

Return to bug 53737