org.eclipse.gemini.blueprint.compendium.internal.cm.DefaultManagedServiceBeanManager.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gemini.blueprint.compendium.internal.cm.DefaultManagedServiceBeanManager.java

Source

/******************************************************************************
 * Copyright (c) 2006, 2010 VMware Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution. 
 * The Eclipse Public License is available at 
 * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
 * is available at http://www.opensource.org/licenses/apache2.0.php.
 * You may elect to redistribute this code under either of these licenses. 
 * 
 * Contributors:
 *   VMware Inc.
 *****************************************************************************/

package org.eclipse.gemini.blueprint.compendium.internal.cm;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.support.AbstractBeanFactory;

/**
 * Default implementation for {@link ManagedServiceBeanManager}.
 * 
 * @author Costin Leau
 * 
 */
public class DefaultManagedServiceBeanManager implements DisposableBean, ManagedServiceBeanManager {

    /** logger */
    private static final Log log = LogFactory.getLog(DefaultManagedServiceBeanManager.class);

    private final Map<Integer, Object> instanceRegistry = new ConcurrentHashMap<Integer, Object>(8);
    private final UpdateCallback updateCallback;
    private final ConfigurationAdminManager cam;
    private final AbstractBeanFactory bf;

    public DefaultManagedServiceBeanManager(boolean autowireOnUpdate, String methodName,
            ConfigurationAdminManager cam, BeanFactory beanFactory) {

        updateCallback = CMUtils.createCallback(autowireOnUpdate, methodName, beanFactory);
        bf = (beanFactory instanceof AbstractBeanFactory ? (AbstractBeanFactory) beanFactory : null);
        this.cam = cam;
        this.cam.setBeanManager(this);
    }

    public Object register(Object bean) {
        int hashCode = System.identityHashCode(bean);
        if (log.isTraceEnabled())
            log.trace("Start tracking instance " + bean.getClass().getName() + "@" + hashCode);
        instanceRegistry.put(Integer.valueOf(hashCode), bean);
        applyInitialInjection(bean, cam.getConfiguration());
        return bean;
    }

    void applyInitialInjection(Object instance, Map configuration) {
        if (log.isTraceEnabled())
            log.trace("Applying injection to instance " + instance.getClass() + "@"
                    + System.identityHashCode(instance) + " using map " + configuration);
        CMUtils.applyMapOntoInstance(instance, configuration, bf);
    }

    public void unregister(Object bean) {
        int hashCode = System.identityHashCode(bean);
        if (log.isTraceEnabled())
            log.trace("Stopped tracking instance " + bean.getClass().getName() + "@" + hashCode);

        instanceRegistry.remove(new Integer(hashCode));
    }

    public void updated(Map properties) {
        if (updateCallback != null) {
            CMUtils.bulkUpdate(updateCallback, instanceRegistry.values(), properties);
        }
    }

    public void destroy() {
        // unregister CM services
        cam.destroy();
        // remove the tracked beans
        instanceRegistry.clear();
    }
}