1 87 package org.codehaus.loom.components.util.lifecycle; 88 89 import java.util.HashMap ; 90 import java.util.Iterator ; 91 import java.util.Map ; 92 import org.apache.avalon.framework.component.Component; 93 import org.apache.avalon.framework.component.ComponentManager; 94 import org.apache.avalon.framework.component.DefaultComponentManager; 95 import org.apache.avalon.framework.configuration.Configuration; 96 import org.apache.avalon.framework.context.Context; 97 import org.apache.avalon.framework.context.DefaultContext; 98 import org.apache.avalon.framework.parameters.Parameters; 99 import org.apache.avalon.framework.service.DefaultServiceManager; 100 import org.apache.avalon.framework.service.ServiceManager; 101 import org.codehaus.loom.components.util.factory.ComponentFactory; 102 import org.codehaus.loom.components.util.info.ComponentInfo; 103 import org.codehaus.loom.components.util.metadata.ComponentTemplate; 104 import org.codehaus.loom.components.util.metadata.DependencyDirective; 105 import org.codehaus.spice.alchemist.configuration.ConfigurationAlchemist; 106 import org.codehaus.spice.salt.i18n.ResourceManager; 107 import org.codehaus.spice.salt.i18n.Resources; 108 import org.codehaus.dna.AbstractLogEnabled; 109 110 122 public abstract class AbstractResourceProvider 123 extends AbstractLogEnabled 124 implements ResourceProvider 125 { 126 private final static Resources REZ = 127 ResourceManager.getPackageResources( AbstractResourceProvider.class ); 128 129 private final ComponentFactory m_factory; 130 131 136 protected AbstractResourceProvider( final ComponentFactory factory ) 137 { 138 if( null == factory ) 139 { 140 throw new NullPointerException ( "factory" ); 141 } 142 m_factory = factory; 143 } 144 145 155 protected abstract Object getService( String name, Object entry ); 156 157 167 protected abstract Object getContextValue( String name, Object entry ); 168 169 177 public Object createObject( final Object entry ) 178 throws Exception 179 { 180 final ComponentTemplate component = getMetaData( entry ); 181 final String implementationKey = component.getImplementationKey(); 182 return m_factory.createComponent( implementationKey ); 183 } 184 185 193 public Parameters createParameters( final Object entry ) 194 throws Exception 195 { 196 final ComponentTemplate component = getMetaData( entry ); 197 final Parameters parameters = component.getParameters(); 198 if( null == parameters ) 199 { 200 final String message = 201 REZ.format( "resource.missing-parameters.error", 202 component.getName() ); 203 throw new Exception ( message ); 204 } 205 parameters.makeReadOnly(); 206 return parameters; 207 } 208 209 216 public Configuration createConfiguration( final Object entry ) 217 throws Exception 218 { 219 final ComponentTemplate component = getMetaData( entry ); 220 final Configuration configuration = 221 ConfigurationAlchemist.toAvalonConfiguration( 222 component.getConfiguration() ); 223 if( null == configuration ) 224 { 225 final String message = 226 REZ.format( "resource.missing-configuration.error", 227 component.getName() ); 228 throw new Exception ( message ); 229 } 230 return configuration; 231 } 232 233 242 protected Context createContextImpl( final Map contextData ) 243 { 244 final DefaultContext context = new DefaultContext( contextData ); 245 context.makeReadOnly(); 246 return context; 247 } 248 249 258 protected ComponentTemplate getMetaData( final Object entry ) 259 { 260 return (ComponentTemplate)entry; 261 } 262 263 271 public final Context createContext( final Object componentEntry ) 272 throws Exception 273 { 274 return createContextImpl( new HashMap () ); 275 } 276 277 284 public final ComponentManager createComponentManager( final Object entry ) 285 throws Exception 286 { 287 final Map services = createServiceMap( entry ); 288 289 final DefaultComponentManager componentManager = new DefaultComponentManager(); 290 291 final Iterator keys = services.keySet().iterator(); 292 while( keys.hasNext() ) 293 { 294 final String key = (String )keys.next(); 295 final Object service = services.get( key ); 296 if( !Component.class.isInstance( service ) ) 297 { 298 final String message = 299 REZ.format( "resource.service-not-a-component.error", 300 key, 301 service.getClass().getName() ); 302 throw new Exception ( message ); 303 } 304 componentManager.put( key, (Component)service ); 305 } 306 307 componentManager.makeReadOnly(); 308 return componentManager; 309 } 310 311 318 public final ServiceManager createServiceManager( final Object entry ) 319 throws Exception 320 { 321 final Map services = createServiceMap( entry ); 322 323 final DefaultServiceManager serviceManager = new DefaultServiceManager(); 324 325 final Iterator keys = services.keySet().iterator(); 326 while( keys.hasNext() ) 327 { 328 final String key = (String )keys.next(); 329 final Object service = services.get( key ); 330 serviceManager.put( key, service ); 331 } 332 333 serviceManager.makeReadOnly(); 334 return serviceManager; 335 } 336 337 342 protected final ComponentFactory getComponentFactory() 343 { 344 return m_factory; 345 } 346 347 355 private Map createServiceMap( final Object entry ) 356 throws Exception 357 { 358 final ComponentTemplate component = getMetaData( entry ); 359 final String impl = component.getImplementationKey(); 360 final ComponentInfo info = m_factory.createInfo( impl ); 361 final DependencyDirective[] dependencies = component.getDependencies(); 362 363 final HashMap services = new HashMap (); 364 365 for( int i = 0; i < dependencies.length; i++ ) 366 { 367 final DependencyDirective dependency = dependencies[ i ]; 368 final String key = dependency.getKey(); 369 final String providerName = dependency.getProviderName(); 370 final boolean optional = info.getDependency( key ).isOptional(); 371 372 final Object service = 373 getService( providerName, entry ); 374 if( null == service ) 375 { 376 final String message = 377 REZ.format( "resource.missing-dependency.error", 378 optional ? "1" : "2", 379 key, 380 component.getName() ); 381 if( !optional ) 382 { 383 throw new Exception ( message ); 384 } 385 else 386 { 387 getLogger().warn( message ); 388 continue; 389 } 390 } 391 392 services.put( key, service ); 393 } 394 395 return services; 396 } 397 } 398 | Popular Tags |