Project

General

Profile

Download (25.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
package eu.etaxonomy.cdm.api.application;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16

    
17
import org.apache.commons.lang3.StringUtils;
18
import org.apache.logging.log4j.LogManager;import org.apache.logging.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.CachingHttpInvokerProxyFactoryBean;
23
import org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor;
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.IDescriptionElementService;
47
import eu.etaxonomy.cdm.api.service.IDescriptionService;
48
import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
49
import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
50
import eu.etaxonomy.cdm.api.service.IEntityValidationService;
51
import eu.etaxonomy.cdm.api.service.IEventBaseService;
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.IRegistrationService;
66
import eu.etaxonomy.cdm.api.service.IRightsService;
67
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
68
import eu.etaxonomy.cdm.api.service.ITaxonService;
69
import eu.etaxonomy.cdm.api.service.ITermNodeService;
70
import eu.etaxonomy.cdm.api.service.ITermService;
71
import eu.etaxonomy.cdm.api.service.ITermTreeService;
72
import eu.etaxonomy.cdm.api.service.ITestService;
73
import eu.etaxonomy.cdm.api.service.IUserService;
74
import eu.etaxonomy.cdm.api.service.IVocabularyService;
75
import eu.etaxonomy.cdm.api.service.longrunningService.ILongRunningTasksService;
76
import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;
77
import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
78
import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
79
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
80
import eu.etaxonomy.cdm.api.service.security.IAccountRegistrationService;
81
import eu.etaxonomy.cdm.api.service.security.IPasswordResetService;
82
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
83
import eu.etaxonomy.cdm.io.service.IIOService;
84
import eu.etaxonomy.cdm.persistence.permission.CdmPermissionEvaluator;
85
import eu.etaxonomy.cdm.persistence.permission.ICdmPermissionEvaluator;
86
import eu.etaxonomy.cdm.persistence.permission.UnanimousBasedUnrevokable;
87
import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionBaseVoter;
88
import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionElementVoter;
89
import eu.etaxonomy.cdm.persistence.permission.voter.GrantAlwaysVoter;
90
import eu.etaxonomy.cdm.persistence.permission.voter.TaxonBaseVoter;
91
import eu.etaxonomy.cdm.persistence.permission.voter.TaxonNodeVoter;
92
import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;
93
import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
94
import eu.etaxonomy.taxeditor.service.AuthenticatingHttpInvokerRequestExecutor;
95
import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;
96
import eu.etaxonomy.taxeditor.service.ICachedCommonService;
97
import eu.etaxonomy.taxeditor.service.RemoteInvocationTermCacher;
98
import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;
99
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
100

    
101
/**
102
 * CDM Application Configuration class which manages the configuration for remoting
103
 * clients
104
 */
105
@Component
106
// TODO split into CdmRepository and proper @Configuration class
107
public class CdmApplicationRemoteConfiguration implements ICdmRepository, ApplicationContextAware  {
108

    
109
    @SuppressWarnings("unused")
110
    private static final Logger logger = LogManager.getLogger(CdmApplicationRemoteConfiguration.class);
111

    
112
    /**
113
     * Timeout for service lookup etc. This timeout (milliseconds) should be more
114
     * strict than {@link #HTTP_READ_TIMEOUT} to avoid connecting to
115
     * cdm servers when the network quality is too bad.
116
     * Note AM: IMO we should not be to strict, sometimes services do not respond too fast
117
     *     during the first call (e.g. test server), therefore I put this up from 1 to 3 sec.
118
     *     Better we should inform the user that the connection might be of low quality
119
     *     instead of making the connection completely unavailable.
120
     */
121
    public static final int HTTP_READ_TIMEOUT_MIN = 3000; // 3 seconds
122

    
123
    /**
124
     * Timeout for normal operation (milliseconds)
125
     *
126
     * Infinite time out (value = 0) can cause the application to be stuck in
127
     * SocketInputStream.read(), Therefore it makes sense to specify a definite
128
     * timeout which is high enough to allow for longer operations
129
     * <p>
130
     * The application should be usable in networks with low connection quality,
131
     * e.g.: from cuba where the throughput rate is low (<= ISDN speed, 64 kbit)
132
     * and a packet delay of <200 ms.
133
     *
134
     */
135
    public static final int HTTP_READ_TIMEOUT = 10 * 60 * 1000;
136

    
137
    protected ApplicationContext applicationContext;
138

    
139
    private ICdmRemoteSource remoteSource;
140

    
141
    //TODO should be something like Map<Class<IService>, IService>, but we have no common service base interface yet
142
    private Map<Class<?>, Object> serviceMap = new HashMap<>();
143

    
144
    private ICdmEntitySessionManager cdmEntitySessionManager;
145

    
146
    private CdmPermissionEvaluator cdmPermissionEvaluator;
147

    
148
    private ProviderManager authenticationManager;
149

    
150
    private ICachedCommonService cachedCommonService;
151

    
152
    static {
153
        // The Taxeditor is multithreaded, the same authentication should be used
154
        // in all threads
155
        SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL);
156
    }
157

    
158
    public CdmApplicationRemoteConfiguration() {}
159

    
160
    public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {
161
        this.remoteSource = remoteSource;
162
    }
163

    
164
    public void setRemoteSource(ICdmRemoteSource remoteSource) {
165
        this.remoteSource = remoteSource;
166
    }
167

    
168
    private Object getService(Class<?/* extends IService*/> clazz, String serviceSuffix, HttpComponentsHttpInvokerRequestExecutor executor) {
169
        if(serviceMap.containsKey(clazz)) {
170
            return serviceMap.get(clazz);
171
        }
172
        Object service = getService(clazz, serviceSuffix, remoteSource, executor);
173
        serviceMap.put(clazz,  service);
174
        return service;
175
    }
176

    
177
    public static Object getService(Class<?> clazz,
178
            String serviceSuffix,
179
            ICdmRemoteSource remoteSource,
180
            HttpComponentsHttpInvokerRequestExecutor executor) {
181

    
182
        String baseUrl;
183
        String protocol = remoteSource.getPort() == 443 ? "https" : "http";
184

    
185
        String contextPath = (remoteSource instanceof CdmRemoteSource)? ((CdmRemoteSource)remoteSource).getContextPath() : "";
186
        if(StringUtils.isBlank(contextPath)) {
187
            baseUrl = protocol + "://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
188
        } else {
189
            baseUrl = protocol + "://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + contextPath;
190
        }
191
        CachingHttpInvokerProxyFactoryBean proxyFactory = new CachingHttpInvokerProxyFactoryBean();
192
        proxyFactory.setServiceInterface(clazz);
193
        proxyFactory.setServiceUrl(baseUrl + serviceSuffix);
194
        if(executor != null) {
195
            executor.setReadTimeout(HTTP_READ_TIMEOUT);
196
            executor.setConnectionRequestTimeout(HTTP_READ_TIMEOUT);
197
            proxyFactory.setHttpInvokerRequestExecutor(executor);
198
        }
199
        if(ITermService.class.isAssignableFrom(clazz)){
200
            proxyFactory.setRemoteInvocationTermCacher(new RemoteInvocationTermCacher());
201
        }
202
        proxyFactory.afterPropertiesSet();
203
        return proxyFactory.getObject();
204
    }
205

    
206
    // ****************************** APPLICATION CONTEXT *************************************************/
207

    
208
    @Override
209
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
210
        this.applicationContext = applicationContext;
211
    }
