/*******************************************************************************
 * Copyright (c) 2008, 2010 SAP AG
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   SAP AG - initial contribution
 *******************************************************************************/

package org.eclipse.virgo.kernel.config.internal;

import org.eclipse.virgo.nano.core.KernelConfig;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * This class is the standard implementation for the KernelConfig interface. It enables access to the configurations provided by the kernel core.
 * <p />
 *
 * <strong>Concurrent Semantics</strong><br />
 * Thread safe.
 */

public class StandardKernelConfig implements KernelConfig {
    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
    ComponentContext context;

    protected void activate(ComponentContext context) {
        this.context = context;
        LOGGER.debug("Activating StandardKernelConfig component with properties " + context.getProperties());
    }

    protected void deactivate(ComponentContext context) {
        LOGGER.debug("Deactivating StandardKernelConfig component");
        this.context = null;
    }

    @Override
    public String getProperty(String name) {
        Object value = this.context.getProperties().get(name);
        LOGGER.debug("KernelConfig.getProperty() is called with name [" + name + "] value is [" + value + "]");
        if (value instanceof String || value == null) {
            return (String) value;
        } else if (value instanceof String[] && ((String[]) value).length > 0) {
            return ((String[]) value)[0];
        } else {
            return value.toString();
        }
    }

}
