Project

General

Profile

Download (20.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.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.IFeatureNodeService;
50
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
51
import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
52
import eu.etaxonomy.cdm.api.service.IGroupService;
53
import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
54
import eu.etaxonomy.cdm.api.service.ILocationService;
55
import eu.etaxonomy.cdm.api.service.IMediaService;
56
import eu.etaxonomy.cdm.api.service.IMetadataService;
57
import eu.etaxonomy.cdm.api.service.INameService;
58
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
59
import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
60
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
61
import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
62
import eu.etaxonomy.cdm.api.service.IReferenceService;
63
import eu.etaxonomy.cdm.api.service.IService;
64
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
65
import eu.etaxonomy.cdm.api.service.ITaxonService;
66
import eu.etaxonomy.cdm.api.service.ITermService;
67
import eu.etaxonomy.cdm.api.service.ITestService;
68
import eu.etaxonomy.cdm.api.service.IUserService;
69
import eu.etaxonomy.cdm.api.service.IVocabularyService;
70
import eu.etaxonomy.cdm.api.service.IWorkingSetService;
71
import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
72
import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
73
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
74
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
75
import eu.etaxonomy.cdm.io.service.IIOService;
76
import eu.etaxonomy.cdm.model.common.CdmBase;
77
import eu.etaxonomy.cdm.persistence.hibernate.permission.CdmPermissionEvaluator;
78
import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
79
import eu.etaxonomy.cdm.persistence.hibernate.permission.UnanimousBasedUnrevokable;
80
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionBaseVoter;
81
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionElementVoter;
82
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.GrantAlwaysVoter;
83
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonBaseVoter;
84
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonNodeVoter;
85
import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
86
import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;
87
import eu.etaxonomy.taxeditor.service.CdmAuthenticatedHttpInvokerRequestExecutor;
88
import eu.etaxonomy.taxeditor.service.CdmServiceRequestExecutor;
89
import eu.etaxonomy.taxeditor.service.ICachedCommonService;
90
import eu.etaxonomy.taxeditor.service.TermServiceRequestExecutor;
91
import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;
92
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
93

    
94

    
95
/**
96
 * CDM Application Configuration class which manages the configuration for remoting
97
 * clients
98
 *
99
 */
100
@Component
101
public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfiguration, ApplicationContextAware  {
102

    
103
    @SuppressWarnings("unused")
104
    private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);
105

    
106
    protected ApplicationContext applicationContext;
107

    
108
    private ICdmRemoteSource remoteSource;
109

    
110
    private Map serviceMap = new HashMap<Class<IService>, IService>();
111

    
112
    private ICdmEntitySessionManager cdmEntitySessionManager;
113

    
114
    private CdmPermissionEvaluator cdmPermissionEvaluator;
115

    
116
    private ProviderManager authenticationManager;
117

    
118
    private ICachedCommonService cachedCommonService;
119

    
120
    public CdmApplicationRemoteConfiguration() {}
121

    
122
    public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {
123
        this.remoteSource = remoteSource;
124

    
125
    }
126

    
127
    public void setRemoteSource(ICdmRemoteSource remoteSource) {
128
        this.remoteSource = remoteSource;
129
    }
130

    
131
    private Object getService(Class<?> clazz, String serviceSuffix, HttpComponentsHttpInvokerRequestExecutor executor) {
132
        if(serviceMap.containsKey(clazz)) {
133
            return serviceMap.get(clazz);
134
        }
135
        Object service = getService(clazz, serviceSuffix, remoteSource, executor);
136
        serviceMap.put(clazz,  service);
137
        return service;
138
    }
139

    
140
    public static Object getService(Class<?> clazz,
141
            String serviceSuffix,
142
            ICdmRemoteSource remoteSource,
143
            HttpComponentsHttpInvokerRequestExecutor executor) {
144

    
145
        String baseUrl;
146
        if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {
147
            baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
148
        } else {
149
            baseUrl = "http://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();
150
        }
151
        HttpInvokerProxyFactoryBean proxy = new HttpInvokerProxyFactoryBean();
152
        proxy.setServiceInterface(clazz);
153
        proxy.setServiceUrl(baseUrl + serviceSuffix);
154
        if(executor != null) {
155
            executor.setReadTimeout(0);
156
            proxy.setHttpInvokerRequestExecutor(executor);
157
        }
158
        proxy.afterPropertiesSet();
159
        return proxy.getObject();
160
    }
161

    
162
    // ****************************** APPLICATION CONTEXT *************************************************/
163

    
164
    @Override
165
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
166
        this.applicationContext = applicationContext;
167
    }
