1 100 package com.ivata.groupware.container; 101 102 import groovy.lang.Binding; 103 104 import java.io.FileNotFoundException ; 105 import java.io.InputStream ; 106 import java.io.InputStreamReader ; 107 import java.io.Serializable ; 108 import java.math.BigDecimal ; 109 import java.sql.Connection ; 110 import java.sql.DriverManager ; 111 import java.sql.ResultSet ; 112 import java.sql.Statement ; 113 import java.util.HashMap ; 114 import java.util.Map ; 115 import java.util.Properties ; 116 117 import javax.naming.Context ; 118 import javax.naming.InitialContext ; 119 import javax.naming.NamingException ; 120 121 import net.sf.hibernate.SessionFactory; 122 123 import org.apache.log4j.Logger; 124 import org.nanocontainer.reflection.DefaultNanoPicoContainer; 125 import org.nanocontainer.script.ScriptedContainerBuilder; 126 import org.nanocontainer.script.groovy.GroovyContainerBuilder; 127 import org.picocontainer.MutablePicoContainer; 128 import org.picocontainer.PicoContainer; 129 import org.picocontainer.defaults.DefaultPicoContainer; 130 import org.picocontainer.defaults.ObjectReference; 131 import org.picocontainer.defaults.SimpleReference; 132 133 import com.ivata.groupware.container.persistence.hibernate.HibernateSetupConstants; 134 import com.ivata.mask.DefaultMaskFactory; 135 import com.ivata.mask.MaskFactory; 136 import com.ivata.mask.field.DefaultFieldValueConvertorFactory; 137 import com.ivata.mask.util.SystemException; 138 139 148 public final class PicoContainerFactory implements Serializable { 149 152 public static final String APPLICATION_SCOPE = "IGW_APPLICATION_SCOPE"; 153 156 private static PicoContainerFactory instance = new PicoContainerFactory(); 157 158 161 private static Logger logger = Logger.getLogger(PicoContainerFactory.class); 162 166 public static final String NO_SCOPE = "IGW_NO_SCOPE"; 167 171 public static final String SINGLETON_SCOPE = "IGW_SINGLETON_SCOPE"; 172 173 176 private static Class classForName(final String name) throws Exception { 177 try { 178 return Class.forName(name); 179 } catch(Exception e) { 180 logger.error(e.getClass().getName() 181 + " thrown looking for class called '" 182 + name 183 + "'", e); 184 throw e; 185 } 186 } 187 193 public static PicoContainerFactory getInstance() 194 throws SystemException { 195 if (logger.isDebugEnabled()) { 196 logger.debug("getInstance() - start"); 197 } 198 199 synchronized (instance) { 200 if (!instance.isInitialized()) { 201 if (logger.isDebugEnabled()) { 202 logger.debug("getInstance() - intiializing."); 203 } 204 instance.initialize(); 205 } 206 } 207 if (logger.isDebugEnabled()) { 208 logger.debug("getInstance() - end - return value = " 209 + instance); 210 } 211 return instance; 212 } 213 217 private ScriptedContainerBuilder builder = null; 218 221 private PicoContainer globalContainer; 222 225 private String hibernateConfigFileName = null; 226 231 private MaskFactory maskFactory = new DefaultMaskFactory( 232 "imInputMaskAction", "imListAction", 233 new DefaultFieldValueConvertorFactory()); 234 238 private String nanoContainerScript = "/nanoContainer.groovy"; 239 243 private SessionFactory sessionFactory = null; 244 245 246 253 private Map settings = new HashMap (); 254 255 259 private Map singletonInstances = new HashMap (); 260 265 public PicoContainerFactory() { 266 } 267 273 public PicoContainer getContainer(final String scope, 274 final PicoContainer parentContainer) 275 throws SystemException { 276 assert (builder != null); 277 ObjectReference containerRef = new SimpleReference(); 278 ObjectReference parentContainerRef = new SimpleReference(); 279 parentContainerRef.set(parentContainer); 280 builder.buildContainer(containerRef, parentContainerRef, 281 scope, true); 282 return (PicoContainer) containerRef.get(); 283 } 284 285 290 public PicoContainer getGlobalContainer() { 291 assert (globalContainer != null); 292 return globalContainer; 293 } 294 300 public String getHibernateConfigFileName() { 301 return hibernateConfigFileName; 302 } 303 310 public MaskFactory getMaskFactory() { 311 return maskFactory; 312 } 313 317 public Map getSettings() { 318 return settings; 319 } 320 327 public Map getSingletonInstances() { 328 return singletonInstances; 329 } 330 339 public void initialize() throws SystemException { 340 ClassLoader classLoader = 341 Thread.currentThread().getContextClassLoader(); 342 PicoContainer parentContainer = 343 new DefaultNanoPicoContainer(classLoader); 344 InputStreamReader scriptReader; 347 try { 348 InputStream inputStream = classLoader.getResourceAsStream( 349 nanoContainerScript); 350 if (inputStream == null) { 351 throw new FileNotFoundException ("Could not find '" 352 + nanoContainerScript 353 + "' on the current class path."); 354 } 355 scriptReader = new InputStreamReader (inputStream); 356 } catch (Exception e) { 357 logger.error(e.getClass().getName() 358 + " thrown loading nano container script '" 359 + nanoContainerScript 360 + "'", e); 361 throw new SystemException(e); 362 } 363 builder = new GroovyContainerBuilder( 364 scriptReader, 365 classLoader) { 366 372 protected void handleBinding(final Binding binding) { 373 if (logger.isDebugEnabled()) { 374 logger.debug("handleBinding(Binding binding = " + binding 375 + ") - start"); 376 } 377 378 binding.setProperty("factory", instance); 379 super.handleBinding(binding); 380 381 if (logger.isDebugEnabled()) { 382 logger.debug("handleBinding(Binding) - end"); 383 } 384 } 385 }; 386 387 try { 389 parentContainer = getContainer(SINGLETON_SCOPE, 390 parentContainer); 391 } catch (Exception e) { 392 logger.error ("initialize - " 393 + e.getClass().getName() 394 + " initializing the SINGLETON_SCOPE.", e); 395 throw new SystemException(e); 396 } 397 try { 399 globalContainer = getContainer(APPLICATION_SCOPE, 400 parentContainer); 401 } catch (Exception e) { 402 logger.error ("initialize - " 403 + e.getClass().getName() 404 + " initializing the APPLICATION_SCOPE.", e); 405 throw new SystemException(e); 406 } 407 } 408 409 431 public void initializeSettingsCache(Properties 432 hibernateProperties) throws Exception { 433 settings.clear(); 434 String driverClass = hibernateProperties.getProperty( 435 HibernateSetupConstants 436 .HIBERNATE_PROPERTY_DATABASE_DRIVER); 437 assert(driverClass != null); 438 classForName(driverClass); 439 String uRL = hibernateProperties.getProperty( 440 HibernateSetupConstants 441 .HIBERNATE_PROPERTY_DATABASE_URL); 442 assert(uRL != null); 443 String userName =hibernateProperties.getProperty( 444 HibernateSetupConstants 445 .HIBERNATE_PROPERTY_DATABASE_USER_NAME); 446 assert(userName != null); 447 String password = hibernateProperties.getProperty( 448 HibernateSetupConstants 449 .HIBERNATE_PROPERTY_DATABASE_PASSWORD); 450 Connection connection = DriverManager.getConnection(uRL, userName, 451 password); 452 Statement statement = connection.createStatement(); 453 ResultSet allSettings = statement.executeQuery( 455 "select name, value, type from setting where person_user is " 456 + "null"); 457 while(allSettings.next()) { 458 String name = allSettings.getString(1); 459 String stringValue = allSettings.getString(2); 460 int type = allSettings.getInt(3); 461 Object value; 462 if (type == 0) { 463 value = new BigDecimal (stringValue); 464 } else if (type == 2) { 465 value = new Boolean (stringValue); 466 } else { 467 value = stringValue; 468 } 469 settings.put(name, value); 470 } 471 statement.close(); 472 } 473 483 public Object instantiateOrOverride( 484 Class theClass) 485 throws SystemException { 486 return instantiateOrOverride(globalContainer, theClass); 487 } 488 public Object instantiateOrOverride(PicoContainer container, 489 Class theClass) 490 throws SystemException { 491 Object instance = container.getComponentInstance(theClass); 492 if (instance != null) { 493 return instance; 494 } 495 496 MutablePicoContainer tempContainer = 498 new DefaultPicoContainer(container); 499 tempContainer.registerComponentImplementation(theClass); 500 instance = tempContainer.getComponentInstance(theClass); 501 if (instance != null) { 502 return instance; 503 } 504 505 tempContainer = override(container); 507 tempContainer.registerComponentImplementation(theClass); 508 return tempContainer.getComponentInstance(theClass); 509 } 510 511 521 public Object instantiateOrOverride(PicoContainer container, 522 String className) 523 throws SystemException { 524 assert (className != null); 525 Class theClass; 526 try { 527 theClass = classForName(className); 528 } catch (Exception e) { 529 throw new SystemException(e); 530 } 531 return instantiateOrOverride(container, theClass); 532 } 533 539 public boolean isInitialized() { 540 return (!singletonInstances.isEmpty()); 541 } 542 543 550 public MutablePicoContainer override(PicoContainer parent) 551 throws SystemException { 552 return (MutablePicoContainer) getContainer(NO_SCOPE, parent); 553 } 554 558 public void reset() { 559 singletonInstances.clear(); 560 globalContainer = null; 561 sessionFactory = null; 562 } 563 568 public void setHibernateConfigFileName(String hibernateConfigFileNameParam) { 569 if (logger.isDebugEnabled()) { 570 logger.debug("Setting hibernateConfigFileName. Before '" 571 + hibernateConfigFileName + "', after '" 572 + hibernateConfigFileNameParam + "'"); 573 } 574 hibernateConfigFileName = hibernateConfigFileNameParam; 575 } 576 580 public void setSettings(Map settingsParam) { 581 if (logger.isDebugEnabled()) { 582 logger.debug("Setting settings. Before '" + settings + "', after '" 583 + settingsParam + "'"); 584 } 585 settings = settingsParam; 586 } 587 591 public void setSingletonInstances(Map singletonInstancesParam) { 592 if (logger.isDebugEnabled()) { 593 logger.debug("Setting singletonInstances. Before '" 594 + singletonInstances + "', after '" 595 + singletonInstancesParam + "'"); 596 } 597 singletonInstances = singletonInstancesParam; 598 } 599 } 600 | Popular Tags |