2 * Copyright (C) 2007 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.
10 package eu
.etaxonomy
.taxeditor
.store
;
12 import java
.util
.EnumSet
;
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
;
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
;
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
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.
115 * @created 17.03.2009
118 public class CdmStore
{
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
;
125 private static CdmStore instance
;
127 //private final ICdmRepository applicationConfiguration;
129 private static ContextManager contextManager
= new ContextManager();
131 private static LoginManager loginManager
= new LoginManager();
133 private static TermManager termManager
= new TermManager();
135 private static SearchManager searchManager
= new SearchManager();
137 private static EditorManager editorManager
= new EditorManager();
139 private static UseObjectStore useObjectInitializer
= new UseObjectStore();
141 private static ProgressMonitorClientManager progressMonitorClientManager
= new ProgressMonitorClientManager();
143 private static CdmStoreConnector job
;
145 private static CDMServer managedServer
;
147 private Language language
;
149 private ICdmSource cdmSource
;
151 private boolean isConnected
;
160 * @return a {@link eu.etaxonomy.taxeditor.store.CdmStore} object.
162 protected static CdmStore
getDefault(boolean connecting
){
163 if (instance
!= null && instance
.isConnected
) {
165 } else{// if (instance == null || !instance.isConnected) {
167 MessagingUtils
.dataSourceNotAvailableWarningDialog(instance
);
169 MessagingUtils
.noDataSourceWarningDialog(instance
);
181 * @return a {@link eu.etaxonomy.taxeditor.store.CdmStore} object.
183 protected static CdmStore
getDefault(){
184 return getDefault(false);
188 * Initialize the with the last edited datasource
190 public static void connect() {
192 ICdmSource cdmSource
;
195 cdmSource
= CdmDataSourceRepository
.getCurrentCdmSource();
197 } catch (Exception e
) {
198 MessagingUtils
.messageDialog("Connection to CDM Source Failed", CdmStore
.class, "Could not connect to target CDM Source", e
);
205 * Initialize with a specific datasource
208 * a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
210 public static void connect(ICdmSource cdmSource
) {
211 connect(cdmSource
, DEFAULT_DB_SCHEMA_VALIDATION
,
212 DEFAULT_APPLICATION_CONTEXT
);
215 public static void connect(ICdmSource cdmSource
, RemotingLoginDialog loginDialog
) {
217 DEFAULT_DB_SCHEMA_VALIDATION
,
218 DEFAULT_APPLICATION_CONTEXT
,
223 * Initialize and provide
226 * @param dbSchemaValidation
227 * @param applicationContextBean
229 private static void connect(final ICdmSource cdmSource
,
230 final DbSchemaValidation dbSchemaValidation
,
231 final Resource applicationContextBean
) {
233 MessagingUtils
.info("Connecting to datasource: " + cdmSource
);
235 job
= new CdmStoreConnector(Display
.getDefault(), cdmSource
,
236 dbSchemaValidation
, applicationContextBean
);
238 job
.setPriority(Job
.BUILD
);
243 private static void connect(final ICdmSource cdmSource
,
244 final DbSchemaValidation dbSchemaValidation
,
245 final Resource applicationContextBean
,
246 RemotingLoginDialog remotingLoginDialog
) {
247 RemotingLoginDialog loginDialog
= remotingLoginDialog
;
249 // before we connect we clear the entity caches and the sessions
250 CdmRemoteCacheManager
.removeEntityCaches();
251 if(getCurrentSessionManager(true) != null) {
252 getCurrentSessionManager(true).disposeAll();
255 MessagingUtils
.info("Connecting to datasource: " + cdmSource
);
257 job
= new CdmStoreConnector(Display
.getDefault(),
260 applicationContextBean
);
261 job
.start(loginDialog
);
265 public static boolean isConnecting() {
266 return job
!= null && job
.getState() == Job
.RUNNING
;
270 * Closes the current application context
273 * a {@link org.eclipse.core.runtime.IProgressMonitor} object.
275 public static void close(final IProgressMonitor monitor
) {
276 Display
.getDefault().asyncExec(new Runnable() {
280 getContextManager().notifyContextAboutToStop(monitor
);
281 if ((monitor
== null || (!monitor
.isCanceled()) && isActive())) {
282 getContextManager().notifyContextStop(monitor
);
289 public static void close(IProgressMonitor monitor
, boolean async
) {
293 getContextManager().notifyContextAboutToStop(monitor
);
294 if ((monitor
== null || (!monitor
.isCanceled()) && isActive())) {
295 getContextManager().notifyContextStop(monitor
);
301 private void close() {
304 CdmApplicationState
.dispose();
307 static void setInstance(ICdmRepository applicationController
,
308 ICdmSource cdmSource
) {
309 instance
= new CdmStore(applicationController
, cdmSource
);
310 CdmApplicationState
.setCdmServiceCacher(new CdmServiceCacher());
314 private CdmStore(ICdmRepository repository
,
315 ICdmSource cdmSource
) {
316 CdmApplicationState
.setCurrentAppConfig(repository
);
317 CdmApplicationState
.setCurrentDataChangeService(new CdmUIDataChangeService());
318 this.cdmSource
= cdmSource
;
323 * All calls to the datastore require
327 private ICdmRepository
getApplicationConfiguration() {
329 return CdmApplicationState
.getCurrentAppConfig();
330 } catch (Exception e
) {
331 MessagingUtils
.error(CdmStore
.class, e
);
338 * getCurrentApplicationController
342 * {@link eu.etaxonomy.cdm.remote.api.application.CdmApplicationController}
345 public static ICdmRepository
getCurrentApplicationConfiguration() {
346 if (getDefault() != null) {
347 return getDefault().getApplicationConfiguration();
357 * Creates a new conversation, binds resources to the conversation and start
358 * a transaction for this conversation.
360 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
363 public static ConversationHolder
createConversation() {
364 ConversationHolder conversation
= getCurrentApplicationConfiguration()
367 conversation
.startTransaction();
369 MessagingUtils
.messageDialog("No database connection", CdmStore
.class, "No database connection available", e
);
374 //FIXME:Remoting should be removed after moving completely to remoting
375 private MockCdmEntitySessionManager mockCdmEntitySessionManager
;
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();
383 if(mockCdmEntitySessionManager
== null) {
384 mockCdmEntitySessionManager
= new MockCdmEntitySessionManager();
386 return mockCdmEntitySessionManager
;
389 public static ICdmEntitySessionManager
getCurrentSessionManager() {
390 return getCurrentSessionManager(false);
394 public static ICdmEntitySessionManager
getCurrentSessionManager(boolean connecting
) {
395 if (getDefault(connecting
) != null) {
396 return getDefault(connecting
).getSessionManager();
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>.
408 * @param serviceClass
409 * @return the configured implementation of <code>serviceClass</code> or <code>null</code>
411 public static <T
extends IService
> T
getService(Class
<T
> serviceClass
) {
414 service
= CdmApplicationState
.getService(serviceClass
);
415 } catch (CdmApplicationException cae
) {
416 MessagingUtils
.error(CdmStore
.class, cae
);
423 * @see #getService(Class)
424 * As ICommonService is not extending IService we need a specific request here
426 public static ICommonService
getCommonService() {
427 return CdmApplicationState
.getCommonService();
433 * getAuthenticationManager
437 * {@link org.springframework.security.authentication.ProviderManager}
440 public static AuthenticationManager
getAuthenticationManager() {
441 return getCurrentApplicationConfiguration().getAuthenticationManager();
446 * getAuthenticationManager
450 * {@link ICdmPermissionEvaluator} object.
452 public static ICdmPermissionEvaluator
getPermissionEvaluator() {
453 return getCurrentApplicationConfiguration().getPermissionEvaluator();
458 * SECURITY RELATED CONVENIENCE METHODS
462 * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication, java.lang.Object, java.lang.Object)
464 * @param targetDomainObject
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;
474 hasPermission
= getPermissionEvaluator().hasPermission(context
.getAuthentication(), targetDomainObject
,
476 } catch (org
.springframework
.security
.access
.AccessDeniedException e
) {
479 return hasPermission
;
483 * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication, java.lang.Object, java.lang.Object)
485 * @param targetDomainObject
489 public static boolean currentAuthentiationHasPermission(Class
<?
extends CdmBase
> targetType
, EnumSet
<CRUD
> permission
){
490 boolean hasPermission
= false;
492 hasPermission
= getPermissionEvaluator().hasPermission(getCurrentAuthentiation(), null, targetType
.getName(), permission
);
493 } catch (org
.springframework
.security
.access
.AccessDeniedException e
) {
496 return hasPermission
;
499 public static boolean currentAuthentiationHasOneOfRoles(Role
... roles
){
500 boolean hasPermission
= false;
502 hasPermission
= getPermissionEvaluator().hasOneOfRoles(getCurrentAuthentiation(), roles
);
503 } catch (org
.springframework
.security
.access
.AccessDeniedException e
) {
506 return hasPermission
;
509 public static Authentication
getCurrentAuthentiation() {
510 SecurityContext context
= SecurityContextHolder
.getContext();
511 return context
.getAuthentication();
519 * Provides access to the global default language set in the application preferences.
521 * @return a {@link eu.etaxonomy.cdm.model.common.Language} object.
523 public static Language
getDefaultLanguage() {
524 if (getDefault().getLanguage() == null) {
525 getDefault().setLanguage(PreferencesUtil
.getGlobalLanguage());
527 return getDefault().getLanguage();
536 * a {@link eu.etaxonomy.cdm.model.common.Language} object.
538 public static void setDefaultLanguage(Language language
) {
539 getDefault().setLanguage(language
);
543 * @return the language
545 private Language
getLanguage() {
551 * the language to set
553 private void setLanguage(Language language
) {
554 this.language
= language
;
563 * Getter for the field <code>loginManager</code>.
566 * @return a {@link eu.etaxonomy.taxeditor.store.LoginManager} object.
568 public static LoginManager
getLoginManager() {
574 * Getter for the field <code>contextManager</code>.
577 * @return a {@link eu.etaxonomy.taxeditor.store.ContextManager} object.
579 public static ContextManager
getContextManager() {
580 return contextManager
;
583 public static TermManager
getTermManager() {
587 public static SearchManager
getSearchManager() {
588 return searchManager
;
591 public static EditorManager
getEditorManager() {
592 return editorManager
;
595 public static ProgressMonitorClientManager
getProgressMonitorClientManager() {
596 return progressMonitorClientManager
;
600 * IMPORT/EXPORT FACTORIES
605 * Getter for the field <code>importHandler</code>.
608 * @return a {@link eu.etaxonomy.taxeditor.io.ImportManager} object.
610 public static ImportManager
getImportManager() {
611 return ImportManager
.NewInstance(getCurrentApplicationConfiguration());
616 * Getter for the field <code>exportHandler</code>.
619 * @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
621 public static ExportManager
getExportManager() {
622 return ExportManager
.NewInstance(getCurrentApplicationConfiguration());
626 * Whether this CdmStore is currently connected to a datasource
630 public static boolean isActive() {
631 return instance
!= null && instance
.isConnected
;
634 public static ICdmSource
getActiveCdmSource() {
636 return instance
.getCdmSource();
646 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
647 * @deprecated currently retained for backward compatibility - use {@link getActiveCdmSource()} instead
649 // public static ICdmDataSource getDataSource() {
651 // return (ICdmDataSource)instance.getCdmSource();
659 private ICdmSource
getCdmSource() {
664 public static <T
extends CdmBase
> IService
<T
> getService(T cdmBase
){
665 IService
<T
> service
= null;
667 //get corresponding service
668 if(cdmBase
.isInstanceOf(Reference
.class)){
669 service
= (IService
<T
>) getService(IReferenceService
.class);
671 else if (cdmBase
.isInstanceOf(AgentBase
.class)){
672 service
= (IService
<T
>) getService(IAgentService
.class);
674 else if (cdmBase
instanceof TaxonName
) {
675 service
= (IService
<T
>) getService(INameService
.class);
677 else if (cdmBase
instanceof TaxonBase
) {
678 service
= (IService
<T
>) getService(ITaxonService
.class);
680 else if (cdmBase
instanceof SpecimenOrObservationBase
) {
681 service
= (IService
<T
>) getService(IOccurrenceService
.class);
683 else if (cdmBase
instanceof Media
) {
684 service
= (IService
<T
>) getService(IMediaService
.class);
686 else if (cdmBase
instanceof Collection
) {
687 service
= (IService
<T
>) getService(ICollectionService
.class);
689 else if (cdmBase
instanceof eu
.etaxonomy
.cdm
.model
.common
.User
) {
690 service
= (IService
<T
>) getService(IUserService
.class);
692 else if (cdmBase
instanceof Group
) {
693 service
= (IService
<T
>) getService(IGroupService
.class);
695 else if (cdmBase
instanceof DescriptiveDataSet
) {
696 service
= (IService
<T
>) getService(IDescriptiveDataSetService
.class);
698 else if (cdmBase
instanceof TermVocabulary
<?
>) {
699 service
= (IService
<T
>) getService(IVocabularyService
.class);
701 else if (cdmBase
instanceof DefinedTermBase
<?
>) {
702 service
= (IService
<T
>) getService(ITermService
.class);
704 else if (cdmBase
instanceof Primer
) {
705 service
= (IService
<T
>) getService(IPrimerService
.class);
707 else if (cdmBase
instanceof Amplification
) {
708 service
= (IService
<T
>) getService(IAmplificationService
.class);
710 else if (cdmBase
instanceof PolytomousKey
) {
711 service
= (IService
<T
>) getService(IPolytomousKeyService
.class);
713 else if (cdmBase
instanceof PolytomousKeyNode
) {
714 service
= (IService
<T
>) getService(IPolytomousKeyNodeService
.class);
716 else if (cdmBase
instanceof Annotation
) {
717 service
= (IService
<T
>) getService(IAnnotationService
.class);
719 else if (cdmBase
instanceof Classification
) {
720 service
= (IService
<T
>) getService(IClassificationService
.class);
722 else if (cdmBase
instanceof DescriptionBase
<?
>) {
723 service
= (IService
<T
>) getService(IDescriptionService
.class);
725 else if (cdmBase
instanceof EntityConstraintViolation
) {
726 service
= (IService
<T
>) getService(IEntityConstraintViolationService
.class);
728 else if (cdmBase
instanceof EntityValidation
) {
729 service
= (IService
<T
>) getService(IEntityValidationService
.class);
731 else if (cdmBase
instanceof FeatureNode
) {
732 service
= (IService
<T
>) getService(IFeatureNodeService
.class);
734 else if (cdmBase
instanceof FeatureTree
) {
735 service
= (IService
<T
>) getService(IFeatureTreeService
.class);
737 else if (cdmBase
instanceof GrantedAuthority
) {
738 service
= (IService
<T
>) getService(IGrantedAuthorityService
.class);
740 else if (cdmBase
instanceof Marker
) {
741 service
= (IService
<T
>) getService(IMarkerService
.class);
743 else if (cdmBase
instanceof Registration
) {
744 service
= (IService
<T
>) getService(IRegistrationService
.class);
746 else if (cdmBase
instanceof Rights
) {
747 service
= (IService
<T
>) getService(IRightsService
.class);
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
);
758 public static void setManagedServer(CDMServer server
) {
759 managedServer
= server
;
762 public static CDMServer
getManagedServer() {
763 return managedServer
;