168

    
169
    /* (non-Javadoc)
170
     * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#getTransactionManager()
171
     */
172
    @Override
173
    public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {
174
        throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");
175
    }
176

    
177

    
178

    
179
    /**
180
     * @return
181
     */
182
    public IEditGeoService getEditGeoService() {
183
        return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new CdmServiceRequestExecutor());
184
    }
185

    
186
    /**
187
     * @return
188
     */
189
    public ICachedCommonService getCachedCommonService(){
190
        if(cachedCommonService == null) {
191
            cachedCommonService = new CachedCommonServiceImpl();
192
        }
193
        return cachedCommonService;
194
    }
195

    
196

    
197
    public ICdmEntitySessionManager getCdmEntitySessionManager() {
198
        if(cdmEntitySessionManager == null) {
199
            cdmEntitySessionManager = new CdmEntitySessionManager();
200
        }
201
        return cdmEntitySessionManager;
202
    }
203

    
204

    
205

    
206

    
207

    
208

    
209
 // ****************************** GETTER *************************************************/
210

    
211
    @Override
212
    public final Object getBean(String name){
213
        throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");
214
    }
215

    
216
    @Override
217
    public IAgentService getAgentService(){
218
        return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new CdmServiceRequestExecutor());
219
    }
220

    
221
    @Override
222
    public IAnnotationService getAnnotationService(){
223
        return (IAnnotationService) getService(IAnnotationService.class, "/remoting/annotation.service", new CdmServiceRequestExecutor());
224
    }
225

    
226
    @Override
227
    public IDatabaseService getDatabaseService(){
228
        return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new CdmServiceRequestExecutor());
229
    }
230

    
231
    @Override
232
    public INameService getNameService(){
233
        return (INameService) getService(INameService.class, "/remoting/name.service", new CdmServiceRequestExecutor());
234
    }
235

    
236
    @Override
237
    public IReferenceService getReferenceService(){
238
        return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new CdmServiceRequestExecutor());
239
    }
240

    
241
    @Override
242
    public ITaxonService getTaxonService(){
243
        return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new CdmServiceRequestExecutor());
244
    }
245

    
246
    @Override
247
    public IClassificationService getClassificationService(){
248
        return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new CdmServiceRequestExecutor());
249
    }
250

    
251
    @Override
252
    public ITaxonNodeService getTaxonNodeService(){
253
        return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new CdmServiceRequestExecutor());
254
    }
255

    
256
    @Override
257
    public IDescriptionService getDescriptionService(){
258
        return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new CdmServiceRequestExecutor());
259
    }
260

    
261
    @Override
262
    public IOccurrenceService getOccurrenceService(){
263
        return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new CdmServiceRequestExecutor());
264
    }
265

    
266
    @Override
267
    public IPrimerService getPrimerService(){
268
        return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new CdmServiceRequestExecutor());
269
    }
270

    
271
    @Override
272
    public IAmplificationService getAmplificationService(){
273
        return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new CdmServiceRequestExecutor());
274
    }
275

    
276
    @Override
277
    public ISequenceService getSequenceService(){
278
        return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new CdmServiceRequestExecutor());
279
    }
280

    
281
    @Override
282
    public IMediaService getMediaService(){
283
        return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new CdmServiceRequestExecutor());
284
    }
285

    
286
    @Override
287
    public ITermService getTermService(){
288
        return (ITermService) getService(ITermService.class, "/remoting/term.service", new TermServiceRequestExecutor());
289
    }
290

    
291
    @Override
292
    public ICommonService getCommonService(){
293
        return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new CdmServiceRequestExecutor());
294
    }
295

    
296
    @Override
297
    public ILocationService getLocationService(){
298
        return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new CdmServiceRequestExecutor());
299
    }
300

    
301
    @Override
302
    public IUserService getUserService(){
303
        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new CdmServiceRequestExecutor());
304
    }
305

    
306

    
307
    public static IUserService getUserService(ICdmRemoteSource remoteSource) {
308
        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
309
    }
310

    
311
    @Override
312
    public IMetadataService getMetadataService() {
313
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", new HttpComponentsHttpInvokerRequestExecutor());
314
    }
315

    
316
    public static IMetadataService getMetadataService(ICdmRemoteSource remoteSource) {
317
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
318
    }
319

    
320
    @Override
