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