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    
010    package org.picocontainer.gems.jndi;
011    
012    import java.util.Set;
013    
014    import javax.management.MBeanServer;
015    
016    import org.picocontainer.ComponentAdapter;
017    import org.picocontainer.PicoContainer;
018    import 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     */
025    public 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    }