2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.api
.application
;
11 import java
.util
.concurrent
.CancellationException
;
13 import org
.apache
.log4j
.Logger
;
14 import org
.springframework
.beans
.BeansException
;
15 import org
.springframework
.beans
.factory
.annotation
.QualifierAnnotationAutowireCandidateResolver
;
16 import org
.springframework
.beans
.factory
.config
.ConfigurableListableBeanFactory
;
17 import org
.springframework
.context
.support
.GenericApplicationContext
;
18 import org
.springframework
.core
.LocalVariableTableParameterNameDiscoverer
;
20 import eu
.etaxonomy
.cdm
.common
.monitor
.IProgressMonitor
;
21 import eu
.etaxonomy
.cdm
.common
.monitor
.SubProgressMonitor
;
24 * {@link GenericApplicationContext Generic application context} which allows progress monitoring.
29 public class MonitoredGenericApplicationContext
extends GenericApplicationContext
{
30 @SuppressWarnings("unused")
31 private static final Logger logger
= Logger
.getLogger(CdmApplicationController
.class);
33 final int countInvokeBeanFactoryPostProcessors
= 10;
34 final int countFinishBeanFactoryInitialization
= 90;
35 private final int countTasks
= countInvokeBeanFactoryPostProcessors
+ countFinishBeanFactoryInitialization
;
36 private IProgressMonitor currentMonitor
;
42 * @param progressMonitor
44 public MonitoredGenericApplicationContext() {
45 // MonitoredListableBeanFactory beanFactory =
46 super(new MonitoredListableBeanFactory());
47 //taken from empty constructor of GenericApplicationContext
48 ((MonitoredListableBeanFactory
)getBeanFactory()).setSerializationId(getId());
49 ((MonitoredListableBeanFactory
)getBeanFactory()).setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer());
50 ((MonitoredListableBeanFactory
)getBeanFactory()).setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
54 public int countTasks(){
58 protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory
){
59 String task
= "Invoke bean factory post processors";
60 checkMonitorCancelled(currentMonitor
);
61 currentMonitor
.subTask(task
);
62 super.invokeBeanFactoryPostProcessors(beanFactory
);
63 currentMonitor
.worked(countInvokeBeanFactoryPostProcessors
);
64 checkMonitorCancelled(currentMonitor
);
67 protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory
){
68 checkMonitorCancelled(currentMonitor
);
69 String task
= "Finish bean factory initialization";
70 currentMonitor
.subTask(task
);
71 IProgressMonitor subMonitor
= new SubProgressMonitor(currentMonitor
, countFinishBeanFactoryInitialization
);
72 getMyBeanFactory().setCurrentMonitor(subMonitor
);
73 super.finishBeanFactoryInitialization(beanFactory
);
74 checkMonitorCancelled(currentMonitor
);
79 * @param progressMonitor the progressMonitor to set
81 public void setCurrentMonitor(IProgressMonitor monitor
) {
82 this.currentMonitor
= monitor
;
88 public IProgressMonitor
getCurrentMonitor() {
89 return currentMonitor
;
94 * @see org.springframework.context.support.AbstractApplicationContext#refresh()
96 public void refresh(IProgressMonitor monitor
) throws BeansException
, IllegalStateException
{
97 checkMonitorCancelled(monitor
);
98 String message
= "Refresh application context. This might take a while ...";
99 currentMonitor
= monitor
;
100 beginTask(message
, countTasks
);
103 checkMonitorCancelled(monitor
);
110 private void taskDone() {
111 if (currentMonitor
!= null){
112 currentMonitor
.done();
121 private void beginTask(String message
, int countTasks
) {
122 if (currentMonitor
!= null){
123 currentMonitor
.beginTask(message
, countTasks
);
128 private MonitoredListableBeanFactory
getMyBeanFactory(){
129 return (MonitoredListableBeanFactory
)getBeanFactory();
133 private void checkMonitorCancelled(IProgressMonitor monitor
) {
134 if (monitor
!= null && monitor
.isCanceled()){
135 throw new CancellationException();