emall fix for selection of reference as inreference
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / application / MonitoredGenericApplicationContext.java
1 /**
2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9 package eu.etaxonomy.cdm.api.application;
10
11 import java.util.concurrent.CancellationException;
12
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;
19
20 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
21 import eu.etaxonomy.cdm.common.monitor.SubProgressMonitor;
22
23 /**
24 * {@link GenericApplicationContext Generic application context} which allows progress monitoring.
25 * @author a.mueller
26 * @date 29.09.2011
27 *
28 */
29 public class MonitoredGenericApplicationContext extends GenericApplicationContext{
30 @SuppressWarnings("unused")
31 private static final Logger logger = Logger.getLogger(CdmApplicationController.class);
32
33 final int countInvokeBeanFactoryPostProcessors = 10;
34 final int countFinishBeanFactoryInitialization = 90;
35 private final int countTasks = countInvokeBeanFactoryPostProcessors + countFinishBeanFactoryInitialization;
36 private IProgressMonitor currentMonitor;
37
38
39
40 /**
41 * Constructor.
42 * @param progressMonitor
43 */
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());
51 }
52
53
54 public int countTasks(){
55 return countTasks;
56 }
57
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);
65 }
66
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);
75
76 }
77
78 /**
79 * @param progressMonitor the progressMonitor to set
80 */
81 public void setCurrentMonitor(IProgressMonitor monitor) {
82 this.currentMonitor = monitor;
83 }
84
85 /**
86 *
87 */
88 public IProgressMonitor getCurrentMonitor() {
89 return currentMonitor;
90 }
91
92
93 /* (non-Javadoc)
94 * @see org.springframework.context.support.AbstractApplicationContext#refresh()
95 */
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);
101 super.refresh();
102 taskDone();
103 checkMonitorCancelled(monitor);
104 }
105
106
107 /**
108 *
109 */
110 private void taskDone() {
111 if (currentMonitor != null){
112 currentMonitor.done();
113 }
114 }
115
116
117 /**
118 * @param monitor
119 * @param message
120 */
121 private void beginTask(String message, int countTasks) {
122 if (currentMonitor != null){
123 currentMonitor.beginTask(message, countTasks);
124 }
125 }
126
127
128 private MonitoredListableBeanFactory getMyBeanFactory(){
129 return (MonitoredListableBeanFactory)getBeanFactory();
130 }
131
132
133 private void checkMonitorCancelled(IProgressMonitor monitor) {
134 if (monitor != null && monitor.isCanceled()){
135 throw new CancellationException();
136 }
137 }
138 }