/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.print;
import java.awt.print.Pageable;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import org.adempiere.pdf.Document;
import org.compiere.model.MArchive;
import org.compiere.model.MClient;
import org.compiere.model.PrintInfo;
import org.compiere.print.layout.LayoutEngine;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.jfree.io.IOUtils;
/**
* Archive Engine.
* Based on Settings on Client Level.
*
* Keys set for * - Menu Reports - AD_Report_ID * - Win Report - AD_Table_ID * - Documents - AD_Table_ID and Record_ID and C_Customer_ID ** @author Jorg Janke * @version $Id: ArchiveEngine.java,v 1.3 2006/07/30 00:53:02 jjanke Exp $ */ public class ArchiveEngine { /** * Get/Create Archive. * @param layout layout * @param info print info * @return existing document or newly created if Client enabled archiving. * Will return NULL if archiving not enabled */ public byte[] archive (LayoutEngine layout, PrintInfo info) { // Do we need to Archive ? MClient client = MClient.get(layout.getCtx()); String aaClient = client.getAutoArchive(); String aa = aaClient; if (aa == null) aa = MClient.AUTOARCHIVE_None; // Nothing to Archive if (aa.equals(MClient.AUTOARCHIVE_None)) return null; // Archive External only if (aa.equals(MClient.AUTOARCHIVE_ExternalDocuments)) { if (info.isReport()) return null; } // Archive Documents only if (aa.equals(MClient.AUTOARCHIVE_Documents)) { if (info.isReport()) return null; } // Create Printable byte[] data = Document.getPDFAsArray(layout.getPageable(false)); // No Copy if (data == null) return null; // TODO to be done async MArchive archive = new MArchive (layout.getCtx(),info, null); archive.setBinaryData(data); archive.saveEx(); return data; } // archive /** * Create Archive. * @param pdfFile * @param info print info */ public void archive (File pdfFile, PrintInfo info) { // Do we need to Archive ? MClient client = MClient.get(Env.getCtx()); String aaClient = client.getAutoArchive(); String aa = aaClient; if (aa == null) aa = MClient.AUTOARCHIVE_None; // Nothing to Archive if (aa.equals(MClient.AUTOARCHIVE_None)) return; // Archive External only if (aa.equals(MClient.AUTOARCHIVE_ExternalDocuments)) { if (info.isReport()) return; } // Archive Documents only if (aa.equals(MClient.AUTOARCHIVE_Documents)) { if (info.isReport()) return; } ByteArrayOutputStream bas = new ByteArrayOutputStream(); FileInputStream fis = null; try { fis = new FileInputStream(pdfFile); BufferedInputStream bis = new BufferedInputStream(fis); IOUtils.getInstance().copyStreams(bis, bas); } catch (FileNotFoundException e) { log.log(Level.SEVERE, e.getLocalizedMessage(), e); } catch (IOException e) { log.log(Level.SEVERE, e.getLocalizedMessage(), e); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) {} } } byte[] data = bas.toByteArray(); // TODO to be done async MArchive archive = new MArchive (Env.getCtx(),info, null); archive.setBinaryData(data); archive.saveEx(); } // archive /** * Can we archive the document? * @param layout layout * @return true if can be archived */ public static boolean isValid (LayoutEngine layout) { return (layout != null && Document.isValid((Pageable)layout) && layout.getNumberOfPages() > 0); } // isValid /** * Get Archive Engine * @return engine */ public static ArchiveEngine get() { if (s_engine == null) s_engine = new ArchiveEngine(); return s_engine; } // get // Create Archiver static { s_engine = new ArchiveEngine(); } /** Logger */ private static CLogger log = CLogger.getCLogger(ArchiveEngine.class); /** Singleton */ private volatile static ArchiveEngine s_engine = null; /** * ArchiveEngine */ private ArchiveEngine () { super (); if (s_engine == null) s_engine = this; } // ArchiveEngine } // ArchiveEngine