Coverage Report - org.webslinger.ext.image.ImageConvertor
 
Classes in this File Line Coverage Branch Coverage Complexity
ImageConvertor
0%
0/10
N/A
0
ImageConvertor$1
0%
0/57
0%
0/16
0
 
 1  
 package org.webslinger.ext.image;
 2  
 
 3  
 import java.awt.Rectangle;
 4  
 import java.io.File;
 5  
 import java.io.IOException;
 6  
 import java.util.ArrayList;
 7  
 import java.util.List;
 8  
 import java.util.ListIterator;
 9  
 import java.util.concurrent.CopyOnWriteArrayList;
 10  
 
 11  
 import org.apache.commons.collections.Transformer;
 12  
 import org.apache.commons.vfs.FileObject;
 13  
 
 14  
 import org.webslinger.util.TTLObject;
 15  
 import org.webslinger.io.IOUtil;
 16  
 
 17  
 public class ImageConvertor implements Transformer {
 18  
     protected final FileObject root;
 19  
     protected final String forceType;
 20  0
     protected final List<ImageTransformerFactory> factories = new CopyOnWriteArrayList<ImageTransformerFactory>();
 21  
     protected String key;
 22  
 
 23  
     public ImageConvertor(FileObject root) {
 24  0
         this(root, null);
 25  0
     }
 26  
 
 27  0
     public ImageConvertor(FileObject root, String forceType) {
 28  0
         this.root = root;
 29  0
         this.forceType = forceType;
 30  0
     }
 31  
 
 32  
     public List<ImageTransformerFactory> getFactories() {
 33  0
         return factories;
 34  
     }
 35  
 
 36  
     public Object transform(Object key) {
 37  0
         return load((ImageDescriptor) key);
 38  
     }
 39  
 
 40  
     public TTLObject<FileObject> load(final ImageDescriptor image) {
 41  0
         return new TTLObject<FileObject>() {
 42  
             protected String name;
 43  
 
 44  
             public long getTTL() {
 45  0
                 return 1000;
 46  
             }
 47  
 
 48  
             protected FileObject load(FileObject dest) throws IOException {
 49  0
                 FileObject source = image.getFile();
 50  0
                 if (!source.exists()) {
 51  0
                     if (dest != null) dest.delete();
 52  0
                     return null;
 53  
                 }
 54  0
                 ListIterator<ImageTransformerFactory> it = factories.listIterator();
 55  0
                 int i = 0;
 56  0
                 while (it.hasNext()) {
 57  0
                     i++;
 58  0
                     if (it.next().isEnabled(image)) {
 59  0
                         while (i > 0) {
 60  0
                             it.previous();
 61  0
                             i--;
 62  
                         }
 63  0
                         ArrayList<ImageTransformer> transformers = new ArrayList<ImageTransformer>();
 64  0
                         StringBuilder newNameBuffer = new StringBuilder();
 65  0
                         while (it.hasNext()) {
 66  0
                             i++;
 67  0
                             ImageTransformerFactory factory = it.next();
 68  0
                             ImageTransformer transformer = factory.getTransformer(image);
 69  0
                             if (newNameBuffer.length() > 0) newNameBuffer.append(';');
 70  0
                             newNameBuffer.append(transformer.toString());
 71  0
                             transformers.add(transformer);
 72  0
                         }
 73  0
                         while (i > 0) {
 74  0
                             i--;
 75  0
                             it.previous();
 76  
                         }
 77  0
                         String newName = newNameBuffer.toString();
 78  0
                         if (dest == null || !dest.exists()) {
 79  0
                             return generate(source, newName, transformers.listIterator());
 80  0
                         } else if (source.getContent().getLastModifiedTime() != dest.getContent().getLastModifiedTime()) {
 81  0
                             return generate(source, newName, transformers.listIterator());
 82  0
                         } else if (!newName.equals(this.name)) {
 83  0
                             return generate(source, newName, transformers.listIterator());
 84  
                         }
 85  0
                         return dest;
 86  
                     }
 87  
                 }
 88  0
                 name = null;
 89  0
                 if (dest != null && dest != source && !dest.equals(source)) dest.delete();
 90  0
                 return source;
 91  
             }
 92  
 
 93  
             protected FileObject generate(FileObject source, String newName, ListIterator<ImageTransformer> it) throws IOException {
 94  0
                 File tmpFile = File.createTempFile("image-convert", ".tmp");
 95  0
                 tmpFile.deleteOnExit();
 96  
                 try {
 97  0
                     IOUtil.copy(source.getContent().getInputStream(), true, tmpFile);
 98  0
                     if (forceType != null) ImageUtils.convertType(tmpFile, forceType);
 99  0
                     Rectangle dimensions = ImageUtils.getImageBox(tmpFile);
 100  0
                     if (dimensions == null) return null;
 101  0
                     while (it.hasNext()) {
 102  0
                         ImageTransformer transformer = it.next();
 103  0
                         if (!transformer.isEnabled()) continue;
 104  0
                         dimensions = transformer.transform(tmpFile, dimensions);
 105  0
                     }
 106  0
                     FileObject dest = root.resolveFile(newName + '/' + source.getName().toString().replaceAll("_", "__").replaceAll(":", "_+").replaceAll("!", "_-"));
 107  0
                     IOUtil.copy(tmpFile, dest.getContent().getOutputStream(), true);
 108  0
                     dest.getContent().setLastModifiedTime(source.getContent().getLastModifiedTime());
 109  0
                     name = newName;
 110  0
                     return dest;
 111  0
                 } catch (InterruptedException e) {
 112  0
                     throw (IOException) new IOException(e.getMessage()).initCause(e);
 113  
                 } finally {
 114  0
                     tmpFile.delete();
 115  
                 }
 116  
             }
 117  
 
 118  
         };
 119  
     }
 120  
 }