KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > books > publisher > impl > publicationprocess > CopyBookInstanceResourcesTask


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

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 JavaDoc;
24 import org.xml.sax.ContentHandler JavaDoc;
25 import org.xml.sax.Attributes JavaDoc;
26 import org.xml.sax.SAXException JavaDoc;
27 import org.outerx.daisy.x10Bookstoremeta.ResourcePropertiesDocument;
28 import org.apache.cocoon.xml.AttributesImpl;
29
30 import javax.xml.parsers.SAXParser JavaDoc;
31 import java.util.Map JavaDoc;
32 import java.util.HashMap JavaDoc;
33 import java.io.InputStream JavaDoc;
34 import java.io.OutputStream JavaDoc;
35 import java.io.IOException JavaDoc;
36
37 public class CopyBookInstanceResourcesTask implements PublicationProcessTask {
38     private final String JavaDoc input;
39     private final String JavaDoc output;
40     private final String JavaDoc baseToPath;
41     private static Map JavaDoc fileExtensions = new HashMap JavaDoc();
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 JavaDoc input, String JavaDoc output, String JavaDoc baseToPath) {
50         this.input = input;
51         this.output = output;
52         this.baseToPath = baseToPath;
53     }
54
55     public void run(PublicationContext context) throws Exception JavaDoc {
56         context.getPublicationLog().info("Running copy book instance resources task.");
57
58         String JavaDoc publicationOutputPath = BookInstanceLayout.getPublicationOutputPath(context.getPublicationOutputName());
59         String JavaDoc inputXmlPath = publicationOutputPath + input;
60         String JavaDoc outputXmlPath = publicationOutputPath + output;
61         String JavaDoc outputPath = BookInstanceLayout.getPublicationOutputPath(context.getPublicationOutputName());
62
63         InputStream JavaDoc is = null;
64         OutputStream JavaDoc os = null;
65         try {
66             SAXParser JavaDoc 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 JavaDoc inputSource = new InputSource JavaDoc(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 JavaDoc outputPath;
85
86         public ImageCopyHandler(ContentHandler consumer, BookInstance bookInstance, String JavaDoc outputPath) {
87             super(consumer);
88             this.bookInstance = bookInstance;
89             this.outputPath = outputPath;
90         }
91
92         public void startElement(String JavaDoc namespaceURI, String JavaDoc localName, String JavaDoc qName, Attributes JavaDoc atts) throws SAXException JavaDoc {
93             if (namespaceURI.equals("")) {
94                 String JavaDoc 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 JavaDoc 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 JavaDoc handleLinkAttr(String JavaDoc href) throws SAXException JavaDoc {
117             if (href == null)
118                 return null;
119             if (!href.startsWith("bookinstance:"))
120                 return null;
121             if (href.startsWith("bookinstance:output/")) {
122                 // resource is already in output dir, just translate to relative link
123
return href.substring("bookinstance:output/".length());
124             }
125
126             String JavaDoc resourcePath = href.substring("bookinstance:".length());
127             String JavaDoc newResourcePath = baseToPath + href.substring(("bookinstance:" + BookInstanceLayout.geResourceStorePath()).length());
128
129             ResourcePropertiesDocument propertiesDocument = bookInstance.getResourceProperties(resourcePath);
130             String JavaDoc mimeType = (propertiesDocument != null && propertiesDocument.getResourceProperties() != null) ? propertiesDocument.getResourceProperties().getMimeType() : null;
131             if (mimeType != null) {
132                 String JavaDoc extension = (String JavaDoc)fileExtensions.get(mimeType);
133                 if (extension != null)
134                     newResourcePath = newResourcePath + extension;
135             }
136
137             InputStream JavaDoc 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 JavaDoc e) {
146                         throw new SAXException JavaDoc(e);
147                     }
148             }
149
150             String JavaDoc newSrc = newResourcePath.startsWith("output/") ? newResourcePath.substring("output/".length()) : newResourcePath;
151             return newSrc;
152         }
153     }
154 }
155
Popular Tags