Merge branch 'develop' into remoting-4.0
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationRemoteController.java
1 /**
2 * Copyright (C) 2014 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
10
11 package eu.etaxonomy.cdm.api.application;
12
13 import java.util.List;
14
15 import org.apache.log4j.Logger;
16 import org.hibernate.collection.internal.AbstractPersistentCollection;
17 import org.hibernate.proxy.AbstractLazyInitializer;
18 import org.springframework.context.ApplicationListener;
19 import org.springframework.core.io.ClassPathResource;
20 import org.springframework.core.io.Resource;
21
22 import eu.etaxonomy.cdm.api.service.ITestService;
23 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
24 import eu.etaxonomy.cdm.common.monitor.NullProgressMonitor;
25 import eu.etaxonomy.cdm.io.service.IIOService;
26 import eu.etaxonomy.taxeditor.remoting.cache.CdmRemoteCacheManager;
27 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
28 import eu.etaxonomy.taxeditor.service.ICachedCommonService;
29 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
30
31 /**
32 * CDM Application Controller class for remoting clients
33 *
34 * FIXME:Remoting extending {@link CdmApplicationController} is a temporary workaround.
35 * The {@link CdmApplicationController} should be split into a CdmApplicationControllerBase
36 * class with {@link CdmApplicationController} and this class as subclasses
37 *
38 */
39 public class CdmApplicationRemoteController extends CdmApplicationController {
40
41 private static final Logger logger = Logger.getLogger(CdmApplicationRemoteController.class);
42
43
44 public static final Resource DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE =
45 new ClassPathResource("/eu/etaxonomy/cdm/remotingApplicationContext.xml");
46 private final Resource applicationContextResource;
47 private final IProgressMonitor progressMonitor;
48 private ICdmRemoteSource remoteSource;
49
50
51 /**
52 * Creates new instance of CdmApplicationRemoteController
53 *
54 * @param applicationContextResource
55 * @param remoteSource
56 * @param omitTermLoading
57 * @param progressMonitor
58 * @param listeners
59 * @return
60 */
61 // public static CdmApplicationRemoteController NewInstance(Resource applicationContextResource,
62 // ICdmRemoteSource remoteSource,
63 // IProgressMonitor progressMonitor,
64 // List<ApplicationListener> listeners) {
65 // return new CdmApplicationRemoteController(applicationContextResource,
66 // remoteSource,
67 // false,
68 // progressMonitor,
69 // listeners);
70 //
71 // }
72 /**
73 * Creates new instance of CdmApplicationRemoteController
74 *
75 * @param applicationContextResource
76 * @param remoteSource
77 * @param omitTermLoading
78 * @param progressMonitor
79 * @param listeners
80 * @return
81 */
82 public static CdmApplicationRemoteController NewInstance(ICdmRemoteSource remoteSource,
83 IProgressMonitor progressMonitor,
84 List<ApplicationListener> listeners) {
85
86 return new CdmApplicationRemoteController(DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE,
87 remoteSource,
88 false,
89 progressMonitor,
90 listeners);
91
92 }
93
94 public static CdmApplicationRemoteController NewInstance(ICdmRemoteSource remoteSource,
95 boolean validateXml,
96 IProgressMonitor progressMonitor,
97 List<ApplicationListener> listeners) {
98
99 return new CdmApplicationRemoteController(DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE,
100 remoteSource,
101 validateXml,
102 progressMonitor,
103 listeners);
104
105 }
106
107 /**
108 * Constructs CdmApplicationRemoteController
109 *
110 * @param applicationContextResource
111 * @param remoteSource
112 * @param omitTermLoading
113 * @param progressMonitor
114 * @param listeners
115 */
116 private CdmApplicationRemoteController(Resource applicationContextResource,
117 ICdmRemoteSource remoteSource,
118 boolean validateXml,
119 IProgressMonitor progressMonitor,
120 List<ApplicationListener> listeners){
121 logger.info("Start CdmApplicationRemoteController with remote source: " + remoteSource.getName());
122 this.applicationContextResource =
123 applicationContextResource != null ? applicationContextResource : DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE;
124 this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();
125 this.remoteSource = remoteSource;
126 setNewRemoteSource(remoteSource, validateXml, listeners);
127
128 }
129
130
131
132
133 /**
134 * Creates and starts a new spring application context
135 *
136 * @param remoteSource object for connecting to an http-invoker server
137 * @param omitTermLoading
138 * @param listeners
139 * @return
140 */
141 public boolean setNewRemoteSource(ICdmRemoteSource remoteSource,
142 boolean validateXml,
143 List<ApplicationListener> listeners){
144
145 logger.info("Connecting to '" + remoteSource.getName() + "'");
146
147 int nTasks = 2;
148
149 progressMonitor.beginTask("Connecting to '" + remoteSource.getName() + "'", nTasks);
150
151 progressMonitor.subTask("Initialising CDM Model Cache ...");
152 CdmRemoteCacheManager.getInstance();
153 progressMonitor.worked(1);
154 progressMonitor.subTask("Starting application context ...");
155 init();
156 progressMonitor.worked(1);
157 progressMonitor.done();
158 return true;
159 }
160
161
162
163 /* (non-Javadoc)
164 * @see eu.etaxonomy.cdm.api.application.CdmApplicationController#init()
165 */
166 @Override
167 protected void init(){
168 configuration = new CdmApplicationRemoteConfiguration(remoteSource);
169 ((CdmApplicationRemoteConfiguration)configuration).setApplicationContext(applicationContext);
170 AbstractLazyInitializer.setConfiguration((CdmApplicationRemoteConfiguration)configuration);
171 AbstractPersistentCollection.setConfiguration((CdmApplicationRemoteConfiguration)configuration);
172 }
173
174 public ICdmEntitySessionManager getCdmEntitySessionManager() {
175 return ((CdmApplicationRemoteConfiguration)configuration).getCdmEntitySessionManager();
176 }
177
178 public IIOService getIOService(){
179 return ((CdmApplicationRemoteConfiguration)configuration).getIOService();
180 }
181
182 public ITestService getTestService(){
183 return ((CdmApplicationRemoteConfiguration)configuration).getTestService();
184 }
185
186 public ICachedCommonService getCachedCommonService(){
187 return ((CdmApplicationRemoteConfiguration)configuration).getCachedCommonService();
188 }
189 }