001 package org.apache.fulcrum.yaafi.interceptor.baseservice;
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 import java.util.HashSet;
024
025 import org.apache.avalon.framework.configuration.Configuration;
026 import org.apache.avalon.framework.configuration.ConfigurationException;
027 import org.apache.avalon.framework.configuration.Reconfigurable;
028 import org.apache.avalon.framework.context.Context;
029 import org.apache.avalon.framework.context.ContextException;
030 import org.apache.avalon.framework.context.Contextualizable;
031 import org.apache.avalon.framework.logger.AbstractLogEnabled;
032 import org.apache.avalon.framework.service.ServiceManager;
033 import org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext;
034 import org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService;
035 import org.apache.fulcrum.yaafi.framework.util.StringUtils;
036
037 /**
038 * A base service providing common functionality for interceptors
039 *
040 * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
041 */
042
043 public class BaseInterceptorServiceImpl
044 extends AbstractLogEnabled
045 implements AvalonInterceptorService, Contextualizable, Reconfigurable
046 {
047 /** this matches all services */
048 private static final String WILDCARD = "*";
049
050 /** contains the services being monitored by the interceptor */
051 private HashSet serviceSet;
052
053 /** is the interceptor service enabled */
054 private boolean isEnabled;
055
056 /** The name of the service as defined in the role configuration file */
057 private String serviceName;
058
059 /** The service manager supplied by the Avalon framework */
060 private ServiceManager serviceManager;
061
062 /** the Avalon application directory */
063 private File serviceApplicationDir;
064
065 /** the Avalon temp directory */
066 private File serviceTempDir;
067
068 /** the supplied class loader */
069 private ClassLoader classLoader;
070
071
072 /////////////////////////////////////////////////////////////////////////
073 // Avalon Service Lifecycle Implementation
074 /////////////////////////////////////////////////////////////////////////
075
076 /**
077 * Constructor
078 */
079 public BaseInterceptorServiceImpl()
080 {
081 this.serviceSet = new HashSet();
082 }
083
084 /**
085 * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
086 */
087 public void contextualize(Context context) throws ContextException
088 {
089 this.serviceName = (String) context.get("urn:avalon:name");
090 this.serviceApplicationDir = (File) context.get("urn:avalon:home");
091 this.serviceTempDir = (File) context.get("urn:avalon:temp");
092 this.classLoader = (ClassLoader) context.get("urn:avalon:classloader");
093 }
094
095 /**
096 * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
097 */
098 public void configure(Configuration configuration) throws ConfigurationException
099 {
100 // take care - the default is disabled which is helpful
101 // for the way we use the interceptors
102
103 this.isEnabled = configuration.getChild("isEnabled").getValueAsBoolean(false);
104
105 // parse the service to be monitored
106
107 Configuration[] serviceConfigList = configuration.getChild("services").getChildren("service");
108
109 if( serviceConfigList.length == 0 )
110 {
111 this.getServiceSet().add(WILDCARD);
112 }
113 else
114 {
115 for( int i=0; i<serviceConfigList.length; i++ )
116 {
117 String name = serviceConfigList[i].getAttribute("name", null);
118 String shorthand = serviceConfigList[i].getAttribute("shorthand", null);
119
120 if( !StringUtils.isEmpty(name) )
121 {
122 this.getServiceSet().add(name);
123 }
124
125 if( !StringUtils.isEmpty(shorthand) )
126 {
127 this.getServiceSet().add(shorthand);
128 }
129 }
130 }
131 }
132
133 /**
134 * @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
135 */
136 public void reconfigure(Configuration configuration) throws ConfigurationException
137 {
138 this.getServiceSet().clear();
139 }
140
141 /////////////////////////////////////////////////////////////////////////
142 // Service interface implementation
143 /////////////////////////////////////////////////////////////////////////
144
145 /**
146 * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onEntry(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext)
147 */
148 public void onEntry(AvalonInterceptorContext avalonInterceptorContext)
149 {
150 // nothing to do
151 }
152
153 /**
154 * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onError(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Throwable)
155 */
156 public void onError(AvalonInterceptorContext avalonInterceptorContext,Throwable t)
157 {
158 // nothing to do
159 }
160
161 /**
162 * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onExit(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Object)
163 */
164 public void onExit(AvalonInterceptorContext avalonInterceptorContext, Object result)
165 {
166 // nothing to do
167 }
168
169 /////////////////////////////////////////////////////////////////////////
170 // Service Implementation
171 /////////////////////////////////////////////////////////////////////////
172
173 /**
174 * @return Returns the isEnabled.
175 */
176 protected boolean isEnabled()
177 {
178 return isEnabled;
179 }
180
181 /**
182 * Determine if the given service is monitored.
183 *
184 * @param avalonInterceptorContext interceptor context
185 * @return true if the service is monitored or false otherwise
186 */
187 protected boolean isServiceMonitored( AvalonInterceptorContext avalonInterceptorContext )
188 {
189 if( !this.isEnabled() )
190 {
191 return false;
192 }
193 else if( this.getServiceSet().contains(WILDCARD) )
194 {
195 return true;
196 }
197 else if( this.getServiceSet().contains(avalonInterceptorContext.getServiceName()) )
198 {
199 return true;
200 }
201 else if( this.getServiceSet().contains(avalonInterceptorContext.getServiceShorthand()) )
202 {
203 return true;
204 }
205 else
206 {
207 return false;
208 }
209 }
210
211 /**
212 * @return Returns the serviceApplicationDir.
213 */
214 protected File getServiceApplicationDir()
215 {
216 return serviceApplicationDir;
217 }
218
219 /**
220 * @return Returns the serviceManager.
221 */
222 protected ServiceManager getServiceManager()
223 {
224 return serviceManager;
225 }
226
227 /**
228 * @return Returns the serviceName.
229 */
230 protected String getServiceName()
231 {
232 return serviceName;
233 }
234
235 /**
236 * @return Returns the serviceTempDir.
237 */
238 protected File getServiceTempDir()
239 {
240 return serviceTempDir;
241 }
242
243 /**
244 * @return Returns the classLoader.
245 */
246 protected ClassLoader getClassLoader() {
247 return this.classLoader;
248 }
249
250 /**
251 * Determines the file location of the given name. If the name denotes
252 * a relative file location it will be resolved using the application
253 * home directory.
254 *
255 * @param name the filename
256 * @return the file
257 */
258 protected File makeAbsoluteFile( String name )
259 {
260 File result = new File(name);
261
262 if( result.isAbsolute() == false )
263 {
264 result = new File( this.getServiceApplicationDir(), name );
265 }
266
267 return result;
268 }
269
270 /**
271 * @return Returns the serviceMap.
272 */
273 private HashSet getServiceSet()
274 {
275 return serviceSet;
276 }
277 }