Project

General

Profile

Download (19.6 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.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;
36

    
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;
92

    
93

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

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

    
105
    protected ApplicationContext applicationContext;
106

    
107
    private ICdmRemoteSource remoteSource;
108

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

    
111
    private ICdmEntitySessionManager cdmEntitySessionManager;
112

    
113
    private CdmPermissionEvaluator cdmPermissionEvaluator;
114

    
115
    private ProviderManager authenticationManager;
116

    
117
    private ICachedCommonService cachedCommonService;
118

    
119
    public CdmApplicationRemoteConfiguration() {}
120

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

    
124
    }
125

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

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

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

    
144
        String baseUrl;
145
        if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {
146
            baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
147
        } else {
148
            baseUrl = "http://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();
149
        }
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);
156
        }
157
        proxy.afterPropertiesSet();
158
        return proxy.getObject();
159
    }
160

    
161
    // ****************************** APPLICATION CONTEXT *************************************************/
162

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

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

    
176

    
177

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

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

    
195

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

    
203

    
204

    
205

    
206

    
207

    
208
 // ****************************** GETTER *************************************************/
209

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
305
    @Override
306
    public IMetadataService getMetadataService() {
307
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", new CdmServiceRequestExecutor());
308
    }
309

    
310
    public static IMetadataService getMetadataService(ICdmRemoteSource remoteSource) {
311
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", remoteSource, new CdmServiceRequestExecutor());
312
    }
313

    
314
    @Override
315
    public IGrantedAuthorityService getGrantedAuthorityService(){
316
        return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new CdmServiceRequestExecutor());
317
    }
318

    
319
    @Override
320
    public IService<CdmBase> getMainService(){
321
        return null;
322
    }
323

    
324

    
325
    @Override
326
    public ProviderManager getAuthenticationManager(){
327
        if(authenticationManager != null) {
328
            return authenticationManager;
329
        }
330
        Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
331
        ReflectionSaltSource saltSource = new ReflectionSaltSource();
332
        saltSource.setUserPropertyToUse("getUsername");
333

    
334
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
335
        daoAuthenticationProvider.setUserDetailsService(getUserService());
336
        daoAuthenticationProvider.setSaltSource(saltSource);
337
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
338

    
339
        authenticationManager = new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
340
        return authenticationManager;
341
    }
342

    
343

    
344
    @Override
345
    public ConversationHolder NewConversation() {
346
        return new ConversationHolderMock();
347
    }
348

    
349
    @Override
350
    public ICollectionService getCollectionService(){
351
        return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new CdmServiceRequestExecutor());
352
    }
353

    
354
    @Override
355
    public IFeatureTreeService getFeatureTreeService(){
356
        return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());
357
    }
358

    
359
    @Override
360
    public IFeatureNodeService getFeatureNodeService(){
361
        return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());
362
    }
363

    
364
    @Override
365
    public IVocabularyService getVocabularyService(){
366
        return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());
367
    }
368

    
369
    @Override
370
    public IIdentificationKeyService getIdentificationKeyService(){
371
        return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());
372
    }
373

    
374
    @Override
375
    public IPolytomousKeyService getPolytomousKeyService(){
376
        return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());
377
    }
378

    
379

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

    
385
    @Override
386
    public IProgressMonitorService getProgressMonitorService() {
387
        return (IProgressMonitorService) getService(IProgressMonitorService.class, "/remoting/progressmonitor.service", new CdmAuthenticatedHttpInvokerRequestExecutor());
388
    }
389

    
390
    @Override
391
    public IWorkingSetService getWorkingSetService(){
392
        return (IWorkingSetService) getService(IWorkingSetService.class, "/remoting/workingset.service", new CdmServiceRequestExecutor());
393
    }
394

    
395
    @Override
396
    public IGroupService getGroupService(){
397
        return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new CdmServiceRequestExecutor());
398
    }
399

    
400

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

    
406

    
407
    @Override
408
    public IEntityConstraintViolationService getEntityConstraintViolationService(){
409
        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());
410
    }
411

    
412
    @Override
413
    public ICdmPermissionEvaluator getPermissionEvaluator(){
414

    
415
        if(cdmPermissionEvaluator != null) {
416
            return cdmPermissionEvaluator;
417
        }
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);
425

    
426
        cdmPermissionEvaluator = new CdmPermissionEvaluator();
427
        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
428

    
429
        return cdmPermissionEvaluator;
430
    }
431

    
432

    
433
    @Override
434
    public TransactionStatus startTransaction() throws UnsupportedOperationException {
435
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
436
    }
437

    
438
    @Override
439
    public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
440
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
441
    }
442

    
443

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

    
449
    @Override
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);
455
    }
456

    
457
    public IIOService getIOService() {
458
        return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());
459
    }
460

    
461
    public ITestService getTestService() {
462
        return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());
463
    }
464
}
(2-2/8)