001/*****************************************************************************
002 * Copyright (c) PicoContainer Organization. All rights reserved.            *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD      *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file.                                                     *
007 *                                                                           *
008 *****************************************************************************/
009
010package org.picocontainer.gems.jndi;
011
012import java.util.Set;
013
014import javax.management.MBeanServer;
015
016import org.picocontainer.ComponentAdapter;
017import org.picocontainer.PicoContainer;
018import org.picocontainer.visitors.TraversalCheckingVisitor;
019
020/**
021 * traverse pico container and expose components to JNDI on 
022 * sight of JNDIExposed
023 * @author Konstantin Pribluda
024 */
025public class JNDIContainerVisitor extends TraversalCheckingVisitor {
026
027        private PicoContainer container;
028        
029        /**
030         * in case component adapter is JNDIExposed, poke it gently and
031         * it will create component and register it to JNDI if not already 
032         * done. 
033         */
034        @Override
035        public void visitComponentAdapter(final ComponentAdapter componentAdapter)
036        {
037                super.visitComponentAdapter(componentAdapter);
038
039                if(componentAdapter instanceof JNDIExposed) {
040                        componentAdapter.getComponentInstance(container,null);
041                }
042
043        }
044
045        /**
046     * Provides the PicoContainer, that can resolve the components to register as MBean.
047     * @see org.picocontainer.PicoVisitor#visitContainer(org.picocontainer.PicoContainer)
048     */
049    @Override
050        public boolean visitContainer(final PicoContainer pico) {
051        super.visitContainer(pico);
052        container = pico;
053        return CONTINUE_TRAVERSAL;
054    }
055
056    /**
057     * Entry point for the visitor traversal.
058     * @return Returns a {@link Set} with all ObjectInstance instances retrieved from the {@link MBeanServer} for the
059     *         registered MBeans.
060     * @see org.picocontainer.visitors.AbstractPicoVisitor#traverse(java.lang.Object)
061     */
062    @Override
063        public Object traverse(final Object node) {
064        super.traverse(node);
065        container = null;
066        return null;
067    }
068
069}