321
    public IGrantedAuthorityService getGrantedAuthorityService(){
322
        return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new CdmServiceRequestExecutor());
323
    }
324

    
325
    @Override
326
    public IService<CdmBase> getMainService(){
327
        return null;
328
    }
329

    
330

    
331
    @Override
332
    public ProviderManager getAuthenticationManager(){
333
        if(authenticationManager != null) {
334
            return authenticationManager;
335
        }
336

    
337
        authenticationManager = getAuthenticationManager(getUserService());
338
        return authenticationManager;
339
    }
340

    
341
    public static ProviderManager getAuthenticationManager(IUserService userService) {
342
        Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
343
        ReflectionSaltSource saltSource = new ReflectionSaltSource();
344
        saltSource.setUserPropertyToUse("getUsername");
345

    
346
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
347
        daoAuthenticationProvider.setUserDetailsService(userService);
348
        daoAuthenticationProvider.setSaltSource(saltSource);
349
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
350

    
351
        return new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
352
    }
353

    
354

    
355
    @Override
356
    public ConversationHolder NewConversation() {
357
        return new ConversationHolderMock();
358
    }
359

    
360
    @Override
361
    public ICollectionService getCollectionService(){
362
        return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new CdmServiceRequestExecutor());
363
    }
364

    
365
    @Override
366
    public IFeatureTreeService getFeatureTreeService(){
367
        return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());
368
    }
369

    
370
    @Override
371
    public IFeatureNodeService getFeatureNodeService(){
372
        return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());
373
    }
374

    
375
    @Override
376
    public IVocabularyService getVocabularyService(){
377
        return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());
378
    }
379

    
380
    @Override
381
    public IIdentificationKeyService getIdentificationKeyService(){
382
        return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());
383
    }
384

    
385
    @Override
386
    public IPolytomousKeyService getPolytomousKeyService(){
387
        return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());
388
    }
389

    
390

    
391
    @Override
392
    public IPolytomousKeyNodeService getPolytomousKeyNodeService(){
393
        return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new CdmServiceRequestExecutor());
394
    }
395

    
396
    @Override
397
    public IProgressMonitorService getProgressMonitorService() {
398
        return (IProgressMonitorService) getService(IProgressMonitorService.class, "/remoting/progressmonitor.service", new CdmAuthenticatedHttpInvokerRequestExecutor());
399
    }
400

    
401
    @Override
402
    public IWorkingSetService getWorkingSetService(){
403
        return (IWorkingSetService) getService(IWorkingSetService.class, "/remoting/workingset.service", new CdmServiceRequestExecutor());
404
    }
405

    
406
    @Override
407
    public IGroupService getGroupService(){
408
        return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new CdmServiceRequestExecutor());
409
    }
410

    
411

    
412
    @Override
413
    public IEntityValidationService getEntityValidationService(){
414
        return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new CdmServiceRequestExecutor());
415
    }
416

    
417

    
418
    @Override
419
    public IEntityConstraintViolationService getEntityConstraintViolationService(){
420
        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());
421
    }
422

    
423
    @Override
424
    public ICdmPermissionEvaluator getPermissionEvaluator(){
425

    
426
        if(cdmPermissionEvaluator != null) {
427
            return cdmPermissionEvaluator;
428
        }
429
        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<AccessDecisionVoter<? extends Object>>();
430
        decisionVoters.add(new GrantAlwaysVoter());
431
        decisionVoters.add(new TaxonNodeVoter());
432
        decisionVoters.add(new TaxonBaseVoter());
433
        decisionVoters.add(new DescriptionBaseVoter());
434
        decisionVoters.add(new DescriptionElementVoter());
435
        UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
436

    
437
        cdmPermissionEvaluator = new CdmPermissionEvaluator();
438
        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
439

    
440
        return cdmPermissionEvaluator;
441
    }
442

    
443

    
444
    @Override
445
    public TransactionStatus startTransaction() throws UnsupportedOperationException {
446
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
447
    }
448

    
449
    @Override
450
    public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
451
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
452
    }
453

    
454

    
455
    @Override
456
    public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
457
        throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
458
    }
459

    
460
    @Override
461
    public void authenticate(String username, String password){
462
        UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
463
        Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
464
        SecurityContext context = SecurityContextHolder.getContext();
465
        context.setAuthentication(authentication);
466
    }
467

    
468
    public IIOService getIOService() {
469
        return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());
470
    }
471

    
472
    public ITestService getTestService() {
473
        return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());
474
    }
475
}
(2-2/8)