2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.api
.application
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Arrays
;
14 import java
.util
.HashMap
;
15 import java
.util
.List
;
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
;
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
.IMetadataService
;
56 import eu
.etaxonomy
.cdm
.api
.service
.INameService
;
57 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
58 import eu
.etaxonomy
.cdm
.api
.service
.IPolytomousKeyNodeService
;
59 import eu
.etaxonomy
.cdm
.api
.service
.IPolytomousKeyService
;
60 import eu
.etaxonomy
.cdm
.api
.service
.IProgressMonitorService
;
61 import eu
.etaxonomy
.cdm
.api
.service
.IReferenceService
;
62 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
63 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonNodeService
;
64 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
65 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
66 import eu
.etaxonomy
.cdm
.api
.service
.ITestService
;
67 import eu
.etaxonomy
.cdm
.api
.service
.IUserService
;
68 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
69 import eu
.etaxonomy
.cdm
.api
.service
.IWorkingSetService
;
70 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.IAmplificationService
;
71 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.IPrimerService
;
72 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.ISequenceService
;
73 import eu
.etaxonomy
.cdm
.ext
.geo
.IEditGeoService
;
74 import eu
.etaxonomy
.cdm
.io
.service
.IIOService
;
75 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
76 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CdmPermissionEvaluator
;
77 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.ICdmPermissionEvaluator
;
78 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.UnanimousBasedUnrevokable
;
79 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.voter
.DescriptionBaseVoter
;
80 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.voter
.DescriptionElementVoter
;
81 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.voter
.GrantAlwaysVoter
;
82 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.voter
.TaxonBaseVoter
;
83 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.voter
.TaxonNodeVoter
;
84 import eu
.etaxonomy
.taxeditor
.remoting
.source
.ICdmRemoteSource
;
85 import eu
.etaxonomy
.taxeditor
.service
.CachedCommonServiceImpl
;
86 import eu
.etaxonomy
.taxeditor
.service
.CdmAuthenticatedHttpInvokerRequestExecutor
;
87 import eu
.etaxonomy
.taxeditor
.service
.CdmServiceRequestExecutor
;
88 import eu
.etaxonomy
.taxeditor
.service
.ICachedCommonService
;
89 import eu
.etaxonomy
.taxeditor
.service
.TermServiceRequestExecutor
;
90 import eu
.etaxonomy
.taxeditor
.session
.CdmEntitySessionManager
;
91 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySessionManager
;
95 * CDM Application Configuration class which manages the configuration for remoting
100 public class CdmApplicationRemoteConfiguration
implements ICdmApplicationConfiguration
, ApplicationContextAware
{
102 @SuppressWarnings("unused")
103 private static final Logger logger
= Logger
.getLogger(CdmApplicationRemoteConfiguration
.class);
105 protected ApplicationContext applicationContext
;
107 private ICdmRemoteSource remoteSource
;
109 private Map serviceMap
= new HashMap
<Class
<IService
>, IService
>();
111 private ICdmEntitySessionManager cdmEntitySessionManager
;
113 private CdmPermissionEvaluator cdmPermissionEvaluator
;
115 private ProviderManager authenticationManager
;
117 private ICachedCommonService cachedCommonService
;
119 public CdmApplicationRemoteConfiguration() {}
121 public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource
) {
122 this.remoteSource
= remoteSource
;
126 public void setRemoteSource(ICdmRemoteSource remoteSource
) {
127 this.remoteSource
= remoteSource
;
130 private Object
getService(Class
<?
> clazz
, String serviceSuffix
, CdmAuthenticatedHttpInvokerRequestExecutor executor
) {
131 if(serviceMap
.containsKey(clazz
)) {
132 return serviceMap
.get(clazz
);
134 Object service
= getService(clazz
, serviceSuffix
, remoteSource
, executor
);
135 serviceMap
.put(clazz
, service
);
139 public static Object
getService(Class
<?
> clazz
,
140 String serviceSuffix
,
141 ICdmRemoteSource remoteSource
,
142 CdmAuthenticatedHttpInvokerRequestExecutor executor
) {
145 if(remoteSource
.getContextPath() == null || remoteSource
.getContextPath().equals("")) {
146 baseUrl
= "http://" + remoteSource
.getServer() + ":" + String
.valueOf(remoteSource
.getPort());
148 baseUrl
= "http://" + remoteSource
.getServer() + ":" + String
.valueOf(remoteSource
.getPort()) + "/" + remoteSource
.getContextPath();
150 HttpInvokerProxyFactoryBean proxy
= new HttpInvokerProxyFactoryBean();
151 proxy
.setServiceInterface(clazz
);
152 proxy
.setServiceUrl(baseUrl
+ serviceSuffix
);
153 if(executor
!= null) {
154 executor
.setReadTimeout(0);
155 proxy
.setHttpInvokerRequestExecutor(executor
);
157 proxy
.afterPropertiesSet();
158 return proxy
.getObject();
161 // ****************************** APPLICATION CONTEXT *************************************************/
164 public void setApplicationContext(ApplicationContext applicationContext
) throws BeansException
{
165 this.applicationContext
= applicationContext
;
169 * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#getTransactionManager()
172 public PlatformTransactionManager
getTransactionManager() throws UnsupportedOperationException
{
173 throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");
181 public IEditGeoService
getEditGeoService() {
182 return (IEditGeoService
) getService(IEditGeoService
.class, "/remoting/editgeo.service", new CdmServiceRequestExecutor());
188 public ICachedCommonService
getCachedCommonService(){
189 if(cachedCommonService
== null) {
190 cachedCommonService
= new CachedCommonServiceImpl();
192 return cachedCommonService
;
196 public ICdmEntitySessionManager
getCdmEntitySessionManager() {
197 if(cdmEntitySessionManager
== null) {
198 cdmEntitySessionManager
= new CdmEntitySessionManager();
200 return cdmEntitySessionManager
;
208 // ****************************** GETTER *************************************************/
211 public final Object
getBean(String name
){
212 throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");
216 public IAgentService
getAgentService(){
217 return (IAgentService
) getService(IAgentService
.class, "/remoting/agent.service", new CdmServiceRequestExecutor());
221 public IAnnotationService
getAnnotationService(){
222 return (IAnnotationService
) getService(IAnnotationService
.class, "/remoting/annotation.service", new CdmServiceRequestExecutor());
226 public IDatabaseService
getDatabaseService(){
227 return (IDatabaseService
) getService(IDatabaseService
.class, "/remoting/database.service", new CdmServiceRequestExecutor());
231 public INameService
getNameService(){
232 return (INameService
) getService(INameService
.class, "/remoting/name.service", new CdmServiceRequestExecutor());
236 public IReferenceService
getReferenceService(){
237 return (IReferenceService
) getService(IReferenceService
.class, "/remoting/reference.service", new CdmServiceRequestExecutor());
241 public ITaxonService
getTaxonService(){
242 return (ITaxonService
) getService(ITaxonService
.class, "/remoting/taxon.service", new CdmServiceRequestExecutor());
246 public IClassificationService
getClassificationService(){
247 return (IClassificationService
) getService(IClassificationService
.class, "/remoting/classification.service", new CdmServiceRequestExecutor());
251 public ITaxonNodeService
getTaxonNodeService(){
252 return (ITaxonNodeService
) getService(ITaxonNodeService
.class, "/remoting/taxonnode.service", new CdmServiceRequestExecutor());
256 public IDescriptionService
getDescriptionService(){
257 return (IDescriptionService
) getService(IDescriptionService
.class, "/remoting/description.service", new CdmServiceRequestExecutor());
261 public IOccurrenceService
getOccurrenceService(){
262 return (IOccurrenceService
) getService(IOccurrenceService
.class, "/remoting/occurrence.service", new CdmServiceRequestExecutor());
266 public IPrimerService
getPrimerService(){
267 return (IPrimerService
) getService(IPrimerService
.class, "/remoting/primer.service", new CdmServiceRequestExecutor());
271 public IAmplificationService
getAmplificationService(){
272 return (IAmplificationService
) getService(IAmplificationService
.class, "/remoting/amplification.service", new CdmServiceRequestExecutor());
276 public ISequenceService
getSequenceService(){
277 return (ISequenceService
) getService(ISequenceService
.class, "/remoting/sequence.service", new CdmServiceRequestExecutor());
281 public IMediaService
getMediaService(){
282 return (IMediaService
) getService(IMediaService
.class, "/remoting/media.service", new CdmServiceRequestExecutor());
286 public ITermService
getTermService(){
287 return (ITermService
) getService(ITermService
.class, "/remoting/term.service", new TermServiceRequestExecutor());
291 public ICommonService
getCommonService(){
292 return (ICommonService
) getService(ICommonService
.class, "/remoting/common.service", new CdmServiceRequestExecutor());
296 public ILocationService
getLocationService(){
297 return (ILocationService
) getService(ILocationService
.class, "/remoting/location.service", new CdmServiceRequestExecutor());
301 public IUserService
getUserService(){
302 return (IUserService
) getService(IUserService
.class, "/remoting-public/user.service", new CdmServiceRequestExecutor());
306 public IMetadataService
getMetadataService() {
307 return (IMetadataService
) getService(IMetadataService
.class, "/remoting-public/metadata.service", new CdmServiceRequestExecutor());
310 public static IMetadataService
getMetadataService(ICdmRemoteSource remoteSource
) {
311 return (IMetadataService
) getService(IMetadataService
.class, "/remoting-public/metadata.service", remoteSource
, new CdmServiceRequestExecutor());
315 public IGrantedAuthorityService
getGrantedAuthorityService(){
316 return (IGrantedAuthorityService
) getService(IGrantedAuthorityService
.class, "/remoting/grantedauthority.service", new CdmServiceRequestExecutor());
320 public IService
<CdmBase
> getMainService(){
326 public ProviderManager
getAuthenticationManager(){
327 if(authenticationManager
!= null) {
328 return authenticationManager
;
330 Md5PasswordEncoder passwordEncoder
= new Md5PasswordEncoder();
331 ReflectionSaltSource saltSource
= new ReflectionSaltSource();
332 saltSource
.setUserPropertyToUse("getUsername");
334 DaoAuthenticationProvider daoAuthenticationProvider
= new DaoAuthenticationProvider();
335 daoAuthenticationProvider
.setUserDetailsService(getUserService());
336 daoAuthenticationProvider
.setSaltSource(saltSource
);
337 daoAuthenticationProvider
.setPasswordEncoder(passwordEncoder
);
339 authenticationManager
= new ProviderManager(Arrays
.asList((AuthenticationProvider
)daoAuthenticationProvider
));
340 return authenticationManager
;
345 public ConversationHolder
NewConversation() {
346 return new ConversationHolderMock();
350 public ICollectionService
getCollectionService(){
351 return (ICollectionService
) getService(ICollectionService
.class, "/remoting/collection.service", new CdmServiceRequestExecutor());
355 public IFeatureTreeService
getFeatureTreeService(){
356 return (IFeatureTreeService
) getService(IFeatureTreeService
.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());
360 public IFeatureNodeService
getFeatureNodeService(){
361 return (IFeatureNodeService
) getService(IFeatureNodeService
.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());
365 public IVocabularyService
getVocabularyService(){
366 return (IVocabularyService
) getService(IVocabularyService
.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());
370 public IIdentificationKeyService
getIdentificationKeyService(){
371 return (IIdentificationKeyService
) getService(IIdentificationKeyService
.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());
375 public IPolytomousKeyService
getPolytomousKeyService(){
376 return (IPolytomousKeyService
) getService(IPolytomousKeyService
.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());
381 public IPolytomousKeyNodeService
getPolytomousKeyNodeService(){
382 return (IPolytomousKeyNodeService
) getService(IPolytomousKeyNodeService
.class, "/remoting/polytomouskeynode.service", new CdmServiceRequestExecutor());
386 public IProgressMonitorService
getProgressMonitorService() {
387 return (IProgressMonitorService
) getService(IProgressMonitorService
.class, "/remoting/progressmonitor.service", new CdmAuthenticatedHttpInvokerRequestExecutor());
391 public IWorkingSetService
getWorkingSetService(){
392 return (IWorkingSetService
) getService(IWorkingSetService
.class, "/remoting/workingset.service", new CdmServiceRequestExecutor());
396 public IGroupService
getGroupService(){
397 return (IGroupService
) getService(IGroupService
.class, "/remoting/group.service", new CdmServiceRequestExecutor());
402 public IEntityValidationService
getEntityValidationService(){
403 return (IEntityValidationService
) getService(IEntityValidationService
.class, "/remoting/entityvalidation.service", new CdmServiceRequestExecutor());
408 public IEntityConstraintViolationService
getEntityConstraintViolationService(){
409 return (IEntityConstraintViolationService
) getService(IEntityConstraintViolationService
.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());
413 public ICdmPermissionEvaluator
getPermissionEvaluator(){
415 if(cdmPermissionEvaluator
!= null) {
416 return cdmPermissionEvaluator
;
418 List
<AccessDecisionVoter
> decisionVoters
= new ArrayList
<AccessDecisionVoter
>();
419 decisionVoters
.add(new GrantAlwaysVoter());
420 decisionVoters
.add(new TaxonNodeVoter());
421 decisionVoters
.add(new TaxonBaseVoter());
422 decisionVoters
.add(new DescriptionBaseVoter());
423 decisionVoters
.add(new DescriptionElementVoter());
424 UnanimousBasedUnrevokable accessDecisionManager
= new UnanimousBasedUnrevokable(decisionVoters
);
426 cdmPermissionEvaluator
= new CdmPermissionEvaluator();
427 cdmPermissionEvaluator
.setAccessDecisionManager(accessDecisionManager
);
429 return cdmPermissionEvaluator
;
434 public TransactionStatus
startTransaction() throws UnsupportedOperationException
{
435 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
439 public TransactionStatus
startTransaction(Boolean readOnly
) throws UnsupportedOperationException
{
440 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
445 public void commitTransaction(TransactionStatus txStatus
) throws UnsupportedOperationException
{
446 throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
450 public void authenticate(String username
, String password
){
451 UsernamePasswordAuthenticationToken tokenForUser
= new UsernamePasswordAuthenticationToken(username
, password
);
452 Authentication authentication
= this.getAuthenticationManager().authenticate(tokenForUser
);
453 SecurityContext context
= SecurityContextHolder
.getContext();
454 context
.setAuthentication(authentication
);
457 public IIOService
getIOService() {
458 return (IIOService
) getService(IIOService
.class, "/remoting/io.service", new CdmServiceRequestExecutor());
461 public ITestService
getTestService() {
462 return (ITestService
) getService(ITestService
.class, "/remoting/test.service", new CdmServiceRequestExecutor());