Add annotation service to config
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationRemoteConfiguration.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 package eu.etaxonomy.cdm.api.application;
11
12 import java.util.ArrayList;
13 import java.util.Arrays;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 import org.apache.log4j.Logger;
19 import org.springframework.beans.BeansException;
20 import org.springframework.context.ApplicationContext;
21 import org.springframework.context.ApplicationContextAware;
22 import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean;
23 import org.springframework.security.access.AccessDecisionVoter;
24 import org.springframework.security.authentication.AuthenticationProvider;
25 import org.springframework.security.authentication.ProviderManager;
26 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
27 import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
28 import org.springframework.security.authentication.dao.ReflectionSaltSource;
29 import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
30 import org.springframework.security.core.Authentication;
31 import org.springframework.security.core.context.SecurityContext;
32 import org.springframework.security.core.context.SecurityContextHolder;
33 import org.springframework.stereotype.Component;
34 import org.springframework.transaction.PlatformTransactionManager;
35 import org.springframework.transaction.TransactionStatus;
36
37 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
38 import eu.etaxonomy.cdm.api.conversation.ConversationHolderMock;
39 import eu.etaxonomy.cdm.api.service.IAgentService;
40 import eu.etaxonomy.cdm.api.service.IAnnotationService;
41 import eu.etaxonomy.cdm.api.service.IClassificationService;
42 import eu.etaxonomy.cdm.api.service.ICollectionService;
43 import eu.etaxonomy.cdm.api.service.ICommonService;
44 import eu.etaxonomy.cdm.api.service.IDatabaseService;
45 import eu.etaxonomy.cdm.api.service.IDescriptionService;
46 import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
47 import eu.etaxonomy.cdm.api.service.IEntityValidationService;
48 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
49 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
50 import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
51 import eu.etaxonomy.cdm.api.service.IGroupService;
52 import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
53 import eu.etaxonomy.cdm.api.service.ILocationService;
54 import eu.etaxonomy.cdm.api.service.IMediaService;
55 import eu.etaxonomy.cdm.api.service.INameService;
56 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
57 import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
58 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
59 import eu.etaxonomy.cdm.api.service.IReferenceService;
60 import eu.etaxonomy.cdm.api.service.IService;
61 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
62 import eu.etaxonomy.cdm.api.service.ITaxonService;
63 import eu.etaxonomy.cdm.api.service.ITermService;
64 import eu.etaxonomy.cdm.api.service.ITestService;
65 import eu.etaxonomy.cdm.api.service.IUserService;
66 import eu.etaxonomy.cdm.api.service.IVocabularyService;
67 import eu.etaxonomy.cdm.api.service.IWorkingSetService;
68 import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
69 import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
70 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
71 import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
72 import eu.etaxonomy.cdm.io.service.IIOService;
73 import eu.etaxonomy.cdm.model.common.CdmBase;
74 import eu.etaxonomy.cdm.persistence.hibernate.permission.CdmPermissionEvaluator;
75 import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
76 import eu.etaxonomy.cdm.persistence.hibernate.permission.UnanimousBasedUnrevokable;
77 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionBaseVoter;
78 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionElementVoter;
79 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.GrantAlwaysVoter;
80 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonBaseVoter;
81 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonNodeVoter;
82 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
83 import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;
84 import eu.etaxonomy.taxeditor.service.CdmServiceRequestExecutor;
85 import eu.etaxonomy.taxeditor.service.ICachedCommonService;
86 import eu.etaxonomy.taxeditor.service.TermServiceRequestExecutor;
87 import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;
88 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
89
90
91 /**
92 * CDM Application Configuration class which manages the configuration for remoting
93 * clients
94 *
95 */
96 @Component
97 public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfiguration, ApplicationContextAware {
98
99 @SuppressWarnings("unused")
100 private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);
101
102 protected ApplicationContext applicationContext;
103
104 private ICdmRemoteSource remoteSource;
105
106 private Map serviceMap = new HashMap<Class<IService>, IService>();
107
108 private ICdmEntitySessionManager cdmEntitySessionManager;
109
110 private CdmPermissionEvaluator cdmPermissionEvaluator;
111
112 private ProviderManager authenticationManager;
113
114 private ICachedCommonService cachedCommonService;
115
116 public CdmApplicationRemoteConfiguration() {}
117
118 public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {
119 this.remoteSource = remoteSource;
120 }
121
122 public void setRemoteSource(ICdmRemoteSource remoteSource) {
123 this.remoteSource = remoteSource;
124 }
125
126 private Object getService(Class<?> clazz, String serviceSuffix, CdmServiceRequestExecutor executor) {
127 if(serviceMap.containsKey(clazz)) {
128 return serviceMap.get(clazz);
129 }
130 String baseUrl;
131 if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {
132 baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
133 } else {
134 baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();
135 }
136 HttpInvokerProxyFactoryBean proxy = new HttpInvokerProxyFactoryBean();
137 proxy.setServiceInterface(clazz);
138 proxy.setServiceUrl(baseUrl + serviceSuffix);
139 if(executor != null) {
140 executor.setReadTimeout(0);
141 proxy.setHttpInvokerRequestExecutor(executor);
142 }
143 proxy.afterPropertiesSet();
144 Object service = proxy.getObject();
145 serviceMap.put(clazz, service);
146 return service;
147 }
148
149 // ****************************** APPLICATION CONTEXT *************************************************/
150
151 @Override
152 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
153 this.applicationContext = applicationContext;
154 }
155
156 /* (non-Javadoc)
157 * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#getTransactionManager()
158 */
159 @Override
160 public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {
161 throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");
162 }
163
164
165
166 /**
167 * @return
168 */
169 public IEditGeoService getEditGeoService() {
170 return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new CdmServiceRequestExecutor());
171 }
172
173 /**
174 * @return
175 */
176 public ICachedCommonService getCachedCommonService(){
177 if(cachedCommonService == null) {
178 cachedCommonService = new CachedCommonServiceImpl();
179 }
180 return cachedCommonService;
181 }
182
183
184 public ICdmEntitySessionManager getCdmEntitySessionManager() {
185 if(cdmEntitySessionManager == null) {
186 cdmEntitySessionManager = new CdmEntitySessionManager();
187 }
188 return cdmEntitySessionManager;
189 }
190
191
192
193
194
195
196 // ****************************** GETTER *************************************************/
197
198 @Override
199 public final Object getBean(String name){
200 throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");
201 }
202
203 @Override
204 public IAgentService getAgentService(){
205 return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new CdmServiceRequestExecutor());
206 }
207
208 @Override
209 public IAnnotationService getAnnotationService(){
210 return (IAnnotationService) getService(IAnnotationService.class, "/remoting/annotation.service", new CdmServiceRequestExecutor());
211 }
212
213 @Override
214 public IDatabaseService getDatabaseService(){
215 return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new CdmServiceRequestExecutor());
216 }
217
218 @Override
219 public INameService getNameService(){
220 return (INameService) getService(INameService.class, "/remoting/name.service", new CdmServiceRequestExecutor());
221 }
222
223 @Override
224 public IReferenceService getReferenceService(){
225 return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new CdmServiceRequestExecutor());
226 }
227
228 @Override
229 public ITaxonService getTaxonService(){
230 return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new CdmServiceRequestExecutor());
231 }
232
233 @Override
234 public IClassificationService getClassificationService(){
235 return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new CdmServiceRequestExecutor());
236 }
237
238 @Override
239 public ITaxonNodeService getTaxonNodeService(){
240 return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new CdmServiceRequestExecutor());
241 }
242
243 @Override
244 public IDescriptionService getDescriptionService(){
245 return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new CdmServiceRequestExecutor());
246 }
247
248 @Override
249 public IOccurrenceService getOccurrenceService(){
250 return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new CdmServiceRequestExecutor());
251 }
252
253 @Override
254 public IPrimerService getPrimerService(){
255 return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new CdmServiceRequestExecutor());
256 }
257
258 @Override
259 public IAmplificationService getAmplificationService(){
260 return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new CdmServiceRequestExecutor());
261 }
262
263 @Override
264 public ISequenceService getSequenceService(){
265 return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new CdmServiceRequestExecutor());
266 }
267
268 @Override
269 public IMediaService getMediaService(){
270 return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new CdmServiceRequestExecutor());
271 }
272
273 @Override
274 public ITermService getTermService(){
275 return (ITermService) getService(ITermService.class, "/remoting/term.service", new TermServiceRequestExecutor());
276 }
277
278 @Override
279 public ICommonService getCommonService(){
280 return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new CdmServiceRequestExecutor());
281 }
282
283 @Override
284 public ILocationService getLocationService(){
285 return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new CdmServiceRequestExecutor());
286 }
287
288 @Override
289 public IUserService getUserService(){
290 return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new CdmServiceRequestExecutor());
291 }
292
293 @Override
294 public IGrantedAuthorityService getGrantedAuthorityService(){
295 return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new CdmServiceRequestExecutor());
296 }
297
298 @Override
299 public IService<CdmBase> getMainService(){
300 return null;
301 }
302
303
304 @Override
305 public ProviderManager getAuthenticationManager(){
306 if(authenticationManager != null) {
307 return authenticationManager;
308 }
309 Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
310 ReflectionSaltSource saltSource = new ReflectionSaltSource();
311 saltSource.setUserPropertyToUse("getUsername");
312
313 DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
314 daoAuthenticationProvider.setUserDetailsService(getUserService());
315 daoAuthenticationProvider.setSaltSource(saltSource);
316 daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
317
318 authenticationManager = new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
319 return authenticationManager;
320 }
321
322
323 @Override
324 public ConversationHolder NewConversation() {
325 return new ConversationHolderMock();
326 }
327
328 @Override
329 public ICollectionService getCollectionService(){
330 return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new CdmServiceRequestExecutor());
331 }
332
333 @Override
334 public IFeatureTreeService getFeatureTreeService(){
335 return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());
336 }
337
338 @Override
339 public IFeatureNodeService getFeatureNodeService(){
340 return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());
341 }
342
343 @Override
344 public IVocabularyService getVocabularyService(){
345 return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());
346 }
347
348 @Override
349 public IIdentificationKeyService getIdentificationKeyService(){
350 return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());
351 }
352
353 @Override
354 public IPolytomousKeyService getPolytomousKeyService(){
355 return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());
356 }
357
358
359 @Override
360 public IPolytomousKeyNodeService getPolytomousKeyNodeService(){
361 return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new CdmServiceRequestExecutor());
362 }
363
364 @Override
365 public IWorkingSetService getWorkingSetService(){
366 return (IWorkingSetService) getService(IWorkingSetService.class, "/remoting/workingset.service", new CdmServiceRequestExecutor());
367 }
368
369 @Override
370 public IGroupService getGroupService(){
371 return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new CdmServiceRequestExecutor());
372 }
373
374
375 @Override
376 public IEntityValidationService getEntityValidationService(){
377 return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new CdmServiceRequestExecutor());
378 }
379
380
381 @Override
382 public IEntityConstraintViolationService getEntityConstraintViolationService(){
383 return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());
384 }
385
386 @Override
387 public ICdmPermissionEvaluator getPermissionEvaluator(){
388
389 if(cdmPermissionEvaluator != null) {
390 return cdmPermissionEvaluator;
391 }
392 List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
393 decisionVoters.add(new GrantAlwaysVoter());
394 decisionVoters.add(new TaxonNodeVoter());
395 decisionVoters.add(new TaxonBaseVoter());
396 decisionVoters.add(new DescriptionBaseVoter());
397 decisionVoters.add(new DescriptionElementVoter());
398 UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
399
400 cdmPermissionEvaluator = new CdmPermissionEvaluator();
401 cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
402
403 return cdmPermissionEvaluator;
404 }
405
406
407 @Override
408 public TransactionStatus startTransaction() throws UnsupportedOperationException {
409 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
410 }
411
412 @Override
413 public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
414 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
415 }
416
417
418 @Override
419 public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
420 throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
421 }
422
423 @Override
424 public void authenticate(String username, String password){
425 UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
426 Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
427 SecurityContext context = SecurityContextHolder.getContext();
428 context.setAuthentication(authentication);
429 }
430
431 public IIOService getIOService() {
432 return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());
433 }
434
435 public ITestService getTestService() {
436 return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());
437 }
438 }