ref #9359 upgrade TaxEditor to log4j2
[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.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 }