/****************************************************************************** * 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.mock; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import org.osgi.framework.Filter; /** * FrameworkUtil-like class that tries to create a somewhat valid filter. * * Filters objects can be created without an actual OSGi platform running * however, the default OSGi implementation delegates the creation to the * package indicated by "org.osgi.vendor.framework" property. * * In its current implementation, this class requires one of Equinox, * Knoplerfish or Felix on its classpath to create the filter object. * * * @author Costin Leau */ public class MockFrameworkUtil { private static final String EQUINOX_CLS = "org.eclipse.osgi.framework.internal.core.FilterImpl"; private static final String KF_CLS = "org.knopflerfish.framework.FilterImpl"; private static final String FELIX_CLS = "org.apache.felix.framework.FilterImpl"; private final Constructor filterConstructor; /** * Constructs a new <code>MockFrameworkUtil</code> instance. * * As opposed to the OSGi approach this class doesn't use statics since it * makes configuration and initialization a lot harder without any * particular benefit. * */ MockFrameworkUtil() { // detect filter implementation ClassLoader cl = getClass().getClassLoader(); Class<?> filterClz = null; // try Equinox filterClz = loadClass(cl, EQUINOX_CLS); // try KF if (filterClz == null) filterClz = loadClass(cl, KF_CLS); // try Felix if (filterClz == null) filterClz = loadClass(cl, FELIX_CLS); if (filterClz == null) // nothing is found, bail out throw new IllegalStateException("cannot find Equinox, Knopflerfish or Felix on the classpath"); try { filterConstructor = filterClz.getConstructor(new Class<?>[] { String.class }); } catch (NoSuchMethodException e) { throw new IllegalArgumentException("found invalid filter class " + filterClz); } } private Class<?> loadClass(ClassLoader loader, String className) { try { return loader.loadClass(className); } catch (ClassNotFoundException e) { // swallow exception } return null; } /** * Create a mock filter that is _might_ be valid. This method does not throw * an checked exception and will always return a filter implementation. * * @param filter OSGi filter given as a String. * @return actual OSGi filter using the underlying OSGi platform */ public Filter createFilter(String filter) { try { return (Filter) filterConstructor.newInstance(new Object[] { filter }); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } }