/*
 *   Copyright 2005 The Apache Software Foundation
 *
 *   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.apache.felix.jmood.core;
public interface ManagedPackageMBean {

    /**
     * 
     * @return the symbolic name of the exporting bundle
     */
    public abstract String getExportingBundle();

    /**
     * 
     * @return the symbolic names of the importing bundles
     */
    public abstract String[] getImportingBundles();

    /**
     * 
     * @return the package name
     */
    public abstract String getName();

    /**
     * 
     * @return the package version
     */
    public abstract String getVersion();

    /**
     * 
     * @return <code>true</code> if the associated package is being exported
     *         by a bundle that has been updated or uninstalled. 
     * @see org.osgi.service.packageadmin.ExportedPackage
     */
    public abstract boolean isRemovalPending();

}