3 * Copyright (C) 2009 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.api
.application
;
12 import java
.util
.Arrays
;
13 import java
.util
.HashSet
;
14 import java
.util
.List
;
16 import java
.util
.concurrent
.CancellationException
;
18 import org
.apache
.log4j
.Logger
;
19 import org
.springframework
.beans
.BeansException
;
20 import org
.springframework
.beans
.factory
.support
.DefaultListableBeanFactory
;
21 import org
.springframework
.beans
.factory
.support
.RootBeanDefinition
;
23 import eu
.etaxonomy
.cdm
.common
.monitor
.IProgressMonitor
;
30 public class RemotingMonitoredListableBeanFactory
extends DefaultListableBeanFactory
{
31 @SuppressWarnings("unused")
32 private static final Logger logger
= Logger
.getLogger(RemotingMonitoredListableBeanFactory
.class);
34 private boolean isInitializingBeans
= false;
35 private IProgressMonitor currentMonitor
;
37 private static List
<String
> beansToMonitor
= Arrays
.asList("sessionFactory","defaultBeanInitializer","persistentTermInitializer");
38 private final Set
<String
> alreadyMonitoredBeans
= new HashSet
<String
>();
40 public RemotingMonitoredListableBeanFactory(){
44 // protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
45 // if (registeredBeanNames.contains(beanName)){
46 // return super.getMergedLocalBeanDefinition(beanName);
49 //// String message = "Handle bean '%s'";
50 //// message = String.format(message, beanName);
51 //// currentMonitor.subTask(message);
52 // RootBeanDefinition result = super.getMergedLocalBeanDefinition(beanName);
53 //// currentMonitor.worked(1);
54 //// registeredBeanNames.add(beanName);
59 public void preInstantiateSingletons() throws BeansException
{
60 isInitializingBeans
= true;
61 checkMonitorCancelled(currentMonitor
);
63 for (String beanName
: getBeanDefinitionNames()) {
64 RootBeanDefinition bd
= getMergedLocalBeanDefinition(beanName
);
65 if (!bd
.isAbstract() && bd
.isSingleton() && !bd
.isLazyInit() && beansToMonitor
.contains(beanName
) ){
69 String message
= "preinstantiate singletons";
70 currentMonitor
.beginTask(message
, countBeans
);
71 super.preInstantiateSingletons();
72 isInitializingBeans
= false;
73 currentMonitor
.done();
76 // protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly){
77 // boolean doMonitor = isInitializingBeans && !monitoredBeanNames.contains(name);
79 // String message = "Handle bean '%s'";
80 // message = String.format(message, name);
81 // currentMonitor.subTask(message);
82 // monitoredBeanNames.add(name);
84 // T result = super.doGetBean(name, requiredType, args, typeCheckOnly);
86 // currentMonitor.worked(1);
92 protected Object
createBean(final String name
, final RootBeanDefinition mbd
, final Object
[] args
){
93 boolean doMonitor
= isInitializingBeans
&& beansToMonitor
.contains(name
) && !alreadyMonitoredBeans
.contains(name
);
94 checkMonitorCancelled(currentMonitor
);
97 if (name
.equals("sessionFactory")){
98 message
= "Initializing persistence context ...";
99 }else if(name
.equals("persistentTermInitializer")){
100 message
= "Loading terms ...";
102 message
= "Handling '%s'";
103 message
= String
.format(message
, name
);
105 currentMonitor
.subTask(message
);
106 alreadyMonitoredBeans
.add(name
);
108 Object result
= super.createBean(name
, mbd
, args
);
110 checkMonitorCancelled(currentMonitor
);
111 currentMonitor
.worked(1);
118 * @param mainMonitor the mainMonitor to set
120 public void setCurrentMonitor(IProgressMonitor monitor
) {
121 this.currentMonitor
= monitor
;
124 private void checkMonitorCancelled(IProgressMonitor monitor
) {
125 if (monitor
!= null && monitor
.isCanceled()){
126 throw new CancellationException();