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