f7c1b957c4e6825fb76bc8500153e79f2a4b50b5
[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
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.HttpInvokerProxyFactoryBean;
23 import org.springframework.remoting.httpinvoker.HttpInvokerRequestExecutor;
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.IClassificationService;
42 import eu.etaxonomy.cdm.api.service.ICollectionService;
43 import eu.etaxonomy.cdm.api.service.ICommonService;
44 import eu.etaxonomy.cdm.api.service.IDatabaseService;
45 import eu.etaxonomy.cdm.api.service.IDescriptionService;
46 import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
47 import eu.etaxonomy.cdm.api.service.IEntityValidationService;
48 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
49 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
50 import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
51 import eu.etaxonomy.cdm.api.service.IGroupService;
52 import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
53 import eu.etaxonomy.cdm.api.service.ILocationService;
54 import eu.etaxonomy.cdm.api.service.IMediaService;
55 import eu.etaxonomy.cdm.api.service.INameService;
56 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
57 import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
58 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
59 import eu.etaxonomy.cdm.api.service.IReferenceService;
60 import eu.etaxonomy.cdm.api.service.IService;
61 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
62 import eu.etaxonomy.cdm.api.service.ITaxonService;
63 import eu.etaxonomy.cdm.api.service.ITermService;
64 import eu.etaxonomy.cdm.api.service.ITestService;
65 import eu.etaxonomy.cdm.api.service.IUserService;
66 import eu.etaxonomy.cdm.api.service.IVocabularyService;
67 import eu.etaxonomy.cdm.api.service.IWorkingSetService;
68 import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
69 import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
70 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
71 import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
72 import eu.etaxonomy.cdm.io.service.IIOService;
73 import eu.etaxonomy.cdm.model.common.CdmBase;
74 import eu.etaxonomy.cdm.persistence.hibernate.permission.CdmPermissionEvaluator;
75 import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
76 import eu.etaxonomy.cdm.persistence.hibernate.permission.UnanimousBasedUnrevokable;
77 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionBaseVoter;
78 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionElementVoter;
79 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.GrantAlwaysVoter;
80 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonBaseVoter;
81 import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonNodeVoter;
82 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
83 import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;
84 import eu.etaxonomy.taxeditor.service.CdmServiceRequestExecutor;
85 import eu.etaxonomy.taxeditor.service.ICachedCommonService;
86 import eu.etaxonomy.taxeditor.service.TermServiceRequestExecutor;
87 import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;
88 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
89
90
91 /**
92 * CDM Application Configuration class which manages the configuration for remoting
93 * clients
94 *
95 */
96 @Component
97 public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfiguration, ApplicationContextAware {
98
99 @SuppressWarnings("unused")
100 private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);
101
102 protected ApplicationContext applicationContext;
103
104 private ICdmRemoteSource remoteSource;
105
106 private Map serviceMap = new HashMap<Class<IService>, IService>();
107
108 private ICdmEntitySessionManager cdmEntitySessionManager;
109
110 private CdmPermissionEvaluator cdmPermissionEvaluator;
111
112 private ProviderManager authenticationManager;
113
114 private ICachedCommonService cachedCommonService;
115
116 public CdmApplicationRemoteConfiguration() {}
117
118 public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {
119 this.remoteSource = remoteSource;
120 }
121
122 public void setRemoteSource(ICdmRemoteSource remoteSource) {
123 this.remoteSource = remoteSource;
124 }
125
126 private Object getService(Class<?> clazz, String serviceSuffix, HttpInvokerRequestExecutor executor) {
127 if(serviceMap.containsKey(clazz)) {
128 return serviceMap.get(clazz);
129 }
130 String baseUrl;
131 if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {
132 baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());
133 } else {
134 baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();
135 }
136 HttpInvokerProxyFactoryBean proxy = new HttpInvokerProxyFactoryBean();
137 proxy.setServiceInterface(clazz);
138 proxy.setServiceUrl(baseUrl + serviceSuffix);
139 if(executor != null) {
140 proxy.setHttpInvokerRequestExecutor(executor);
141 }
142 proxy.afterPropertiesSet();
143 Object service = proxy.getObject();
144 serviceMap.put(clazz, service);
145 return service;
146 }
147
148 // ****************************** APPLICATION CONTEXT *************************************************/
149
150 @Override
151 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
152 this.applicationContext = applicationContext;
153 }
154
155 /* (non-Javadoc)
156 * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#getTransactionManager()
157 */
158 @Override
159 public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {
160 throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");
161 }
162
163
164
165 /**
166 * @return
167 */
168 public IEditGeoService getEditGeoService() {
169 return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new CdmServiceRequestExecutor());
170 }
171
172 /**
173 * @return
174 */
175 public ICachedCommonService getCachedCommonService(){
176 if(cachedCommonService == null) {
177 cachedCommonService = new CachedCommonServiceImpl();
178 }
179 return cachedCommonService;
180 }
181
182
183 public ICdmEntitySessionManager getCdmEntitySessionManager() {
184 if(cdmEntitySessionManager == null) {
185 cdmEntitySessionManager = new CdmEntitySessionManager();
186 }
187 return cdmEntitySessionManager;
188 }
189
190
191
192
193
194
195 // ****************************** GETTER *************************************************/
196
197 @Override
198 public final Object getBean(String name){
199 throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");
200 }
201
202 @Override
203 public IAgentService getAgentService(){
204 return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new CdmServiceRequestExecutor());
205 }
206
207 @Override
208 public IDatabaseService getDatabaseService(){
209 return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new CdmServiceRequestExecutor());
210 }
211
212 @Override
213 public INameService getNameService(){
214 return (INameService) getService(INameService.class, "/remoting/name.service", new CdmServiceRequestExecutor());
215 }
216
217 @Override
218 public IReferenceService getReferenceService(){
219 return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new CdmServiceRequestExecutor());
220 }
221
222 @Override
223 public ITaxonService getTaxonService(){
224 return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new CdmServiceRequestExecutor());
225 }
226
227 @Override
228 public IClassificationService getClassificationService(){
229 return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new CdmServiceRequestExecutor());
230 }
231
232 @Override
233 public ITaxonNodeService getTaxonNodeService(){
234 return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new CdmServiceRequestExecutor());
235 }
236
237 @Override
238 public IDescriptionService getDescriptionService(){
239 return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new CdmServiceRequestExecutor());
240 }
241
242 @Override
243 public IOccurrenceService getOccurrenceService(){
244 return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new CdmServiceRequestExecutor());
245 }
246
247 @Override
248 public IPrimerService getPrimerService(){
249 return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new CdmServiceRequestExecutor());
250 }
251
252 @Override
253 public IAmplificationService getAmplificationService(){
254 return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new CdmServiceRequestExecutor());
255 }
256
257 @Override
258 public ISequenceService getSequenceService(){
259 return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new CdmServiceRequestExecutor());
260 }
261
262 @Override
263 public IMediaService getMediaService(){
264 return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new CdmServiceRequestExecutor());
265 }
266
267 @Override
268 public ITermService getTermService(){
269 return (ITermService) getService(ITermService.class, "/remoting/term.service", new TermServiceRequestExecutor());
270 }
271
272 @Override
273 public ICommonService getCommonService(){
274 return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new CdmServiceRequestExecutor());
275 }
276
277 @Override
278 public ILocationService getLocationService(){
279 return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new CdmServiceRequestExecutor());
280 }
281
282 @Override
283 public IUserService getUserService(){
284 return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new CdmServiceRequestExecutor());
285 }
286
287 @Override
288 public IGrantedAuthorityService getGrantedAuthorityService(){
289 return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new CdmServiceRequestExecutor());
290 }
291
292 @Override
293 public IService<CdmBase> getMainService(){
294 return null;
295 }
296
297
298 @Override
299 public ProviderManager getAuthenticationManager(){
300 if(authenticationManager != null) {
301 return authenticationManager;
302 }
303 Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();
304 ReflectionSaltSource saltSource = new ReflectionSaltSource();
305 saltSource.setUserPropertyToUse("getUsername");
306
307 DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
308 daoAuthenticationProvider.setUserDetailsService(getUserService());
309 daoAuthenticationProvider.setSaltSource(saltSource);
310 daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
311
312 authenticationManager = new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));
313 return authenticationManager;
314 }
315
316
317 @Override
318 public ConversationHolder NewConversation() {
319 return new ConversationHolderMock();
320 }
321
322 @Override
323 public ICollectionService getCollectionService(){
324 return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new CdmServiceRequestExecutor());
325 }
326
327 @Override
328 public IFeatureTreeService getFeatureTreeService(){
329 return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());
330 }
331
332 @Override
333 public IFeatureNodeService getFeatureNodeService(){
334 return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());
335 }
336
337 @Override
338 public IVocabularyService getVocabularyService(){
339 return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());
340 }
341
342 @Override
343 public IIdentificationKeyService getIdentificationKeyService(){
344 return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());
345 }
346
347 @Override
348 public IPolytomousKeyService getPolytomousKeyService(){
349 return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());
350 }
351
352
353 @Override
354 public IPolytomousKeyNodeService getPolytomousKeyNodeService(){
355 return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new CdmServiceRequestExecutor());
356 }
357
358 @Override
359 public IWorkingSetService getWorkingSetService(){
360 return (IWorkingSetService) getService(IWorkingSetService.class, "/remoting/workingset.service", new CdmServiceRequestExecutor());
361 }
362
363 @Override
364 public IGroupService getGroupService(){
365 return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new CdmServiceRequestExecutor());
366 }
367
368
369 @Override
370 public IEntityValidationService getEntityValidationService(){
371 return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new CdmServiceRequestExecutor());
372 }
373
374
375 @Override
376 public IEntityConstraintViolationService getEntityConstraintViolationService(){
377 return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());
378 }
379
380 @Override
381 public ICdmPermissionEvaluator getPermissionEvaluator(){
382
383 if(cdmPermissionEvaluator != null) {
384 return cdmPermissionEvaluator;
385 }
386 List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
387 decisionVoters.add(new GrantAlwaysVoter());
388 decisionVoters.add(new TaxonNodeVoter());
389 decisionVoters.add(new TaxonBaseVoter());
390 decisionVoters.add(new DescriptionBaseVoter());
391 decisionVoters.add(new DescriptionElementVoter());
392 UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);
393
394 cdmPermissionEvaluator = new CdmPermissionEvaluator();
395 cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);
396
397 return cdmPermissionEvaluator;
398 }
399
400
401 @Override
402 public TransactionStatus startTransaction() throws UnsupportedOperationException {
403 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
404 }
405
406 @Override
407 public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {
408 throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");
409 }
410
411
412 @Override
413 public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {
414 throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");
415 }
416
417 @Override
418 public void authenticate(String username, String password){
419 UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
420 Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
421 SecurityContext context = SecurityContextHolder.getContext();
422 context.setAuthentication(authentication);
423 }
424
425 public IIOService getIOService() {
426 return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());
427 }
428
429 public ITestService getTestService() {
430 return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());
431 }
432 }