KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > books > publisher > impl > BookPublishTask


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;
17
18 import org.outerj.daisy.repository.*;
19 import org.outerj.daisy.books.store.BookInstance;
20 import org.outerj.daisy.books.store.BookInstanceMetaData;
21 import org.outerj.daisy.books.publisher.impl.bookmodel.BookBuilder;
22 import org.outerj.daisy.books.publisher.impl.bookmodel.Book;
23 import org.outerj.daisy.books.publisher.impl.dataretrieval.BookDataRetrievalProcess;
24 import org.outerj.daisy.books.publisher.impl.publicationtype.PublicationTypeBuilder;
25 import org.outerj.daisy.books.publisher.impl.publicationtype.PublicationType;
26 import org.outerj.daisy.books.publisher.impl.publicationtype.AggregatedPartDecider;
27 import org.outerj.daisy.books.publisher.impl.util.PublicationLog;
28 import org.outerj.daisy.books.publisher.impl.util.XMLPropertiesHelper;
29 import org.outerj.daisy.books.publisher.PublicationSpec;
30 import org.apache.avalon.framework.service.ServiceManager;
31 import org.apache.avalon.framework.context.Context;
32 import org.apache.xmlbeans.XmlOptions;
33
34 import java.io.InputStream JavaDoc;
35 import java.io.OutputStream JavaDoc;
36 import java.util.*;
37
38 public class BookPublishTask {
39     private Repository repository;
40     private ServiceManager serviceManager;
41     private Context context;
42     private String JavaDoc daisyContextPath;
43     private String JavaDoc daisyCocoonPath;
44     private BookInstance bookInstance;
45     private VariantKey bookDefinition;
46     private PublicationSpec[] publicationSpecs;
47     private long dataBranchId;
48     private long dataLanguageId;
49     private Locale locale;
50     private String JavaDoc dataVersion;
51     private String JavaDoc[] state = new String JavaDoc[] {"bookstate.starting"};
52
53     BookPublishTask(VariantKey bookDefintion, long dataBranchId, long dataLanguageId, String JavaDoc dataVersion, Locale locale,
54                     PublicationSpec[] specs, BookInstance bookInstance, String JavaDoc daisyContextPath,
55                     String JavaDoc daisyCocoonPath, Repository repository, ServiceManager serviceManager, Context context) {
56         this.serviceManager = serviceManager;
57         this.context = context;
58         this.bookInstance = bookInstance;
59         this.daisyContextPath = daisyContextPath;
60         this.daisyCocoonPath = daisyCocoonPath;
61         this.bookDefinition = bookDefintion;
62         this.repository = repository;
63         this.publicationSpecs = specs;
64         this.dataBranchId = dataBranchId;
65         this.dataLanguageId = dataLanguageId;
66         this.locale = locale;
67         this.dataVersion = dataVersion;
68     }
69
70     public void run() {
71         PublicationLog publicationLog = null;
72         try {
73             publicationLog = new PublicationLog(bookInstance);
74             publicationLog.info("Starting");
75
76             state = new String JavaDoc[] {"bookstate.initializing"};
77             Document bookDefDoc = repository.getDocument(bookDefinition, false);
78             Version bookDefDocVersion = bookDefDoc.getLiveVersion();
79             if (bookDefDocVersion == null)
80                 throw new Exception JavaDoc("Book definition document does not have a live version.");
81
82             Map bookMetaData = getBookMetadata(bookDefDocVersion);
83
84             Part bookDefinitionPart = bookDefDocVersion.getPart("BookDefinitionDescription");
85             BookBuilder bookBuilder = new BookBuilder(repository, dataBranchId, dataLanguageId);
86
87             Book book;
88             InputStream JavaDoc is = bookDefinitionPart.getDataStream();
89             try {
90                 book = bookBuilder.buildBook(is);
91             } finally {
92                 is.close();
93             }
94
95             String JavaDoc bookPath = bookDefDoc.hasField("BookPath") ? (String JavaDoc)bookDefDoc.getField("BookPath").getValue() : "";
96             BookInstanceMetaData metaData = bookInstance.getMetaData();
97             metaData.setBookPath(bookPath + "/" + bookMetaData.get("title"));
98             bookInstance.setMetaData(metaData);
99
100             PublicationType[] publicationTypes = new PublicationType[publicationSpecs.length];
101             for (int i = 0; i < publicationSpecs.length; i++) {
102                 PublicationSpec spec = publicationSpecs[i];
103                 publicationTypes[i] = PublicationTypeBuilder.build(spec.getPublicationTypeName(), daisyContextPath, serviceManager);
104             }
105
106             state = new String JavaDoc[] {"bookstate.retrieving-data"};
107             BookDataRetrievalProcess bookDataRetrievalProcess = new BookDataRetrievalProcess(repository, dataBranchId, dataLanguageId, locale, dataVersion, book, bookInstance, new AggregatedPartDecider(publicationTypes), publicationLog);
108             bookDataRetrievalProcess.run();
109
110             // Save a copy of the publication specs
111
OutputStream JavaDoc pubSpecsStream = bookInstance.getResourceOutputStream(BookInstanceLayout.getPublicationSpecsPath());
112             try {
113                 XmlOptions xmlOptions = new XmlOptions();
114                 xmlOptions.setSavePrettyPrint();
115                 PublicationSpec.getXml(publicationSpecs).save(pubSpecsStream);
116             } finally {
117                 pubSpecsStream.close();
118             }
119
120             for (int i = 0; i < publicationTypes.length; i++) {
121                 PublicationSpec spec = publicationSpecs[i];
122                 state = new String JavaDoc[] {"bookstate.publishing", spec.getPublicationTypeName(), spec.getPublicationOutputName()};
123                 publicationTypes[i].publishBook(book, bookInstance, spec.getPublicationOutputName(), spec.getPublicationOutputLabel(),
124                         spec.getPublicationProperties(), bookMetaData, repository, serviceManager, context, daisyContextPath, daisyCocoonPath, locale, publicationLog);
125             }
126
127             publicationLog.info("Finished");
128             state = new String JavaDoc[] {"bookstate.finished"};
129         } catch (Throwable JavaDoc e) {
130             publicationLog.error("Error producing book.", e);
131         } finally {
132             if (publicationLog != null)
133                 try { publicationLog.dispose(); } catch (Throwable JavaDoc e) { /* ignore */ }
134         }
135     }
136
137     public String JavaDoc[] getState() {
138         return state;
139     }
140
141     public Repository getRepository() {
142         return repository;
143     }
144
145     private Map getBookMetadata(Version bookDefDocVersion) throws Exception JavaDoc {
146         Map bookMetaData;
147
148         if (bookDefDocVersion.hasPart("BookMetadata")) {
149             Part bookMetadataPart = bookDefDocVersion.getPart("BookMetadata");
150             InputStream JavaDoc is = bookMetadataPart.getDataStream();
151             try {
152                 bookMetaData = XMLPropertiesHelper.load(is, "metadata");
153             } finally {
154                 is.close();
155             }
156         } else {
157             bookMetaData = new HashMap();
158         }
159
160         if (!bookMetaData.containsKey("title")) {
161             bookMetaData.put("title", "Book Without Title");
162         }
163
164         return bookMetaData;
165     }
166
167     public BookInstance getBookInstance() {
168         return bookInstance;
169     }
170 }
171
Popular Tags