/* * JBoss, Home of Professional Open Source. * Copyright 2011, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * 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, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.jdr.util; import org.jboss.as.jdr.commands.JdrEnvironment; import org.jboss.vfs.VirtualFile; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipOutputStream; import static org.jboss.as.jdr.logger.JdrLogger.ROOT_LOGGER; /** * Abstracts the zipfile used for packaging the JDR Report. */ public class JdrZipFile { ZipOutputStream zos; String jbossHome; JdrEnvironment env; String name; String baseName; public JdrZipFile(JdrEnvironment env) throws Exception { this.env = env; this.jbossHome = this.env.getJbossHome(); SimpleDateFormat fmt = new SimpleDateFormat("yy-MM-dd_hh-mm-ss"); baseName = "jdr_" + fmt.format(new Date()); if (this.env.getHostControllerName() != null) { this.baseName += "." + this.env.getHostControllerName(); } if (this.env.getServerName() != null) { this.baseName += "_" + this.env.getServerName(); } this.name = this.env.getOutputDirectory() + java.io.File.separator + baseName + ".zip"; zos = new ZipOutputStream(new FileOutputStream(this.name)); } /** * @return the full pathname to the zipfile on disk */ public String name() { return this.name; } /** * Adds the contents of the {@link InputStream} to the path in the zip. * * This method allows for absolute control of the destination of the content to be stored. * It is not common to use this method. * @param is content to write * @param path destination to write to in the zip file */ public void add(InputStream is, String path) { byte [] buffer = new byte[1024]; try { String entryName = this.baseName + "/" + path; ZipEntry ze = new ZipEntry(entryName); zos.putNextEntry(ze); int bytesRead = is.read(buffer); while( bytesRead > -1 ) { zos.write(buffer, 0, bytesRead); bytesRead = is.read(buffer); } } catch (ZipException ze) { ROOT_LOGGER.debugf(ze, "%s is already in the zip", path); } catch (Exception e) { ROOT_LOGGER.debugf(e, "Error when adding %s", path); } finally { try { zos.closeEntry(); } catch (Exception e) { ROOT_LOGGER.debugf(e, "Error when closing entry for %s", path); } } } /** * Adds the content of the {@link InputStream} to the zip in a location that mirrors where {@link VirtualFile file} is located. * * For example if {@code file} is at {@code /tmp/foo/bar} and {@code $JBOSS_HOME} is {@code tmp} then the destination will be {@code JBOSSHOME/foo/bar} * * @param file {@link VirtualFile} where metadata is read from * @param is content to write to the zip file * @throws Exception */ public void add(VirtualFile file, InputStream is) throws Exception { String name = "JBOSS_HOME" + file.getPhysicalFile().getAbsolutePath().substring(this.jbossHome.length()); this.add(is, name); } /** * Adds content to the zipfile at path * * path is prepended with the directory reserved for generated text files in JDR * * @param content * @param path * @throws Exception */ public void add(String content, String path) throws Exception { StringBuilder name = new StringBuilder("sos_strings/"); name.append(this.env.getProductName().replace(" ", "_").toLowerCase()); name.append("-"); name.append(this.env.getProductVersion().split("\\.")[0]); name.append("/"); name.append(path); this.add(new ByteArrayInputStream(content.getBytes()), name.toString()); } /** * Adds content to the zipfile at path * * path is prepended with the directory reserved for generated text files in JDR * * @param stream * @param path * @throws Exception */ public void addAsString(InputStream stream, String path) throws Exception { StringBuilder name = new StringBuilder("sos_strings/"); name.append(this.env.getProductName().replace(" ", "_").toLowerCase()); name.append("-"); name.append(this.env.getProductVersion().split("\\.")[0]); name.append("/"); name.append(path); this.add(stream, name.toString()); } /** * Adds content to the zipfile in a file named logName * * path is prepended with the directory reserved for JDR log files * * @param content * @param logName * @throws Exception */ public void addLog(String content, String logName) throws Exception { String name = "sos_logs/" + logName; this.add(new ByteArrayInputStream(content.getBytes()), name); } public void close() throws Exception { this.zos.close(); } }