Project

General

Profile

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

    
90

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

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

    
102
    protected ApplicationContext applicationContext;
103

    
104
    private ICdmRemoteSource remoteSource;
105

    
106
    private Map serviceMap = new HashMap<Class<IService>, IService>();
107

    
108
    private ICdmEntitySessionManager cdmEntitySessionManager;
109

    
110
    private CdmPermissionEvaluator cdmPermissionEvaluator;
111

    
112
    private ProviderManager authenticationManager;
113

    
114
    private ICachedCommonService cachedCommonService;
115

    
116
    public CdmApplicationRemoteConfiguration() {}
117

    
118
    public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {
119
        this.remoteSource = remoteSource;
120
    }
121

    
122
    public void setRemoteSource(ICdmRemoteSource remoteSource) {
123
        this.remoteSource = remoteSource;
124
    }
125

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

    
149
    // ****************************** APPLICATION CONTEXT *************************************************/
150

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

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

    
164

    
165

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

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

    
183

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

    
191

    
192

    
193

    
194

    
195

    
196
 // ****************************** GETTER *************************************************/
197

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
303

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

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

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

    
322

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

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

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

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

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

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

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

    
358

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

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

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

    
374

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

    
380

    
381
    @Override
382
    public IEntityConstraintViolationService getEntityConstraintViolationService(){
383
        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());
384
    }
385

    
386
    @Override
387
    public ICdmPermissionEvaluator getPermissionEvaluator(){
388

    
389
        if(cdmPermissionEvaluator != null) {
390
            return cdmPermissionEvaluator;
391
        }
392
        List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
393
        decisionVoters.add(new GrantAlwaysVoter());
394
        decisionVoters.add(new TaxonNodeVoter());
395
        decisionVoters.add(new TaxonBaseVoter());
396
        decisionVoters.add(new DescriptionBaseVoter());
397
        decisionVoters.add(new DescriptionElementVoter());
398
        UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
399

    
400
        cdmPermissionEvaluator = new CdmPermissionEvaluator();
401
        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
402

    
403
        return cdmPermissionEvaluator;
404
    }
405

    
406

    
407
    @Override
408
    public TransactionStatus startTransaction() throws UnsupportedOperationException {
409
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
410
    }
411

    
412
    @Override
413
    public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
414
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
415
    }
416

    
417

    
418
    @Override
419
    public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
420
        throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
421
    }
422

    
423
    @Override
424
    public void authenticate(String username, String password){
425
        UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
426
        Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
427
        SecurityContext context = SecurityContextHolder.getContext();
428
        context.setAuthentication(authentication);
429
    }
430

    
431
    public IIOService getIOService() {
432
        return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());
433
    }
434

    
435
    public ITestService getTestService() {
436
        return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());
437
    }
438
}
(2-2/8)