/* * eID Applet Project. * Copyright (C) 2010-2011 FedICT. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version * 3.0 as published by the Free Software Foundation. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, see * http://www.gnu.org/licenses/. */ package be.fedict.eid.applet.service.signer.asic; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * ASiC signature output stream. * <p/> * This output stream implementation injects an ASiC signature into an ASiC * file. * * @author Frank Cornelis. * */ public class ASiCSignatureOutputStream extends ByteArrayOutputStream { private static final Log LOG = LogFactory.getLog(ASiCSignatureOutputStream.class); private final File originalZipFile; private final OutputStream targetOutputStream; /** * Main constructor. * * @param originalZipFile * the original ASiC document. * @param targetOutputStream * the output stream in which to copy the original ASiC document, * together with the new ASiC signature. */ public ASiCSignatureOutputStream(File originalZipFile, OutputStream targetOutputStream) { this.originalZipFile = originalZipFile; this.targetOutputStream = targetOutputStream; } @Override public void close() throws IOException { super.close(); byte[] signatureData = toByteArray(); /* * Copy the original ZIP content. */ ZipOutputStream zipOutputStream = new ZipOutputStream(this.targetOutputStream); ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(this.originalZipFile)); ZipEntry zipEntry; while (null != (zipEntry = zipInputStream.getNextEntry())) { if (!zipEntry.getName().equals(ASiCUtil.SIGNATURE_FILE)) { ZipEntry newZipEntry = new ZipEntry(zipEntry.getName()); zipOutputStream.putNextEntry(newZipEntry); LOG.debug("copying " + zipEntry.getName()); IOUtils.copy(zipInputStream, zipOutputStream); } } zipInputStream.close(); /* * Add the XML signature file to the ASiC package. */ zipEntry = new ZipEntry(ASiCUtil.SIGNATURE_FILE); LOG.debug("writing " + zipEntry.getName()); zipOutputStream.putNextEntry(zipEntry); IOUtils.write(signatureData, zipOutputStream); zipOutputStream.close(); } }