content: /**
   *  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.aries.jmx.framework;
  
  import java.io.IOException;
  import java.util.Dictionary;
  import java.util.Hashtable;
  
  import org.osgi.framework.BundleContext;
  import org.osgi.service.cm.ConfigurationException;
  import org.osgi.service.cm.ManagedService;
  
  /**
   * Configuration for {@link BundleState} and {@link ServiceState}.
   *
   * @version $Rev$ $Date$
   */
  public class StateConfig implements ManagedService {
  
      private static final String PID = StateConfig.class.getName();
  
      private static final String ATTRIBUTE_CHANGE_NOTIFICATION_ENABLED = "attributeChangeNotificationEnabled";
      private static final boolean DEFAULT_ATTRIBUTE_CHANGE_NOTIFICATION_ENABLED = true;
  
      private static final String SERVICE_CHANGE_NOTIFICATION_ENABLED = "serviceChangeNotificationEnabled";
      private static final boolean DEFAULT_SERVICE_CHANGE_NOTIFICATION_ENABLED = true;
  
      private static final String BUNDLE_CHANGE_NOTIFICATION_ENABLED = "bundleChangeNotificationEnabled";
      private static final boolean DEFAULT_BUNDLE_CHANGE_NOTIFICATION_ENABLED = true;
  
      private volatile boolean attributeChangeNotificationEnabled = DEFAULT_ATTRIBUTE_CHANGE_NOTIFICATION_ENABLED;
      private volatile boolean serviceChangeNotificationEnabled = DEFAULT_SERVICE_CHANGE_NOTIFICATION_ENABLED;
      private volatile boolean bundleChangeNotificationEnabled = DEFAULT_BUNDLE_CHANGE_NOTIFICATION_ENABLED;
  
      void setAttributeChangeNotificationEnabled(boolean attributeChangeNotificationEnabled) {
          this.attributeChangeNotificationEnabled = attributeChangeNotificationEnabled;
      }
  
      void setServiceChangeNotificationEnabled(boolean serviceChangeNotificationEnabled) {
          this.serviceChangeNotificationEnabled = serviceChangeNotificationEnabled;
      }
  
      void setBundleChangeNotificationEnabled(boolean bundleChangeNotificationEnabled) {
          this.bundleChangeNotificationEnabled = bundleChangeNotificationEnabled;
      }
  
      /**
       * Registers this service and returns an instance.
       *
       * @param context the bundle context
       * @return the service instance
       * @throws IOException
       */
      public static StateConfig register(BundleContext context) throws IOException {
          Dictionary<String, Object> serviceProps = new Hashtable<String, Object>();
          serviceProps.put("service.pid", PID);
  
          StateConfig stateConfig = new StateConfig();
          context.registerService(ManagedService.class, stateConfig, serviceProps);
          return stateConfig;
      }
  
      @Override
      public void updated(Dictionary<String, ?> dictionary) throws ConfigurationException {
          attributeChangeNotificationEnabled = getBoolean(dictionary, ATTRIBUTE_CHANGE_NOTIFICATION_ENABLED,
                  DEFAULT_ATTRIBUTE_CHANGE_NOTIFICATION_ENABLED);
          serviceChangeNotificationEnabled = getBoolean(dictionary, SERVICE_CHANGE_NOTIFICATION_ENABLED,
                  DEFAULT_SERVICE_CHANGE_NOTIFICATION_ENABLED);
          bundleChangeNotificationEnabled = getBoolean(dictionary, BUNDLE_CHANGE_NOTIFICATION_ENABLED,
                  DEFAULT_BUNDLE_CHANGE_NOTIFICATION_ENABLED);
      }
  
      /**
       * Whether or not JMX attribute change notifications should be triggered when attributes change.
       *
       * @return <code>true</code> if attribute change notifications are enabled
       */
      public boolean isAttributeChangeNotificationEnabled() {
          return attributeChangeNotificationEnabled;
      }
  
      /**
       * Whether or not JMX OSGi service change notifications should be triggered when OSGi service change.
       *
       * @return <code>true</code> if OSGi service change notifications are enabled
       */
      public boolean isServiceChangeNotificationEnabled() {
          return serviceChangeNotificationEnabled;
      }
  
      /**
       * Whether or not JMX bundle change notifications should be triggered when bundle change.
       *
       * @return <code>true</code> if bundle change notifications are enabled
       */
      public boolean isBundleChangeNotificationEnabled() {
          return bundleChangeNotificationEnabled;
      }
  
      private static boolean getBoolean(Dictionary<String, ?> dictionary, String propertyName, boolean defaultValue) {
          Object object = (dictionary != null) ? dictionary.get(propertyName) : null;
          if (object == null) {
              return defaultValue;
          } else if (object instanceof Boolean) {
              return (Boolean) object;
          } else {
              String string = object.toString();
              return !string.isEmpty() ? Boolean.parseBoolean(string) : defaultValue;
          }
      }
  
  }
  