View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with 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,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.config.impl;
20  
21  import java.io.IOException;
22  import java.io.InputStream;
23  import java.net.JarURLConnection;
24  import java.net.URL;
25  import java.util.jar.JarEntry;
26  import java.util.logging.Logger;
27  
28  import javax.faces.context.ExternalContext;
29  
30  import org.apache.myfaces.shared.util.ClassUtils;
31  import org.xml.sax.EntityResolver;
32  import org.xml.sax.InputSource;
33  
34  /**
35   * SAX EntityResolver to provide JSF-specific resources (DTDs) for well-known identifiers.
36   *
37   * @author Manfred Geiler (latest modification by $Author$)
38   * @author Thomas Spiegl
39   * @version $Revision$ $Date$
40   */
41  public class FacesConfigEntityResolver
42      implements EntityResolver
43  {
44      //private static final Log log = LogFactory.getLog(FacesConfigEntityResolver.class);
45      private static final Logger log = Logger.getLogger(FacesConfigEntityResolver.class.getName());
46  
47      private static final String FACES_CONFIG_1_0_DTD_SYSTEM_ID = "http://java.sun.com/dtd/web-facesconfig_1_0.dtd";
48      private static final String FACES_CONFIG_1_0_DTD_RESOURCE
49              = "org.apache.myfaces.resource".replace('.', '/') + "/web-facesconfig_1_0.dtd";
50      private static final String FACES_CONFIG_1_1_DTD_SYSTEM_ID = "http://java.sun.com/dtd/web-facesconfig_1_1.dtd";
51      private static final String FACES_CONFIG_1_1_DTD_RESOURCE
52              = "org.apache.myfaces.resource".replace('.', '/') + "/web-facesconfig_1_1.dtd";
53  
54      private ExternalContext _externalContext = null;
55  
56      public FacesConfigEntityResolver(ExternalContext context)
57      {
58          _externalContext = context;
59      }
60  
61      public FacesConfigEntityResolver()
62      {
63      }
64  
65      public InputSource resolveEntity(String publicId,
66                                       String systemId)
67          throws IOException
68      {
69          InputStream stream;
70          if (systemId.equals(FACES_CONFIG_1_0_DTD_SYSTEM_ID))
71          {
72              stream = ClassUtils.getResourceAsStream(FACES_CONFIG_1_0_DTD_RESOURCE);
73          }
74          else if (systemId.equals(FACES_CONFIG_1_1_DTD_SYSTEM_ID))
75          {
76              stream = ClassUtils.getResourceAsStream(FACES_CONFIG_1_1_DTD_RESOURCE);
77          }
78  
79          else if (systemId.startsWith("jar:"))
80          {
81              URL url = new URL(systemId);
82              JarURLConnection conn = (JarURLConnection) url.openConnection();
83              
84              // see MYFACES-1982
85              conn.setUseCaches(false);
86              JarEntry jarEntry = conn.getJarEntry();
87              if (jarEntry == null)
88              {
89                  log.severe("JAR entry '" + systemId + "' not found.");
90              }
91              //_jarFile.getInputStream(jarEntry);
92              stream = conn.getJarFile().getInputStream(jarEntry);
93          }
94          else
95          {
96              if (_externalContext == null)
97              {
98                  stream = ClassUtils.getResourceAsStream(systemId);
99              }
100             else
101             {
102                 if (systemId.startsWith("file:"))
103                 {
104                     systemId = systemId.substring(7); // remove file://
105                 }
106                 stream = _externalContext.getResourceAsStream(systemId);
107             }
108         }
109 
110         if (stream == null)
111         {
112             return null;
113         }
114         InputSource is = new InputSource(stream);
115         is.setPublicId(publicId);
116         is.setSystemId(systemId);
117         is.setEncoding("ISO-8859-1");
118         return is;
119     }
120 
121 }