2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.api
.application
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Arrays
;
13 import java
.util
.HashMap
;
14 import java
.util
.List
;
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
;
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
;
102 * CDM Application Configuration class which manages the configuration for remoting
106 // TODO split into CdmRepository and proper @Configuration class
107 public class CdmApplicationRemoteConfiguration
implements ICdmRepository
, ApplicationContextAware
{
109 @SuppressWarnings("unused")
110 private static final Logger logger
= LogManager
.getLogger(CdmApplicationRemoteConfiguration
.class);
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.
121 public static final int HTTP_READ_TIMEOUT_MIN
= 3000; // 3 seconds
124 * Timeout for normal operation (milliseconds)
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
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.
135 public static final int HTTP_READ_TIMEOUT
= 10 * 60 * 1000;
137 protected ApplicationContext applicationContext
;
139 private ICdmRemoteSource remoteSource
;
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
<>();
144 private ICdmEntitySessionManager cdmEntitySessionManager
;
146 private CdmPermissionEvaluator cdmPermissionEvaluator
;
148 private ProviderManager authenticationManager
;
150 private ICachedCommonService cachedCommonService
;
153 // The Taxeditor is multithreaded, the same authentication should be used
155 SecurityContextHolder
.setStrategyName(SecurityContextHolder
.MODE_GLOBAL
);
158 public CdmApplicationRemoteConfiguration() {}
160 public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource
) {
161 this.remoteSource
= remoteSource
;
164 public void setRemoteSource(ICdmRemoteSource remoteSource
) {
165 this.remoteSource
= remoteSource
;
168 private Object
getService(Class
<?
/* extends IService*/> clazz
, String serviceSuffix
, HttpComponentsHttpInvokerRequestExecutor executor
) {
169 if(serviceMap
.containsKey(clazz
)) {
170 return serviceMap
.get(clazz
);
172 Object service
= getService(clazz
, serviceSuffix
, remoteSource
, executor
);
173 serviceMap
.put(clazz
, service
);
177 public static Object
getService(Class
<?
> clazz
,
178 String serviceSuffix
,
179 ICdmRemoteSource remoteSource
,
180 HttpComponentsHttpInvokerRequestExecutor executor
) {
183 String protocol
= remoteSource
.getPort() == 443 ?
"https" : "http";
185 String contextPath
= (remoteSource
instanceof CdmRemoteSource
)?
((CdmRemoteSource
)remoteSource
).getContextPath() : "";
186 if(StringUtils
.isBlank(contextPath
)) {
187 baseUrl
= protocol
+ "://" + remoteSource
.getServer() + ":" + String
.valueOf(remoteSource
.getPort());
189 baseUrl
= protocol
+ "://" + remoteSource
.getServer() + ":" + String
.valueOf(remoteSource
.getPort()) + "/" + contextPath
;
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
);
199 if(ITermService
.class.isAssignableFrom(clazz
)){
200 proxyFactory
.setRemoteInvocationTermCacher(new RemoteInvocationTermCacher());
202 proxyFactory
.afterPropertiesSet();
203 return proxyFactory
.getObject();
206 // ****************************** APPLICATION CONTEXT *************************************************/
209 public void setApplicationContext(ApplicationContext applicationContext
) throws BeansException
{
210 this.applicationContext
= applicationContext
;
214 public PlatformTransactionManager
getTransactionManager() throws UnsupportedOperationException
{
215 throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");
218 public IEditGeoService
getEditGeoService() {
219 return (IEditGeoService
) getService(IEditGeoService
.class, "/remoting/editgeo.service", new AuthenticatingHttpInvokerRequestExecutor());
222 public ICachedCommonService
getCachedCommonService(){
223 if(cachedCommonService
== null) {
224 cachedCommonService
= new CachedCommonServiceImpl();
226 return cachedCommonService
;
229 public ICdmEntitySessionManager
getCdmEntitySessionManager() {
230 if(cdmEntitySessionManager
== null) {
231 cdmEntitySessionManager
= new CdmEntitySessionManager();
233 return cdmEntitySessionManager
;
236 // ****************************** GETTER *************************************************/
239 public final Object
getBean(String name
){
240 throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");
244 public IAccountRegistrationService
getAccountRegistrationService() {
245 return (IAccountRegistrationService
) getService(IAccountRegistrationService
.class, "/remoting/accountregistrationservice.service", new AuthenticatingHttpInvokerRequestExecutor());
249 public IAgentService
getAgentService(){
250 return (IAgentService
) getService(IAgentService
.class, "/remoting/agent.service", new AuthenticatingHttpInvokerRequestExecutor());
254 public IAnnotationService
getAnnotationService(){
255 return (IAnnotationService
) getService(IAnnotationService
.class, "/remoting/annotation.service", new AuthenticatingHttpInvokerRequestExecutor());
259 public IDatabaseService
getDatabaseService(){
260 return (IDatabaseService
) getService(IDatabaseService
.class, "/remoting/database.service", new AuthenticatingHttpInvokerRequestExecutor());
264 public INameService
getNameService(){
265 return (INameService
) getService(INameService
.class, "/remoting/name.service", new AuthenticatingHttpInvokerRequestExecutor());
269 public IReferenceService
getReferenceService(){
270 return (IReferenceService
) getService(IReferenceService
.class, "/remoting/reference.service", new AuthenticatingHttpInvokerRequestExecutor());
274 public ITaxonService
getTaxonService(){
275 return (ITaxonService
) getService(ITaxonService
.class, "/remoting/taxon.service", new AuthenticatingHttpInvokerRequestExecutor());
279 public IClassificationService
getClassificationService(){
280 return (IClassificationService
) getService(IClassificationService
.class, "/remoting/classification.service", new AuthenticatingHttpInvokerRequestExecutor());
284 public ITaxonNodeService
getTaxonNodeService(){
285 return (ITaxonNodeService
) getService(ITaxonNodeService
.class, "/remoting/taxonnode.service", new AuthenticatingHttpInvokerRequestExecutor());
289 public IDescriptionService
getDescriptionService(){
290 return (IDescriptionService
) getService(IDescriptionService
.class, "/remoting/description.service", new AuthenticatingHttpInvokerRequestExecutor());
294 public IDescriptionElementService
getDescriptionElementService(){
295 return (IDescriptionElementService
) getService(IDescriptionElementService
.class, "/remoting/descriptionelement.service", new AuthenticatingHttpInvokerRequestExecutor());
299 public IOccurrenceService
getOccurrenceService(){
300 return (IOccurrenceService
) getService(IOccurrenceService
.class, "/remoting/occurrence.service", new AuthenticatingHttpInvokerRequestExecutor());
304 public IPrimerService
getPrimerService(){
305 return (IPrimerService
) getService(IPrimerService
.class, "/remoting/primer.service", new AuthenticatingHttpInvokerRequestExecutor());
309 public IAmplificationService
getAmplificationService(){
310 return (IAmplificationService
) getService(IAmplificationService
.class, "/remoting/amplification.service", new AuthenticatingHttpInvokerRequestExecutor());
314 public ISequenceService
getSequenceService(){
315 return (ISequenceService
) getService(ISequenceService
.class, "/remoting/sequence.service", new AuthenticatingHttpInvokerRequestExecutor());
319 public IEventBaseService
getEventBaseService() {
320 return (IEventBaseService
) getService(IEventBaseService
.class, "/remoting/eventbase.service", new AuthenticatingHttpInvokerRequestExecutor());
324 public IMediaService
getMediaService(){
325 return (IMediaService
) getService(IMediaService
.class, "/remoting/media.service", new AuthenticatingHttpInvokerRequestExecutor());
329 public ITermService
getTermService(){
330 return (ITermService
) getService(ITermService
.class, "/remoting/term.service", new AuthenticatingHttpInvokerRequestExecutor());
334 public IRightsService
getRightsService(){
335 return (IRightsService
) getService(IRightsService
.class, "/remoting/rights.service", new AuthenticatingHttpInvokerRequestExecutor());
339 public ICommonService
getCommonService(){
340 return (ICommonService
) getService(ICommonService
.class, "/remoting/common.service", new AuthenticatingHttpInvokerRequestExecutor());
344 public ILocationService
getLocationService(){
345 return (ILocationService
) getService(ILocationService
.class, "/remoting/location.service", new AuthenticatingHttpInvokerRequestExecutor());
349 public IUserService
getUserService(){
350 return (IUserService
) getService(IUserService
.class, "/remoting-public/user.service", new AuthenticatingHttpInvokerRequestExecutor());
353 public static IUserService
getUserService(ICdmRemoteSource remoteSource
) {
354 return (IUserService
) getService(IUserService
.class, "/remoting-public/user.service", remoteSource
, new HttpComponentsHttpInvokerRequestExecutor());
358 public IMetadataService
getMetadataService() {
359 return (IMetadataService
) getService(IMetadataService
.class, "/remoting-public/metadata.service", new HttpComponentsHttpInvokerRequestExecutor());
362 public static IMetadataService
getMetadataService(ICdmRemoteSource remoteSource
) {
363 return (IMetadataService
) getService(IMetadataService
.class, "/remoting-public/metadata.service", remoteSource
, new HttpComponentsHttpInvokerRequestExecutor());
367 public IGrantedAuthorityService
getGrantedAuthorityService(){
368 return (IGrantedAuthorityService
) getService(IGrantedAuthorityService
.class, "/remoting/grantedauthority.service", new AuthenticatingHttpInvokerRequestExecutor());
372 public ProviderManager
getAuthenticationManager(){
373 if(authenticationManager
== null) {
374 authenticationManager
= getAuthenticationManager(getUserService());
376 return authenticationManager
;
379 public static ProviderManager
getAuthenticationManager(IUserService userService
) {
380 Md5PasswordEncoder passwordEncoder
= new Md5PasswordEncoder();
381 ReflectionSaltSource saltSource
= new ReflectionSaltSource();
382 saltSource
.setUserPropertyToUse("getUsername");
384 DaoAuthenticationProvider daoAuthenticationProvider
= new DaoAuthenticationProvider();
385 daoAuthenticationProvider
.setUserDetailsService(userService
);
386 daoAuthenticationProvider
.setSaltSource(saltSource
);
387 daoAuthenticationProvider
.setPasswordEncoder(passwordEncoder
);
389 return new ProviderManager(Arrays
.asList((AuthenticationProvider
)daoAuthenticationProvider
));
394 public ConversationHolder
NewConversation() {
395 return new ConversationHolderMock();
399 public ICollectionService
getCollectionService(){
400 return (ICollectionService
) getService(ICollectionService
.class, "/remoting/collection.service", new AuthenticatingHttpInvokerRequestExecutor());
404 public ITermTreeService
getTermTreeService() {
405 return (ITermTreeService
) getService(ITermTreeService
.class, "/remoting/termtree.service", new AuthenticatingHttpInvokerRequestExecutor());
409 public ITermNodeService
getTermNodeService() {
410 return (ITermNodeService
) getService(ITermNodeService
.class, "/remoting/termnode.service", new AuthenticatingHttpInvokerRequestExecutor());
414 public IVocabularyService
getVocabularyService(){
415 return (IVocabularyService
) getService(IVocabularyService
.class, "/remoting/vocabulary.service", new AuthenticatingHttpInvokerRequestExecutor());
419 public IIdentificationKeyService
getIdentificationKeyService(){
420 return (IIdentificationKeyService
) getService(IIdentificationKeyService
.class, "/remoting/identificationkey.service", new AuthenticatingHttpInvokerRequestExecutor());
424 public IPolytomousKeyService
getPolytomousKeyService(){
425 return (IPolytomousKeyService
) getService(IPolytomousKeyService
.class, "/remoting/polytomouskey.service", new AuthenticatingHttpInvokerRequestExecutor());
429 public IPolytomousKeyNodeService
getPolytomousKeyNodeService(){
430 return (IPolytomousKeyNodeService
) getService(IPolytomousKeyNodeService
.class, "/remoting/polytomouskeynode.service", new AuthenticatingHttpInvokerRequestExecutor());
434 public IProgressMonitorService
getProgressMonitorService() {
435 return (IProgressMonitorService
) getService(IProgressMonitorService
.class, "/remoting/progressmonitor.service", new AuthenticatingHttpInvokerRequestExecutor());
439 public IDescriptiveDataSetService
getDescriptiveDataSetService(){
440 return (IDescriptiveDataSetService
) getService(IDescriptiveDataSetService
.class, "/remoting/descriptivedataset.service", new AuthenticatingHttpInvokerRequestExecutor());
444 public IRegistrationService
getRegistrationService() {
445 return (IRegistrationService
) getService(IRegistrationService
.class, "/remoting/registration.service", new AuthenticatingHttpInvokerRequestExecutor());
449 public IGroupService
getGroupService(){
450 return (IGroupService
) getService(IGroupService
.class, "/remoting/group.service", new AuthenticatingHttpInvokerRequestExecutor());
454 public IPreferenceService
getPreferenceService(){
455 return (IPreferenceService
) getService(IPreferenceService
.class, "/remoting/preference.service", new AuthenticatingHttpInvokerRequestExecutor());
459 public IPasswordResetService
getPasswordResetService(){
460 return (IPasswordResetService
) getService(IPasswordResetService
.class, "/remoting/passwordreset.service", new AuthenticatingHttpInvokerRequestExecutor());
464 public IEntityValidationService
getEntityValidationService(){
465 return (IEntityValidationService
) getService(IEntityValidationService
.class, "/remoting/entityvalidation.service", new AuthenticatingHttpInvokerRequestExecutor());
469 public IEntityConstraintViolationService
getEntityConstraintViolationService(){
470 return (IEntityConstraintViolationService
) getService(IEntityConstraintViolationService
.class, "/remoting/entityconstraintviolation.service", new AuthenticatingHttpInvokerRequestExecutor());
474 public MediaInfoFactory
getMediaInfoFactory(){ // TODO use interface
475 return (MediaInfoFactory
) getService(MediaInfoFactory
.class, "/remoting/mediainfofactory.service", new AuthenticatingHttpInvokerRequestExecutor());
479 public ICdmPermissionEvaluator
getPermissionEvaluator(){
481 if(cdmPermissionEvaluator
!= null) {
482 return cdmPermissionEvaluator
;
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
);
492 cdmPermissionEvaluator
= new CdmPermissionEvaluator();
493 cdmPermissionEvaluator
.setAccessDecisionManager(accessDecisionManager
);
495 return cdmPermissionEvaluator
;
499 public TransactionStatus
startTransaction() throws UnsupportedOperationException
{
500 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
504 public TransactionStatus
startTransaction(Boolean readOnly
) throws UnsupportedOperationException
{
505 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
509 public void commitTransaction(TransactionStatus txStatus
) throws UnsupportedOperationException
{
510 throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
514 public void rollbackTransaction(TransactionStatus arg0
) {
515 throw new UnsupportedOperationException("rollbackTransaction is not implemented for CdmApplicationRemoteConfiguration");
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
);
526 public IIOService
getIOService() {
527 return (IIOService
) getService(IIOService
.class, "/remoting/io.service", new AuthenticatingHttpInvokerRequestExecutor());
531 public ILongRunningTasksService
getLongRunningTasksService() {
532 return (ILongRunningTasksService
) getService(ILongRunningTasksService
.class, "/remoting/longrunningtasks.service", new AuthenticatingHttpInvokerRequestExecutor());
535 public ITestService
getTestService() {
536 return (ITestService
) getService(ITestService
.class, "/remoting/test.service", new AuthenticatingHttpInvokerRequestExecutor());