212

    
213
    @Override
214
    public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {
215
        throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");
216
    }
217

    
218
    public IEditGeoService getEditGeoService() {
219
        return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new AuthenticatingHttpInvokerRequestExecutor());
220
    }
221

    
222
    public ICachedCommonService getCachedCommonService(){
223
        if(cachedCommonService == null) {
224
            cachedCommonService = new CachedCommonServiceImpl();
225
        }
226
        return cachedCommonService;
227
    }
228

    
229
    public ICdmEntitySessionManager getCdmEntitySessionManager() {
230
        if(cdmEntitySessionManager == null) {
231
            cdmEntitySessionManager = new CdmEntitySessionManager();
232
        }
233
        return cdmEntitySessionManager;
234
    }
235

    
236
 // ****************************** GETTER *************************************************/
237

    
238
    @Override
239
    public final Object getBean(String name){
240
        throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");
241
    }
242

    
243
    @Override
244
    public IAccountRegistrationService getAccountRegistrationService() {
245
        return (IAccountRegistrationService) getService(IAccountRegistrationService.class, "/remoting/accountregistrationservice.service", new AuthenticatingHttpInvokerRequestExecutor());
246
    }
247

    
248
    @Override
249
    public IAgentService getAgentService(){
250
        return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new AuthenticatingHttpInvokerRequestExecutor());
