1 16 package org.outerj.daisy.books.publisher.impl.cocooncomponents; 17 18 import org.apache.cocoon.transformation.AbstractTransformer; 19 import org.apache.cocoon.environment.SourceResolver; 20 import org.apache.cocoon.ProcessingException; 21 import org.apache.cocoon.components.flow.FlowHelper; 22 import org.apache.cocoon.xml.AttributesImpl; 23 import org.apache.avalon.framework.parameters.Parameters; 24 import org.apache.commons.jxpath.JXPathContext; 25 import org.apache.excalibur.source.Source; 26 import org.xml.sax.SAXException ; 27 import org.xml.sax.Attributes ; 28 import org.outerj.daisy.books.store.BookInstance; 29 import org.outerj.daisy.books.publisher.impl.BookInstanceLayout; 30 31 import java.util.Map ; 32 import java.io.IOException ; 33 34 public class PdfImageLinkTransformer extends AbstractTransformer { 35 private BookInstance bookInstance; 36 private String publicationTypesUri; 37 private String publicationOutputName; 38 private static final String XSL_FO_NS = "http://www.w3.org/1999/XSL/Format"; 39 40 public void setup(SourceResolver sourceResolver, Map objectModel, String string, Parameters parameters) throws ProcessingException, SAXException , IOException { 41 Object flowContext = FlowHelper.getContextObject(objectModel); 42 JXPathContext jxpc = JXPathContext.newContext(flowContext); 43 bookInstance = (BookInstance)jxpc.getValue("/bookInstance"); 44 if (bookInstance == null) 45 throw new ProcessingException("Missing 'bookInstance' in flow context."); 46 47 publicationOutputName = (String )jxpc.getValue("/publicationOutputName"); 48 49 Source source = null; 50 try { 51 source = sourceResolver.resolveURI(""); 54 publicationTypesUri = source.getURI(); 55 } finally { 56 sourceResolver.release(source); 57 } 58 } 59 60 public void startElement(String namespaceURI, String localName, String qName, Attributes attributes) throws SAXException { 61 if (namespaceURI.equals(XSL_FO_NS) && localName.equals("external-graphic")) { 62 attributes = handleLinkAttribute(attributes, "src"); 63 } 64 super.startElement(namespaceURI, localName, qName, attributes); 65 } 66 67 private Attributes handleLinkAttribute(Attributes attributes, String linkAttrName) { 68 String linkAttr = attributes.getValue(linkAttrName); 69 if (linkAttr != null) { 70 String uri = linkAttr; 71 if (linkAttr.startsWith("bookinstance:")) { 72 uri = bookInstance.getResourceURI(linkAttr.substring("bookinstance:".length())).toString(); 73 } else if (linkAttr.startsWith("publication:")) { 74 uri = bookInstance.getResourceURI(BookInstanceLayout.getPublicationOutputPath(publicationOutputName) + linkAttr.substring("publication:".length())).toString(); 75 } else if (linkAttr.startsWith("publicationtype:")) { 76 uri = publicationTypesUri + "/" + linkAttr.substring("publicationtype:".length()); 77 } 78 AttributesImpl newAttrs = new AttributesImpl(attributes); 79 newAttrs.setValue(attributes.getIndex(linkAttrName), "url(" + uri + ")"); 80 attributes = newAttrs; 81 } 82 return attributes; 83 } 84 } 85 | Popular Tags |