/******************************************************************************
* 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.iandt.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Enumeration;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.eclipse.gemini.blueprint.test.platform.OsgiPlatform;
import org.eclipse.gemini.blueprint.util.OsgiBundleUtils;
import org.eclipse.gemini.blueprint.util.OsgiStringUtils;
import org.springframework.util.FileCopyUtils;
/**
* @author Costin Leau
*/
public class OSGI723Test extends BaseIoTest {
private static boolean bundleInstalled = false;
private static final String SLASH = "/";
/**
* Add a bundle fragment.
*/
protected String[] getTestBundlesNames() {
return new String[0];
}
protected String getManifestLocation() {
return null;
}
protected void preProcessBundleContext(BundleContext platformBundleContext) throws Exception {
super.preProcessBundleContext(platformBundleContext);
if (!bundleInstalled) {
logger.info("Installing OSGi-723 bundle...");
InputStream stream = getClass().getResourceAsStream("/osgi-723.jar");
Bundle bundle = platformBundleContext.installBundle("osgi-723", stream);
bundle.start();
bundleInstalled = true;
}
}
public static void unpackBundle(Bundle bundle, File targetFolder) {
// no need to use a recursive method since we get all resources directly
Enumeration enm = bundle.findEntries(SLASH, null, true);
while (enm != null && enm.hasMoreElements()) {
// get only the path
URL url = (URL) enm.nextElement();
String entryPath = url.getPath();
if (entryPath.startsWith(SLASH))
entryPath = entryPath.substring(1);
File targetFile = new File(targetFolder, entryPath);
// folder are a special case, we have to create them rather then copy
if (entryPath.endsWith("/"))
targetFile.mkdirs();
else {
try {
File parent = targetFile.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
System.out.println(parent);
OutputStream targetStream = new FileOutputStream(targetFile);
System.err.println("Copying " + url + " to " + targetFile);
FileCopyUtils.copy(url.openStream(), targetStream);
}
catch (IOException ex) {
//
System.err.println("Cannot copy resource " + entryPath + ex);
throw (RuntimeException) new IllegalStateException("IO exception while unpacking bundle "
+ OsgiStringUtils.nullSafeNameAndSymName(bundle)).initCause(ex);
}
// no need to close the streams - the utils already handles that
}
}
}
public void testSpecialBundle() throws Exception {
Bundle bundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext, "issue.osgi-723");
System.out.println(bundle);
File tmpFile = File.createTempFile("tomcat-bla", ".osgi");
tmpFile.delete();
tmpFile.mkdir();
unpackBundle(bundle, tmpFile);
}
protected OsgiPlatform createPlatform() {
OsgiPlatform platform = super.createPlatform();
platform.getConfigurationProperties().setProperty("felix.fragment.validation", "warning");
return platform;
}
}