/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.jcache; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.apache.camel.RuntimeCamelException; public final class JCacheHelper { private JCacheHelper() { } public static <K, V> JCacheManager<K, V> createManager(JCacheConfiguration configuration) { if (isOSGi()) { try { Class<?> type = Class.forName("org.apache.camel.component.jcache.osgi.OSGiCacheManager"); Constructor<?> ctor = type.getConstructor(JCacheConfiguration.class); return (JCacheManager<K, V>)ctor.newInstance(configuration); } catch (Exception e) { throw new RuntimeCamelException(e); } } return new JCacheManager<>(configuration); } @SuppressWarnings("unchecked") public static <T> T tcclProxy(final T instance, Class<T> type, final ClassLoader classLoader) { return (T) Proxy.newProxyInstance( JCacheHelper.class.getClassLoader(), new Class<?>[] { type }, (Object proxy, Method method, Object[] args) -> { final ClassLoader tccl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(classLoader); return method.invoke(instance, args); } finally { Thread.currentThread().setContextClassLoader(tccl); } } ); } public static boolean isOSGi() { try { // Check if we are in an osgi container Class<?> fu = Class.forName("org.osgi.framework.FrameworkUtil"); if (fu != null) { Method method = fu.getMethod("getBundle", Class.class); if (method != null) { return method.invoke(null, JCacheHelper.class) != null; } } } catch (ClassNotFoundException e) { } catch (Exception e) { throw new RuntimeCamelException(e); } return false; } }