/****************************************************************************** * 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(); } }