/****************************************************************************** * 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.InputStream; import java.net.URL; import java.util.Arrays; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.ResourcePatternResolver; import org.eclipse.gemini.blueprint.io.OsgiBundleResourceLoader; import org.eclipse.gemini.blueprint.io.OsgiBundleResourcePatternResolver; import org.eclipse.gemini.blueprint.util.OsgiBundleUtils; import org.springframework.util.ObjectUtils; /** * Integration test based on the bug report OSGI-799 regarding discovery of imported packages from the exporting bundle * w/o considering their bundle classpath. * * The test will install two bundle, one with a custom classpath exporting a package and the other importing that * particular package. * * @author Costin Leau */ public class OSGI799Test extends BaseIoTest { private static boolean customBundlesInstalled = false; private static final String EXPORT_BND = "org.eclipse.gemini.blueprint.bundle.osgi.io.test.osgi799.exp"; private static final String IMPORT_BND = "org.eclipse.gemini.blueprint.bundle.osgi.io.test.osgi799.imp"; /** * No dependencies installed (we'll do this manually for this test). */ protected String[] getTestBundlesNames() { return new String[0]; } protected String getManifestLocation() { return null; } protected void preProcessBundleContext(BundleContext platformBundleContext) throws Exception { super.preProcessBundleContext(platformBundleContext); if (!customBundlesInstalled) { logger.info("Installing custom bundles..."); InputStream stream = getClass().getResourceAsStream("/osgi-799-exp.jar"); assertNotNull(stream); Bundle bundle = platformBundleContext.installBundle("osgi-799-exp", stream); bundle.start(); stream = getClass().getResourceAsStream("/osgi-799-imp.jar"); bundle = platformBundleContext.installBundle("osgi-799-imp", stream); bundle.start(); customBundlesInstalled = true; } } protected String[] getBundleContentPattern() { return (String[]) ObjectUtils.addObjectToArray(super.getBundleContentPattern(), "bundleclasspath/**/*"); } /** * Resolves the pattern resolved for the exporting bundle using a custom classpath. * * @return */ protected ResourcePatternResolver getExporterPatternLoader() { Bundle bundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext, EXPORT_BND); ResourceLoader loader = new OsgiBundleResourceLoader(bundle); return new OsgiBundleResourcePatternResolver(loader); } protected ResourcePatternResolver getImporterPatternLoader() { Bundle bundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext, IMPORT_BND); ResourceLoader loader = new OsgiBundleResourceLoader(bundle); return new OsgiBundleResourcePatternResolver(loader); } public void testExportedCustomCP() throws Exception { ResourcePatternResolver resolver = getExporterPatternLoader(); Resource[] resources = resolver.getResources("classpath:/some/**/*.res"); System.out.println(Arrays.toString(resources)); assertEquals(3, resources.length); } public void testImportedCustomCP() throws Exception { ResourcePatternResolver resolver = getImporterPatternLoader(); Resource[] resources = resolver.getResources("classpath:some/**/*.res"); System.out.println(Arrays.toString(resources)); assertEquals(3, resources.length); } public void testExportedCustomFoldersCP() throws Exception { ResourcePatternResolver resolver = getExporterPatternLoader(); Resource[] resources = resolver.getResources("classpath:/**/path/**/*"); System.out.println(Arrays.toString(resources)); assertEquals(8, resources.length); } public void testImporterCustomFoldersCP() throws Exception { ResourcePatternResolver resolver = getImporterPatternLoader(); Resource[] resources = resolver.getResources("classpath:/**/path/**/*"); System.out.println(Arrays.toString(resources)); assertEquals(5, resources.length); } public void testExportedCustomPatternFoldersCP() throws Exception { ResourcePatternResolver resolver = getExporterPatternLoader(); Resource[] resources = resolver.getResources("classpath:/**/p?th/**/*"); System.out.println(Arrays.toString(resources)); assertEquals(8, resources.length); } public void testImporterCustomPatternFoldersCP() throws Exception { ResourcePatternResolver resolver = getImporterPatternLoader(); Resource[] resources = resolver.getResources("classpath:/**/p?th/**/*"); System.out.println(Arrays.toString(resources)); assertEquals(5, resources.length); } }