Project

General

Profile

Download (24.2 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.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.IDescriptionService;
47
import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
48
import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
49
import eu.etaxonomy.cdm.api.service.IEntityValidationService;
50
import eu.etaxonomy.cdm.api.service.IEventBaseService;
51
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
52
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
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.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.ext.geo.IEditGeoService;
81
import eu.etaxonomy.cdm.io.service.IIOService;
82
import eu.etaxonomy.cdm.persistence.hibernate.permission.CdmPermissionEvaluator;
83
import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
84
import eu.etaxonomy.cdm.persistence.hibernate.permission.UnanimousBasedUnrevokable;
85
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionBaseVoter;
86
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionElementVoter;
87
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.GrantAlwaysVoter;
88
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonBaseVoter;
89
import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonNodeVoter;
90
import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
91
import eu.etaxonomy.taxeditor.service.AuthenticatingHttpInvokerRequestExecutor;
92
import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;
93
import eu.etaxonomy.taxeditor.service.ICachedCommonService;
94
import eu.etaxonomy.taxeditor.service.RemoteInvocationTermCacher;
95
import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;
96
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
97

    
98

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

    
107
    @SuppressWarnings("unused")
108
    private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);
109

    
110
    /**
111
     * Timeout for service lookup etc. This timeout (milliseconds) should me more
112
     * strict than {@link #HTTP_READ_TIMEOUT} to avoid connecting to
113
     * cdm servers when the network quality is too bad.
114
     *
115
     */
116
    public static final int HTTP_READ_TIMEOUT_MIN = 1000; // one minute
117

    
118
    /**
119
     * Timeout for normal operation (milliseconds)
120
     *
121
     * Infinite time out (value = 0) can cause the application to be stuck in
122
     * SocketInputStream.read(), Therefore it makes sense to specify a definite
123
     * timeout which is high enough to allow for longer operations
124
     * <p>
125
     * The application should be usable in networks with low connection quality,
126
     * e.g.: from cuba where the throughput rate is low (<= ISDN speed, 64 kbit)
127
     * and a packet delay of <200 ms. Additionally we should tolerate a certain
128
     * amount of packet loss. Here we take the packet loss rate as it occurs
129
     * in the FU-Berlin ZEDAT VPN as reference case (~1%)
130
     * <ul>
131
     * <li>5min: Timeout at remoting/taxonnode.service
132
     * </ul>
133
     *
134
     */
135
    public static final int HTTP_READ_TIMEOUT = 70000;
136

    
137

    
138
    protected ApplicationContext applicationContext;
139

    
140
    private ICdmRemoteSource remoteSource;
141

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

    
145
    private ICdmEntitySessionManager cdmEntitySessionManager;
146

    
147
    private CdmPermissionEvaluator cdmPermissionEvaluator;
148

    
149
    private ProviderManager authenticationManager;
150

    
151
    private ICachedCommonService cachedCommonService;
152

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

    
159
    public CdmApplicationRemoteConfiguration() {}
160

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

    
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
        if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {
186
            baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
187
        } else {
188
            baseUrl = "http://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();
189
        }
190
        CachingHttpInvokerProxyFactoryBean proxyFactory = new CachingHttpInvokerProxyFactoryBean();
191
        proxyFactory.setServiceInterface(clazz);
192
        proxyFactory.setServiceUrl(baseUrl + serviceSuffix);
193
        if(executor != null) {
194
            executor.setReadTimeout(HTTP_READ_TIMEOUT);
195
            executor.setConnectionRequestTimeout(HTTP_READ_TIMEOUT);
196
            proxyFactory.setHttpInvokerRequestExecutor(executor);
197
        }
198
        if(ITermService.class.isAssignableFrom(clazz)){
199
            proxyFactory.setRemoteInvocationTermCacher(new RemoteInvocationTermCacher());
200
        }
201
        proxyFactory.afterPropertiesSet();
202
        return proxyFactory.getObject();
203
    }
204

    
205
    // ****************************** APPLICATION CONTEXT *************************************************/
206

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

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

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

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

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

    
235
 // ****************************** GETTER *************************************************/
236

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

    
242
    @Override
243
    public IAgentService getAgentService(){
244
        return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new AuthenticatingHttpInvokerRequestExecutor());
245
    }
246

    
247
    @Override
248
    public IAnnotationService getAnnotationService(){
249
        return (IAnnotationService) getService(IAnnotationService.class, "/remoting/annotation.service", new AuthenticatingHttpInvokerRequestExecutor());
250
    }
251

    
252
    @Override
253
    public IDatabaseService getDatabaseService(){
254
        return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new AuthenticatingHttpInvokerRequestExecutor());
255
    }
256

    
257
    @Override
258
    public INameService getNameService(){
259
        return (INameService) getService(INameService.class, "/remoting/name.service", new AuthenticatingHttpInvokerRequestExecutor());
260
    }
261

    
262
    @Override
263
    public IReferenceService getReferenceService(){
264
        return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new AuthenticatingHttpInvokerRequestExecutor());
265
    }
266

    
267
    @Override
