Package org.osgi.impl.bundle.jmx

Source Code of org.osgi.impl.bundle.jmx.Activator$ProvisioningServiceTracker

/*
* Copyright 2008 Oracle Corporation
*
* 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.osgi.impl.bundle.jmx;

import static org.osgi.jmx.JmxConstants.BUNDLE_STATE;
import static org.osgi.jmx.JmxConstants.CM_SERVICE;
import static org.osgi.jmx.JmxConstants.FRAMEWORK;
import static org.osgi.jmx.JmxConstants.PACKAGE_STATE;
import static org.osgi.jmx.JmxConstants.PA_SERVICE;
import static org.osgi.jmx.JmxConstants.PS_SERVICE;
import static org.osgi.jmx.JmxConstants.SERVICE_STATE;
import static org.osgi.jmx.JmxConstants.UA_SERVICE;

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.StandardMBean;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.impl.bundle.jmx.cm.ConfigAdminManager;
import org.osgi.impl.bundle.jmx.framework.BundleState;
import org.osgi.impl.bundle.jmx.framework.Framework;
import org.osgi.impl.bundle.jmx.framework.PackageState;
import org.osgi.impl.bundle.jmx.framework.ServiceState;
import org.osgi.impl.bundle.jmx.permissionadmin.PermissionManager;
import org.osgi.impl.bundle.jmx.provisioning.Provisioning;
import org.osgi.impl.bundle.jmx.useradmin.UserManager;
import org.osgi.jmx.cm.ConfigAdminManagerMBean;
import org.osgi.jmx.framework.BundleStateMBean;
import org.osgi.jmx.framework.FrameworkMBean;
import org.osgi.jmx.framework.PackageStateMBean;
import org.osgi.jmx.framework.ServiceStateMBean;
import org.osgi.jmx.permissionadmin.PermissionManagerMBean;
import org.osgi.jmx.provisioning.ProvisioningMBean;
import org.osgi.jmx.useradmin.UserManagerMBean;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.packageadmin.PackageAdmin;
import org.osgi.service.permissionadmin.PermissionAdmin;
import org.osgi.service.provisioning.ProvisioningService;
import org.osgi.service.startlevel.StartLevel;
import org.osgi.service.useradmin.UserAdmin;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;

/**
* The bundle activator which starts and stops the system, as well as providing
* the service tracker which listens for the MBeanServer. When the MBeanServer
* is found, the MBeans representing the OSGi services will be installed.
*
*/
public class Activator implements BundleActivator {

