Project

General

Profile

Download (25.5 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;
19
import org.apache.logging.log4j.Logger;
20
import org.springframework.beans.BeansException;
21
import org.springframework.context.ApplicationContext;
22
import org.springframework.context.ApplicationContextAware;
23
import org.springframework.remoting.httpinvoker.CachingHttpInvokerProxyFactoryBean;
24
import org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor;
25
import org.springframework.security.access.AccessDecisionVoter;
26
import org.springframework.security.authentication.AuthenticationProvider;
27
import org.springframework.security.authentication.ProviderManager;
28
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
29
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
30
import org.springframework.security.authentication.dao.ReflectionSaltSource;
31
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
32
import org.springframework.security.core.Authentication;
33
import org.springframework.security.core.context.SecurityContext;
34
import org.springframework.security.core.context.SecurityContextHolder;
35
import org.springframework.stereotype.Component;
36
import org.springframework.transaction.PlatformTransactionManager;
37
import org.springframework.transaction.TransactionStatus;
38

    
39
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
40
import eu.etaxonomy.cdm.api.conversation.ConversationHolderMock;
41
import eu.etaxonomy.cdm.api.service.IAgentService;
42
import eu.etaxonomy.cdm.api.service.IAnnotationService;
43
import eu.etaxonomy.cdm.api.service.IClassificationService;
44
import eu.etaxonomy.cdm.api.service.ICollectionService;
45
import eu.etaxonomy.cdm.api.service.ICommonService;
46
import eu.etaxonomy.cdm.api.service.IDatabaseService;
47
import eu.etaxonomy.cdm.api.service.IDescriptionElementService;
48
import eu.etaxonomy.cdm.api.service.IDescriptionService;
49
import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
50
import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
51
import eu.etaxonomy.cdm.api.service.IEntityValidationService;
52
import eu.etaxonomy.cdm.api.service.IEventBaseService;
53
import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
54
import eu.etaxonomy.cdm.api.service.IGroupService;
55
import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
56
import eu.etaxonomy.cdm.api.service.ILocationService;
57
import eu.etaxonomy.cdm.api.service.IMediaService;
58
import eu.etaxonomy.cdm.api.service.IMetadataService;
59
import eu.etaxonomy.cdm.api.service.INameService;
60
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
61
import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
62
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
63
import eu.etaxonomy.cdm.api.service.IPreferenceService;
64
import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
65
import eu.etaxonomy.cdm.api.service.IReferenceService;
66
import eu.etaxonomy.cdm.api.service.IRegistrationService;
67
import eu.etaxonomy.cdm.api.service.IRightsService;
68
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
69
import eu.etaxonomy.cdm.api.service.ITaxonService;
70
import eu.etaxonomy.cdm.api.service.ITermNodeService;
71
import eu.etaxonomy.cdm.api.service.ITermService;
72
import eu.etaxonomy.cdm.api.service.ITermTreeService;
73
import eu.etaxonomy.cdm.api.service.ITestService;
74
import eu.etaxonomy.cdm.api.service.IUserService;
75
import eu.etaxonomy.cdm.api.service.IVocabularyService;
76
import eu.etaxonomy.cdm.api.service.longrunningService.ILongRunningTasksService;
77
import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;
78
import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
79
import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
80
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
81
import eu.etaxonomy.cdm.api.service.registration.IRegistrationWorkingSetService;
82
import eu.etaxonomy.cdm.api.service.security.IAccountRegistrationService;
83
import eu.etaxonomy.cdm.api.service.security.IPasswordResetService;
84
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
85
import eu.etaxonomy.cdm.io.service.IIOService;
86
import eu.etaxonomy.cdm.persistence.permission.CdmPermissionEvaluator;
87
import eu.etaxonomy.cdm.persistence.permission.ICdmPermissionEvaluator;
88
import eu.etaxonomy.cdm.persistence.permission.UnanimousBasedUnrevokable;
89
import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionBaseVoter;
90
import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionElementVoter;
91
import eu.etaxonomy.cdm.persistence.permission.voter.GrantAlwaysVoter;
92
import eu.etaxonomy.cdm.persistence.permission.voter.TaxonBaseVoter;
93
import eu.etaxonomy.cdm.persistence.permission.voter.TaxonNodeVoter;
94
import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;
95
import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
96
import eu.etaxonomy.taxeditor.service.AuthenticatingHttpInvokerRequestExecutor;
97
import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;
98
import eu.etaxonomy.taxeditor.service.ICachedCommonService;
99
import eu.etaxonomy.taxeditor.service.RemoteInvocationTermCacher;
100
import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;
101
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
102

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

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

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

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

    
139
    protected ApplicationContext applicationContext;
140

    
141
    private ICdmRemoteSource remoteSource;
142

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

    
146
    private ICdmEntitySessionManager cdmEntitySessionManager;
147

    
148
    private CdmPermissionEvaluator cdmPermissionEvaluator;
149

    
150
    private ProviderManager authenticationManager;
151

    
152
    private ICachedCommonService cachedCommonService;
153

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

    
160
    public CdmApplicationRemoteConfiguration() {}
161

    
162
    public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {
163
        this.remoteSource = remoteSource;
164
    }
165

    
166
    public void setRemoteSource(ICdmRemoteSource remoteSource) {
167
        this.remoteSource = remoteSource;
168
    }
169

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

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

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

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

    
208
    // ****************************** APPLICATION CONTEXT *************************************************/
209

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

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

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

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

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

    
238
 // ****************************** GETTER *************************************************/
239

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
391
        return new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
392
    }
