f69e23e89878057ebf2dfb02a55f35157cc28186
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / store / CdmStore.java
1 /**
2 * Copyright (C) 2007 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.taxeditor.store;
11
12 import java.util.EnumSet;
13
14 import org.eclipse.core.runtime.IProgressMonitor;
15 import org.eclipse.core.runtime.jobs.Job;
16 import org.eclipse.swt.widgets.Display;
17 import org.slf4j.Marker;
18 import org.springframework.core.io.ClassPathResource;
19 import org.springframework.core.io.Resource;
20 import org.springframework.security.access.PermissionEvaluator;
21 import org.springframework.security.authentication.AuthenticationManager;
22 import org.springframework.security.core.Authentication;
23 import org.springframework.security.core.GrantedAuthority;
24 import org.springframework.security.core.context.SecurityContext;
25 import org.springframework.security.core.context.SecurityContextHolder;
26
27 import eu.etaxonomy.cdm.api.application.CdmApplicationException;
28 import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteController;
29 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
30 import eu.etaxonomy.cdm.api.application.ICdmRepository;
31 import eu.etaxonomy.cdm.api.cache.CdmServiceCacher;
32 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
33 import eu.etaxonomy.cdm.api.service.IAgentService;
34 import eu.etaxonomy.cdm.api.service.IAnnotationService;
35 import eu.etaxonomy.cdm.api.service.IClassificationService;
36 import eu.etaxonomy.cdm.api.service.ICollectionService;
37 import eu.etaxonomy.cdm.api.service.ICommonService;
38 import eu.etaxonomy.cdm.api.service.IDescriptionService;
39 import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
40 import eu.etaxonomy.cdm.api.service.IEntityValidationService;
41 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
42 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
43 import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
44 import eu.etaxonomy.cdm.api.service.IGroupService;
45 import eu.etaxonomy.cdm.api.service.IMarkerService;
46 import eu.etaxonomy.cdm.api.service.IMediaService;
47 import eu.etaxonomy.cdm.api.service.INameService;
48 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
49 import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
50 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
51 import eu.etaxonomy.cdm.api.service.IReferenceService;
52 import eu.etaxonomy.cdm.api.service.IRegistrationService;
53 import eu.etaxonomy.cdm.api.service.IRightsService;
54 import eu.etaxonomy.cdm.api.service.IService;
55 import eu.etaxonomy.cdm.api.service.ITaxonService;
56 import eu.etaxonomy.cdm.api.service.ITermService;
57 import eu.etaxonomy.cdm.api.service.IUserService;
58 import eu.etaxonomy.cdm.api.service.IVocabularyService;
59 import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
60 import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
61 import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
62 import eu.etaxonomy.cdm.cache.CdmRemoteCacheManager;
63 import eu.etaxonomy.cdm.config.ICdmSource;
64 import eu.etaxonomy.cdm.database.DbSchemaValidation;
65 import eu.etaxonomy.cdm.model.agent.AgentBase;
66 import eu.etaxonomy.cdm.model.common.Annotation;
67 import eu.etaxonomy.cdm.model.common.CdmBase;
68 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
69 import eu.etaxonomy.cdm.model.common.Group;
70 import eu.etaxonomy.cdm.model.common.Language;
71 import eu.etaxonomy.cdm.model.term.TermVocabulary;
72 import eu.etaxonomy.cdm.model.description.DescriptionBase;
73 import eu.etaxonomy.cdm.model.term.FeatureNode;
74 import eu.etaxonomy.cdm.model.term.FeatureTree;
75 import eu.etaxonomy.cdm.model.description.PolytomousKey;
76 import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
77 import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
78 import eu.etaxonomy.cdm.model.media.Media;
79 import eu.etaxonomy.cdm.model.media.Rights;
80 import eu.etaxonomy.cdm.model.molecular.Amplification;
81 import eu.etaxonomy.cdm.model.molecular.Primer;
82 import eu.etaxonomy.cdm.model.name.Registration;
83 import eu.etaxonomy.cdm.model.name.TaxonName;
84 import eu.etaxonomy.cdm.model.occurrence.Collection;
85 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
86 import eu.etaxonomy.cdm.model.reference.Reference;
87 import eu.etaxonomy.cdm.model.taxon.Classification;
88 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
89 import eu.etaxonomy.cdm.model.validation.EntityConstraintViolation;
90 import eu.etaxonomy.cdm.model.validation.EntityValidation;
91 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
92 import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
93 import eu.etaxonomy.cdm.persistence.hibernate.permission.Role;
94 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
95 import eu.etaxonomy.taxeditor.io.ExportManager;
96 import eu.etaxonomy.taxeditor.io.ImportManager;
97 import eu.etaxonomy.taxeditor.model.MessagingUtils;
98 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
99 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
100 import eu.etaxonomy.taxeditor.session.mock.MockCdmEntitySessionManager;
101 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
102 import eu.etaxonomy.taxeditor.ui.dialog.RemotingLoginDialog;
103 import eu.etaxonomy.taxeditor.util.ProgressMonitorClientManager;
104 import eu.etaxonomy.taxeditor.webapp.CDMServer;
105
106 /**
107 * This implementation of ICdmDataRepository depends on hibernate sessions to
108 * store the data correctly for the current session. No state is held in this
109 * class.
110 *
111 * Only methods that either get or manipulate data are exposed here. So this
112 * class acts as a facade for the methods in cdmlib-service.
113 *
114 * @author n.hoffmann
115 * @created 17.03.2009
116 * @version 1.0
117 */
118 public class CdmStore {
119
120 private static final Resource DEFAULT_APPLICATION_CONTEXT = new ClassPathResource(
121 "/eu/etaxonomy/cdm/editorApplicationContext.xml",
122 TaxeditorStorePlugin.class);
123 private static final DbSchemaValidation DEFAULT_DB_SCHEMA_VALIDATION = DbSchemaValidation.VALIDATE;
124
125 private static CdmStore instance;
126
127 //private final ICdmRepository applicationConfiguration;
128
129 private static ContextManager contextManager = new ContextManager();
130
131 private static LoginManager loginManager = new LoginManager();
132
133 private static TermManager termManager = new TermManager();
134
135 private static SearchManager searchManager = new SearchManager();
136
137 private static EditorManager editorManager = new EditorManager();
138
139 private static UseObjectStore useObjectInitializer = new UseObjectStore();
140
141 private static ProgressMonitorClientManager progressMonitorClientManager = new ProgressMonitorClientManager();
142
143 private static CdmStoreConnector job;
144
145 private static CDMServer managedServer;
146
147 private Language language;
148
149 private ICdmSource cdmSource;
150
151 private boolean isConnected;
152
153
154
155 /**
156 * <p>
157 * getDefault
158 * </p>
159 *
160 * @return a {@link eu.etaxonomy.taxeditor.store.CdmStore} object.
161 */
162 protected static CdmStore getDefault(boolean connecting){
163 if (instance != null && instance.isConnected) {
164 return instance;
165 } else{// if (instance == null || !instance.isConnected) {
166 if (connecting){
167 MessagingUtils.dataSourceNotAvailableWarningDialog(instance);
168 }else{
169 MessagingUtils.noDataSourceWarningDialog(instance);
170 }
171
172
173 return null;
174 }
175 }
176 /**
177 * <p>
178 * getDefault
179 * </p>
180 *
181 * @return a {@link eu.etaxonomy.taxeditor.store.CdmStore} object.
182 */
183 protected static CdmStore getDefault(){
184 return getDefault(false);
185 }
186
187 /**
188 * Initialize the with the last edited datasource
189 */
190 public static void connect() {
191
192 ICdmSource cdmSource;
193 try {
194
195 cdmSource = CdmDataSourceRepository.getCurrentCdmSource();
196 connect(cdmSource);
197 } catch (Exception e) {
198 MessagingUtils.messageDialog("Connection to CDM Source Failed", CdmStore.class, "Could not connect to target CDM Source", e);
199 }
200
201
202 }
203
204 /**
205 * Initialize with a specific datasource
206 *
207 * @param datasource
208 * a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
209 */
210 public static void connect(ICdmSource cdmSource) {
211 connect(cdmSource, DEFAULT_DB_SCHEMA_VALIDATION,
212 DEFAULT_APPLICATION_CONTEXT);
213 }
214
215 public static void connect(ICdmSource cdmSource, RemotingLoginDialog loginDialog) {
216 connect(cdmSource,
217 DEFAULT_DB_SCHEMA_VALIDATION,
218 DEFAULT_APPLICATION_CONTEXT,
219 loginDialog);
220 }
221
222 /**
223 * Initialize and provide
224 *
225 * @param datasource
226 * @param dbSchemaValidation
227 * @param applicationContextBean
228 */
229 private static void connect(final ICdmSource cdmSource,
230 final DbSchemaValidation dbSchemaValidation,
231 final Resource applicationContextBean) {
232
233 MessagingUtils.info("Connecting to datasource: " + cdmSource);
234
235 job = new CdmStoreConnector(Display.getDefault(), cdmSource,
236 dbSchemaValidation, applicationContextBean);
237 job.setUser(true);
238 job.setPriority(Job.BUILD);
239 job.schedule();
240
241 }
242
243 private static void connect(final ICdmSource cdmSource,
244 final DbSchemaValidation dbSchemaValidation,
245 final Resource applicationContextBean,
246 RemotingLoginDialog remotingLoginDialog) {
247 RemotingLoginDialog loginDialog = remotingLoginDialog;
248 if(isActive()) {
249 // before we connect we clear the entity caches and the sessions
250 CdmRemoteCacheManager.removeEntityCaches();
251 if(getCurrentSessionManager(true) != null) {
252 getCurrentSessionManager(true).disposeAll();
253 }
254 }
255 MessagingUtils.info("Connecting to datasource: " + cdmSource);
256
257 job = new CdmStoreConnector(Display.getDefault(),
258 cdmSource,
259 dbSchemaValidation,
260 applicationContextBean);
261 job.start(loginDialog);
262
263 }
264
265 public static boolean isConnecting() {
266 return job != null && job.getState() == Job.RUNNING;
267 }
268
269 /**
270 * Closes the current application context
271 *
272 * @param monitor
273 * a {@link org.eclipse.core.runtime.IProgressMonitor} object.
274 */
275 public static void close(final IProgressMonitor monitor) {
276 Display.getDefault().asyncExec(new Runnable() {
277
278 @Override
279 public void run() {
280 getContextManager().notifyContextAboutToStop(monitor);
281 if ((monitor == null || (!monitor.isCanceled()) && isActive())) {
282 getContextManager().notifyContextStop(monitor);
283 instance.close();
284 }
285 }
286 });
287 }
288
289 public static void close(IProgressMonitor monitor, boolean async) {
290 if(async) {
291 close(monitor);
292 } else {
293 getContextManager().notifyContextAboutToStop(monitor);
294 if ((monitor == null || (!monitor.isCanceled()) && isActive())) {
295 getContextManager().notifyContextStop(monitor);
296 instance.close();
297 }
298 }
299
300 }
301 private void close() {
302 isConnected = false;
303 cdmSource = null;
304 CdmApplicationState.dispose();
305 }
306
307 static void setInstance(ICdmRepository applicationController,
308 ICdmSource cdmSource) {
309 instance = new CdmStore(applicationController, cdmSource);
310 CdmApplicationState.setCdmServiceCacher(new CdmServiceCacher());
311
312 }
313
314 private CdmStore(ICdmRepository repository,
315 ICdmSource cdmSource) {
316 CdmApplicationState.setCurrentAppConfig(repository);
317 CdmApplicationState.setCurrentDataChangeService(new CdmUIDataChangeService());
318 this.cdmSource = cdmSource;
319 isConnected = true;
320 }
321
322 /**
323 * All calls to the datastore require
324 *
325 * @return
326 */
327 private ICdmRepository getApplicationConfiguration() {
328 try {
329 return CdmApplicationState.getCurrentAppConfig();
330 } catch (Exception e) {
331 MessagingUtils.error(CdmStore.class, e);
332 }
333 return null;
334 }
335
336 /**
337 * <p>
338 * getCurrentApplicationController
339 * </p>
340 *
341 * @return a
342 * {@link eu.etaxonomy.cdm.remote.api.application.CdmApplicationController}
343 * object.
344 */
345 public static ICdmRepository getCurrentApplicationConfiguration() {
346 if (getDefault() != null) {
347 return getDefault().getApplicationConfiguration();
348 }
349 return null;
350 }
351
352 /*
353 * CONVERSATIONS
354 */
355
356 /**
357 * Creates a new conversation, binds resources to the conversation and start
358 * a transaction for this conversation.
359 *
360 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
361 * object.
362 */
363 public static ConversationHolder createConversation() {
364 ConversationHolder conversation = getCurrentApplicationConfiguration()
365 .NewConversation();
366 try {
367 conversation.startTransaction();
368 }catch(Exception e){
369 MessagingUtils.messageDialog("No database connection", CdmStore.class, "No database connection available", e);
370 }
371 return conversation;
372 }
373
374 //FIXME:Remoting should be removed after moving completely to remoting
375 private MockCdmEntitySessionManager mockCdmEntitySessionManager;
376
377 private ICdmEntitySessionManager getSessionManager() {
378 //FIXME:Remoting we should only have CdmApplicationRemoteConfiguration after move to remoting
379 // bad hack which should be finally removed
380 if(getCurrentApplicationConfiguration() instanceof CdmApplicationRemoteController) {
381 return ((CdmApplicationRemoteController)getCurrentApplicationConfiguration()).getCdmEntitySessionManager();
382 } else {
383 if(mockCdmEntitySessionManager == null) {
384 mockCdmEntitySessionManager = new MockCdmEntitySessionManager();
385 }
386 return mockCdmEntitySessionManager;
387 }
388 }
389 public static ICdmEntitySessionManager getCurrentSessionManager() {
390 return getCurrentSessionManager(false);
391 }
392
393
394 public static ICdmEntitySessionManager getCurrentSessionManager(boolean connecting) {
395 if (getDefault(connecting) != null) {
396 return getDefault(connecting).getSessionManager();
397 }
398 return null;
399
400 }
401
402 /**
403 * Generic method that will scan the getters of {@link ICdmRepository} for the given service
404 * interface. If a matching getter is found the according service implementation is returned by
405 * invoking the getter otherwise the method returns <code>null</code>.
406 *
407 * @param <T>
408 * @param serviceClass
409 * @return the configured implementation of <code>serviceClass</code> or <code>null</code>
410 */
411 public static <T extends IService> T getService(Class<T> serviceClass) {
412 T service = null;
413 try {
414 service = CdmApplicationState.getService(serviceClass);
415 } catch (CdmApplicationException cae) {
416 MessagingUtils.error(CdmStore.class, cae);
417 }
418
419 return service;
420 }
421
422 /**
423 * @see #getService(Class)
424 * As ICommonService is not extending IService we need a specific request here
425 */
426 public static ICommonService getCommonService() {
427 return CdmApplicationState.getCommonService();
428
429 }
430
431 /**
432 * <p>
433 * getAuthenticationManager
434 * </p>
435 *
436 * @return a
437 * {@link org.springframework.security.authentication.ProviderManager}
438 * object.
439 */
440 public static AuthenticationManager getAuthenticationManager() {
441 return getCurrentApplicationConfiguration().getAuthenticationManager();
442 }
443
444 /**
445 * <p>
446 * getAuthenticationManager
447 * </p>
448 *
449 * @return a
450 * {@link ICdmPermissionEvaluator} object.
451 */
452 public static ICdmPermissionEvaluator getPermissionEvaluator() {
453 return getCurrentApplicationConfiguration().getPermissionEvaluator();
454 }
455
456
457 /*
458 * SECURITY RELATED CONVENIENCE METHODS
459 */
460
461 /**
462 * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication, java.lang.Object, java.lang.Object)
463 *
464 * @param targetDomainObject
465 * @param permission
466 * @return
467 */
468 public static boolean currentAuthentiationHasPermission(CdmBase targetDomainObject, EnumSet<CRUD> permission){
469 //TODO use getCurrentApplicationConfiguration().currentAuthentiationHasPermission(CdmBase targetDomainObject, Operation permission) instead
470 SecurityContext context = SecurityContextHolder.getContext();
471 PermissionEvaluator pe = getPermissionEvaluator();
472 boolean hasPermission = false;
473 try {
474 hasPermission = getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject,
475 permission);
476 } catch (org.springframework.security.access.AccessDeniedException e) {
477 /* IGNORE */
478 }
479 return hasPermission;
480 }
481
482 /**
483 * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication, java.lang.Object, java.lang.Object)
484 *
485 * @param targetDomainObject
486 * @param permission
487 * @return
488 */
489 public static boolean currentAuthentiationHasPermission(Class<? extends CdmBase> targetType, EnumSet<CRUD> permission){
490 boolean hasPermission = false;
491 try {
492 hasPermission = getPermissionEvaluator().hasPermission(getCurrentAuthentiation(), null, targetType.getName(), permission);
493 } catch (org.springframework.security.access.AccessDeniedException e) {
494 /* IGNORE */
495 }
496 return hasPermission;
497 }
498
499 public static boolean currentAuthentiationHasOneOfRoles(Role ... roles){
500 boolean hasPermission = false;
501 try {
502 hasPermission = getPermissionEvaluator().hasOneOfRoles(getCurrentAuthentiation(), roles);
503 } catch (org.springframework.security.access.AccessDeniedException e) {
504 /* IGNORE */
505 }
506 return hasPermission;
507 }
508
509 public static Authentication getCurrentAuthentiation() {
510 SecurityContext context = SecurityContextHolder.getContext();
511 return context.getAuthentication();
512 }
513
514 /*
515 * LANGUAGE
516 */
517
518 /**
519 * Provides access to the global default language set in the application preferences.
520 *
521 * @return a {@link eu.etaxonomy.cdm.model.common.Language} object.
522 */
523 public static Language getDefaultLanguage() {
524 if (getDefault().getLanguage() == null) {
525 getDefault().setLanguage(PreferencesUtil.getGlobalLanguage());
526 }
527 return getDefault().getLanguage();
528 }
529
530 /**
531 * <p>
532 * setDefaultLanguage
533 * </p>
534 *
535 * @param language
536 * a {@link eu.etaxonomy.cdm.model.common.Language} object.
537 */
538 public static void setDefaultLanguage(Language language) {
539 getDefault().setLanguage(language);
540 }
541
542 /**
543 * @return the language
544 */
545 private Language getLanguage() {
546 return language;
547 }
548
549 /**
550 * @param language
551 * the language to set
552 */
553 private void setLanguage(Language language) {
554 this.language = language;
555 }
556
557 /*
558 * LOGIN
559 */
560
561 /**
562 * <p>
563 * Getter for the field <code>loginManager</code>.
564 * </p>
565 *
566 * @return a {@link eu.etaxonomy.taxeditor.store.LoginManager} object.
567 */
568 public static LoginManager getLoginManager() {
569 return loginManager;
570 }
571
572 /**
573 * <p>
574 * Getter for the field <code>contextManager</code>.
575 * </p>
576 *
577 * @return a {@link eu.etaxonomy.taxeditor.store.ContextManager} object.
578 */
579 public static ContextManager getContextManager() {
580 return contextManager;
581 }
582
583 public static TermManager getTermManager() {
584 return termManager;
585 }
586
587 public static SearchManager getSearchManager() {
588 return searchManager;
589 }
590
591 public static EditorManager getEditorManager() {
592 return editorManager;
593 }
594
595 public static ProgressMonitorClientManager getProgressMonitorClientManager() {
596 return progressMonitorClientManager;
597 }
598
599 /*
600 * IMPORT/EXPORT FACTORIES
601 */
602
603 /**
604 * <p>
605 * Getter for the field <code>importHandler</code>.
606 * </p>
607 *
608 * @return a {@link eu.etaxonomy.taxeditor.io.ImportManager} object.
609 */
610 public static ImportManager getImportManager() {
611 return ImportManager.NewInstance(getCurrentApplicationConfiguration());
612 }
613
614 /**
615 * <p>
616 * Getter for the field <code>exportHandler</code>.
617 * </p>
618 *
619 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
620 */
621 public static ExportManager getExportManager() {
622 return ExportManager.NewInstance(getCurrentApplicationConfiguration());
623 }
624
625 /**
626 * Whether this CdmStore is currently connected to a datasource
627 *
628 * @return a boolean.
629 */
630 public static boolean isActive() {
631 return instance != null && instance.isConnected;
632 }
633
634 public static ICdmSource getActiveCdmSource() {
635 if (isActive()) {
636 return instance.getCdmSource();
637 }
638 return null;
639 }
640
641 /**
642 * <p>
643 * getDataSource
644 * </p>
645 *
646 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
647 * @deprecated currently retained for backward compatibility - use {@link getActiveCdmSource()} instead
648 */
649 // public static ICdmDataSource getDataSource() {
650 // if (isActive()) {
651 // return (ICdmDataSource)instance.getCdmSource();
652 // }
653 // return null;
654 // }
655
656 /**
657 * @return
658 */
659 private ICdmSource getCdmSource() {
660 return cdmSource;
661 }
662
663
664 public static <T extends CdmBase> IService<T> getService(T cdmBase){
665 IService<T> service = null;
666 if(cdmBase!=null){
667 //get corresponding service
668 if(cdmBase.isInstanceOf(Reference.class)){
669 service = (IService<T>) getService(IReferenceService.class);
670 }
671 else if (cdmBase.isInstanceOf(AgentBase.class)){
672 service = (IService<T>) getService(IAgentService.class);
673 }
674 else if (cdmBase instanceof TaxonName) {
675 service = (IService<T>) getService(INameService.class);
676 }
677 else if (cdmBase instanceof TaxonBase) {
678 service = (IService<T>) getService(ITaxonService.class);
679 }
680 else if (cdmBase instanceof SpecimenOrObservationBase) {
681 service = (IService<T>) getService(IOccurrenceService.class);
682 }
683 else if (cdmBase instanceof Media) {
684 service = (IService<T>) getService(IMediaService.class);
685 }
686 else if (cdmBase instanceof Collection) {
687 service = (IService<T>) getService(ICollectionService.class);
688 }
689 else if (cdmBase instanceof eu.etaxonomy.cdm.model.common.User) {
690 service = (IService<T>) getService(IUserService.class);
691 }
692 else if (cdmBase instanceof Group) {
693 service = (IService<T>) getService(IGroupService.class);
694 }
695 else if (cdmBase instanceof DescriptiveDataSet) {
696 service = (IService<T>) getService(IDescriptiveDataSetService.class);
697 }
698 else if (cdmBase instanceof TermVocabulary<?>) {
699 service = (IService<T>) getService(IVocabularyService.class);
700 }
701 else if (cdmBase instanceof DefinedTermBase<?>) {
702 service = (IService<T>) getService(ITermService.class);
703 }
704 else if (cdmBase instanceof Primer) {
705 service = (IService<T>) getService(IPrimerService.class);
706 }
707 else if (cdmBase instanceof Amplification) {
708 service = (IService<T>) getService(IAmplificationService.class);
709 }
710 else if (cdmBase instanceof PolytomousKey) {
711 service = (IService<T>) getService(IPolytomousKeyService.class);
712 }
713 else if (cdmBase instanceof PolytomousKeyNode) {
714 service = (IService<T>) getService(IPolytomousKeyNodeService.class);
715 }
716 else if (cdmBase instanceof Annotation) {
717 service = (IService<T>) getService(IAnnotationService.class);
718 }
719 else if (cdmBase instanceof Classification) {
720 service = (IService<T>) getService(IClassificationService.class);
721 }
722 else if (cdmBase instanceof DescriptionBase<?>) {
723 service = (IService<T>) getService(IDescriptionService.class);
724 }
725 else if (cdmBase instanceof EntityConstraintViolation) {
726 service = (IService<T>) getService(IEntityConstraintViolationService.class);
727 }
728 else if (cdmBase instanceof EntityValidation) {
729 service = (IService<T>) getService(IEntityValidationService.class);
730 }
731 else if (cdmBase instanceof FeatureNode) {
732 service = (IService<T>) getService(IFeatureNodeService.class);
733 }
734 else if (cdmBase instanceof FeatureTree) {
735 service = (IService<T>) getService(IFeatureTreeService.class);
736 }
737 else if (cdmBase instanceof GrantedAuthority) {
738 service = (IService<T>) getService(IGrantedAuthorityService.class);
739 }
740 else if (cdmBase instanceof Marker) {
741 service = (IService<T>) getService(IMarkerService.class);
742 }
743 else if (cdmBase instanceof Registration) {
744 service = (IService<T>) getService(IRegistrationService.class);
745 }
746 else if (cdmBase instanceof Rights) {
747 service = (IService<T>) getService(IRightsService.class);
748 }
749 else{
750 String message = "Service for entity of class %s not yet implemented in TaxEditor";
751 message = String.format(message, cdmBase.getClass().getSimpleName());
752 throw new RuntimeException(message);
753 }
754 }
755 return service;
756 }
757
758 public static void setManagedServer(CDMServer server) {
759 managedServer = server;
760 }
761
762 public static CDMServer getManagedServer() {
763 return managedServer;
764 }
765
766 }