Project

General

Profile

Download (20.7 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.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
}
(2-2/8)