251
    }
252

    
253
    @Override
254
    public IAnnotationService getAnnotationService(){
255
        return (IAnnotationService) getService(IAnnotationService.class, "/remoting/annotation.service", new AuthenticatingHttpInvokerRequestExecutor());
256
    }
257

    
258
    @Override
259
    public IDatabaseService getDatabaseService(){
260
        return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new AuthenticatingHttpInvokerRequestExecutor());
261
    }
262

    
263
    @Override
264
    public INameService getNameService(){
265
        return (INameService) getService(INameService.class, "/remoting/name.service", new AuthenticatingHttpInvokerRequestExecutor());
266
    }
267

    
268
    @Override
269
    public IReferenceService getReferenceService(){
270
        return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new AuthenticatingHttpInvokerRequestExecutor());
271
    }
272

    
273
    @Override
274
    public ITaxonService getTaxonService(){
275
        return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new AuthenticatingHttpInvokerRequestExecutor());
276
    }
277

    
278
    @Override
279
    public IClassificationService getClassificationService(){
280
        return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new AuthenticatingHttpInvokerRequestExecutor());
281
    }
282

    
283
    @Override
284
    public ITaxonNodeService getTaxonNodeService(){
285
        return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new AuthenticatingHttpInvokerRequestExecutor());
286
    }
287

    
288
    @Override
289
    public IDescriptionService getDescriptionService(){
290
        return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new AuthenticatingHttpInvokerRequestExecutor());
291
    }
292

    
293
    @Override
294
    public IDescriptionElementService getDescriptionElementService(){
295
        return (IDescriptionElementService) getService(IDescriptionElementService.class, "/remoting/descriptionelement.service", new AuthenticatingHttpInvokerRequestExecutor());
296
    }
297

    
298
    @Override
299
    public IOccurrenceService getOccurrenceService(){
300
        return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new AuthenticatingHttpInvokerRequestExecutor());
301
    }
302

    
303
    @Override
304
    public IPrimerService getPrimerService(){
305
        return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new AuthenticatingHttpInvokerRequestExecutor());
306
    }
307

    
308
    @Override
309
    public IAmplificationService getAmplificationService(){
310
        return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new AuthenticatingHttpInvokerRequestExecutor());
311
    }
312

    
313
    @Override
314
    public ISequenceService getSequenceService(){
315
        return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new AuthenticatingHttpInvokerRequestExecutor());
316
    }
317

    
318
    @Override
319
    public IEventBaseService getEventBaseService() {
320
        return (IEventBaseService) getService(IEventBaseService.class, "/remoting/eventbase.service", new AuthenticatingHttpInvokerRequestExecutor());
321
    }
322

    
323
    @Override
324
    public IMediaService getMediaService(){
325
        return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new AuthenticatingHttpInvokerRequestExecutor());
326
    }
327

    
328
    @Override
329
    public ITermService getTermService(){
330
        return (ITermService) getService(ITermService.class, "/remoting/term.service", new AuthenticatingHttpInvokerRequestExecutor());
331
    }
