1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
36
37
38
39
40 public class FacesConfigEntityResolver
41 implements EntityResolver
42 {
43
44 private static final Logger log = Logger.getLogger(FacesConfigEntityResolver.class.getName());
45
46 private static final String FACES_CONFIG_1_0_DTD_SYSTEM_ID = "http://java.sun.com/dtd/web-facesconfig_1_0.dtd";
47 private static final String FACES_CONFIG_1_0_DTD_RESOURCE
48 = "org.apache.myfaces.resource".replace('.', '/') + "/web-facesconfig_1_0.dtd";
49 private static final String FACES_CONFIG_1_1_DTD_SYSTEM_ID = "http://java.sun.com/dtd/web-facesconfig_1_1.dtd";
50 private static final String FACES_CONFIG_1_1_DTD_RESOURCE
51 = "org.apache.myfaces.resource".replace('.', '/') + "/web-facesconfig_1_1.dtd";
52
53 private ExternalContext _externalContext = null;
54
55 public FacesConfigEntityResolver(ExternalContext context)
56 {
57 _externalContext = context;
58 }
59
60 public FacesConfigEntityResolver()
61 {
62 }
63
64 public InputSource resolveEntity(String publicId,
65 String systemId)
66 throws IOException
67 {
68 InputStream stream;
69 if (systemId.equals(FACES_CONFIG_1_0_DTD_SYSTEM_ID))
70 {
71 stream = ClassUtils.getResourceAsStream(FACES_CONFIG_1_0_DTD_RESOURCE);
72 }
73 else if (systemId.equals(FACES_CONFIG_1_1_DTD_SYSTEM_ID))
74 {
75 stream = ClassUtils.getResourceAsStream(FACES_CONFIG_1_1_DTD_RESOURCE);
76 }
77
78 else if (systemId.startsWith("jar:"))
79 {
80 URL url = new URL(systemId);
81 JarURLConnection conn = (JarURLConnection) url.openConnection();
82
83
84 conn.setUseCaches(false);
85 JarEntry jarEntry = conn.getJarEntry();
86 if (jarEntry == null)
87 {
88 log.severe("JAR entry '" + systemId + "' not found.");
89 }
90
91 stream = conn.getJarFile().getInputStream(jarEntry);
92 }
93 else
94 {
95 if (_externalContext == null)
96 {
97 stream = ClassUtils.getResourceAsStream(systemId);
98 }
99 else
100 {
101 if (systemId.startsWith("file:")) {
102 systemId = systemId.substring(7);
103 }
104 stream = _externalContext.getResourceAsStream(systemId);
105 }
106 }
107
108 if (stream == null) {
109 return null;
110 }
111 InputSource is = new InputSource(stream);
112 is.setPublicId(publicId);
113 is.setSystemId(systemId);
114 is.setEncoding("ISO-8859-1");
115 return is;
116 }
117
118 }