remove deprecated featureTreeService and featureNodeService from CdmApplicationRemote...
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationRemoteConfiguration.java
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.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.IGrantedAuthorityService;
52 import eu.etaxonomy.cdm.api.service.IGroupService;
53 import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
54 import eu.etaxonomy.cdm.api.service.ILocationService;
55 import eu.etaxonomy.cdm.api.service.IMediaService;
56 import eu.etaxonomy.cdm.api.service.IMetadataService;
57 import eu.etaxonomy.cdm.api.service.INameService;
58 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
59 import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
60 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
61 import eu.etaxonomy.cdm.api.service.IPreferenceService;
62 import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
63 import eu.etaxonomy.cdm.api.service.IReferenceService;
64 import eu.etaxonomy.cdm.api.service.IRegistrationService;
65 import eu.etaxonomy.cdm.api.service.IRightsService;
66 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
67 import eu.etaxonomy.cdm.api.service.ITaxonService;
68 import eu.etaxonomy.cdm.api.service.ITermNodeService;
69 import eu.etaxonomy.cdm.api.service.ITermService;
70 import eu.etaxonomy.cdm.api.service.ITermTreeService;
71 import eu.etaxonomy.cdm.api.service.ITestService;
72 import eu.etaxonomy.cdm.api.service.IUserService;
73 import eu.etaxonomy.cdm.api.service.IVocabularyService;
74 import eu.etaxonomy.cdm.api.service.longrunningService.ILongRunningTasksService;
75 import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;
76 import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
77 import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
78 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
79 import eu.etaxonomy.cdm.api.service.security.IAccountRegistrationService;
80 import eu.etaxonomy.cdm.api.service.security.IPasswordResetService;
81 import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
82 import eu.etaxonomy.cdm.io.service.IIOService;
83 import eu.etaxonomy.cdm.persistence.permission.CdmPermissionEvaluator;
84 import eu.etaxonomy.cdm.persistence.permission.ICdmPermissionEvaluator;
85 import eu.etaxonomy.cdm.persistence.permission.UnanimousBasedUnrevokable;
86 import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionBaseVoter;
87 import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionElementVoter;
88 import eu.etaxonomy.cdm.persistence.permission.voter.GrantAlwaysVoter;
89 import eu.etaxonomy.cdm.persistence.permission.voter.TaxonBaseVoter;
90 import eu.etaxonomy.cdm.persistence.permission.voter.TaxonNodeVoter;
91 import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;
92 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
93 import eu.etaxonomy.taxeditor.service.AuthenticatingHttpInvokerRequestExecutor;
94 import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;
95 import eu.etaxonomy.taxeditor.service.ICachedCommonService;
96 import eu.etaxonomy.taxeditor.service.RemoteInvocationTermCacher;
97 import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;
98 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
99
100 /**
101 * CDM Application Configuration class which manages the configuration for remoting
102 * clients
103 */
104 @Component
105 // TODO split into CdmRepository and proper @Configuration class
106 public class CdmApplicationRemoteConfiguration implements ICdmRepository, ApplicationContextAware {
107
108 @SuppressWarnings("unused")
109 private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);
110
111 /**
112 * Timeout for service lookup etc. This timeout (milliseconds) should be more
113 * strict than {@link #HTTP_READ_TIMEOUT} to avoid connecting to
114 * cdm servers when the network quality is too bad.
115 * Note AM: IMO we should not be to strict, sometimes services do not respond too fast
116 * during the first call (e.g. test server), therefore I put this up from 1 to 3 sec.
117 * Better we should inform the user that the connection might be of low quality
118 * instead of making the connection completely unavailable.
119 */
120 public static final int HTTP_READ_TIMEOUT_MIN = 3000; // 3 seconds
121
122 /**
123 * Timeout for normal operation (milliseconds)
124 *
125 * Infinite time out (value = 0) can cause the application to be stuck in
126 * SocketInputStream.read(), Therefore it makes sense to specify a definite
127 * timeout which is high enough to allow for longer operations
128 * <p>
129 * The application should be usable in networks with low connection quality,
130 * e.g.: from cuba where the throughput rate is low (<= ISDN speed, 64 kbit)
131 * and a packet delay of <200 ms.
132 *
133 */
134 public static final int HTTP_READ_TIMEOUT = 10 * 60 * 1000;
135
136 protected ApplicationContext applicationContext;
137
138 private ICdmRemoteSource remoteSource;
139
140 //TODO should be something like Map<Class<IService>, IService>, but we have no common service base interface yet
141 private Map<Class<?>, Object> serviceMap = new HashMap<>();
142
143 private ICdmEntitySessionManager cdmEntitySessionManager;
144
145 private CdmPermissionEvaluator cdmPermissionEvaluator;
146
147 private ProviderManager authenticationManager;
148
149 private ICachedCommonService cachedCommonService;
150
151 static {
152 // The Taxeditor is multithreaded, the same authentication should be used
153 // in all threads
154 SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL);
155 }
156
157 public CdmApplicationRemoteConfiguration() {}
158
159 public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {
160 this.remoteSource = remoteSource;
161 }
162
163 public void setRemoteSource(ICdmRemoteSource remoteSource) {
164 this.remoteSource = remoteSource;
165 }
166
167 private Object getService(Class<?/* extends IService*/> clazz, String serviceSuffix, HttpComponentsHttpInvokerRequestExecutor executor) {
168 if(serviceMap.containsKey(clazz)) {
169 return serviceMap.get(clazz);
170 }
171 Object service = getService(clazz, serviceSuffix, remoteSource, executor);
172 serviceMap.put(clazz, service);
173 return service;
174 }
175
176 public static Object getService(Class<?> clazz,
177 String serviceSuffix,
178 ICdmRemoteSource remoteSource,
179 HttpComponentsHttpInvokerRequestExecutor executor) {
180
181 String baseUrl;
182 String protocol = remoteSource.getPort() == 443 ? "https" : "http";
183
184 String contextPath = (remoteSource instanceof CdmRemoteSource)? ((CdmRemoteSource)remoteSource).getContextPath() : "";
185 if(StringUtils.isBlank(contextPath)) {
186 baseUrl = protocol + "://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
187 } else {
188 baseUrl = protocol + "://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort()) + "/" + contextPath;
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 IAccountRegistrationService getAccountRegistrationService() {
244 return (IAccountRegistrationService) getService(IAccountRegistrationService.class, "/remoting/accountregistrationservice.service", new AuthenticatingHttpInvokerRequestExecutor());
245 }
246
247 @Override
248 public IAgentService getAgentService(){
249 return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new AuthenticatingHttpInvokerRequestExecutor());
250 }
251
252 @Override
253 public IAnnotationService getAnnotationService(){
254 return (IAnnotationService) getService(IAnnotationService.class, "/remoting/annotation.service", new AuthenticatingHttpInvokerRequestExecutor());
255 }
256
257 @Override
258 public IDatabaseService getDatabaseService(){
259 return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new AuthenticatingHttpInvokerRequestExecutor());
260 }
261
262 @Override
263 public INameService getNameService(){
264 return (INameService) getService(INameService.class, "/remoting/name.service", new AuthenticatingHttpInvokerRequestExecutor());
265 }
266
267 @Override
268 public IReferenceService getReferenceService(){
269 return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new AuthenticatingHttpInvokerRequestExecutor());
270 }
271
272 @Override
273 public ITaxonService getTaxonService(){
274 return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new AuthenticatingHttpInvokerRequestExecutor());
275 }
276
277 @Override
278 public IClassificationService getClassificationService(){
279 return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new AuthenticatingHttpInvokerRequestExecutor());
280 }
281
282 @Override
283 public ITaxonNodeService getTaxonNodeService(){
284 return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new AuthenticatingHttpInvokerRequestExecutor());
285 }
286
287 @Override
288 public IDescriptionService getDescriptionService(){
289 return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new AuthenticatingHttpInvokerRequestExecutor());
290 }
291
292 @Override
293 public IOccurrenceService getOccurrenceService(){
294 return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new AuthenticatingHttpInvokerRequestExecutor());
295 }
296
297 @Override
298 public IPrimerService getPrimerService(){
299 return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new AuthenticatingHttpInvokerRequestExecutor());
300 }
301
302 @Override
303 public IAmplificationService getAmplificationService(){
304 return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new AuthenticatingHttpInvokerRequestExecutor());
305 }
306
307 @Override
308 public ISequenceService getSequenceService(){
309 return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new AuthenticatingHttpInvokerRequestExecutor());
310 }
311
312 @Override
313 public IEventBaseService getEventBaseService() {
314 return (IEventBaseService) getService(IEventBaseService.class, "/remoting/eventbase.service", new AuthenticatingHttpInvokerRequestExecutor());
315 }
316
317 @Override
318 public IMediaService getMediaService(){
319 return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new AuthenticatingHttpInvokerRequestExecutor());
320 }
321
322 @Override
323 public ITermService getTermService(){
324 return (ITermService) getService(ITermService.class, "/remoting/term.service", new AuthenticatingHttpInvokerRequestExecutor());
325 }
326
327 @Override
328 public IRightsService getRightsService(){
329 return (IRightsService) getService(IRightsService.class, "/remoting/rights.service", new AuthenticatingHttpInvokerRequestExecutor());
330 }
331
332 @Override
333 public ICommonService getCommonService(){
334 return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new AuthenticatingHttpInvokerRequestExecutor());
335 }
336
337 @Override
338 public ILocationService getLocationService(){
339 return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new AuthenticatingHttpInvokerRequestExecutor());
340 }
341
342 @Override
343 public IUserService getUserService(){
344 return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new AuthenticatingHttpInvokerRequestExecutor());
345 }
346
347 public static IUserService getUserService(ICdmRemoteSource remoteSource) {
348 return (IUserService) getService(IUserService.class, "/remoting-public/user.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
349 }
350
351 @Override
352 public IMetadataService getMetadataService() {
353 return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", new HttpComponentsHttpInvokerRequestExecutor());
354 }
355
356 public static IMetadataService getMetadataService(ICdmRemoteSource remoteSource) {
357 return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());
358 }
359
360 @Override
361 public IGrantedAuthorityService getGrantedAuthorityService(){
362 return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new AuthenticatingHttpInvokerRequestExecutor());
363 }
364
365 @Override
366 public ProviderManager getAuthenticationManager(){
367 if(authenticationManager == null) {
368 authenticationManager = getAuthenticationManager(getUserService());
369 }
370 return authenticationManager;
371 }
372
373 public static ProviderManager getAuthenticationManager(IUserService userService) {
374 Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
375 ReflectionSaltSource saltSource = new ReflectionSaltSource();
376 saltSource.setUserPropertyToUse("getUsername");
377
378 DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
379 daoAuthenticationProvider.setUserDetailsService(userService);
380 daoAuthenticationProvider.setSaltSource(saltSource);
381 daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
382
383 return new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
384 }
385
386
387 @Override
388 public ConversationHolder NewConversation() {
389 return new ConversationHolderMock();
390 }
391
392 @Override
393 public ICollectionService getCollectionService(){
394 return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new AuthenticatingHttpInvokerRequestExecutor());
395 }
396
397 @Override
398 public ITermTreeService getTermTreeService() {
399 return (ITermTreeService) getService(ITermTreeService.class, "/remoting/termtree.service", new AuthenticatingHttpInvokerRequestExecutor());
400 }
401
402 @Override
403 public ITermNodeService getTermNodeService() {
404 return (ITermNodeService) getService(ITermNodeService.class, "/remoting/termnode.service", new AuthenticatingHttpInvokerRequestExecutor());
405 }
406
407 @Override
408 public IVocabularyService getVocabularyService(){
409 return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new AuthenticatingHttpInvokerRequestExecutor());
410 }
411
412 @Override
413 public IIdentificationKeyService getIdentificationKeyService(){
414 return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new AuthenticatingHttpInvokerRequestExecutor());
415 }
416
417 @Override
418 public IPolytomousKeyService getPolytomousKeyService(){
419 return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new AuthenticatingHttpInvokerRequestExecutor());
420 }
421
422 @Override
423 public IPolytomousKeyNodeService getPolytomousKeyNodeService(){
424 return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new AuthenticatingHttpInvokerRequestExecutor());
425 }
426
427 @Override
428 public IProgressMonitorService getProgressMonitorService() {
429 return (IProgressMonitorService) getService(IProgressMonitorService.class, "/remoting/progressmonitor.service", new AuthenticatingHttpInvokerRequestExecutor());
430 }
431
432 @Override
433 public IDescriptiveDataSetService getDescriptiveDataSetService(){
434 return (IDescriptiveDataSetService) getService(IDescriptiveDataSetService.class, "/remoting/descriptivedataset.service", new AuthenticatingHttpInvokerRequestExecutor());
435 }
436
437 @Override
438 public IRegistrationService getRegistrationService() {
439 return (IRegistrationService) getService(IRegistrationService.class, "/remoting/registration.service", new AuthenticatingHttpInvokerRequestExecutor());
440 }
441
442 @Override
443 public IGroupService getGroupService(){
444 return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new AuthenticatingHttpInvokerRequestExecutor());
445 }
446
447 @Override
448 public IPreferenceService getPreferenceService(){
449 return (IPreferenceService) getService(IPreferenceService.class, "/remoting/preference.service", new AuthenticatingHttpInvokerRequestExecutor());
450 }
451
452 @Override
453 public IPasswordResetService getPasswordResetService(){
454 return (IPasswordResetService) getService(IPasswordResetService.class, "/remoting/passwordreset.service", new AuthenticatingHttpInvokerRequestExecutor());
455 }
456
457 @Override
458 public IEntityValidationService getEntityValidationService(){
459 return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new AuthenticatingHttpInvokerRequestExecutor());
460 }
461
462 @Override
463 public IEntityConstraintViolationService getEntityConstraintViolationService(){
464 return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new AuthenticatingHttpInvokerRequestExecutor());
465 }
466
467 @Override
468 public MediaInfoFactory getMediaInfoFactory(){ // TODO use interface
469 return (MediaInfoFactory) getService(MediaInfoFactory.class, "/remoting/mediainfofactory.service", new AuthenticatingHttpInvokerRequestExecutor());
470 }
471
472 @Override
473 public ICdmPermissionEvaluator getPermissionEvaluator(){
474
475 if(cdmPermissionEvaluator != null) {
476 return cdmPermissionEvaluator;
477 }
478 List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>();
479 decisionVoters.add(new GrantAlwaysVoter());
480 decisionVoters.add(new TaxonNodeVoter());
481 decisionVoters.add(new TaxonBaseVoter());
482 decisionVoters.add(new DescriptionBaseVoter());
483 decisionVoters.add(new DescriptionElementVoter());
484 UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
485
486 cdmPermissionEvaluator = new CdmPermissionEvaluator();
487 cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
488
489 return cdmPermissionEvaluator;
490 }
491
492 @Override
493 public TransactionStatus startTransaction() throws UnsupportedOperationException {
494 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
495 }
496
497 @Override
498 public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
499 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
500 }
501
502 @Override
503 public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
504 throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
505 }
506
507 @Override
508 public void rollbackTransaction(TransactionStatus arg0) {
509 throw new UnsupportedOperationException("rollbackTransaction is not implemented for CdmApplicationRemoteConfiguration");
510 }
511
512 @Override
513 public void authenticate(String username, String password){
514 UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
515 Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
516 SecurityContext context = SecurityContextHolder.getContext();
517 context.setAuthentication(authentication);
518 }
519
520 public IIOService getIOService() {
521 return (IIOService) getService(IIOService.class, "/remoting/io.service", new AuthenticatingHttpInvokerRequestExecutor());
522 }
523
524 @Override
525 public ILongRunningTasksService getLongRunningTasksService() {
526 return (ILongRunningTasksService) getService(ILongRunningTasksService.class, "/remoting/longrunningtasks.service", new AuthenticatingHttpInvokerRequestExecutor());
527 }
528
529 public ITestService getTestService() {
530 return (ITestService) getService(ITestService.class, "/remoting/test.service", new AuthenticatingHttpInvokerRequestExecutor());
531 }
532 }