java-fmpp-remove-imageinfo.patch
1 | See https://github.com/freemarker/fmpp/pull/18 |
2 | |
3 | In order to leverage the package dependency we removed |
4 | `org.devlib.schmidt.imageinfo.ImageInfo` class and replaced it with more |
5 | standard one javax.imageio.ImageIO in Fedora. We suggest you do the same here. |
6 | |
7 | The old class comes from a package whose latest release is in 2008 and whose |
8 | homepage doesn't exist anymore. There doesn't seem to be any corresponding |
9 | sources anymore. |
10 | |
11 | From 14dae73c5e5f162e6ddb59430cbfc7c555429140 Mon Sep 17 00:00:00 2001 |
12 | From: Tomas Repik <trepik@redhat.com> |
13 | Date: Mon, 5 Dec 2016 13:17:54 +0100 |
14 | Subject: [PATCH] removed org.devlib.schmidt.imageinfo.ImageInfo dependency |
15 | from sources |
16 | |
17 | --- |
18 | .../java/fmpp/dataloaders/HtmlUtilsDataLoader.java | 399 ++++++++++----------- |
19 | 1 file changed, 196 insertions(+), 203 deletions(-) |
20 | |
21 | diff --git a/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java b/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java |
22 | index 3dcb613..6c32065 100644 |
23 | --- a/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java |
24 | +++ b/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java |
25 | @@ -1,12 +1,12 @@ |
26 | /* |
27 | * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky |
28 | - * |
29 | + * |
30 | * Licensed under the Apache License, Version 2.0 (the "License"); |
31 | * you may not use this file except in compliance with the License. |
32 | * You may obtain a copy of the License at |
33 | - * |
34 | + * |
35 | * http://www.apache.org/licenses/LICENSE-2.0 |
36 | - * |
37 | + * |
38 | * Unless required by applicable law or agreed to in writing, software |
39 | * distributed under the License is distributed on an "AS IS" BASIS, |
40 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
41 | @@ -14,8 +14,8 @@ |
42 | * limitations under the License. |
43 | */ |
44 | |
45 | -package fmpp.dataloaders; |
46 | - |
47 | +package fmpp.dataloaders; |
48 | + |
49 | import java.io.File; |
50 | import java.io.FileNotFoundException; |
51 | import java.io.IOException; |
52 | @@ -25,8 +25,7 @@ import java.util.HashMap; |
53 | import java.util.Iterator; |
54 | import java.util.List; |
55 | import java.util.Map; |
56 | - |
57 | -import org.devlib.schmidt.imageinfo.ImageInfo; |
58 | +import javax.imageio.ImageIO; |
59 | |
60 | import fmpp.Engine; |
61 | import fmpp.tdd.DataLoader; |
62 | @@ -36,199 +35,193 @@ import freemarker.template.TemplateModelException; |
63 | import freemarker.template.TemplateNumberModel; |
64 | import freemarker.template.TemplateScalarModel; |
65 | import freemarker.template.TemplateTransformModel; |
66 | - |
67 | -/** |
68 | - * Returns a hash that contains useful directives for HTML generation. |
69 | - * <ul> |
70 | - * <li>img: Same as HTML img, but automatically calculates the width and/or |
71 | - * height attributes if they are missing. |
72 | - * </ul> |
73 | - */ |
74 | -public class HtmlUtilsDataLoader implements DataLoader { |
75 | - private boolean xHtml = false; |
76 | - private String eTagClose; |
77 | - |
78 | - private Engine engine; |
79 | - |
80 | - private static final int MAX_CACHE_SIZE = 100; |
81 | - private Map imageInfoCache = new HashMap(); |
82 | - private CachedImageInfo first; |
83 | - private CachedImageInfo last; |
84 | - private ImageInfo imageInfo = new ImageInfo(); |
85 | - |
86 | - public Object load(Engine e, List args) throws Exception { |
87 | - if (args.size() != 0) { |
88 | - throw new IllegalArgumentException( |
89 | - "data loader does not have arguments"); |
90 | - } |
91 | - engine = e; |
92 | - if (xHtml) { |
93 | - eTagClose = " />"; |
94 | - } else { |
95 | - eTagClose = ">"; |
96 | - } |
97 | - |
98 | - Map map = new HashMap(); |
99 | - |
100 | - map.put("img", new ImgTransform()); |
101 | - |
102 | - return map; |
103 | - } |
104 | - |
105 | - public void setXHtml(boolean xHtml) { |
106 | - this.xHtml = xHtml; |
107 | - } |
108 | - |
109 | - private CachedImageInfo getImageInfo(File f) |
110 | - throws IOException, TemplateModelException { |
111 | - String cacheKey = f.getCanonicalPath(); |
112 | - |
113 | - CachedImageInfo inf = (CachedImageInfo) imageInfoCache.get(cacheKey); |
114 | - if (inf != null) { |
115 | - long lmd = new File(cacheKey).lastModified(); |
116 | - if (inf.lmd == lmd && lmd != 0L && inf.lmd != 0L) { |
117 | - if (inf != last) { |
118 | - if (inf.prev != null) { |
119 | - inf.prev.next = inf.next; |
120 | - } else { |
121 | - first = inf.next; |
122 | - } |
123 | - if (inf.next != null) { |
124 | - inf.next.prev = inf.prev; |
125 | - } else { |
126 | - last = inf.prev; |
127 | - } |
128 | - |
129 | - inf.prev = last; |
130 | - inf.next = null; |
131 | - last = inf; |
132 | - inf.prev.next = last; |
133 | - } |
134 | - return inf; //! |
135 | - } else { |
136 | - imageInfoCache.remove(cacheKey); |
137 | - if (inf.prev != null) { |
138 | - inf.prev.next = inf.next; |
139 | - } else { |
140 | - first = inf.next; |
141 | - } |
142 | - if (inf.next != null) { |
143 | - inf.next.prev = inf.prev; |
144 | - } else { |
145 | - last = inf.prev; |
146 | - } |
147 | - } |
148 | - } |
149 | - |
150 | - RandomAccessFile raf; |
151 | - try { |
152 | - raf = new RandomAccessFile(f, "r"); |
153 | - } catch (FileNotFoundException e) { |
154 | - throw new TemplateModelException("Image file not found: " + f.getAbsolutePath(), e); |
155 | - } |
156 | - try { |
157 | - imageInfo.setCollectComments(false); |
158 | - imageInfo.setInput(raf); |
159 | - if (!imageInfo.check()) { |
160 | - throw new TemplateModelException("Failed to analyse image file: " + cacheKey); |
161 | - } |
162 | - } finally { |
163 | - raf.close(); |
164 | - } |
165 | - inf = new CachedImageInfo(); |
166 | - inf.lmd = f.lastModified(); |
167 | - inf.width = imageInfo.getWidth(); |
168 | - inf.height = imageInfo.getHeight(); |
169 | - inf.path = cacheKey; |
170 | - if (last != null) { |
171 | - last.next = inf; |
172 | - } |
173 | - inf.prev = last; |
174 | - inf.next = null; |
175 | - last = inf; |
176 | - if (inf.prev == null) { |
177 | - first = inf; |
178 | - } |
179 | - imageInfoCache.put(cacheKey, inf); |
180 | - if (imageInfoCache.size() > MAX_CACHE_SIZE) { |
181 | - imageInfoCache.remove(first.path); |
182 | - first.next.prev = null; |
183 | - first = first.next; |
184 | - } |
185 | - |
186 | - return inf; |
187 | - } |
188 | - |
189 | - private class CachedImageInfo { |
190 | - private CachedImageInfo prev; |
191 | - private CachedImageInfo next; |
192 | - private String path; |
193 | - private long lmd; |
194 | - private int width; |
195 | - private int height; |
196 | - } |
197 | - |
198 | - private class ImgTransform implements TemplateTransformModel { |
199 | - public Writer getWriter(Writer out, Map args) |
200 | - throws TemplateModelException, IOException { |
201 | - boolean detectHeight = true; |
202 | - boolean detectWidth = true; |
203 | - String src = null; |
204 | - |
205 | - out.write("<img"); |
206 | - |
207 | - Iterator it = args.entrySet().iterator(); |
208 | - while (it.hasNext()) { |
209 | - Map.Entry e = (Map.Entry) it.next(); |
210 | - String pname = (String) e.getKey(); |
211 | - Object obj = e.getValue(); |
212 | - String pvalue; |
213 | - if (obj instanceof TemplateScalarModel) { |
214 | - pvalue = ((TemplateScalarModel) obj).getAsString(); |
215 | - } else if (obj instanceof TemplateNumberModel) { |
216 | - pvalue = ((TemplateNumberModel) obj).getAsNumber() |
217 | - .toString(); |
218 | - } else if (obj instanceof TemplateBooleanModel) { |
219 | - pvalue = null; |
220 | - if (((TemplateBooleanModel) obj).getAsBoolean()) { |
221 | - out.write(" " + pname); |
222 | - } |
223 | - } else { |
224 | - throw new TemplateModelException( |
225 | - "Argument to img must be string, " + "number or boolean"); |
226 | - } |
227 | - if (pvalue != null) { |
228 | - pname = pname.toLowerCase(); |
229 | - out.write(" " + pname + "=\"" |
230 | - + StringUtil.htmlEnc(pvalue) + "\""); |
231 | - if (pname.equals("src")) { |
232 | - src = pvalue; |
233 | - } else if (pname.equals("width")) { |
234 | - detectWidth = false; |
235 | - } else if (pname.equals("height")) { |
236 | - detectHeight = false; |
237 | - } |
238 | - } |
239 | - } |
240 | - if (detectWidth || detectHeight) { |
241 | - if (src == null) { |
242 | - throw new TemplateModelException( |
243 | - "The src attribute of img is missing"); |
244 | - } |
245 | - CachedImageInfo inf; |
246 | - inf = getImageInfo(engine.getTemplateEnvironment() |
247 | - .resolveSourcePath(src)); |
248 | - if (detectWidth) { |
249 | - out.write(" width=\"" + inf.width + "\""); |
250 | - } |
251 | - if (detectHeight) { |
252 | - out.write(" height=\"" + inf.height + "\""); |
253 | - } |
254 | - } |
255 | - |
256 | - out.write(eTagClose); |
257 | - |
258 | - return null; |
259 | - } |
260 | - } |
261 | -} |
262 | + |
263 | +/** |
264 | + * Returns a hash that contains useful directives for HTML generation. |
265 | + * <ul> |
266 | + * <li>img: Same as HTML img, but automatically calculates the width and/or |
267 | + * height attributes if they are missing. |
268 | + * </ul> |
269 | + */ |
270 | +public class HtmlUtilsDataLoader implements DataLoader { |
271 | + private boolean xHtml = false; |
272 | + private String eTagClose; |
273 | + |
274 | + private Engine engine; |
275 | + |
276 | + private static final int MAX_CACHE_SIZE = 100; |
277 | + private Map imageInfoCache = new HashMap(); |
278 | + private CachedImageInfo first; |
279 | + private CachedImageInfo last; |
280 | + |
281 | + public Object load(Engine e, List args) throws Exception { |
282 | + if (args.size() != 0) { |
283 | + throw new IllegalArgumentException( |
284 | + "data loader does not have arguments"); |
285 | + } |
286 | + engine = e; |
287 | + if (xHtml) { |
288 | + eTagClose = " />"; |
289 | + } else { |
290 | + eTagClose = ">"; |
291 | + } |
292 | + |
293 | + Map map = new HashMap(); |
294 | + |
295 | + map.put("img", new ImgTransform()); |
296 | + |
297 | + return map; |
298 | + } |
299 | + |
300 | + public void setXHtml(boolean xHtml) { |
301 | + this.xHtml = xHtml; |
302 | + } |
303 | + |
304 | + private CachedImageInfo getImageInfo(File f) |
305 | + throws IOException, TemplateModelException { |
306 | + String cacheKey = f.getCanonicalPath(); |
307 | + |
308 | + CachedImageInfo inf = (CachedImageInfo) imageInfoCache.get(cacheKey); |
309 | + if (inf != null) { |
310 | + long lmd = new File(cacheKey).lastModified(); |
311 | + if (inf.lmd == lmd && lmd != 0L && inf.lmd != 0L) { |
312 | + if (inf != last) { |
313 | + if (inf.prev != null) { |
314 | + inf.prev.next = inf.next; |
315 | + } else { |
316 | + first = inf.next; |
317 | + } |
318 | + if (inf.next != null) { |
319 | + inf.next.prev = inf.prev; |
320 | + } else { |
321 | + last = inf.prev; |
322 | + } |
323 | + |
324 | + inf.prev = last; |
325 | + inf.next = null; |
326 | + last = inf; |
327 | + inf.prev.next = last; |
328 | + } |
329 | + return inf; //! |
330 | + } else { |
331 | + imageInfoCache.remove(cacheKey); |
332 | + if (inf.prev != null) { |
333 | + inf.prev.next = inf.next; |
334 | + } else { |
335 | + first = inf.next; |
336 | + } |
337 | + if (inf.next != null) { |
338 | + inf.next.prev = inf.prev; |
339 | + } else { |
340 | + last = inf.prev; |
341 | + } |
342 | + } |
343 | + } |
344 | + |
345 | + int width = 0; |
346 | + int height = 0; |
347 | + |
348 | + try { |
349 | + java.awt.image.BufferedImage img = ImageIO.read(f); |
350 | + width = img.getWidth(); |
351 | + height = img.getHeight(); |
352 | + } catch(Exception e) { |
353 | + throw new TemplateModelException("Failed to analyse image file:" + cacheKey); |
354 | + } |
355 | + inf = new CachedImageInfo(); |
356 | + inf.lmd = f.lastModified(); |
357 | + inf.width = width; |
358 | + inf.height = height; |
359 | + inf.path = cacheKey; |
360 | + if (last != null) { |
361 | + last.next = inf; |
362 | + } |
363 | + inf.prev = last; |
364 | + inf.next = null; |
365 | + last = inf; |
366 | + if (inf.prev == null) { |
367 | + first = inf; |
368 | + } |
369 | + imageInfoCache.put(cacheKey, inf); |
370 | + if (imageInfoCache.size() > MAX_CACHE_SIZE) { |
371 | + imageInfoCache.remove(first.path); |
372 | + first.next.prev = null; |
373 | + first = first.next; |
374 | + } |
375 | + |
376 | + return inf; |
377 | + } |
378 | + |
379 | + private class CachedImageInfo { |
380 | + private CachedImageInfo prev; |
381 | + private CachedImageInfo next; |
382 | + private String path; |
383 | + private long lmd; |
384 | + private int width; |
385 | + private int height; |
386 | + } |
387 | + |
388 | + private class ImgTransform implements TemplateTransformModel { |
389 | + public Writer getWriter(Writer out, Map args) |
390 | + throws TemplateModelException, IOException { |
391 | + boolean detectHeight = true; |
392 | + boolean detectWidth = true; |
393 | + String src = null; |
394 | + |
395 | + out.write("<img"); |
396 | + |
397 | + Iterator it = args.entrySet().iterator(); |
398 | + while (it.hasNext()) { |
399 | + Map.Entry e = (Map.Entry) it.next(); |
400 | + String pname = (String) e.getKey(); |
401 | + Object obj = e.getValue(); |
402 | + String pvalue; |
403 | + if (obj instanceof TemplateScalarModel) { |
404 | + pvalue = ((TemplateScalarModel) obj).getAsString(); |
405 | + } else if (obj instanceof TemplateNumberModel) { |
406 | + pvalue = ((TemplateNumberModel) obj).getAsNumber() |
407 | + .toString(); |
408 | + } else if (obj instanceof TemplateBooleanModel) { |
409 | + pvalue = null; |
410 | + if (((TemplateBooleanModel) obj).getAsBoolean()) { |
411 | + out.write(" " + pname); |
412 | + } |
413 | + } else { |
414 | + throw new TemplateModelException( |
415 | + "Argument to img must be string, " + "number or boolean"); |
416 | + } |
417 | + if (pvalue != null) { |
418 | + pname = pname.toLowerCase(); |
419 | + out.write(" " + pname + "=\"" |
420 | + + StringUtil.htmlEnc(pvalue) + "\""); |
421 | + if (pname.equals("src")) { |
422 | + src = pvalue; |
423 | + } else if (pname.equals("width")) { |
424 | + detectWidth = false; |
425 | + } else if (pname.equals("height")) { |
426 | + detectHeight = false; |
427 | + } |
428 | + } |
429 | + } |
430 | + if (detectWidth || detectHeight) { |
431 | + if (src == null) { |
432 | + throw new TemplateModelException( |
433 | + "The src attribute of img is missing"); |
434 | + } |
435 | + CachedImageInfo inf; |
436 | + inf = getImageInfo(engine.getTemplateEnvironment() |
437 | + .resolveSourcePath(src)); |
438 | + if (detectWidth) { |
439 | + out.write(" width=\"" + inf.width + "\""); |
440 | + } |
441 | + if (detectHeight) { |
442 | + out.write(" height=\"" + inf.height + "\""); |
443 | + } |
444 | + } |
445 | + |
446 | + out.write(eTagClose); |
447 | + |
448 | + return null; |
449 | + } |
450 | + } |
451 | +} |
452 | -- |
453 | 2.11.0 |
454 | |
455 |