268
    public ITaxonService getTaxonService(){
269
        return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new AuthenticatingHttpInvokerRequestExecutor());
270
    }
271

    
272
    @Override
273
    public IClassificationService getClassificationService(){
274
        return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new AuthenticatingHttpInvokerRequestExecutor());
275
    }
276

    
277
    @Override
278
    public ITaxonNodeService getTaxonNodeService(){
279
        return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new AuthenticatingHttpInvokerRequestExecutor());
280
    }
281

    
282
    @Override
283
    public IDescriptionService getDescriptionService(){
284
        return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new AuthenticatingHttpInvokerRequestExecutor());
285
    }
286

    
287
    @Override
288
    public IOccurrenceService getOccurrenceService(){
289
        return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new AuthenticatingHttpInvokerRequestExecutor());
290
    }
291

    
292
    @Override
293
    public IPrimerService getPrimerService(){
294
        return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new AuthenticatingHttpInvokerRequestExecutor());
295
    }
296

    
297
    @Override
298
    public IAmplificationService getAmplificationService(){
299
        return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new AuthenticatingHttpInvokerRequestExecutor());
300
    }
301

    
302
    @Override
303
    public ISequenceService getSequenceService(){
304
        return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new AuthenticatingHttpInvokerRequestExecutor());
305
    }
306

    
307
    @Override
308
    public IEventBaseService getEventBaseService() {
309
        return (IEventBaseService) getService(IEventBaseService.class, "/remoting/eventbase.service", new AuthenticatingHttpInvokerRequestExecutor());
310
    }
311

    
312
    @Override
313
    public IMediaService getMediaService(){
314
        return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new AuthenticatingHttpInvokerRequestExecutor());
315
    }
316

    
317
    @Override
318
    public ITermService getTermService(){
319
        return (ITermService) getService(ITermService.class, "/remoting/term.service", new AuthenticatingHttpInvokerRequestExecutor());
320
    }
321

    
322
    @Override
323
    public IRightsService getRightsService(){
324
        return (IRightsService) getService(IRightsService.class, "/remoting/rights.service", new AuthenticatingHttpInvokerRequestExecutor());
325
    }
326

    
327
    @Override
328
    public ICommonService getCommonService(){
329
        return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new AuthenticatingHttpInvokerRequestExecutor());
330
    }
331

    
332
    @Override
333
    public ILocationService getLocationService(){
334
        return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new AuthenticatingHttpInvokerRequestExecutor());
335
    }
336

    
337
    @Override
338
    public IUserService getUserService(){
339
        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new AuthenticatingHttpInvokerRequestExecutor());
340
    }
341

    
342

    
343
    public static IUserService getUserService(ICdmRemoteSource remoteSource) {
344
        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
345
    }
346

    
347
    @Override
348
    public IMetadataService getMetadataService() {
349
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", new HttpComponentsHttpInvokerRequestExecutor());
350
    }
351

    
352
    public static IMetadataService getMetadataService(ICdmRemoteSource remoteSource) {
353
        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
354
    }
355

    
356
    @Override
357
    public IGrantedAuthorityService getGrantedAuthorityService(){
358
        return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new AuthenticatingHttpInvokerRequestExecutor());
359
    }
360

    
361

    
362
    @Override
363
    public ProviderManager getAuthenticationManager(){
364
        if(authenticationManager == null) {
365
        	authenticationManager = getAuthenticationManager(getUserService());
366
        }
367
        return authenticationManager;
368
    }
369

    
370
    public static ProviderManager getAuthenticationManager(IUserService userService) {
371
        Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
372
        ReflectionSaltSource saltSource = new ReflectionSaltSource();
373
        saltSource.setUserPropertyToUse("getUsername");
374

    
375
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
376
        daoAuthenticationProvider.setUserDetailsService(userService);
377
        daoAuthenticationProvider.setSaltSource(saltSource);
378
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
379

    
380
        return new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
381
    }
382

    
383

    
384
    @Override
385
    public ConversationHolder NewConversation() {
386
        return new ConversationHolderMock();
387
    }
388

    
389
    @Override
390
    public ICollectionService getCollectionService(){
391
        return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new AuthenticatingHttpInvokerRequestExecutor());
392
    }
393

    
394
    @Override
395
    public IFeatureTreeService getFeatureTreeService(){
396
        return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new AuthenticatingHttpInvokerRequestExecutor());
397
    }
398
    @Override
399
    public ITermTreeService getTermTreeService() {
400
    	return (ITermTreeService) getService(ITermTreeService.class, "/remoting/termtree.service", new AuthenticatingHttpInvokerRequestExecutor());
401
    }
402

    
403
    @Override
404
    public IFeatureNodeService getFeatureNodeService(){
405
        return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.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

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

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

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

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

    
451
    }
452

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

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

    
463

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

    
469

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

    
475
    @Override
476
    public ICdmPermissionEvaluator getPermissionEvaluator(){
477

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

    
489
        cdmPermissionEvaluator = new CdmPermissionEvaluator();
490
        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
491

    
492
        return cdmPermissionEvaluator;
493
    }
494

    
495

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

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

    
506

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

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

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

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

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

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

    
538
}
(2-2/8)