393

    
394

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

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

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

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

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

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

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

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

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

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

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

    
450
    @Override
451
    public IRegistrationWorkingSetService getRegistrationWorkingSetService() {
452
        return (IRegistrationWorkingSetService) getService(IRegistrationWorkingSetService.class, "/remoting/registrationworkingset.service", new AuthenticatingHttpInvokerRequestExecutor());
453
    }
454

    
455
    @Override
456
    public IGroupService getGroupService(){
457
        return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new AuthenticatingHttpInvokerRequestExecutor());
458
    }
459

    
460
    @Override
461
    public IPreferenceService getPreferenceService(){
462
        return (IPreferenceService) getService(IPreferenceService.class, "/remoting/preference.service", new AuthenticatingHttpInvokerRequestExecutor());
463
    }
464

    
465
    @Override
466
    public IPasswordResetService getPasswordResetService(){
467
        return (IPasswordResetService) getService(IPasswordResetService.class, "/remoting/passwordreset.service", new AuthenticatingHttpInvokerRequestExecutor());
468
    }
469

    
470
    @Override
471
    public IEntityValidationService getEntityValidationService(){
472
        return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new AuthenticatingHttpInvokerRequestExecutor());
473
    }
474

    
475
    @Override
476
    public IEntityConstraintViolationService getEntityConstraintViolationService(){
477
        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new AuthenticatingHttpInvokerRequestExecutor());
478
    }
479

    
480
    @Override
481
    public MediaInfoFactory getMediaInfoFactory(){ // TODO use interface
482
        return (MediaInfoFactory) getService(MediaInfoFactory.class, "/remoting/mediainfofactory.service", new AuthenticatingHttpInvokerRequestExecutor());
483
    }
484

    
485
    @Override
486
    public ICdmPermissionEvaluator getPermissionEvaluator(){
487

    
488
        if(cdmPermissionEvaluator != null) {
489
            return cdmPermissionEvaluator;
490
        }
491
        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>();
492
        decisionVoters.add(new GrantAlwaysVoter());
493
        decisionVoters.add(new TaxonNodeVoter());
494
        decisionVoters.add(new TaxonBaseVoter());
495
        decisionVoters.add(new DescriptionBaseVoter());
496
        decisionVoters.add(new DescriptionElementVoter());
497
        UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
498

    
499
        cdmPermissionEvaluator = new CdmPermissionEvaluator();
500
        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
501

    
502
        return cdmPermissionEvaluator;
503
    }
504

    
505
    @Override
506
    public TransactionStatus startTransaction() throws UnsupportedOperationException {
507
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
508
    }
509

    
510
    @Override
511
    public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
512
        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
513
    }
514

    
515
    @Override
516
    public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
517
        throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
518
    }
519

    
520
	@Override
521
	public void rollbackTransaction(TransactionStatus arg0) {
522
        throw new UnsupportedOperationException("rollbackTransaction is not implemented for CdmApplicationRemoteConfiguration");
523
	}
524

    
525
    @Override
526
    public void authenticate(String username, String password){
527
        UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
528
        Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
529
        SecurityContext context = SecurityContextHolder.getContext();
530
        context.setAuthentication(authentication);
531
    }
532

    
533
    public IIOService getIOService() {
534
        return (IIOService) getService(IIOService.class, "/remoting/io.service", new AuthenticatingHttpInvokerRequestExecutor());
535
    }
536

    
537
    @Override
538
    public ILongRunningTasksService getLongRunningTasksService() {
539
        return (ILongRunningTasksService) getService(ILongRunningTasksService.class, "/remoting/longrunningtasks.service", new AuthenticatingHttpInvokerRequestExecutor());
540
    }
541

    
542
    public ITestService getTestService() {
543
        return (ITestService) getService(ITestService.class, "/remoting/test.service", new AuthenticatingHttpInvokerRequestExecutor());
544
    }
545
}
(2-2/8)