fix #9025 allow for creating a new schema in empty dbs via the remote login dialog
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 20 May 2020 12:50:03 +0000 (14:50 +0200)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 20 May 2020 12:50:03 +0000 (14:50 +0200)
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/RemotingLoginDialog.java
eu.etaxonomy.taxeditor.webapp/src/main/java/eu/etaxonomy/taxeditor/webapp/CDMServer.java

index 4a61551044d1f059188884266380f24f727fb08f..04d10da40892ee166a34f697c189cdbe082d436d 100644 (file)
@@ -784,7 +784,11 @@ public class RemotingLoginDialog extends Dialog implements ICDMServerError {
                     monitor.subTask(String.format(Messages.RemotingLoginDialog_GENERATING_CONFIG_FILE, selectedCdmInstance.getName()));
                     managedServerConfigFile = CDMServerUtils.writeManagedServerConfig(config, mgdServerConfigFileName);
                     monitor.worked(1);
+                    boolean forceSchemaCreate = CdmStore.getManagedServer() != null
+                            && CdmStore.getManagedServer().getDataSourceName().equals(selectedCdmInstance.getName())
+                            && CdmStore.getManagedServer().isForceSchemaCreate();
                     CdmStore.setManagedServer(new CDMServer(selectedCdmInstance.getName(), managedServerConfigFile));
+                    CdmStore.getManagedServer().setForceSchemaCreate(forceSchemaCreate);
                     monitor.subTask(Messages.RemotingLoginDialog_STARTING_MGD_SERVER);
                     CdmStore.getManagedServer().start(false, RemotingLoginDialog.this);
                     int serverUnits = 0;
@@ -818,14 +822,17 @@ public class RemotingLoginDialog extends Dialog implements ICDMServerError {
                             true);
                 } catch (CDMEmbeddedServerException cse) {
                     MessagingUtils.errorDialog(Messages.RemotingLoginDialog_ERROR_STARTING_SERVER,
-                            this,
-                            cse.getMessage(),
-                            TaxeditorStorePlugin.PLUGIN_ID,
-                            cse,
-                            true);
+                                this,
+                                cse.getMessage(),
+                                TaxeditorStorePlugin.PLUGIN_ID,
+                                cse,
+                                true);
                 } finally {
                     monitor.done();
                 }
+                // NOTE: Errors thrown during server startup are passed to the handleError() implementation
+                // TODO: is the above catch clause for CDMEmbeddedServerException still valuable?
+
                 return Status.OK_STATUS;
             }
         };
@@ -838,6 +845,42 @@ public class RemotingLoginDialog extends Dialog implements ICDMServerError {
         job.schedule();
     }
 
+
+    @Override
+    public void handleError(final Throwable t) {
+
+        if(CdmStore.getManagedServer().isFailed() && CdmStore.getManagedServer().isPotentiallyMissingSchema()) {
+            CdmStore.getManagedServer().setForceSchemaCreate(true);
+            // we are in a separate thread here, thus update the screen via
+            Display.getDefault().asyncExec(new Runnable() {
+                @Override
+                public void run() {
+                    btnConnect.setEnabled(true);
+                    btnConnect.setText("Create Schema");
+                    btnConnect.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+                }
+             });
+        } else {
+            Display.getDefault().syncExec(new Runnable() {
+                @Override
+                public void run() {
+                    serverJob.cancel();
+
+                    String title = Messages.RemotingLoginDialog_SERVER_LAUNCH_ERROR;
+                    String  message = t.getMessage();
+
+
+                    MessagingUtils.errorDialog(title,
+                            this,
+                            message,
+                            TaxeditorStorePlugin.PLUGIN_ID,
+                            t,
+                            true);
+                }
+            });
+        }
+    }
+
     private void stopManagedServer() {
         try {
             CdmStore.getManagedServer().stop();
@@ -930,7 +973,6 @@ public class RemotingLoginDialog extends Dialog implements ICDMServerError {
 
     }
 
-
     public boolean isRememberMe() {
         return btnRememberMe.getSelection();
     }
@@ -1152,30 +1194,5 @@ public class RemotingLoginDialog extends Dialog implements ICDMServerError {
         txtServerCDMVersion.setText(""); //$NON-NLS-1$
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void handleError(final Throwable t) {
-
-        Display.getDefault().syncExec(new Runnable() {
-            @Override
-            public void run() {
-                serverJob.cancel();
-
-                String title = Messages.RemotingLoginDialog_SERVER_LAUNCH_ERROR;
-                String  message = t.getMessage();
-
-
-                MessagingUtils.errorDialog(title,
-                        this,
-                        message,
-                        TaxeditorStorePlugin.PLUGIN_ID,
-                        t,
-                        true);
-            }
-        });
-    }
-
 
 }
index 9161fb181661d6ccdd384c1a5850177009ae2b50..5146d0a9b83732d9bad710930beec63c121ab0ca 100644 (file)
@@ -61,6 +61,9 @@ public class CDMServer {
     private File warFile;
     private Server server;
 
+    private boolean potentiallyMissingSchema;
+    private boolean forceSchemaCreate = false;
+
 
     public CDMServer(String dataSourceName, File dataSourcesFile) throws CDMEmbeddedServerException {
         if(StringUtil.isBlank(dataSourceName)) {
@@ -90,6 +93,7 @@ public class CDMServer {
             throw new CDMEmbeddedServerException(ioe);
         }
 
+        //TODO instead of strings, use the constants defined in eu.etaxonomy.cdm.opt.config.DataSourceConfigurer
         System.setProperty("spring.profiles.active", "remoting");
         System.setProperty("cdm.beanDefinitionFile", dataSourcesFile.getAbsolutePath());
         System.setProperty("cdm.datasource", dataSourceName);
@@ -177,9 +181,15 @@ public class CDMServer {
 
         Thread serverThread = new Thread() {
 
+
             @Override
             public void run() {
                 try {
+                    if(isForceSchemaCreate()) {
+                        System.setProperty("cdm.forceSchemaCreate", "true");
+                        potentiallyMissingSchema = false; // reset flag
+                        setForceSchemaCreate(false); // reset flag
+                    }
                     server.start();
                     server.join();
                 } catch (Throwable t) {
@@ -189,7 +199,21 @@ public class CDMServer {
                         Thread.sleep(1000);
                     } catch (InterruptedException e) {
                     }
+                    Throwable cause = t;
+                    while(cause != null) {
+
+                        // pure string comparison to avoid dependencies to hibernate or cdmlib-persistance in the taxeditor
+                        if(cause.getClass().getSimpleName().equals("SchemaExtractionException") || cause.getClass().getSimpleName().equals("CdmDatabaseException") ) {
+                            potentiallyMissingSchema = true;
+                            logger.debug(cause.getClass().getName() + " detected which indicates missing or corrupt schema");
+                            cause = null;
+                        } else {
+                            cause = cause.getCause();
+                        }
+                    }
                     cdmServerError.handleError(new RuntimeException("Error during CDM server startup", t));
+                } finally {
+                    //System.getProperties().remove("cdm.forceSchemaCreate");
                 }
             }
         };
@@ -247,5 +271,17 @@ public class CDMServer {
         }
     }
 
+    public boolean isForceSchemaCreate() {
+        return forceSchemaCreate;
+    }
+
+    public void setForceSchemaCreate(boolean forceSchemaCreate) {
+        this.forceSchemaCreate = forceSchemaCreate;
+    }
+
+    public boolean isPotentiallyMissingSchema() {
+        return potentiallyMissingSchema;
+    }
+
 
 }