ref #8045: further implementation for default/explicit value selection preference...
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / store / CdmStore.java
index bd594ad195403921c50c83a659ac4609e111d4f6..f69e23e89878057ebf2dfb02a55f35157cc28186 100644 (file)
@@ -14,42 +14,93 @@ import java.util.EnumSet;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.swt.widgets.Display;
+import org.slf4j.Marker;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 import org.springframework.security.access.PermissionEvaluator;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.context.SecurityContextHolder;
 
 import eu.etaxonomy.cdm.api.application.CdmApplicationException;
 import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteController;
 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
-import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
+import eu.etaxonomy.cdm.api.application.ICdmRepository;
 import eu.etaxonomy.cdm.api.cache.CdmServiceCacher;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.IAgentService;
+import eu.etaxonomy.cdm.api.service.IAnnotationService;
+import eu.etaxonomy.cdm.api.service.IClassificationService;
+import eu.etaxonomy.cdm.api.service.ICollectionService;
 import eu.etaxonomy.cdm.api.service.ICommonService;
+import eu.etaxonomy.cdm.api.service.IDescriptionService;
+import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
+import eu.etaxonomy.cdm.api.service.IEntityValidationService;
+import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
+import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
+import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
+import eu.etaxonomy.cdm.api.service.IGroupService;
+import eu.etaxonomy.cdm.api.service.IMarkerService;
+import eu.etaxonomy.cdm.api.service.IMediaService;
+import eu.etaxonomy.cdm.api.service.INameService;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
+import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
+import eu.etaxonomy.cdm.api.service.IReferenceService;
+import eu.etaxonomy.cdm.api.service.IRegistrationService;
+import eu.etaxonomy.cdm.api.service.IRightsService;
 import eu.etaxonomy.cdm.api.service.IService;
+import eu.etaxonomy.cdm.api.service.ITaxonService;
+import eu.etaxonomy.cdm.api.service.ITermService;
+import eu.etaxonomy.cdm.api.service.IUserService;
+import eu.etaxonomy.cdm.api.service.IVocabularyService;
+import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
+import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
+import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
+import  eu.etaxonomy.cdm.cache.CdmRemoteCacheManager;
 import eu.etaxonomy.cdm.config.ICdmSource;
 import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.model.agent.AgentBase;
+import eu.etaxonomy.cdm.model.common.Annotation;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.term.DefinedTermBase;
+import eu.etaxonomy.cdm.model.common.Group;
 import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.cdm.model.term.TermVocabulary;
+import eu.etaxonomy.cdm.model.description.DescriptionBase;
+import eu.etaxonomy.cdm.model.term.FeatureNode;
+import eu.etaxonomy.cdm.model.term.FeatureTree;
+import eu.etaxonomy.cdm.model.description.PolytomousKey;
+import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
+import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
+import eu.etaxonomy.cdm.model.media.Media;
+import eu.etaxonomy.cdm.model.media.Rights;
+import eu.etaxonomy.cdm.model.molecular.Amplification;
+import eu.etaxonomy.cdm.model.molecular.Primer;
+import eu.etaxonomy.cdm.model.name.Registration;
+import eu.etaxonomy.cdm.model.name.TaxonName;
+import eu.etaxonomy.cdm.model.occurrence.Collection;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.taxon.Classification;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.validation.EntityConstraintViolation;
+import eu.etaxonomy.cdm.model.validation.EntityValidation;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.Role;
 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
 import eu.etaxonomy.taxeditor.io.ExportManager;
 import eu.etaxonomy.taxeditor.io.ImportManager;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
-import eu.etaxonomy.taxeditor.remoting.cache.CdmRemoteCacheManager;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
 import eu.etaxonomy.taxeditor.session.mock.MockCdmEntitySessionManager;
 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
 import eu.etaxonomy.taxeditor.ui.dialog.RemotingLoginDialog;
 import eu.etaxonomy.taxeditor.util.ProgressMonitorClientManager;
-import eu.etaxonomy.taxeditor.view.datasource.CdmDataSourceViewPart;
 import eu.etaxonomy.taxeditor.webapp.CDMServer;
 
 /**
@@ -73,7 +124,7 @@ public class CdmStore {
 
     private static CdmStore instance;
 
-    //private final ICdmApplicationConfiguration applicationConfiguration;
+    //private final ICdmRepository applicationConfiguration;
 
     private static ContextManager contextManager = new ContextManager();
 
@@ -108,17 +159,30 @@ public class CdmStore {
      *
      * @return a {@link eu.etaxonomy.taxeditor.store.CdmStore} object.
      */
