1 8 package org.apache.avalon.phoenix.components.kernel; 9 10 import java.util.HashMap ; 11 import java.io.File ; 12 import org.apache.avalon.excalibur.i18n.ResourceManager; 13 import org.apache.avalon.excalibur.i18n.Resources; 14 import org.apache.avalon.framework.CascadingException; 15 import org.apache.avalon.framework.activity.Disposable; 16 import org.apache.avalon.framework.activity.Initializable; 17 import org.apache.avalon.framework.configuration.Configurable; 18 import org.apache.avalon.framework.configuration.Configuration; 19 import org.apache.avalon.framework.configuration.ConfigurationException; 20 import org.apache.avalon.framework.container.ContainerUtil; 21 import org.apache.avalon.framework.logger.AbstractLogEnabled; 22 import org.apache.avalon.framework.logger.Logger; 23 import org.apache.avalon.framework.service.DefaultServiceManager; 24 import org.apache.avalon.framework.service.ServiceException; 25 import org.apache.avalon.framework.service.ServiceManager; 26 import org.apache.avalon.framework.service.Serviceable; 27 import org.apache.avalon.phoenix.components.application.DefaultApplication; 28 import org.apache.avalon.phoenix.interfaces.Application; 29 import org.apache.avalon.phoenix.interfaces.ApplicationContext; 30 import org.apache.avalon.phoenix.interfaces.ApplicationMBean; 31 import org.apache.avalon.phoenix.interfaces.ConfigurationRepository; 32 import org.apache.avalon.phoenix.interfaces.ConfigurationValidator; 33 import org.apache.avalon.phoenix.interfaces.Kernel; 34 import org.apache.avalon.phoenix.interfaces.KernelMBean; 35 import org.apache.avalon.phoenix.interfaces.SystemManager; 36 import org.apache.avalon.phoenix.metadata.SarMetaData; 37 38 51 public class DefaultKernel 52 extends AbstractLogEnabled 53 implements Kernel, KernelMBean, Initializable, Serviceable, Disposable, Configurable 54 { 55 private static final Resources REZ = 56 ResourceManager.getPackageResources( DefaultKernel.class ); 57 58 private SystemManager m_systemManager; 60 61 private SystemManager m_applicationManager; 62 63 private ConfigurationRepository m_repository; 65 66 private ConfigurationValidator m_validator; 68 69 private HashMap m_entries = new HashMap (); 70 71 private boolean m_addInvalidApplications; 72 73 public void service( final ServiceManager serviceManager ) 74 throws ServiceException 75 { 76 m_systemManager = (SystemManager)serviceManager.lookup( SystemManager.ROLE ); 77 m_repository = (ConfigurationRepository)serviceManager. 78 lookup( ConfigurationRepository.ROLE ); 79 m_validator = (ConfigurationValidator)serviceManager.lookup( ConfigurationValidator.ROLE ); 80 } 81 82 public void configure( Configuration configuration ) 83 throws ConfigurationException 84 { 85 m_addInvalidApplications = 86 configuration.getChild( "add-invalid-applications" ).getValueAsBoolean( false ); 87 } 88 89 public void initialize() 90 throws Exception 91 { 92 m_applicationManager = 93 m_systemManager.getSubContext( null, "application" ); 94 } 95 96 public void dispose() 97 { 98 final String [] names = getApplicationNames(); 99 for( int i = 0; i < names.length; i++ ) 100 { 101 try 102 { 103 final SarEntry entry = (SarEntry)m_entries.get( names[ i ] ); 104 shutdown( entry ); 105 } 106 catch( final Exception e ) 107 { 108 final String message = REZ.getString( "kernel.error.entry.dispose", names[ i ] ); 109 getLogger().warn( message, e ); 110 } 111 } 112 } 113 114 public String [] getApplicationNames() 115 { 116 return (String [])m_entries.keySet().toArray( new String [ 0 ] ); 117 } 118 119 public Application getApplication( final String name ) 120 { 121 final SarEntry entry = (SarEntry)m_entries.get( name ); 122 if( null == entry ) 123 { 124 return null; 125 } 126 else 127 { 128 return entry.getApplication(); 129 } 130 } 131 132 138 private void startup( final SarEntry entry ) 139 throws Exception 140 { 141 synchronized( entry ) 143 { 144 final String name = entry.getMetaData().getName(); 145 146 Application application = entry.getApplication(); 147 if( null == application ) 148 { 149 try 150 { 151 final Application newApp = new DefaultApplication(); 152 final Logger childLogger = 153 getLogger().getChildLogger( name ); 154 ContainerUtil.enableLogging( newApp, childLogger ); 155 156 final ApplicationContext context = 157 createApplicationContext( entry ); 158 newApp.setApplicationContext( context ); 159 160 ContainerUtil.initialize( newApp ); 161 162 application = newApp; 163 } 164 catch( final Throwable t ) 165 { 166 entry.setApplication( null ); 169 170 final String message = 171 REZ.getString( "kernel.error.entry.initialize", 172 entry.getMetaData().getName() ); 173 throw new CascadingException( message, t ); 174 } 175 176 try 177 { 178 ContainerUtil.start( application ); 179 } 180 catch( final Throwable t ) 181 { 182 final String message = 183 REZ.getString( "kernel.error.entry.start", entry.getMetaData().getName() ); 184 185 if( m_addInvalidApplications ) 186 { 187 getLogger().warn( message, t ); 188 } 189 else 190 { 191 entry.setApplication( null ); 194 195 throw new CascadingException( message, t ); 196 } 197 } 198 199 entry.setApplication( application ); 200 201 try 203 { 204 m_applicationManager.register( name, 205 application, 206 new Class []{ApplicationMBean.class} ); 207 } 208 catch( final Throwable t ) 209 { 210 final String message = 211 REZ.getString( "kernel.error.entry.manage", name ); 212 throw new CascadingException( message, t ); 213 } 214 } 215 } 216 } 217 218 private void shutdown( final SarEntry entry ) 219 throws Exception 220 { 221 synchronized( entry ) 223 { 224 final Application application = entry.getApplication(); 225 if( null != application ) 226 { 227 entry.setApplication( null ); 228 ContainerUtil.shutdown( application ); 229 } 230 else 231 { 232 final String message = 233 REZ.getString( "kernel.error.entry.nostop", 234 entry.getMetaData().getName() ); 235 getLogger().warn( message ); 236 } 237 } 238 } 239 240 public void addApplication( final SarMetaData metaData, 241 final File workDirectory, 242 final ClassLoader classLoader, 243 final Logger logger, 244 final Configuration server ) 245 throws Exception 246 { 247 final String name = metaData.getName(); 248 final SarEntry entry = 249 new SarEntry( metaData, workDirectory, classLoader, logger, server ); 250 m_entries.put( name, entry ); 251 252 try 253 { 254 startup( (SarEntry)entry ); 255 } 256 catch( final Exception e ) 257 { 258 final String message = REZ.getString( "kernel.error.entry.start", name ); 259 getLogger().warn( message, e ); 260 throw e; 261 } 262 } 263 264 private ApplicationContext createApplicationContext( final SarEntry entry ) 265 throws Exception 266 { 267 final SarMetaData metaData = entry.getMetaData(); 268 final String name = metaData.getName(); 269 270 final DefaultApplicationContext context = 271 new DefaultApplicationContext( metaData, 272 entry.getWorkDirectory(), 273 entry.getClassLoader(), 274 entry.getLogger() ); 275 276 ContainerUtil.enableLogging( context, createContextLogger( name ) ); 277 ContainerUtil.service( context, createServiceManager() ); 278 ContainerUtil.initialize( context ); 279 return context; 280 } 281 282 288 private Logger createContextLogger( final String name ) 289 { 290 final String loggerName = name + ".frame"; 291 final Logger childLogger = 292 getLogger().getChildLogger( loggerName ); 293 return childLogger; 294 } 295 296 private ServiceManager createServiceManager() 297 { 298 final DefaultServiceManager componentManager = new DefaultServiceManager(); 299 componentManager.put( SystemManager.ROLE, m_systemManager ); 300 componentManager.put( ConfigurationRepository.ROLE, m_repository ); 301 componentManager.put( ConfigurationValidator.ROLE, m_validator ); 302 componentManager.put( Kernel.ROLE, this ); 303 componentManager.makeReadOnly(); 304 return componentManager; 305 } 306 307 public void removeApplication( String name ) 308 throws Exception 309 { 310 final SarEntry entry = (SarEntry)m_entries.remove( name ); 311 if( null == entry ) 312 { 313 final String message = 314 REZ.getString( "kernel.error.entry.initialize", name ); 315 throw new Exception ( message ); 316 } 317 else 318 { 319 try 321 { 322 m_applicationManager.unregister( name ); 323 } 324 catch( final Throwable t ) 325 { 326 final String message = 327 REZ.getString( "kernel.error.entry.unmanage", name ); 328 throw new CascadingException( message, t ); 329 } 330 331 shutdown( entry ); 332 } 333 } 334 } 335 | Popular Tags |