  /*
   * (non-Javadoc)
   *
   * @see
   * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
   * )
   */
  public void start(BundleContext bundleContext) throws Exception {
    this.bundleContext = bundleContext;
    frameworkName = new ObjectName(FRAMEWORK);
    bundlesStateName = new ObjectName(BUNDLE_STATE);
    serviceStateName = new ObjectName(SERVICE_STATE);
    packageStateName = new ObjectName(PACKAGE_STATE);

    mbeanServiceTracker = new ServiceTracker(bundleContext,
        MBeanServer.class.getCanonicalName(), new MBeanServiceTracker());
    log.fine("Awaiting MBeanServer service registration");
    mbeanServiceTracker.open();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
   */
  public void stop(BundleContext arg0) throws Exception {
    mbeanServiceTracker.close();
    deregisterServices();
    mbeanServer = null;
  }

  /**
     */
  protected synchronized void deregisterServices() {
    if (!servicesRegistered.get()) {
      return;
    }
    log.fine("Deregistering framework with MBeanServer: " + mbeanServer);
    try {
      mbeanServer.unregisterMBean(frameworkName);
    } catch (InstanceNotFoundException e) {
      log
          .log(Level.FINE,
              "FrameworkMBean not found on deregistration", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.FINE, "FrameworkMBean deregistration problem", e);
    }
    framework = null;

    try {
      mbeanServer.unregisterMBean(bundlesStateName);
    } catch (InstanceNotFoundException e) {
      log.log(Level.FINEST,
          "OSGi BundleStateMBean not found on deregistration", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.FINE, "OSGi BundleStateMBean deregistration problem",
          e);
    }
    bundleState = null;

    log.fine("Deregistering services monitor with MBeanServer: "
        + mbeanServer);
    try {
      mbeanServer.unregisterMBean(serviceStateName);
    } catch (InstanceNotFoundException e) {
      log.log(Level.FINEST,
          "OSGi ServiceStateMBean not found on deregistration", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.FINE,
          "OSGi ServiceStateMBean deregistration problem", e);
    }
    serviceState = null;

    log.fine("Deregistering packages monitor with MBeanServer: "
        + mbeanServer);
    try {
      mbeanServer.unregisterMBean(packageStateName);
    } catch (InstanceNotFoundException e) {
      log.log(Level.FINEST,
          "OSGi PackageStateMBean not found on deregistration", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.FINE,
          "OSGi PackageStateMBean deregistration problem", e);
    }
    packageState = null;
    configAdminTracker.close();
    configAdminTracker = null;
    permissionAdminTracker.close();
    permissionAdminTracker = null;
    provisioningServiceTracker.close();
    provisioningServiceTracker = null;
    userAdminTracker.close();
    userAdminTracker = null;

    servicesRegistered.set(false);
  }

  /**
     */
  protected synchronized void registerServices() {
    PackageAdmin admin = (PackageAdmin) bundleContext
        .getService(bundleContext
            .getServiceReference(PackageAdmin.class
                .getCanonicalName()));
    StartLevel sl = (StartLevel) bundleContext.getService(bundleContext
        .getServiceReference(StartLevel.class.getCanonicalName()));
    try {
      framework = new StandardMBean(new Framework(bundleContext, admin,
          sl), FrameworkMBean.class);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE,
          "Unable to create StandardMBean for Framework", e);
      return;
    }
    try {
      bundleState = new StandardMBean(new BundleState(bundleContext, sl,
          admin), BundleStateMBean.class);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE,
          "Unable to create StandardMBean for BundleState", e);
      return;
    }
    try {
      serviceState = new StandardMBean(new ServiceState(bundleContext),
          ServiceStateMBean.class);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE,
          "Unable to create StandardMBean for ServiceState", e);
      return;
    }
    try {
      packageState = new StandardMBean(new PackageState(bundleContext,
          admin), PackageStateMBean.class);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE,
          "Unable to create StandardMBean for PackageState", e);
      return;
    }

    log.fine("Registering Framework with MBeanServer: " + mbeanServer
        + " with name: " + frameworkName);
    try {
      mbeanServer.registerMBean(framework, frameworkName);
    } catch (InstanceAlreadyExistsException e) {
      log.log(Level.SEVERE, "Cannot register OSGi framework MBean", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.SEVERE, "Cannot register OSGi framework MBean", e);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE, "Cannot register OSGi framework MBean", e);
    }

    log.fine("Registering bundle state monitor with MBeanServer: "
        + mbeanServer + " with name: " + bundlesStateName);
    try {
      mbeanServer.registerMBean(bundleState, bundlesStateName);
    } catch (InstanceAlreadyExistsException e) {
      log.log(Level.SEVERE, "Cannot register OSGi BundleStateMBean", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.SEVERE, "Cannot register OSGi BundleStateMBean", e);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE, "Cannot register OSGi BundleStateMBean", e);
    }

    log.fine("Registering services monitor with MBeanServer: "
        + mbeanServer + " with name: " + serviceStateName);
    try {
      mbeanServer.registerMBean(serviceState, serviceStateName);
    } catch (InstanceAlreadyExistsException e) {
      log.log(Level.SEVERE, "Cannot register OSGi ServiceStateMBean", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.SEVERE, "Cannot register OSGi ServiceStateMBean", e);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE, "Cannot register OSGi ServiceStateMBean", e);
    }

    log.fine("Registering packages monitor with MBeanServer: "
        + mbeanServer + " with name: " + packageStateName);
    try {
      mbeanServer.registerMBean(packageState, packageStateName);
    } catch (InstanceAlreadyExistsException e) {
      log.log(Level.SEVERE, "Cannot register OSGi PackageStateMBean", e);
    } catch (MBeanRegistrationException e) {
      log.log(Level.SEVERE, "Cannot register OSGi PackageStateMBean", e);
    } catch (NotCompliantMBeanException e) {
      log.log(Level.SEVERE, "Cannot register OSGi PackageStateMBean", e);
    }

    configAdminTracker = new ServiceTracker(bundleContext,
        "org.osgi.service.cm.ConfigurationAdmin",
        new ConfigAdminTracker());
    permissionAdminTracker = new ServiceTracker(bundleContext,
        "org.osgi.service.permissionadmin.PermissionAdmin",
        new PermissionAdminTracker());
    provisioningServiceTracker = new ServiceTracker(bundleContext,
        "org.osgi.service.provisioning.ProvisioningService",
        new ProvisioningServiceTracker());
    userAdminTracker = new ServiceTracker(bundleContext,
        "org.osgi.service.useradmin.UserAdmin", new UserAdminTracker());
    configAdminTracker.open();
    permissionAdminTracker.open();
    provisioningServiceTracker.open();
    userAdminTracker.open();
    servicesRegistered.set(true);
  }

  private static final Logger log = Logger.getLogger(Activator.class
      .getCanonicalName());

  protected MBeanServer mbeanServer;
  protected StandardMBean bundleState;
  protected StandardMBean packageState;
  protected StandardMBean serviceState;
  protected BundleContext bundleContext;
  protected ObjectName bundlesStateName;
  protected StandardMBean framework;
  protected ObjectName frameworkName;
  protected ServiceTracker mbeanServiceTracker;
  protected ObjectName packageStateName;
  protected ObjectName serviceStateName;
  protected AtomicBoolean servicesRegistered = new AtomicBoolean(false);
  protected ServiceTracker configAdminTracker;
  protected ServiceTracker permissionAdminTracker;
  protected ServiceTracker provisioningServiceTracker;
  protected ServiceTracker userAdminTracker;

  class MBeanServiceTracker implements ServiceTrackerCustomizer {

    public Object addingService(ServiceReference servicereference) {
      try {
        log.fine("Adding MBeanServer: " + servicereference);
        mbeanServer = (MBeanServer) bundleContext
            .getService(servicereference);
        Runnable registration = new Runnable() {
          public void run() {
            registerServices();
          }
        };
        Thread registrationThread = new Thread(registration,
            "JMX Core MBean Registration");
        registrationThread.setDaemon(true);
        registrationThread.start();

        return mbeanServer;
      } catch (RuntimeException e) {
        log.log(Level.SEVERE, "uncaught exception in addingService", e);
        throw e;
      }
    }

    public void modifiedService(ServiceReference servicereference,
        Object obj) {
      // no op
    }

    public void removedService(ServiceReference servicereference, Object obj) {
      try {
        log.fine("Removing MBeanServer: " + servicereference);
        Runnable deregister = new Runnable() {
          public void run() {
            deregisterServices();
            mbeanServer = null;
          }
        };

        Thread deregisterThread = new Thread(deregister,
            "JMX Core MBean Deregistration");
        deregisterThread.setDaemon(true);
        deregisterThread.start();

      } catch (Throwable e) {
        log.log(Level.FINE, "uncaught exception in removedService", e);
      }
    }
  }

  class ConfigAdminTracker implements ServiceTrackerCustomizer {
    StandardMBean manager;
    ObjectName name;

    public ConfigAdminTracker() {
      try {
        name = new ObjectName(CM_SERVICE);
      } catch (Throwable e) {
        throw new IllegalStateException(
            "unable to create object name: " + CM_SERVICE);
      }
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#addingService(org.
     * osgi.framework.ServiceReference)
     */
    public Object addingService(ServiceReference reference) {
      log.fine("Registering configuration admin with MBeanServer: "
          + mbeanServer + " with name: " + name);
      ConfigurationAdmin admin = (ConfigurationAdmin) bundleContext
          .getService(reference);
      try {
        manager = new StandardMBean(new ConfigAdminManager(admin),
            ConfigAdminManagerMBean.class);
      } catch (NotCompliantMBeanException e1) {
        log.log(Level.SEVERE,
            "Unable to create Configuration Admin Manager");
        return admin;
      }
      try {
        mbeanServer.registerMBean(manager, name);
      } catch (InstanceAlreadyExistsException e) {
        log.log(Level.SEVERE,
            "Cannot register Configuration Manager MBean", e);
      } catch (MBeanRegistrationException e) {
        log.log(Level.SEVERE,
            "Cannot register Configuration Manager MBean", e);
      } catch (NotCompliantMBeanException e) {
        log.log(Level.SEVERE,
            "Cannot register Configuration Manager MBean", e);
      }
      return admin;
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#modifiedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void modifiedService(ServiceReference reference, Object service) {
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#removedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void removedService(ServiceReference reference, Object service) {

      log.fine("deregistering configuration admin from: " + mbeanServer
          + " with name: " + name);
      try {
        mbeanServer.unregisterMBean(name);
      } catch (InstanceNotFoundException e) {
        log.fine("Configuration Manager MBean was never registered");
      } catch (MBeanRegistrationException e) {
        log.log(Level.SEVERE,
            "Cannot deregister Configuration Manager MBean", e);
      }
    }
  }

  class PermissionAdminTracker implements ServiceTrackerCustomizer {
    StandardMBean manager;
    ObjectName name;

    public PermissionAdminTracker() {
      try {
        name = new ObjectName(PA_SERVICE);
      } catch (Throwable e) {
        throw new IllegalStateException(
            "unable to create object name: " + PA_SERVICE);
      }
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#addingService(org.
     * osgi.framework.ServiceReference)
     */
    public Object addingService(ServiceReference reference) {
      log.fine("Registering permission admin with MBeanServer: "
          + mbeanServer + " with name: " + name);
      PermissionAdmin admin = (PermissionAdmin) bundleContext
          .getService(reference);
      try {
        manager = new StandardMBean(new PermissionManager(admin),
            PermissionManagerMBean.class);
      } catch (NotCompliantMBeanException e1) {
        log.log(Level.SEVERE,
            "Unable to create Permission Admin Manager");
        return admin;
      }
      try {
        mbeanServer.registerMBean(manager, name);
      } catch (InstanceAlreadyExistsException e) {
        log.log(Level.SEVERE,
            "Cannot register Permission Manager MBean", e);
      } catch (MBeanRegistrationException e) {
        log.log(Level.SEVERE,
            "Cannot register Permission Manager MBean", e);
      } catch (NotCompliantMBeanException e) {
        log.log(Level.SEVERE,
            "Cannot register Permission Manager MBean", e);
      }
      return admin;
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#modifiedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void modifiedService(ServiceReference reference, Object service) {
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#removedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void removedService(ServiceReference reference, Object service) {
      log.fine("deregistering permission admin with MBeanServer: "
          + mbeanServer + " with name: " + name);
      try {
        mbeanServer.unregisterMBean(name);
      } catch (InstanceNotFoundException e) {
        log.fine("Permission Manager MBean was never registered");
      } catch (MBeanRegistrationException e) {
        log.log(Level.SEVERE,
            "Cannot deregister Permission Manager MBean", e);
      }
    }
  }

  class ProvisioningServiceTracker implements ServiceTrackerCustomizer {
    StandardMBean provisioning;
    ObjectName name;

    public ProvisioningServiceTracker() {
      try {
        name = new ObjectName(PS_SERVICE);
      } catch (Throwable e) {
        throw new IllegalStateException(
            "unable to create object name: " + PS_SERVICE);
      }
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#addingService(org.
     * osgi.framework.ServiceReference)
     */
    public Object addingService(ServiceReference reference) {
      log.fine("Registering provisioning service with MBeanServer: "
          + mbeanServer + " with name: " + name);
      ProvisioningService admin = (ProvisioningService) bundleContext
          .getService(reference);
      try {
        provisioning = new StandardMBean(new Provisioning(admin),
            ProvisioningMBean.class);
      } catch (NotCompliantMBeanException e1) {
        log.log(Level.SEVERE,
            "Unable to create Provisioning Service Manager");
        return admin;
      }
      try {
        mbeanServer.registerMBean(provisioning, name);
      } catch (InstanceAlreadyExistsException e) {
        log.log(Level.SEVERE,
            "Cannot register Provisioning Service MBean", e);
      } catch (MBeanRegistrationException e) {
        log.log(Level.SEVERE,
            "Cannot register Provisioning Service MBean", e);
      } catch (NotCompliantMBeanException e) {
        log.log(Level.SEVERE,
            "Cannot register Provisioning Service MBean", e);
      }
      return admin;
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#modifiedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void modifiedService(ServiceReference reference, Object service) {
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#removedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void removedService(ServiceReference reference, Object service) {
      log.fine("deregistering provisioning service with MBeanServer: "
          + mbeanServer + " with name: " + name);
      try {
        mbeanServer.unregisterMBean(name);
      } catch (InstanceNotFoundException e) {
        log.fine("Provisioning Service MBean was never registered");
      } catch (MBeanRegistrationException e) {
        log.log(Level.SEVERE,
            "Cannot deregister Provisioning Service MBean", e);
      }
    }
  }

  class UserAdminTracker implements ServiceTrackerCustomizer {
    StandardMBean manager;
    ObjectName name;

    public UserAdminTracker() {
      try {
        name = new ObjectName(UA_SERVICE);
      } catch (Throwable e) {
        throw new IllegalStateException(
            "unable to create object name: " + UA_SERVICE);
      }
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#addingService(org.
     * osgi.framework.ServiceReference)
     */
    public Object addingService(ServiceReference reference) {
      log.fine("Registering user admin with MBeanServer: " + mbeanServer
          + " with name: " + name);
      UserAdmin admin = (UserAdmin) bundleContext.getService(reference);
      try {
        manager = new StandardMBean(new UserManager(admin),
            UserManagerMBean.class);
      } catch (NotCompliantMBeanException e1) {
        log.log(Level.SEVERE, "Unable to create User Admin Manager");
        return admin;
      }
      try {
        mbeanServer.registerMBean(manager, name);
      } catch (InstanceAlreadyExistsException e) {
        log.log(Level.SEVERE, "Cannot register User Manager MBean", e);
      } catch (MBeanRegistrationException e) {
        log.log(Level.SEVERE, "Cannot register User Manager MBean", e);
      } catch (NotCompliantMBeanException e) {
        log.log(Level.SEVERE, "Cannot register User Manager MBean", e);
      }
      return admin;
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#modifiedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void modifiedService(ServiceReference reference, Object service) {
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.osgi.util.tracker.ServiceTrackerCustomizer#removedService(org
     * .osgi.framework.ServiceReference, java.lang.Object)
     */
    public void removedService(ServiceReference reference, Object service) {
      log.fine("Deregistering user admin with MBeanServer: "
          + mbeanServer + " with name: " + name);
      try {
        mbeanServer.unregisterMBean(name);
      } catch (InstanceNotFoundException e) {
        log.fine("User Manager MBean was never registered");
      } catch (MBeanRegistrationException e) {
        log
            .log(Level.SEVERE,
                "Cannot deregister User Manager MBean", e);
      }
    }
  }
}
TOP

Related Classes of org.osgi.impl.bundle.jmx.Activator$ProvisioningServiceTracker

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.