Java tutorial
/** * EasySOA Registry * Copyright 2011 Open Wide * * This program 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 3 of the License, or * (at your option) any later version. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Contact : easysoa-dev@googlegroups.com */ package org.easysoa.registry.frascati; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.nio.channels.FileChannel; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class FileUtils { private static Log log = LogFactory.getLog(FileUtils.class); /** * Copied from AssemblyFactoryManager * Stream copy - used to extract entries from contribution ZIP. * @param in input stream * @param out output stream * @throws IOException */ public static final void copy(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024 * 64]; int len; while ((len = in.read(buffer)) >= 0) { out.write(buffer, 0, len); } in.close(); out.close(); } /** * Unzips the given jar in a temp file and returns its files' URLs Inspired * from AssemblyFactoryManager.processContribution() (though doesn't add it * to the classloader or parse composites) * TODO move to util TODO better : delete temp files afterwards (or mark them so) OR rather use jar:url ? * @param SCA zip or jar * @return unzipped composites URLs * @throws ManagerException */ public static final Set<URL> unzipAndGetFileUrls(File file) { try { // Load contribution zip file ZipFile zipFile = new ZipFile(file); // Get folder name for output final String folder = zipFile.getName().substring(zipFile.getName().lastIndexOf(File.separator), zipFile.getName().length() - ".zip".length()); Set<URL> fileURLSet = new HashSet<URL>(); // Set directory for extracted files // TODO : use system temp directory but should use output folder // given by // runtime component. Will be possible once Assembly Factory modules // will // be merged final String tempDir = System.getProperty("java.io.tmpdir") + File.separator + folder + File.separator; Enumeration<? extends ZipEntry> entries = zipFile.entries(); // Iterate over zip entries while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); log.info("ZIP entry: " + entry.getName()); // create directories if (entry.isDirectory()) { log.info("create directory : " + tempDir + entry.getName()); new File(tempDir, entry.getName()).mkdirs(); } else { File f = new File(tempDir, File.separator + entry.getName()); // register jar files int idx = entry.getName().lastIndexOf(File.separator); if (idx != -1) { String tmp = entry.getName().substring(0, idx); log.info("create directory : " + tempDir + tmp); new File(tempDir, tmp).mkdirs(); } // extract entry from zip to tempDir copy(zipFile.getInputStream(entry), new BufferedOutputStream(new FileOutputStream(f))); // add to res set fileURLSet.add(f.toURI().toURL()); } } return fileURLSet; } catch (IOException e) { log.error(e); return new HashSet<URL>(0); } } /** * Copy a file in an other file * * @param source The source file * @param target The target file * @throws Exception If a problem occurs */ public static final void copyTo(File source, File target) throws Exception { if (source == null || target == null) { throw new IllegalArgumentException("Source and target files must not be null"); } // Input and outputs channels log.debug("source file = " + source); log.debug("target file = " + target); FileChannel in = null; FileChannel out = null; try { // Init in = new FileInputStream(source).getChannel(); out = new FileOutputStream(target).getChannel(); // File copy in.transferTo(0, in.size(), out); } catch (Exception ex) { throw ex; } finally { // finally close all streams if (in != null) { try { in.close(); } catch (IOException e) { } } if (out != null) { try { out.close(); } catch (IOException e) { } } } } }