Project

General

Profile

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

    
92

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

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

    
104
    protected ApplicationContext applicationContext;
105

    
106
    private ICdmRemoteSource remoteSource;
107

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

    
110
    private ICdmEntitySessionManager cdmEntitySessionManager;
111

    
112
    private CdmPermissionEvaluator cdmPermissionEvaluator;
113

    
114
    private ProviderManager authenticationManager;
115

    
116
    private ICachedCommonService cachedCommonService;
117

    
118
    public CdmApplicationRemoteConfiguration() {}
119

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

    
124
    public void setRemoteSource(ICdmRemoteSource remoteSource) {
125
        this.remoteSource = remoteSource;
126
    }
127

    
128
    private Object getService(Class<?> clazz, String serviceSuffix, CdmAuthenticatedHttpInvokerRequestExecutor executor) {
129
        if(serviceMap.containsKey(clazz)) {
130
            return serviceMap.get(clazz);
131
        }
132
        String baseUrl;
133
        if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {
134
            baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
135
        } else {
136
            baseUrl = "http://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();
137
        }
138
        HttpInvokerProxyFactoryBean proxy = new HttpInvokerProxyFactoryBean();
139
        proxy.setServiceInterface(clazz);
140
        proxy.setServiceUrl(baseUrl + serviceSuffix);
141
        if(executor != null) {
142
            executor.setReadTimeout(0);
143
            proxy.setHttpInvokerRequestExecutor(executor);
144
        }
145
        proxy.afterPropertiesSet();
146
        Object service = proxy.getObject();
147
        serviceMap.put(clazz,  service);
148
        return service;
149
    }
150

    
151
    // ****************************** APPLICATION CONTEXT *************************************************/
152

    
153
    @Override
154
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
155
        this.applicationContext = applicationContext;
156
    }
157

    
158
    /* (non-Javadoc)
159
     * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#getTransactionManager()
160
     */
161
    @Override
162
    public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {
163
        throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");
164
    }
165

    
166

    
167

    
168
    /**
169
     * @return
170
     */
171
    public IEditGeoService getEditGeoService() {
172
        return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new CdmServiceRequestExecutor());
173
    }
174

    
175
    /**
176
     * @return
177
     */
178
    public ICachedCommonService getCachedCommonService(){
179
        if(cachedCommonService == null) {
180
            cachedCommonService = new CachedCommonServiceImpl();
181
        }
182
        return cachedCommonService;
183
    }
184

    
185

    
186
    public ICdmEntitySessionManager getCdmEntitySessionManager() {
187
        if(cdmEntitySessionManager == null) {
188
            cdmEntitySessionManager = new CdmEntitySessionManager();
189
        }
190
        return cdmEntitySessionManager;
191
    }
192

    
193

    
194

    
195

    
196

    
197

    
198
 // ****************************** GETTER *************************************************/
199

    
200
    @Override
201
    public final Object getBean(String name){
202
        throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");
203
    }
204

    
205
    @Override
206
    public IAgentService getAgentService(){
207
        return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new CdmServiceRequestExecutor());
208
    }
209

    
210
    @Override
211
    public IAnnotationService getAnnotationService(){
212
        return (IAnnotationService) getService(IAnnotationService.class, "/remoting/annotation.service", new CdmServiceRequestExecutor());
213
    }
214

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

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

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

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

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

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

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

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

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

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

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

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

    
275
    @Override
276
    public ITermService getTermService(){
277
        return (ITermService) getService(ITermService.class, "/remoting/term.service", new TermServiceRequestExecutor());
278
    }
279

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

    
285
    @Override
286
    public ILocationService getLocationService(){
287
        return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new CdmServiceRequestExecutor());
288
    }
289

    
290
    @Override
291
    public IUserService getUserService(){
292
        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new CdmServiceRequestExecutor());
293
    }
294

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

    
300
    @Override
301
    public IService<CdmBase> getMainService(){
302
        return null;
303
    }
304

    
305

    
306
    @Override
