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