1 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 ; 35 import java.io.OutputStream ; 36 import java.util.*; 37 38 public class BookPublishTask { 39 private Repository repository; 40 private ServiceManager serviceManager; 41 private Context context; 42 private String daisyContextPath; 43 private String 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 dataVersion; 51 private String [] state = new String [] {"bookstate.starting"}; 52 53 BookPublishTask(VariantKey bookDefintion, long dataBranchId, long dataLanguageId, String dataVersion, Locale locale, 54 PublicationSpec[] specs, BookInstance bookInstance, String daisyContextPath, 55 String 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 [] {"bookstate.initializing"}; 77 Document bookDefDoc = repository.getDocument(bookDefinition, false); 78 Version bookDefDocVersion = bookDefDoc.getLiveVersion(); 79 if (bookDefDocVersion == null) 80 throw new Exception ("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 is = bookDefinitionPart.getDataStream(); 89 try { 90 book = bookBuilder.buildBook(is); 91 } finally { 92 is.close(); 93 } 94 95 String bookPath = bookDefDoc.hasField("BookPath") ? (String )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 [] {"bookstate.retrieving-data"}; 107 BookDataRetrievalProcess bookDataRetrievalProcess = new BookDataRetrievalProcess(repository, dataBranchId, dataLanguageId, locale, dataVersion, book, bookInstance, new AggregatedPartDecider(publicationTypes), publicationLog); 108 bookDataRetrievalProcess.run(); 109 110 OutputStream 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 [] {"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 [] {"bookstate.finished"}; 129 } catch (Throwable e) { 130 publicationLog.error("Error producing book.", e); 131 } finally { 132 if (publicationLog != null) 133 try { publicationLog.dispose(); } catch (Throwable e) { } 134 } 135 } 136 137 public String [] getState() { 138 return state; 139 } 140 141 public Repository getRepository() { 142 return repository; 143 } 144 145 private Map getBookMetadata(Version bookDefDocVersion) throws Exception { 146 Map bookMetaData; 147 148 if (bookDefDocVersion.hasPart("BookMetadata")) { 149 Part bookMetadataPart = bookDefDocVersion.getPart("BookMetadata"); 150 InputStream 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 |