/* * ### * Phresco Service Implemenation * * Copyright (C) 1999 - 2012 Photon Infotech Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ### */ /******************************************************************************* * Copyright (c) 2011 Photon. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Photon Public License v1.0 * which accompanies this distribution, and is available at * http://www.photon.in/legal/ppl-v10.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Photon - initial API and implementation ******************************************************************************/ package com.photon.phresco.service.docs.impl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.BadPdfFormatException; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfWriter; import com.photon.phresco.exception.PhrescoException; import com.photon.phresco.model.Documentation; import com.photon.phresco.model.Documentation.DocumentationType; import com.photon.phresco.model.ModuleGroup; import com.photon.phresco.model.ProjectInfo; import com.photon.phresco.service.api.RepositoryManager; import com.photon.phresco.service.model.EntityType; /** * Document Util to process PDF documents * */ public final class DocumentUtil { private static final Logger S_LOGGER = Logger.getLogger(DocumentUtil.class); private static Boolean isDebugEnabled = S_LOGGER.isDebugEnabled(); private static String coreModule = "COREMODULE"; private static String externalModule = "EXTERNALMODULE"; private DocumentUtil(){ } /** * Adds title section. * @param info the project info object * @return PDF input stream * @throws DocumentException */ public static InputStream getTitleSection(ProjectInfo info) throws DocumentException{ if (isDebugEnabled) { S_LOGGER.debug(" Entering Method DocumentUtil.getTitleSection(ProjectInfo info)"); } if (isDebugEnabled) { S_LOGGER.debug("getTitleSection() projectCode="+info.getCode()); } //create output stream com.itextpdf.text.Document docu = new com.itextpdf.text.Document(); ByteArrayOutputStream os = new ByteArrayOutputStream(); PdfWriter.getInstance(docu, os); docu.open(); //add standard title section with supplied info object Paragraph paragraph = new Paragraph(); paragraph.setAlignment(Element.ALIGN_CENTER); paragraph.setFont(DocConstants.TITLE_FONT); addBlankLines(paragraph, 10); paragraph.add(info.getName()); addBlankLines(paragraph, 4); docu.add(paragraph); paragraph = new Paragraph(); paragraph.setAlignment(Element.ALIGN_CENTER); addBlankLines(paragraph, 10); String techName = info.getTechnology().getName(); if(info.getTechnology().getVersions() != null) { paragraph.add(techName + " - " + info.getTechnology().getVersions().get(0)); } else { paragraph.add(techName); } docu.add(paragraph); paragraph = new Paragraph(); addBlankLines(paragraph, 10); paragraph.setAlignment(Element.ALIGN_CENTER); paragraph.add(DocumentMessages.getString("Documents.version.name")+getVersion(info)); //$NON-NLS-1$ addBlankLines(paragraph, 7); docu.add(paragraph); paragraph = new Paragraph(); paragraph.setAlignment(Element.ALIGN_RIGHT); paragraph.setFont(DocConstants.DESC_FONT); paragraph.setFirstLineIndent(8); paragraph.add(info.getDescription()); docu.add(paragraph); docu.close(); //Create an inputstream to return. return new ByteArrayInputStream(os.toByteArray()); } /** * @param info * @return */ private static String getVersion(ProjectInfo info) { if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.getVersion(ProjectInfo info)"); } if (isDebugEnabled) { S_LOGGER.debug("getVersion() ProjectCode="+ info.getCode()); } String version = info.getVersion(); if(org.apache.commons.lang.StringUtils.isEmpty(version)){ return DocumentMessages.getString("Documents.default.version"); //$NON-NLS-1$ } return version; } /** * Creates and returns PDF input stream for the supplied string. * @param string to be printed in the PDF * @return PDF input stream. * @throws DocumentException */ public static InputStream getStringAsPDF(String string) throws DocumentException{ if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.getStringAsPDF(String string)"); } com.itextpdf.text.Document docu = new com.itextpdf.text.Document(); ByteArrayOutputStream os = new ByteArrayOutputStream(); PdfWriter.getInstance(docu, os); docu.open(); Paragraph paragraph = new Paragraph(); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setFirstLineIndent(180); paragraph.add("\n"); //$NON-NLS-1$ paragraph.add(string); paragraph.add("\n\n"); //$NON-NLS-1$ docu.add(paragraph); docu.close(); //Create an inputstream to return. return new ByteArrayInputStream(os.toByteArray()); } /** * Process tuple beans to generate Documnets for a speific entity type. * @param dependencyManager dependency manager * @param modules list of tuple beans * @param type Entity type * @return PDF input stream. * @throws PhrescoException * @throws DocumentException * @throws IOException */ public static InputStream getDocumentStream(List<ModuleGroup> modules, String moduleType) throws PhrescoException, DocumentException, IOException { if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.getDocumentStream(RepositoryManager repoManager,List<TupleBean> modules, EntityType type)"); } if(modules!= null && !modules.isEmpty()){ com.itextpdf.text.Document docu = new com.itextpdf.text.Document(); ByteArrayOutputStream os = new ByteArrayOutputStream(); PdfWriter writer = PdfWriter.getInstance(docu, os); docu.open(); if(moduleType.equals("Modules")) { List<ModuleGroup> coreModules = new ArrayList<ModuleGroup>(); List<ModuleGroup> externalModules = new ArrayList<ModuleGroup>(); for (ModuleGroup moduleGroup : modules) { if (moduleGroup.isCore()) { coreModules.add(moduleGroup); } if (!moduleGroup.isCore()) { externalModules.add(moduleGroup); } } if (coreModules != null && CollectionUtils.isNotEmpty(coreModules) && moduleType.equals("Modules")) { updateDoc(coreModules, docu, writer, coreModule); } if (externalModules != null && CollectionUtils.isNotEmpty(externalModules) && moduleType.equals("Modules")) { updateDoc(externalModules, docu, writer, externalModule); } } if (moduleType.equals("JsLibraries")) { updateDoc(modules, docu, writer, moduleType); } docu.close(); return new ByteArrayInputStream(os.toByteArray()); } return null; } private static void updateDoc(List<ModuleGroup> modules, com.itextpdf.text.Document docu, PdfWriter writer, String moduleName) throws DocumentException, PhrescoException, IOException { Paragraph para = new Paragraph(); para.setAlignment(Element.ALIGN_CENTER); para.setFont(DocConstants.BODY_FONT); para.setFont(DocConstants.CATEGORY_FONT); para.add(moduleName); addBlankLines(para, 2); docu.add(para); for (ModuleGroup tupleBean : modules) { para = new Paragraph(); para.setFont(DocConstants.CATEGORY_FONT); para.add(tupleBean.getName()); docu.add(para); Documentation document = tupleBean.getDoc(DocumentationType.DESCRIPTION); if (document != null) { if(!StringUtils.isEmpty(document.getUrl())){ PdfInput convertToPdf = DocConvertor.convertToPdf(document.getUrl()); if(convertToPdf != null) { DocumentUtil.addPages(convertToPdf.getInputStream(), writer, docu); } } else { para = new Paragraph(); para.setFont(DocConstants.BODY_FONT); para.add(document.getContent()); addBlankLines(para, 2); docu.add(para); } } } } /** * Adds blank lines into the supplied paragraph. * @param p the Paragraph object * @param noOfLines no of blank lines. */ private static void addBlankLines(Paragraph p, int noOfLines){ if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.addBlankLines(Paragraph p, int noOfLines)"); } if (isDebugEnabled) { S_LOGGER.debug("addBlankLines() No of Lines="+noOfLines); } StringBuffer sb =new StringBuffer(); for (int i = 0; i < noOfLines; i++) { sb.append("\n"); //$NON-NLS-1$ } p.add(sb.toString()); } /** * @param titleSection * @param pdfCopy * @throws IOException * @throws BadPdfFormatException */ public static void addPages(InputStream titleSection, PdfCopy pdfCopy) throws IOException, BadPdfFormatException { if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.addPages(InputStream titleSection, PdfCopy pdfCopy)"); } PdfReader reader = new PdfReader(titleSection); reader.consolidateNamedDestinations(); int pages = reader.getNumberOfPages(); for (int i = 1; i <= pages; i++) { PdfImportedPage importedPage = pdfCopy.getImportedPage(reader, i); pdfCopy.addPage(importedPage); } pdfCopy.freeReader(reader); } /** * @param titleSection * @param writer * @param docu * @throws IOException * @throws DocumentException */ public static void addPages(InputStream titleSection, PdfWriter writer, com.itextpdf.text.Document docu) throws IOException, DocumentException { if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.addPages(InputStream titleSection, PdfWriter writer, com.itextpdf.text.Document docu)"); } PdfReader reader = new PdfReader(titleSection); reader.consolidateNamedDestinations(); PdfContentByte cb = writer.getDirectContent(); int pages = reader.getNumberOfPages(); for (int i = 1; i <= pages; i++) { PdfImportedPage importedPage = writer.getImportedPage(reader, i); cb.addTemplate(importedPage, 0,0); docu.newPage(); } } /** * @param dependencyManager * @param tuples * @param type * @param pdfCopy * @return * @throws PhrescoException * @throws DocumentException * @throws IOException * @throws BadPdfFormatException */ public static InputStream addPages(List<ModuleGroup> tuples, PdfCopy pdfCopy, String moduleType) throws PhrescoException, DocumentException, IOException { if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.addPages(RepositoryManager repoManager,List<TupleBean> tuples, EntityType type, PdfCopy pdfCopy)"); } InputStream addDocumentInfo = getDocumentStream(tuples, moduleType); if(addDocumentInfo !=null) { addPages(addDocumentInfo, pdfCopy); } return addDocumentInfo; } /** * @param folder * @return */ public static String getIndexHtml(File folder) { if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.getIndexHtml(File folder)"); } if (isDebugEnabled) { S_LOGGER.debug("getIndexHtml() folder="+folder.getPath()); } StringBuffer sb = new StringBuffer(); sb.append("<html>"); //$NON-NLS-1$ sb.append("<body>"); //$NON-NLS-1$ sb.append("<h1>"); //$NON-NLS-1$ sb.append(DocumentMessages.getString("Documents.document.index.title")); //$NON-NLS-1$ sb.append("</h1>"); //$NON-NLS-1$ listFiles(folder, sb); sb.append("</body>"); //$NON-NLS-1$ sb.append("</html>"); //$NON-NLS-1$ return sb.toString(); } private static void listFiles(File file,StringBuffer sb) { if (isDebugEnabled) { S_LOGGER.debug("Entering Method DocumentUtil.listFiles(File file,StringBuffer sb)"); } String[] list = file.list(); sb.append("<ul>"); //$NON-NLS-1$ for (String fileOrFolder : list) { File newFile = new File(file.toString()+File.separator+fileOrFolder); if(newFile.isHidden()) continue; /*if(newFile.isDirectory()){ sb.append("<li>"); //$NON-NLS-1$ sb.append("<a href=./"); //$NON-NLS-1$ sb.append(newFile.getName()); sb.append("\">"); //$NON-NLS-1$ sb.append(newFile.getPath()); sb.append("</a>"); //$NON-NLS-1$ sb.append("</li>"); //$NON-NLS-1$ listFiles(newFile, sb); } else {*/ sb.append("<li>"); //$NON-NLS-1$ sb.append("<a href="+"\""+"./"); //$NON-NLS-1$ sb.append(newFile.getName()); sb.append("\">"); //$NON-NLS-1$ sb.append(newFile.getName()); sb.append("</a>"); //$NON-NLS-1$ sb.append("</li>"); //$NON-NLS-1$ // } } sb.append("</ul>"); //$NON-NLS-1$ } }