001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.fulcrum.yaafi.framework.configuration;
020
021 import java.io.File;
022 import java.io.IOException;
023 import java.io.InputStream;
024 import java.util.Properties;
025
026 import org.apache.avalon.framework.configuration.Configurable;
027 import org.apache.avalon.framework.configuration.Configuration;
028 import org.apache.avalon.framework.configuration.ConfigurationException;
029 import org.apache.avalon.framework.context.Context;
030 import org.apache.avalon.framework.context.ContextException;
031 import org.apache.avalon.framework.context.Contextualizable;
032 import org.apache.avalon.framework.logger.LogEnabled;
033 import org.apache.avalon.framework.logger.Logger;
034 import org.apache.fulcrum.yaafi.framework.constant.AvalonYaafiConstants;
035 import org.apache.fulcrum.yaafi.framework.util.InputStreamLocator;
036
037 /**
038 * Base class to expand the value and all attributes. This class is intentend
039 * to be sub-classed if you hook up your own configuration mechanism.
040 *
041 * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
042 */
043 public abstract class ComponentConfigurationPropertiesResolverBaseImpl
044 implements ComponentConfigurationPropertiesResolver, LogEnabled, Contextualizable, Configurable
045 {
046 /** the logger of the container */
047 private Logger logger;
048
049 /** the Avalon context */
050 private Context context;
051
052 /** the container configuration */
053 private Configuration configuration;
054
055 /*
056 * @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger)
057 */
058 public void enableLogging(Logger logger)
059 {
060 this.logger = logger;
061 }
062
063 /*
064 * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
065 */
066 public void contextualize(Context context) throws ContextException
067 {
068 this.context = context;
069 }
070
071 /**
072 * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
073 */
074 public void configure(Configuration configuration) throws ConfigurationException
075 {
076 this.configuration = configuration;
077 }
078
079 /**
080 * @return Returns the logger.
081 */
082 protected Logger getLogger()
083 {
084 return logger;
085 }
086
087 /**
088 * @return Returns the context.
089 */
090 protected Context getContext()
091 {
092 return context;
093 }
094
095 /**
096 * @return the home directory of the application
097 */
098 protected File getApplicationRootDir()
099 {
100 try
101 {
102 return (File) this.getContext().get(AvalonYaafiConstants.URN_AVALON_HOME);
103 }
104 catch(Exception e)
105 {
106 throw new RuntimeException(e.getMessage());
107 }
108 }
109
110 /**
111 * @return Returns the configuration.
112 */
113 protected Configuration getConfiguration()
114 {
115 return configuration;
116 }
117
118 /**
119 * @return Returns the componentConfigurationPropertiesLocation.
120 */
121 protected String getLocation()
122 {
123 return configuration.getChild("location").getValue(COMPONENT_CONFIG_PROPERTIES_VALUE );
124 }
125
126 /**
127 * Creates an InputStream using a Locator.
128 * @return the InputStrem or null if the resource was not found
129 */
130 protected InputStream createInputStream(String location) throws IOException
131 {
132 InputStreamLocator locator = new InputStreamLocator(this.getApplicationRootDir(), this.getLogger());
133 return locator.locate(location);
134 }
135
136 /**
137 * Add the Avalon context variables.
138 */
139 protected void addAvalonContext(Properties properties) throws ContextException
140 {
141 properties.put(
142 AvalonYaafiConstants.URN_AVALON_NAME,
143 this.getContext().get(AvalonYaafiConstants.URN_AVALON_NAME)
144 );
145
146 properties.put(
147 AvalonYaafiConstants.URN_AVALON_PARTITION,
148 this.getContext().get(AvalonYaafiConstants.URN_AVALON_PARTITION)
149 );
150
151 properties.put(
152 AvalonYaafiConstants.URN_AVALON_HOME,
153 this.getContext().get(AvalonYaafiConstants.URN_AVALON_HOME)
154 );
155
156 properties.put(
157 AvalonYaafiConstants.URN_AVALON_TEMP,
158 this.getContext().get(AvalonYaafiConstants.URN_AVALON_TEMP)
159 );
160 }
161
162 protected Properties loadProperties(String location) throws Exception
163 {
164 Properties result = new Properties();
165 InputStream is = this.createInputStream(location);
166
167 try
168 {
169 if(is != null)
170 {
171 result.load(is);
172 is.close();
173 is = null;
174 }
175 else
176 {
177 this.getLogger().debug("Unable to load the following optional file :" + location);
178 }
179
180 return result;
181 }
182 catch ( Exception e )
183 {
184 String msg = "Unable to parse the following file : " + location;
185 this.getLogger().error( msg , e );
186 throw e;
187 }
188 }
189 }