307
    public ProviderManager getAuthenticationManager(){
308
        if(authenticationManager != null) {
309
            return authenticationManager;
310
        }
311
        Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
312
        ReflectionSaltSource saltSource = new ReflectionSaltSource();
313
        saltSource.setUserPropertyToUse("getUsername");
314

    
315
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
316
        daoAuthenticationProvider.setUserDetailsService(getUserService());
317
        daoAuthenticationProvider.setSaltSource(saltSource);
318
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
319

    
320
        authenticationManager = new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
321
        return authenticationManager;
322
    }
323

    
324

    
325
    @Override
326
    public ConversationHolder NewConversation() {
327
        return new ConversationHolderMock();
328
    }
329

    
330
    @Override
331
    public ICollectionService getCollectionService(){
332
        return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new CdmServiceRequestExecutor());
333
    }
334

    
335
    @Override
336
    public IFeatureTreeService getFeatureTreeService(){
337
        return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());
338
    }
339

    
340
    @Override
341
    public IFeatureNodeService getFeatureNodeService(){
342
        return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());
343
    }
344

    
345
    @Override
346
    public IVocabularyService getVocabularyService(){
347
        return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());
348
    }
349

    
350
    @Override
351
    public IIdentificationKeyService getIdentificationKeyService(){
352
        return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());
353
    }
354

    
355
    @Override
356
    public IPolytomousKeyService getPolytomousKeyService(){
357
        return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());
358
    }
359

    
360

    
361
    @Override
362
    public IPolytomousKeyNodeService getPolytomousKeyNodeService(){
363
        return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new CdmServiceRequestExecutor());
364
    }
365

    
366
    @Override
367
    public IProgressMonitorService getProgressMonitorService() {
368
        return (IProgressMonitorService) getService(IProgressMonitorService.class, "/remoting/progressmonitor.service", new CdmAuthenticatedHttpInvokerRequestExecutor());
369
    }
370

    
371
    @Override
372
    public IWorkingSetService getWorkingSetService(){
373
        return (IWorkingSetService) getService(IWorkingSetService.class, "/remoting/workingset.service", new CdmServiceRequestExecutor());
374
    }
375

    
376
    @Override
377
    public IGroupService getGroupService(){
378
        return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new CdmServiceRequestExecutor());
379
    }
380

    
381

    
382
    @Override
383
    public IEntityValidationService getEntityValidationService(){
384
        return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new CdmServiceRequestExecutor());
385
    }
386

    
387

    
388
    @Override
389
    public IEntityConstraintViolationService getEntityConstraintViolationService(){
390
        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());
391
    }
392

    
393
    @Override
394
    public ICdmPermissionEvaluator getPermissionEvaluator(){
395

    
396
        if(cdmPermissionEvaluator != null) {
397
            return cdmPermissionEvaluator;
398
        }
399
        List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
400
        decisionVoters.add(new GrantAlwaysVoter());
401
        decisionVoters.add(new TaxonNodeVoter());
402
        decisionVoters.add(new TaxonBaseVoter());
403
        decisionVoters.add(new DescriptionBaseVoter());
404
        decisionVoters.add(new DescriptionElementVoter());
405
        UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
406

    
407
        cdmPermissionEvaluator = new CdmPermissionEvaluator();
408
        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
409

    
410
        return cdmPermissionEvaluator;
411
    }
412

    
413

    
414
    @Override
415
    public TransactionStatus startTransaction() throws UnsupportedOperationException {
416
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
417
    }
418

    
419
    @Override
420
    public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
421
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
422
    }
423

    
424

    
425
    @Override
426
    public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
427
        throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
428
    }
429

    
430
    @Override
431
    public void authenticate(String username, String password){
432
        UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
433
        Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
434
        SecurityContext context = SecurityContextHolder.getContext();
435
        context.setAuthentication(authentication);
436
    }
437

    
438
    public IIOService getIOService() {
439
        return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());
440
    }
441

    
442
    public ITestService getTestService() {
443
        return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());
444
    }
445
}
(2-2/8)