Merge branch 'develop' into remoting-4.0
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / store / CdmStore.java
index 06c791ca1b1b898b92b013ef0ce9db56c57a5bcc..213720753c6421830f0744190d7721731cc8934a 100644 (file)
@@ -9,9 +9,6 @@
 
 package eu.etaxonomy.taxeditor.store;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
 import java.util.EnumSet;
 
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -20,16 +17,20 @@ import org.eclipse.swt.widgets.Display;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 import org.springframework.security.access.PermissionEvaluator;
-import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.core.Authentication;
 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.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.ICommonService;
 import eu.etaxonomy.cdm.api.service.IService;
+import eu.etaxonomy.cdm.config.ICdmSource;
 import eu.etaxonomy.cdm.database.DbSchemaValidation;
-import eu.etaxonomy.cdm.database.ICdmDataSource;
 import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.Language;
@@ -39,7 +40,12 @@ 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.view.datasource.CdmDataSourceViewPart;
 
@@ -64,7 +70,7 @@ public class CdmStore {
 
        private static CdmStore instance;
 
-       private final ICdmApplicationConfiguration applicationConfiguration;
+       //private final ICdmApplicationConfiguration applicationConfiguration;
 
        private static ContextManager contextManager = new ContextManager();
 
@@ -76,14 +82,18 @@ public class CdmStore {
 
        private static EditorManager editorManager = new EditorManager();
 
+       private static UseObjectStore useObjectInitializer = new UseObjectStore();
+
        private static CdmStoreConnector job;
 
        private Language language;
 
-       private ICdmDataSource cdmDatasource;
+       private ICdmSource cdmSource;
 
        private boolean isConnected;
 
+
+
        /**
         * <p>
         * getDefault
@@ -94,20 +104,13 @@ public class CdmStore {
        protected static CdmStore getDefault() {
                if (instance != null && instance.isConnected) {
                        return instance;
-               } else if (instance == null || !instance.isConnected) {
+               } else{// if (instance == null || !instance.isConnected) {
 
-                       StoreUtil
-                                       .warningDialog(
-                                                       "Application is not connected to a datastore",
-                                                       instance,
-                                                       "The requested operation is only available when "
-                                                                       + "connected to a datasource. You may choose a datasource to connect to or create a new one in the datasource view.");
-
-                       StoreUtil.showView(CdmDataSourceViewPart.ID);
+                       MessagingUtils.noDataSourceWarningDialog(instance);
 
+                       AbstractUtility.showView(CdmDataSourceViewPart.ID);
+                       return null;
                }
-
-               throw new RuntimeException();
        }
 
        /**
@@ -115,10 +118,16 @@ public class CdmStore {
         */
        public static void connect() {
 
-               ICdmDataSource datasource = CdmDataSourceRepository
-                               .getCurrentDataSource();
+               ICdmSource cdmSource;
+               try {
+
+                       cdmSource = CdmDataSourceRepository.getCurrentCdmSource();
+                       connect(cdmSource);
+               } catch (Exception e) {
+                       MessagingUtils.messageDialog("Connection to CDM Source Failed", CdmStore.class, "Could not connect to target CDM Source", e);
+               }
+
 
-               connect(datasource);
        }
 
        /**
@@ -127,8 +136,8 @@ public class CdmStore {
         * @param datasource
         *            a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
         */
-       public static void connect(ICdmDataSource datasource) {
-               connect(datasource, DEFAULT_DB_SCHEMA_VALIDATION,
+       public static void connect(ICdmSource cdmSource) {
+               connect(cdmSource, DEFAULT_DB_SCHEMA_VALIDATION,
                                DEFAULT_APPLICATION_CONTEXT);
        }
 
@@ -139,12 +148,19 @@ public class CdmStore {
         * @param dbSchemaValidation
         * @param applicationContextBean
         */
-       private static void connect(final ICdmDataSource datasource,
+       private static void connect(final ICdmSource cdmSource,
                        final DbSchemaValidation dbSchemaValidation,
                        final Resource applicationContextBean) {
-               StoreUtil.info("Connecting to datasource: " + datasource);
-
-               job = new CdmStoreConnector(Display.getDefault(), datasource,
+           if(isActive()) {
+               // before we connect we clear the entity caches and the sessions
+               CdmRemoteCacheManager.removeEntityCaches();
+               if(getCurrentSessionManager() != null) {
+                   getCurrentSessionManager().disposeAll();
+               }
+           }
+               MessagingUtils.info("Connecting to datasource: " + cdmSource);
+
+               job = new CdmStoreConnector(Display.getDefault(), cdmSource,
                                dbSchemaValidation, applicationContextBean);
                job.setUser(true);
                job.setPriority(Job.BUILD);
@@ -182,18 +198,20 @@ public class CdmStore {
 
        private void close() {
                isConnected = false;
-               cdmDatasource = null;
+               cdmSource = null;
+               CdmApplicationState.dispose();
        }
 
        static void setInstance(ICdmApplicationConfiguration applicationController,
-                       ICdmDataSource dataSource) {
-               instance = new CdmStore(applicationController, dataSource);
+                       ICdmSource cdmSource) {
+               instance = new CdmStore(applicationController, cdmSource);
        }
 
        private CdmStore(ICdmApplicationConfiguration applicationController,
-                       ICdmDataSource dataSource) {
-               this.applicationConfiguration = applicationController;
-               this.cdmDatasource = dataSource;
+                       ICdmSource cdmSource) {
+               CdmApplicationState.setCurrentAppConfig(applicationController);
+               CdmApplicationState.setCurrentDataChangeService(new CdmUIDataChangeService());
+               this.cdmSource = cdmSource;
                isConnected = true;
        }
 
@@ -204,9 +222,9 @@ public class CdmStore {
         */
        private ICdmApplicationConfiguration getApplicationConfiguration() {
                try {
-                       return applicationConfiguration;
+                       return CdmApplicationState.getCurrentAppConfig();
                } catch (Exception e) {
-                       StoreUtil.error(CdmStore.class, e);
+                       MessagingUtils.error(CdmStore.class, e);
                }
                return null;
        }
@@ -241,14 +259,38 @@ public class CdmStore {
        public static ConversationHolder createConversation() {
                ConversationHolder conversation = getCurrentApplicationConfiguration()
                                .NewConversation();
-               try{
+               try {
                        conversation.startTransaction();
                }catch(Exception e){
-                       StoreUtil.errorDialog("No database connection", CdmStore.class, "No database connection available", e);
+                       MessagingUtils.messageDialog("No database connection", CdmStore.class, "No database connection available", e);
                }
                return conversation;
        }
 
+       //FIXME:Remoting should be removed after moving completely to remoting
+       private MockCdmEntitySessionManager mockCdmEntitySessionManager;
+
+       private ICdmEntitySessionManager getSessionManager() {
+               //FIXME:Remoting we should only have CdmApplicationRemoteConfiguration after move to remoting
+               //               bad hack which should be finally removed
+               if(getCurrentApplicationConfiguration() instanceof CdmApplicationRemoteController) {
+                       return ((CdmApplicationRemoteController)getCurrentApplicationConfiguration()).getCdmEntitySessionManager();
+               } else {
+                       if(mockCdmEntitySessionManager == null) {
+                               mockCdmEntitySessionManager = new MockCdmEntitySessionManager();
+                       }
+                       return mockCdmEntitySessionManager;
+               }
+       }
+
+       public static  ICdmEntitySessionManager getCurrentSessionManager() {
+               if (getDefault() != null) {
+                       return getDefault().getSessionManager();
+               }
+               return null;
+
+       }
+
        /**
         * Generic method that will scan the getters of {@link ICdmApplicationConfiguration} for the given service
         * interface. If a matching getter is found the according service implementation is returned by
@@ -259,30 +301,23 @@ public class CdmStore {
         * @return the configured implementation of <code>serviceClass</code> or <code>null</code>
         */
        public static <T extends IService> T getService(Class<T> serviceClass) {
-               ICdmApplicationConfiguration configuration = getCurrentApplicationConfiguration();
-
-               Method[] methods = ICdmApplicationConfiguration.class.getDeclaredMethods();
+           T service = null;
+           try {
+               service = CdmApplicationState.getService(serviceClass);
+           } catch (CdmApplicationException cae) {
+               MessagingUtils.error(CdmStore.class, cae);
+           }
 
-               T service = null;
-
-               for (Method method : methods) {
-                       Type type = method.getGenericReturnType();
+           return service;
+       }
 
-                       if (type.equals(serviceClass)) {
-                               try {
-                                       service = (T) method.invoke(configuration, null);
-                                       break;
-                               } catch (IllegalArgumentException e) {
-                                       StoreUtil.error(CdmStore.class, e);
-                               } catch (IllegalAccessException e) {
-                                       StoreUtil.error(CdmStore.class, e);
-                               } catch (InvocationTargetException e) {
-                                       StoreUtil.error(CdmStore.class, e);
-                               }
-                       }
-               }
+       /**
+        * @see #getService(Class)
+        * As ICommonService is not extending IService we need a specific request here
+        */
+       public static ICommonService getCommonService() {
+               return CdmApplicationState.getCommonService();
 
-               return service;
        }
 
        /**
@@ -294,7 +329,7 @@ public class CdmStore {
         *         {@link org.springframework.security.authentication.ProviderManager}
         *         object.
         */
-       public static ProviderManager getAuthenticationManager() {
+       public static AuthenticationManager getAuthenticationManager() {
                return getCurrentApplicationConfiguration().getAuthenticationManager();
        }
 
@@ -384,9 +419,7 @@ public class CdmStore {
         */
 
        /**
-        * <p>
-        * getDefaultLanguage
-        * </p>
+        * Provides access to the global default language set in the application preferences.
         *
         * @return a {@link eu.etaxonomy.cdm.model.common.Language} object.
         */
@@ -497,25 +530,33 @@ public class CdmStore {
                return instance != null && instance.isConnected;
        }
 
+       public static ICdmSource getActiveCdmSource() {
+               if (isActive()) {
+                       return instance.getCdmSource();
+               }
+               return null;
+       }
+
        /**
         * <p>
         * getDataSource
         * </p>
         *
         * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
+        * @deprecated currently retained for backward compatibility - use {@link getActiveCdmSource()} instead
         */
-       public static ICdmDataSource getDataSource() {
-               if (isActive()) {
-                       return instance.getDatasource();
-               }
-               return null;
-       }
+//     public static ICdmDataSource getDataSource() {
+//             if (isActive()) {
+//                     return (ICdmDataSource)instance.getCdmSource();
+//             }
+//             return null;
+//     }
 
        /**
         * @return
         */
-       private ICdmDataSource getDatasource() {
-               return cdmDatasource;
+       private ICdmSource getCdmSource() {
+               return cdmSource;
        }
 
 }