Package ch.entwine.weblounge.kernel.runtime

Source Code of ch.entwine.weblounge.kernel.runtime.EnvironmentService

/*
*  Weblounge: Web Content Management System
*  Copyright (c) 2003 - 2011 The Weblounge Team
*  http://entwinemedia.com/weblounge
*
*  This program is free software; you can redistribute it and/or
*  modify it under the terms of the GNU Lesser General Public License
*  as published by the Free Software Foundation; either version 2
*  of the License, or (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU Lesser General Public License for more details.
*
*  You should have received a copy of the GNU Lesser General Public License
*  along with this program; if not, write to the Free Software Foundation
*  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package ch.entwine.weblounge.kernel.runtime;

import ch.entwine.weblounge.common.site.Environment;

import org.apache.commons.lang.StringUtils;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.cm.ManagedService;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Dictionary;

/**
* The environment service provides the default environment for a Weblounge
* instance.
* <p>
* The environment can be configured in the configuration with pid
* <code>ch.entwine.weblounge.environment</code>
*/
public class EnvironmentService implements ManagedService {

  /** Logger */
  private static final Logger logger = LoggerFactory.getLogger(EnvironmentService.class);

  /** Service pid, used to look up the service configuration */
  public static final String SERVICE_PID = "ch.entwine.weblounge.environment";

  /** Name of the option to look up the default environment */
  public static final String OPT_ENVIRONMENT = "environment";

  /** Default environment setting */
  public static final Environment DEFAULT_ENVIRONMENT = Environment.Production;

  /** The current environment */
  protected Environment environment = Environment.Production;

  /** The environment registration */
  private ServiceRegistration registration = null;

  /** Bundle context */
  private BundleContext bundleContext = null;

  /**
   * Callback for OSGi's declarative services component inactivation.
   *
   * @param context
   *          the component context
   * @throws Exception
   *           if component inactivation fails
   */
  void activate(ComponentContext context) throws Exception {
    bundleContext = context.getBundleContext();

    // Try to get hold of the service configuration
    ServiceReference configAdminRef = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
    if (configAdminRef != null) {
      ConfigurationAdmin configAdmin = (ConfigurationAdmin) bundleContext.getService(configAdminRef);
      Dictionary<?, ?> config = configAdmin.getConfiguration(SERVICE_PID).getProperties();
      if (config != null) {
        updated(config);
      }
    } else {
      logger.debug("No configuration admin service found while looking for runtime environment configuration");
    }

    // Make sure we use some environment
    if (environment == null) {
      environment = DEFAULT_ENVIRONMENT;
      logger.info("Runtime environment defaults to '{}'", environment.toString().toLowerCase());
    }

    // Register the default environment
    if (registration == null) {
      logger.debug("Registering default runtime environment");
      registration = bundleContext.registerService(Environment.class.getName(), environment, null);
    }
  }

  /**
   * Callback for OSGi's declarative services component inactivation.
   *
   * @param context
   *          the component context
   * @throws Exception
   *           if component inactivation fails
   */
  void deactivate(ComponentContext context) throws Exception {
    logger.debug("Unregistering default runtime environment", this);
    if (registration != null) {
      try {
        registration.unregister();
      } catch (IllegalStateException e) {
        // Never mind, the service has been unregistered already
      } catch (Throwable t) {
        logger.error("Unregistering runtime environment failed: {}", t.getMessage());
      }
      registration = null;
    }
  }

  /**
   * {@inheritDoc}
   *
   * @see org.osgi.service.cm.ManagedService#updated(java.util.Dictionary)
   */
  @SuppressWarnings("rawtypes")
  public void updated(Dictionary properties) throws ConfigurationException {
    if (properties == null)
      return;

    // Environment
    Environment env = null;
    String environmentValue = StringUtils.trimToNull((String) properties.get(OPT_ENVIRONMENT));
    if (StringUtils.isNotBlank(environmentValue)) {
      try {
        env = Environment.valueOf(StringUtils.capitalize(environmentValue));
        logger.debug("Configured value for the default runtime environment is '{}'", env.toString().toLowerCase());
      } catch (IllegalArgumentException e) {
        throw new ConfigurationException(OPT_ENVIRONMENT, environmentValue);
      }
    } else {
      env = DEFAULT_ENVIRONMENT;
      logger.debug("Using default value '{}' for runtime environment", env.toString().toLowerCase());
    }

    // Did the setting change?
    if (!env.equals(environment)) {
      this.environment = env;
      if (registration != null) {
        try {
          registration.unregister();
        } catch (IllegalStateException e) {
          // Never mind, the service has been unregistered already
        } catch (Throwable t) {
          logger.error("Unregistering runtime environment failed: {}", t.getMessage());
        }
      }
      registration = bundleContext.registerService(Environment.class.getName(), environment, null);
      logger.info("Runtime environment set to '{}'", environment.toString().toLowerCase());
    }
  }

}
TOP

Related Classes of ch.entwine.weblounge.kernel.runtime.EnvironmentService

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.