332

    
333
    @Override
334
    public IRightsService getRightsService(){
335
        return (IRightsService) getService(IRightsService.class, "/remoting/rights.service", new AuthenticatingHttpInvokerRequestExecutor());
336
    }
337

    
338
    @Override
339
    public ICommonService getCommonService(){
340
        return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new AuthenticatingHttpInvokerRequestExecutor());
341
    }
342

    
343
    @Override
344
    public ILocationService getLocationService(){
345
        return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new AuthenticatingHttpInvokerRequestExecutor());
346
    }
347

    
348
    @Override
349
    public IUserService getUserService(){
350
        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new AuthenticatingHttpInvokerRequestExecutor());
351
    }
352

    
353
    public static IUserService getUserService(ICdmRemoteSource remoteSource) {
354
        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
355
    }
356

    
357
    @Override
358
    public IMetadataService getMetadataService() {
359
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", new HttpComponentsHttpInvokerRequestExecutor());
360
    }
361

    
362
    public static IMetadataService getMetadataService(ICdmRemoteSource remoteSource) {
363
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
364
    }
365

    
366
    @Override
367
    public IGrantedAuthorityService getGrantedAuthorityService(){
368
        return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new AuthenticatingHttpInvokerRequestExecutor());
369
    }
370

    
371
    @Override
372
    public ProviderManager getAuthenticationManager(){
373
        if(authenticationManager == null) {
374
        	authenticationManager = getAuthenticationManager(getUserService());
375
        }
376
        return authenticationManager;
377
    }
378

    
379
    public static ProviderManager getAuthenticationManager(IUserService userService) {
380
        Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
381
        ReflectionSaltSource saltSource = new ReflectionSaltSource();
382
        saltSource.setUserPropertyToUse("getUsername");
383

    
384
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
385
        daoAuthenticationProvider.setUserDetailsService(userService);
386
        daoAuthenticationProvider.setSaltSource(saltSource);
387
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
388

    
389
        return new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
390
    }
391

    
392

    
393
    @Override
394
    public ConversationHolder NewConversation() {
395
        return new ConversationHolderMock();
396
    }
397

    
398
    @Override
399
    public ICollectionService getCollectionService(){
400
        return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new AuthenticatingHttpInvokerRequestExecutor());
401
    }
402

    
403
    @Override
404
    public ITermTreeService getTermTreeService() {
405
    	return (ITermTreeService) getService(ITermTreeService.class, "/remoting/termtree.service", new AuthenticatingHttpInvokerRequestExecutor());
406
    }
407

    
408
	@Override
409
	public ITermNodeService getTermNodeService() {
410
        return (ITermNodeService) getService(ITermNodeService.class, "/remoting/termnode.service", new AuthenticatingHttpInvokerRequestExecutor());
411
	}
412

    
413
    @Override
414
    public IVocabularyService getVocabularyService(){
415
        return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new AuthenticatingHttpInvokerRequestExecutor());
416
    }
417

    
418
    @Override
419
    public IIdentificationKeyService getIdentificationKeyService(){
420
        return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new AuthenticatingHttpInvokerRequestExecutor());
421
    }
422

    
423
    @Override
424
    public IPolytomousKeyService getPolytomousKeyService(){
425
        return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new AuthenticatingHttpInvokerRequestExecutor());
426
    }
427

    
428
    @Override
429
    public IPolytomousKeyNodeService getPolytomousKeyNodeService(){
430
        return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new AuthenticatingHttpInvokerRequestExecutor());
431
    }
432

    
433
    @Override
434
    public IProgressMonitorService getProgressMonitorService() {
435
        return (IProgressMonitorService) getService(IProgressMonitorService.class, "/remoting/progressmonitor.service", new AuthenticatingHttpInvokerRequestExecutor());
436
    }
437

    
438
    @Override
