blob: 6574a01378b3edeea2d8243cb7e93931adfc2dd8 [file] [log] [blame]
/******************************************************************************
* 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.proxycreator;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.DocumentEvent;
import org.eclipse.gemini.blueprint.iandt.BaseIntegrationTest;
import org.eclipse.gemini.blueprint.service.importer.support.*;
import org.osgi.framework.AdminPermission;
/**
* Integration test for bug OSGI-597.
*
* This test tries to create a proxy for DocumentEvent w/o importing its
* dependency, namely javax.swing.text.Element.
*
* @author Costin Leau
*/
public class ClassDependenciesVisibilityTest extends BaseIntegrationTest {
private static String DEPENDENCY_CLASS = "javax.swing.text.Element";
public void testPackageDependency() throws Exception {
ClassLoader cl = applicationContext.getClassLoader();
System.out.println(cl);
OsgiServiceProxyFactoryBean fb = new OsgiServiceProxyFactoryBean();
fb.setBundleContext(bundleContext);
fb.setAvailability(Availability.OPTIONAL);
fb.setImportContextClassLoader(ImportContextClassLoaderEnum.UNMANAGED);
fb.setInterfaces(new Class<?>[] { DocumentEvent.class });
fb.setBeanClassLoader(cl);
fb.setApplicationEventPublisher(applicationContext);
fb.afterPropertiesSet();
checkPackageVisibility(cl);
Object proxy = fb.getObject();
assertNotNull(proxy);
assertTrue(proxy instanceof DocumentEvent);
System.out.println(proxy.getClass());
}
public void testJdkProxy() throws Exception {
InvocationHandler ih = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
};
ClassLoader cl = applicationContext.getClassLoader();
checkPackageVisibility(cl);
try {
Object proxy = Proxy.newProxyInstance(cl, new Class<?>[] { DocumentEvent.class }, ih);
assertNotNull(proxy);
System.out.println(proxy.getClass());
fail("should have failed");
}
catch (Throwable cnfe) {
// expected
}
}
private void checkPackageVisibility(ClassLoader cl) throws Exception {
try {
cl.loadClass(DEPENDENCY_CLASS);
fail("should not be able to load " + DEPENDENCY_CLASS);
}
catch (ClassNotFoundException cnfe) {
// expected
}
}
// remove the javax.* boot delegation
protected List getBootDelegationPackages() {
List packages = super.getBootDelegationPackages();
packages.remove("javax.*");
packages.remove("javax.swing.*");
return packages;
}
protected List getTestPermissions() {
List perms = super.getTestPermissions();
// export package
perms.add(new RuntimePermission("*", "getClassLoader"));
return perms;
}
}