1
24 package net.sf.jasperreports.repo;
25
26 import java.io.File;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.io.OutputStream;
30 import java.net.URL;
31 import java.net.URLStreamHandlerFactory;
32 import java.nio.file.Path;
33
34 import org.apache.commons.logging.Log;
35 import org.apache.commons.logging.LogFactory;
36
37 import net.sf.jasperreports.engine.JRException;
38 import net.sf.jasperreports.engine.JRPropertiesUtil;
39 import net.sf.jasperreports.engine.JRRuntimeException;
40 import net.sf.jasperreports.engine.JasperReportsContext;
41 import net.sf.jasperreports.engine.util.JRLoader;
42 import net.sf.jasperreports.engine.util.JRResourcesUtil;
43
44
45
48 public class DefaultRepositoryService implements StreamRepositoryService
49 {
50
51 private static final Log log = LogFactory.getLog(DefaultRepositoryService.class);
52
53 public static final String PROPERTY_FILES_ENABLED =
54 JRPropertiesUtil.PROPERTY_PREFIX + "default.file.repository.enabled";
55
56 public static final String EXCEPTION_MESSAGE_KEY_NOT_IMPLEMENTED = "repo.default.not.implemented";
57
58
61 protected JasperReportsContext jasperReportsContext;
62 private boolean filesEnabled;
63
64
67 protected ClassLoader classLoader;
68 protected URLStreamHandlerFactory urlHandlerFactory;
69
72 protected net.sf.jasperreports.engine.util.FileResolver fileResolver;
73
74
77 public DefaultRepositoryService(JasperReportsContext jasperReportsContext)
78 {
79 this.jasperReportsContext = jasperReportsContext;
80 this.filesEnabled = JRPropertiesUtil.getInstance(jasperReportsContext).getBooleanProperty(
81 PROPERTY_FILES_ENABLED, true);
82 }
83
84
87 public void setClassLoader(ClassLoader classLoader)
88 {
89 this.classLoader = classLoader;
90 }
91
92
95 public void setURLStreamHandlerFactory(URLStreamHandlerFactory urlHandlerFactory)
96 {
97 this.urlHandlerFactory = urlHandlerFactory;
98 }
99
100
103 public void setFileResolver(net.sf.jasperreports.engine.util.FileResolver fileResolver)
104 {
105 this.fileResolver = fileResolver;
106 }
107
108 @Override
109 public InputStream getInputStream(String uri)
110 {
111 return getInputStream(SimpleRepositoryContext.of(jasperReportsContext), uri);
112 }
113
114 @Override
115 public InputStream getInputStream(RepositoryContext context, String uri)
116 {
117 try
118 {
119 URL url = JRResourcesUtil.createURL(uri, urlHandlerFactory);
120 if (url != null)
121 {
122 return JRLoader.getInputStream(url);
123 }
124
125 File file = resolveFile(context, uri);
126 if (file != null)
127 {
128 return JRLoader.getInputStream(file);
129 }
130
131 url = JRResourcesUtil.findClassLoaderResource(uri, classLoader);
132 if (url != null)
133 {
134 return JRLoader.getInputStream(url);
135 }
136 }
137 catch (JRException e)
138 {
139 throw new JRRuntimeException(e);
140 }
141
142 return null;
143 }
144
145
148 protected File resolveFile(RepositoryContext context, String uri)
149 {
150 if (fileResolver != null)
151 {
152 return fileResolver.resolveFile(uri);
153 }
154
155 if (filesEnabled)
156 {
157 return JRResourcesUtil.resolveFile(context, uri);
158 }
159
160 return null;
161 }
162
163 @Override
164 public OutputStream getOutputStream(String uri)
165 {
166 throw new UnsupportedOperationException();
167 }
168
169 @Override
170 public Resource getResource(String uri)
171 {
172 throw
173 new JRRuntimeException(
174 EXCEPTION_MESSAGE_KEY_NOT_IMPLEMENTED,
175 (Object[])null);
176 }
177
178 @Override
179 public void saveResource(String uri, Resource resource)
180 {
181 throw new UnsupportedOperationException();
182 }
183
184 @Override
185 public <K extends Resource> K getResource(String uri, Class<K> resourceType)
186 {
187 return getResource(SimpleRepositoryContext.of(jasperReportsContext), uri, resourceType);
188 }
189
190 @Override
191 public <K extends Resource> K getResource(RepositoryContext context, String uri, Class<K> resourceType)
192 {
193 PersistenceService persistenceService = PersistenceUtil.getInstance(jasperReportsContext).getService(DefaultRepositoryService.class, resourceType);
194 if (persistenceService != null)
195 {
196 return (K) persistenceService.load(context, uri, this);
197 }
198 return null;
199 }
200
201 @Override
202 public ResourceInfo getResourceInfo(RepositoryContext context, String location)
203 {
204
205 URL url = JRResourcesUtil.createURL(location, urlHandlerFactory);
206 if (url != null)
207 {
208
209 return null;
210 }
211
212 if (fileResolver != null)
213 {
214
215 return null;
216 }
217
218 File file = resolveFile(context, location);
219 if (file != null)
220 {
221 try
222 {
223
224 Path path = file.toPath().toRealPath();
225 return StandardResourceInfo.from(path);
226 }
227 catch (IOException e)
228 {
229 log.warn("Failed to resolve real path for file " + file, e);
230
231
232 return StandardResourceInfo.from(file);
233 }
234 }
235
236
237 return null;
238 }
239
240
241 }
242