439
    public IDescriptiveDataSetService getDescriptiveDataSetService(){
440
        return (IDescriptiveDataSetService) getService(IDescriptiveDataSetService.class, "/remoting/descriptivedataset.service", new AuthenticatingHttpInvokerRequestExecutor());
441
    }
442

    
443
    @Override
444
    public IRegistrationService getRegistrationService() {
445
        return (IRegistrationService) getService(IRegistrationService.class, "/remoting/registration.service", new AuthenticatingHttpInvokerRequestExecutor());
446
    }
447

    
448
    @Override
449
    public IGroupService getGroupService(){
450
        return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new AuthenticatingHttpInvokerRequestExecutor());
451
    }
452

    
453
    @Override
454
    public IPreferenceService getPreferenceService(){
455
        return (IPreferenceService) getService(IPreferenceService.class, "/remoting/preference.service", new AuthenticatingHttpInvokerRequestExecutor());
456
    }
457

    
458
    @Override
459
    public IPasswordResetService getPasswordResetService(){
460
        return (IPasswordResetService) getService(IPasswordResetService.class, "/remoting/passwordreset.service", new AuthenticatingHttpInvokerRequestExecutor());
461
    }
462

    
463
    @Override
464
    public IEntityValidationService getEntityValidationService(){
465
        return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new AuthenticatingHttpInvokerRequestExecutor());
466
    }
467

    
468
    @Override
469
    public IEntityConstraintViolationService getEntityConstraintViolationService(){
470
        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new AuthenticatingHttpInvokerRequestExecutor());
471
    }
472

    
473
    @Override
474
    public MediaInfoFactory getMediaInfoFactory(){ // TODO use interface
475
        return (MediaInfoFactory) getService(MediaInfoFactory.class, "/remoting/mediainfofactory.service", new AuthenticatingHttpInvokerRequestExecutor());
476
    }
477

    
478
    @Override
479
    public ICdmPermissionEvaluator getPermissionEvaluator(){
480

    
481
        if(cdmPermissionEvaluator != null) {
482
            return cdmPermissionEvaluator;
483
        }
484
        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>();
485
        decisionVoters.add(new GrantAlwaysVoter());
486
        decisionVoters.add(new TaxonNodeVoter());
487
        decisionVoters.add(new TaxonBaseVoter());
488
        decisionVoters.add(new DescriptionBaseVoter());
489
        decisionVoters.add(new DescriptionElementVoter());
490
        UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
491

    
492
        cdmPermissionEvaluator = new CdmPermissionEvaluator();
493
        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
494

    
495
        return cdmPermissionEvaluator;
496
    }
497

    
498
    @Override
499
    public TransactionStatus startTransaction() throws UnsupportedOperationException {
500
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
501
    }
502

    
503
    @Override
504
    public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
505
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
506
    }
507

    
508
    @Override
509
    public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
510
        throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
511
    }
512

    
513
	@Override
514
	public void rollbackTransaction(TransactionStatus arg0) {
515
        throw new UnsupportedOperationException("rollbackTransaction is not implemented for CdmApplicationRemoteConfiguration");
516
	}
517

    
518
    @Override
519
    public void authenticate(String username, String password){
520
        UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
521
        Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
522
        SecurityContext context = SecurityContextHolder.getContext();
523
        context.setAuthentication(authentication);
524
    }
525

    
526
    public IIOService getIOService() {
527
        return (IIOService) getService(IIOService.class, "/remoting/io.service", new AuthenticatingHttpInvokerRequestExecutor());
528
    }
529

    
530
    @Override
531
    public ILongRunningTasksService getLongRunningTasksService() {
532
        return (ILongRunningTasksService) getService(ILongRunningTasksService.class, "/remoting/longrunningtasks.service", new AuthenticatingHttpInvokerRequestExecutor());
533
    }
534

    
535
    public ITestService getTestService() {
536
        return (ITestService) getService(ITestService.class, "/remoting/test.service", new AuthenticatingHttpInvokerRequestExecutor());
537
    }
538
}
(2-2/8)