All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ops4j.pax.logging.internal.BundleHelper Maven / Gradle / Ivy

/*
 * Copyright 2010 Guillaume Nodet.
 *
 * Licensed  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.ops4j.pax.logging.internal;

import java.lang.reflect.Method;

import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;

public final class BundleHelper
{
    private BundleHelper()
    {
    }

    private static final SecurityManagerEx securityManager;
    private static final Method getBundleMethod;

    static
    {
        securityManager = new SecurityManagerEx();
        Method mth = null;
        try
        {
            mth = FrameworkUtil.class.getMethod("getBundle", new Class[] { Class.class });
        }
        catch (NoSuchMethodException e)
        {
        }
        getBundleMethod = mth;
    }

    public static Bundle getCallerBundle(Bundle defaultBundle)
    {
        if (getBundleMethod == null) {
            return defaultBundle;
        }

        try
        {
            Class[] classCtx = securityManager.getClassContext();
            /* Skip first 2 classes on call stack since:
             *  classCtx[0] is always SecurityManagerEx.getClassContext()
             *  classCtx[1] is always BundleHelper.getCallerBundle()
             */
            Bundle curBundle = null;
            for (int i = 2; i < classCtx.length; i++)
            {
                Bundle bundle = FrameworkUtil.getBundle(classCtx[i]);
                if (bundle == null)
                {
                    return defaultBundle;
                }
                else if (curBundle == null)
                {
                    curBundle = bundle;
                }
                else if (bundle != curBundle)
                {
                    return bundle;
                }
            }
        }
        catch (Exception e)
        {
        }
        
        return defaultBundle;
    }

    static class SecurityManagerEx extends SecurityManager
    {
        public Class[] getClassContext()
        {
            return super.getClassContext();
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy