1 16 package org.outerj.daisy.books.publisher.impl.publicationprocess; 17 18 import org.outerj.daisy.books.publisher.impl.BookInstanceLayout; 19 import org.outerj.daisy.books.publisher.impl.util.AbstractContentHandler; 20 import org.outerj.daisy.books.store.BookInstance; 21 import org.outerj.daisy.xmlutil.LocalSAXParserFactory; 22 import org.outerj.daisy.xmlutil.XmlSerializer; 23 import org.xml.sax.InputSource ; 24 import org.xml.sax.ContentHandler ; 25 import org.xml.sax.Attributes ; 26 import org.xml.sax.SAXException ; 27 import org.outerx.daisy.x10Bookstoremeta.ResourcePropertiesDocument; 28 import org.apache.cocoon.xml.AttributesImpl; 29 30 import javax.xml.parsers.SAXParser ; 31 import java.util.Map ; 32 import java.util.HashMap ; 33 import java.io.InputStream ; 34 import java.io.OutputStream ; 35 import java.io.IOException ; 36 37 public class CopyBookInstanceResourcesTask implements PublicationProcessTask { 38 private final String input; 39 private final String output; 40 private final String baseToPath; 41 private static Map fileExtensions = new HashMap (); 42 static { 43 fileExtensions.put("image/png", ".png"); 44 fileExtensions.put("image/x-png", ".png"); 45 fileExtensions.put("image/jpeg", ".jpg"); 46 fileExtensions.put("image/gif", ".gif"); 47 } 48 49 public CopyBookInstanceResourcesTask(String input, String output, String baseToPath) { 50 this.input = input; 51 this.output = output; 52 this.baseToPath = baseToPath; 53 } 54 55 public void run(PublicationContext context) throws Exception { 56 context.getPublicationLog().info("Running copy book instance resources task."); 57 58 String publicationOutputPath = BookInstanceLayout.getPublicationOutputPath(context.getPublicationOutputName()); 59 String inputXmlPath = publicationOutputPath + input; 60 String outputXmlPath = publicationOutputPath + output; 61 String outputPath = BookInstanceLayout.getPublicationOutputPath(context.getPublicationOutputName()); 62 63 InputStream is = null; 64 OutputStream os = null; 65 try { 66 SAXParser parser = LocalSAXParserFactory.getSAXParserFactory().newSAXParser(); 67 os = context.getBookInstance().getResourceOutputStream(outputXmlPath); 68 XmlSerializer serializer = new XmlSerializer(os); 69 ImageCopyHandler imageCopyHandler = new ImageCopyHandler(serializer, context.getBookInstance(), outputPath); 70 parser.getXMLReader().setContentHandler(imageCopyHandler); 71 is = context.getBookInstance().getResource(inputXmlPath); 72 InputSource inputSource = new InputSource (is); 73 parser.getXMLReader().parse(inputSource); 74 } finally { 75 if (os != null) 76 os.close(); 77 if (is != null) 78 is.close(); 79 } 80 } 81 82 class ImageCopyHandler extends AbstractContentHandler { 83 private final BookInstance bookInstance; 84 private final String outputPath; 85 86 public ImageCopyHandler(ContentHandler consumer, BookInstance bookInstance, String outputPath) { 87 super(consumer); 88 this.bookInstance = bookInstance; 89 this.outputPath = outputPath; 90 } 91 92 public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 93 if (namespaceURI.equals("")) { 94 String attrName = null; 95 if (localName.equals("img")) 96 attrName = "src"; 97 else if (localName.equals("a")) 98 attrName = "href"; 99 else if (localName.equals("object")) 100 attrName = "data"; 101 else if (localName.equals("embed")) 102 attrName = "src"; 103 104 if (attrName != null) { 105 String newLink = handleLinkAttr(atts.getValue(attrName)); 106 if (newLink != null) { 107 AttributesImpl newAttrs = new AttributesImpl(atts); 108 newAttrs.setValue(newAttrs.getIndex(attrName), newLink); 109 atts = newAttrs; 110 } 111 } 112 } 113 super.startElement(namespaceURI, localName, qName, atts); 114 } 115 116 private String handleLinkAttr(String href) throws SAXException { 117 if (href == null) 118 return null; 119 if (!href.startsWith("bookinstance:")) 120 return null; 121 if (href.startsWith("bookinstance:output/")) { 122 return href.substring("bookinstance:output/".length()); 124 } 125 126 String resourcePath = href.substring("bookinstance:".length()); 127 String newResourcePath = baseToPath + href.substring(("bookinstance:" + BookInstanceLayout.geResourceStorePath()).length()); 128 129 ResourcePropertiesDocument propertiesDocument = bookInstance.getResourceProperties(resourcePath); 130 String mimeType = (propertiesDocument != null && propertiesDocument.getResourceProperties() != null) ? propertiesDocument.getResourceProperties().getMimeType() : null; 131 if (mimeType != null) { 132 String extension = (String )fileExtensions.get(mimeType); 133 if (extension != null) 134 newResourcePath = newResourcePath + extension; 135 } 136 137 InputStream is = null; 138 try { 139 is = bookInstance.getResource(resourcePath); 140 bookInstance.storeResource(outputPath + newResourcePath, is); 141 } finally { 142 if (is != null) 143 try { 144 is.close(); 145 } catch (IOException e) { 146 throw new SAXException (e); 147 } 148 } 149 150 String newSrc = newResourcePath.startsWith("output/") ? newResourcePath.substring("output/".length()) : newResourcePath; 151 return newSrc; 152 } 153 } 154 } 155 | Popular Tags |