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