001    package org.apache.fulcrum.testcontainer;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.io.File;
023    
024    import org.apache.avalon.framework.component.Component;
025    import org.apache.avalon.framework.component.ComponentException;
026    import org.apache.avalon.framework.logger.AbstractLogEnabled;
027    import org.apache.avalon.framework.logger.ConsoleLogger;
028    import org.apache.fulcrum.yaafi.framework.container.ServiceContainer;
029    import org.apache.fulcrum.yaafi.framework.factory.ServiceContainerConfiguration;
030    import org.apache.fulcrum.yaafi.framework.factory.ServiceContainerFactory;
031    
032    /**
033     * This is a simple YAAFI based container that can be used in unit test
034     * of the fulcrum components.
035     *
036     * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
037     */
038    public class YAAFIContainer extends AbstractLogEnabled implements Container
039    {
040        /** The YAAFI configuration */
041        private ServiceContainerConfiguration config;
042    
043        /** Component manager */
044        private ServiceContainer manager;
045    
046        /**
047         * Constructor
048         */
049        public YAAFIContainer()
050        {
051            // org.apache.log4j.BasicConfigurator.configure();
052            this.enableLogging( new ConsoleLogger( ConsoleLogger.LEVEL_DEBUG ) );
053            this.config = new ServiceContainerConfiguration();
054        }
055    
056        /**
057         * Starts up the container and initializes it.
058         *
059         * @param configFileName Name of the component configuration file
060         * @param roleFileName Name of the role configuration file
061         */
062        public void startup(
063            String configFileName,
064            String roleFileName,
065            String parametersFileName )
066        {
067            getLogger().debug("Starting container...");
068    
069            this.config.setComponentConfigurationLocation( configFileName );
070            this.config.setComponentRolesLocation( roleFileName );
071            this.config.setParametersLocation( parametersFileName );
072            this.config.setLogger( new ConsoleLogger( ConsoleLogger.LEVEL_DEBUG ) );
073    
074            File configFile = new File(configFileName);
075    
076            if (!configFile.exists())
077            {
078                throw new RuntimeException(
079                    "Could not initialize the container because the config file could not be found:" + configFile);
080            }
081    
082            try
083            {
084                initialize();
085                getLogger().info("YaffiContainer ready.");
086            }
087            catch (Exception e)
088            {
089                getLogger().error("Could not initialize the container", e);
090                throw new RuntimeException("Could not initialize the container");
091            }
092        }
093    
094        // -------------------------------------------------------------
095        // Avalon lifecycle interfaces
096        // -------------------------------------------------------------
097    
098        /**
099         * Initializes the container
100         *
101         * @throws Exception generic exception
102         */
103        public void initialize() throws Exception
104        {
105            this.manager = ServiceContainerFactory.create(
106                this.config
107                );
108        }
109    
110        /**
111         * Disposes of the container and releases resources
112         */
113        public void dispose()
114        {
115            getLogger().debug("Disposing of container...");
116            if( this.manager != null )
117            {
118                this.manager.dispose();
119            }
120            getLogger().info("YaffiContainer has been disposed.");
121        }
122    
123        /**
124         * Returns an instance of the named component
125         *
126         * @param roleName Name of the role the component fills.
127         * @throws ComponentException generic exception
128         */
129        public Object lookup(String roleName) throws ComponentException
130        {
131            try
132            {
133                return this.manager.lookup(roleName);
134            }
135            catch( Exception e )
136            {
137                String msg = "Failed to lookup role " + roleName;
138                throw new ComponentException(roleName,msg,e);
139            }
140        }
141    
142        /**
143         * Releases the component implementing the Component interface. This
144         * interface is deprecated but still around in Fulcrum
145         *
146         * @param component
147         */
148        public void release(Component component)
149        {
150            this.manager.release(component);
151        }
152    
153        /**
154         * Releases the component
155         *
156         * @param component
157         */
158        public void release(Object component)
159        {
160            this.manager.release(component);
161        }
162    }