/****************************************************************************** * 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.internal.service.collection; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.eclipse.gemini.blueprint.service.importer.ImportedOsgiServiceProxy; import org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ProxyPlusCallback; import org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceProxyCreator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.springframework.aop.SpringProxy; import org.springframework.aop.support.AopUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; /** * Simple, JDK based proxy creator useful for testing only. * * @author Costin Leau */ public class SimpleServiceJDKProxyCreator implements ServiceProxyCreator { private Class<?>[] classes; private ClassLoader loader; private BundleContext context; private class JDKHandler implements InvocationHandler { private final ServiceReference reference; public JDKHandler(ServiceReference reference) { this.reference = reference; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object service = context.getService(reference); if (AopUtils.isEqualsMethod(method)) { return (equals(args[0]) ? Boolean.TRUE : Boolean.FALSE); } return ReflectionUtils.invokeMethod(method, service, args); } public boolean equals(Object other) { if (other == this) { return true; } if (other == null) { return false; } if (Proxy.isProxyClass(other.getClass())) { InvocationHandler ih = Proxy.getInvocationHandler(other); if (ih instanceof JDKHandler) { return reference.equals(((JDKHandler) ih).reference); } } return false; } } public SimpleServiceJDKProxyCreator(BundleContext context, Class<?>[] classes, ClassLoader loader) { // add Spring-DM proxies Object[] obj = ObjectUtils.addObjectToArray(classes, ImportedOsgiServiceProxy.class); this.classes = (Class[]) ObjectUtils.addObjectToArray(obj, SpringProxy.class); System.out.println("given classes " + ObjectUtils.nullSafeToString(classes) + " | resulting classes " + ObjectUtils.nullSafeToString(this.classes)); this.loader = loader; this.context = context; } public SimpleServiceJDKProxyCreator(BundleContext context, Class<?>[] classes) { this(context, classes, SimpleServiceJDKProxyCreator.class.getClassLoader()); } public ProxyPlusCallback createServiceProxy(final ServiceReference reference) { return new ProxyPlusCallback(Proxy.newProxyInstance(loader, classes, new JDKHandler(reference)), null); } }