Project

General

Profile

Download (22.1 KB) Statistics
| Branch: | Tag: | Revision:
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 rollback(TransactionStatus arg0) {
494
        throw new UnsupportedOperationException("rollback is not implemented for CdmApplicationRemoteConfiguration");
495
	}
496

    
497
    @Override
498
    public void authenticate(String username, String password){
499
        UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
500
        Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
501
        SecurityContext context = SecurityContextHolder.getContext();
502
        context.setAuthentication(authentication);
503
    }
504

    
505
    public IIOService getIOService() {
506
        return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());
507
    }
508

    
509
    public ILongRunningTasksService getLongRunningTasksService() {
510
        return (ILongRunningTasksService) getService(ILongRunningTasksService.class, "/remoting/longrunningtasks.service", new CdmServiceRequestExecutor());
511
    }
512

    
513
    public ITestService getTestService() {
514
        return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());
515
    }
516

    
517
}
(2-2/8)