/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.test.internal; import java.io.InputStream; import java.net.URL; import java.util.Map; import java.util.jar.Attributes; import java.util.jar.JarInputStream; import java.util.jar.Manifest; import junit.framework.TestCase; import org.eclipse.gemini.blueprint.test.internal.util.IOUtils; import org.eclipse.gemini.blueprint.test.internal.util.jar.JarCreator; import org.eclipse.gemini.blueprint.test.internal.util.jar.storage.MemoryStorage; import org.eclipse.gemini.blueprint.test.internal.util.jar.storage.Storage; /** * @author Costin Leau * */ public class JarCreatorTests extends TestCase { private JarCreator creator; private Storage storage; protected void setUp() throws Exception { creator = new JarCreator(); storage = new MemoryStorage(); creator.setStorage(storage); } protected void tearDown() throws Exception { storage.dispose(); } public void testJarCreation() throws Exception { final Manifest mf = new Manifest(); Map entries = mf.getEntries(); Attributes attrs = new Attributes(); attrs.putValue("rocco-ventrella", "winelight"); entries.put("test", attrs); String location = JarCreatorTests.class.getName().replace('.', '/') + ".class"; // get absolute file location // file:/...s/org/eclipse/gemini/blueprint/test/JarCreatorTests.class final URL clazzURL = getClass().getClassLoader().getResource(location); // go two folders above // ...s/org/springframework/ String rootPath = new URL(clazzURL, "../../").toExternalForm(); String firstLevel = new URL(clazzURL, "../").toExternalForm().substring(rootPath.length()); // get file folder String secondLevel = new URL(clazzURL, ".").toExternalForm().substring(rootPath.length()); // now determine the file relative to the root String file = clazzURL.toExternalForm().substring(rootPath.length()); // create a simple jar from a given class and a manifest creator.setContentPattern(new String[] { file }); creator.setRootPath(rootPath); creator.setAddFolders(true); System.out.println("creating jar with just one file " + file + " from root " + rootPath); // create the jar creator.createJar(mf); // start reading the jar JarInputStream jarStream = null; try { jarStream = new JarInputStream(storage.getInputStream()); // get manifest assertEquals("original manifest not found", mf, jarStream.getManifest()); // move the jar stream to the first entry (which should be META-INF/ folder) String entryName = jarStream.getNextEntry().getName(); assertEquals("META-INF/ not found", "META-INF/", entryName); entryName = jarStream.getNextEntry().getName(); assertEquals("folders above the file not included", firstLevel, entryName); entryName = jarStream.getNextEntry().getName(); assertEquals("file folder not included", secondLevel, entryName); // now get the file jarStream.getNextEntry(); // open the original file InputStream originalFile = clazzURL.openStream(); int b; while ((b = originalFile.read()) != -1) assertEquals("incorrect jar content", b, jarStream.read()); } finally { IOUtils.closeStream(jarStream); } } }