-    protected static CdmStore getDefault({
+    protected static CdmStore getDefault(boolean connecting){
         if (instance != null && instance.isConnected) {
             return instance;
         } else{// if (instance == null || !instance.isConnected) {
+            if (connecting){
+                MessagingUtils.dataSourceNotAvailableWarningDialog(instance);
+            }else{
+                MessagingUtils.noDataSourceWarningDialog(instance);
+            }
 
-            MessagingUtils.noDataSourceWarningDialog(instance);
 
-            AbstractUtility.showView(CdmDataSourceViewPart.ID);
             return null;
         }
     }
+    /**
+     * <p>
+     * getDefault
+     * </p>
+     *
+     * @return a {@link eu.etaxonomy.taxeditor.store.CdmStore} object.
+     */
+    protected static CdmStore getDefault(){
+       return getDefault(false);
+    }
 
     /**
      * Initialize the with the last edited datasource
@@ -183,9 +247,9 @@ public class CdmStore {
         RemotingLoginDialog loginDialog = remotingLoginDialog;
         if(isActive()) {
             // before we connect we clear the entity caches and the sessions
-            CdmRemoteCacheManager.removeEntityCaches();
-            if(getCurrentSessionManager() != null) {
-                getCurrentSessionManager().disposeAll();
+           CdmRemoteCacheManager.removeEntityCaches();
+            if(getCurrentSessionManager(true) != null) {
+                getCurrentSessionManager(true).disposeAll();
             }
         }
         MessagingUtils.info("Connecting to datasource: " + cdmSource);
@@ -210,11 +274,7 @@ public class CdmStore {
      */
     public static void close(final IProgressMonitor monitor) {
         Display.getDefault().asyncExec(new Runnable() {
-            /*
-             * (non-Javadoc)
-             *
-             * @see java.lang.Runnable#run()
-             */
+
             @Override
             public void run() {
                 getContextManager().notifyContextAboutToStop(monitor);
@@ -244,17 +304,16 @@ public class CdmStore {
         CdmApplicationState.dispose();
     }
 
-    static void setInstance(ICdmApplicationConfiguration applicationController,
+    static void setInstance(ICdmRepository applicationController,
             ICdmSource cdmSource) {
         instance = new CdmStore(applicationController, cdmSource);
-        if(getCurrentSessionManager().isRemoting()) {
-            CdmApplicationState.setCdmServiceCacher(new CdmServiceCacher());
-        }
+        CdmApplicationState.setCdmServiceCacher(new CdmServiceCacher());
+
     }
 
-    private CdmStore(ICdmApplicationConfiguration applicationController,
+    private CdmStore(ICdmRepository repository,
             ICdmSource cdmSource) {
-        CdmApplicationState.setCurrentAppConfig(applicationController);
+        CdmApplicationState.setCurrentAppConfig(repository);
         CdmApplicationState.setCurrentDataChangeService(new CdmUIDataChangeService());
         this.cdmSource = cdmSource;
         isConnected = true;
@@ -265,7 +324,7 @@ public class CdmStore {
      *
      * @return
      */
-    private ICdmApplicationConfiguration getApplicationConfiguration() {
+    private ICdmRepository getApplicationConfiguration() {
         try {
             return CdmApplicationState.getCurrentAppConfig();
         } catch (Exception e) {
@@ -283,7 +342,7 @@ public class CdmStore {
      *         {@link eu.etaxonomy.cdm.remote.api.application.CdmApplicationController}
      *         object.
      */
-    public static ICdmApplicationConfiguration getCurrentApplicationConfiguration() {
+    public static ICdmRepository getCurrentApplicationConfiguration() {
         if (getDefault() != null) {
             return getDefault().getApplicationConfiguration();
         }
@@ -327,17 +386,21 @@ public class CdmStore {
             return mockCdmEntitySessionManager;
         }
     }
-
     public static  ICdmEntitySessionManager getCurrentSessionManager() {
-        if (getDefault() != null) {
-            return getDefault().getSessionManager();
+        return getCurrentSessionManager(false);
+    }
+
+
+    public static  ICdmEntitySessionManager getCurrentSessionManager(boolean connecting) {
+        if (getDefault(connecting) != null) {
+            return getDefault(connecting).getSessionManager();
         }
         return null;
 
     }
 
     /**
-     * Generic method that will scan the getters of {@link ICdmApplicationConfiguration} for the given service
+     * Generic method that will scan the getters of {@link ICdmRepository} for the given service
      * interface. If a matching getter is found the according service implementation is returned by
      * invoking the getter otherwise the method returns <code>null</code>.
      *
@@ -598,6 +661,100 @@ public class CdmStore {
     }
 
 
+    public static <T extends CdmBase> IService<T> getService(T cdmBase){
+        IService<T> service = null;
+        if(cdmBase!=null){
+            //get corresponding service
+            if(cdmBase.isInstanceOf(Reference.class)){
+                service = (IService<T>) getService(IReferenceService.class);
+            }
+            else if (cdmBase.isInstanceOf(AgentBase.class)){
+                service = (IService<T>) getService(IAgentService.class);
+            }
+            else if (cdmBase instanceof TaxonName) {
+                service = (IService<T>) getService(INameService.class);
+            }
+            else if (cdmBase instanceof TaxonBase) {
+                service = (IService<T>) getService(ITaxonService.class);
+            }
+            else if (cdmBase instanceof SpecimenOrObservationBase) {
+                service = (IService<T>) getService(IOccurrenceService.class);
+            }
+            else if (cdmBase instanceof Media) {
+                service = (IService<T>) getService(IMediaService.class);
+            }
+            else if (cdmBase instanceof Collection) {
+                service = (IService<T>) getService(ICollectionService.class);
+            }
+            else if (cdmBase instanceof eu.etaxonomy.cdm.model.common.User) {
+                service = (IService<T>) getService(IUserService.class);
+            }
+            else if (cdmBase instanceof Group) {
+               service = (IService<T>) getService(IGroupService.class);
+            }
+            else if (cdmBase instanceof DescriptiveDataSet) {
+               service = (IService<T>) getService(IDescriptiveDataSetService.class);
+            }
+            else if (cdmBase instanceof TermVocabulary<?>) {
+               service = (IService<T>) getService(IVocabularyService.class);
+            }
+            else if (cdmBase instanceof DefinedTermBase<?>) {
+               service = (IService<T>) getService(ITermService.class);
+            }
+            else if (cdmBase instanceof Primer) {
+                service = (IService<T>) getService(IPrimerService.class);
+            }
+            else if (cdmBase instanceof Amplification) {
+                service = (IService<T>) getService(IAmplificationService.class);
+            }
+            else if (cdmBase instanceof PolytomousKey) {
+                service = (IService<T>) getService(IPolytomousKeyService.class);
+            }
+            else if (cdmBase instanceof PolytomousKeyNode) {
+                service = (IService<T>) getService(IPolytomousKeyNodeService.class);
+            }
+            else if (cdmBase instanceof Annotation) {
+                service = (IService<T>) getService(IAnnotationService.class);
+            }
+            else if (cdmBase instanceof Classification) {
+                service = (IService<T>) getService(IClassificationService.class);
+            }
+            else if (cdmBase instanceof DescriptionBase<?>) {
+                service = (IService<T>) getService(IDescriptionService.class);
+            }
+            else if (cdmBase instanceof EntityConstraintViolation) {
+                service = (IService<T>) getService(IEntityConstraintViolationService.class);
+            }
+            else if (cdmBase instanceof EntityValidation) {
+                service = (IService<T>) getService(IEntityValidationService.class);
+            }
+            else if (cdmBase instanceof FeatureNode) {
+                service = (IService<T>) getService(IFeatureNodeService.class);
+            }
+            else if (cdmBase instanceof FeatureTree) {
+                service = (IService<T>) getService(IFeatureTreeService.class);
+            }
+            else if (cdmBase instanceof GrantedAuthority) {
+                service = (IService<T>) getService(IGrantedAuthorityService.class);
+            }
+            else if (cdmBase instanceof Marker) {
+                service = (IService<T>) getService(IMarkerService.class);
+            }
+            else if (cdmBase instanceof Registration) {
+                service = (IService<T>) getService(IRegistrationService.class);
+            }
+            else if (cdmBase instanceof Rights) {
+                service = (IService<T>) getService(IRightsService.class);
+            }
+            else{
+               String message = "Service for entity of class %s not yet implemented in TaxEditor";
+               message = String.format(message, cdmBase.getClass().getSimpleName());
+               throw new RuntimeException(message);
+            }
+        }
+        return service;
+    }
+
     public static void setManagedServer(CDMServer server) {
         managedServer = server;
     }