From 05732352511fb5be5a3d2d131b80affeb1710c1d Mon Sep 17 00:00:00 2001
From: bourgesl <bourges.laurent@gmail.com>
Date: Mon, 26 Mar 2018 16:18:44 +0200
Subject: [PATCH] javadoc + datacite sync: show all DOIs

---
 src/main/java/fr/osug/DOIApplication.java     | 24 ++++-----
 src/main/java/fr/osug/doi/DOIConfig.java      | 49 ++++++++++++++++-
 .../fr/osug/doi/DataciteSyncPipeline.java     | 52 +++++++++----------
 .../java/fr/osug/doi/GeneratePipeline.java    |  2 +-
 .../fr/osug/doi/GenerateRedirectPipeline.java |  2 +-
 .../java/fr/osug/doi/ProcessPipeline.java     |  2 +-
 .../java/fr/osug/doi/ProcessUrlPipeline.java  |  2 +-
 src/main/java/fr/osug/doi/RemovePipeline.java |  2 +-
 8 files changed, 90 insertions(+), 45 deletions(-)

diff --git a/src/main/java/fr/osug/DOIApplication.java b/src/main/java/fr/osug/DOIApplication.java
index 4b22103..2c557d3 100644
--- a/src/main/java/fr/osug/DOIApplication.java
+++ b/src/main/java/fr/osug/DOIApplication.java
@@ -148,9 +148,8 @@ public class DOIApplication {
             final boolean saveCSV = aa.containsOption("csv");
 
             try {
-                final ProjectConfig projectConfig = new ProjectConfig(doiConfig.getPathConfig(), project);
-
-                final AbstractPipeline<?> pipeline = doiConfig.getProcessPipeline(saveCSV, projectConfig);
+                // Staging only
+                final AbstractPipeline<?> pipeline = doiConfig.getProcessPipeline(saveCSV, getProjectConfig(project));
                 pipeline.execute();
 
             } catch (IOException ioe) {
@@ -163,9 +162,8 @@ public class DOIApplication {
             final String project = getRequiredValue("project", aa);
 
             try {
-                final ProjectConfig projectConfig = new ProjectConfig(doiConfig.getPathConfig(), project);
-
-                final AbstractPipeline<?> pipeline = doiConfig.getProcessUrlPipeline(projectConfig, null);
+                // Staging only
+                final AbstractPipeline<?> pipeline = doiConfig.getProcessUrlPipeline(getProjectConfig(project), null);
                 pipeline.execute();
 
             } catch (IOException ioe) {
@@ -185,9 +183,8 @@ public class DOIApplication {
                 final char ch = (char) in.readByte();
 
                 if (Character.toLowerCase(ch) == 'y') {
-                    final ProjectConfig projectConfig = new ProjectConfig(doiConfig.getPathConfig(), project);
-
-                    final AbstractPipeline<?> pipeline = doiConfig.getPublishPipeline(projectConfig, doiPattern);
+                    // Public only
+                    final AbstractPipeline<?> pipeline = doiConfig.getPublishPipeline(getProjectConfig(project), doiPattern);
                     pipeline.execute();
                 } else {
                     logger.info("Action cancelled ({})", ch);
@@ -210,9 +207,8 @@ public class DOIApplication {
                 final char ch = (char) in.readByte();
 
                 if (Character.toLowerCase(ch) == 'y') {
-                    final ProjectConfig projectConfig = new ProjectConfig(doiConfig.getPathConfig(), project);
-
-                    final AbstractPipeline<?> pipeline = doiConfig.getRemovePipeline(projectConfig, doiPattern);
+                    // Staging only
+                    final AbstractPipeline<?> pipeline = doiConfig.getRemovePipeline(getProjectConfig(project), doiPattern);
                     pipeline.execute();
                 } else {
                     logger.info("Action cancelled ({})", ch);
@@ -241,6 +237,10 @@ public class DOIApplication {
             }
         }
 
+        private ProjectConfig getProjectConfig(final String project) throws IOException {
+            return new ProjectConfig(doiConfig.getPathConfig(), project);
+        }
+
         /** Show command arguments help. */
         public static void showArgumentsHelp() {
             System.out.println("---------------------------------- Arguments help ------------------------------");
diff --git a/src/main/java/fr/osug/doi/DOIConfig.java b/src/main/java/fr/osug/doi/DOIConfig.java
index 6e14895..eff44b2 100644
--- a/src/main/java/fr/osug/doi/DOIConfig.java
+++ b/src/main/java/fr/osug/doi/DOIConfig.java
@@ -84,6 +84,12 @@ public class DOIConfig {
         logger.info("Enable Datacite Client: {}", isDataciteClientEnabled());
     }
 
+    /**
+    * (CLI) Get the Process pipeline (Staging only)
+    * @param saveCSV save CSV (intermediate results)
+    * @param projectConfig project config to use
+    * @return new pipeline instance
+    */
     @Bean
     @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public ProcessPipeline getProcessPipeline(final boolean saveCSV,
@@ -96,6 +102,12 @@ public class DOIConfig {
         );
     }
 
+    /**
+    * (CLI) Get the Process URL pipeline (Staging only)
+    * @param projectConfig project config to use
+    * @param pipeData optional pipeline data
+    * @return new pipeline instance
+    */
     @Bean
     @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public ProcessUrlPipeline getProcessUrlPipeline(final ProjectConfig projectConfig,
@@ -108,11 +120,17 @@ public class DOIConfig {
         );
     }
 
+    /**
+    * (CLI) Get the Publish pipeline (Public only)
+    * @param projectConfig project config to use
+    * @param doiPattern pattern to match DOI suffix
+    * @return new pipeline instance
+    */
     @Bean
     @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public PublishPipeline getPublishPipeline(final ProjectConfig projectConfig,
                                               final String doiPattern) {
-        final PipelineCommonData pipelineData = new PipelineCommonData(pathConfig);
+        final PipelineCommonData pipelineData = createPipelineData(null);
         pipelineData.addProjectConfig(projectConfig);
         pipelineData.setDoiPattern(doiPattern);
 
@@ -121,11 +139,17 @@ public class DOIConfig {
         );
     }
 
+    /**
+    * (CLI) Get the Remove pipeline (Staging only)
+    * @param projectConfig project config to use
+    * @param doiPattern pattern to match DOI suffix
+    * @return new pipeline instance
+    */
     @Bean
     @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public RemovePipeline getRemovePipeline(final ProjectConfig projectConfig,
                                             final String doiPattern) {
-        final PipelineCommonData pipelineData = new PipelineCommonData(pathConfig);
+        final PipelineCommonData pipelineData = createPipelineData(null);
         pipelineData.addProjectConfig(projectConfig);
         pipelineData.setDoiPattern(doiPattern);
 
@@ -134,6 +158,13 @@ public class DOIConfig {
         );
     }
 
+    /**
+    * (CLI) Get the Generate pipeline (Public / Staging)
+    * @param doStaging true to process Staging: web pages & datacite sync
+    * @param doPublic true to process Public: web pages & datacite sync
+    * @param pipeData optional pipeline data
+    * @return new pipeline instance
+    */
     @Bean
     @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public GeneratePipeline getGeneratePipeline(final boolean doStaging, final boolean doPublic,
@@ -144,6 +175,13 @@ public class DOIConfig {
         );
     }
 
+    /**
+    * Get the Generate Redirect pipeline (Public / Staging)
+    * @param doStaging true to process Staging: datacite sync
+    * @param doPublic true to process Public: datacite sync
+    * @param pipeData optional pipeline data
+    * @return new pipeline instance
+    */
     @Bean
     @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public GenerateRedirectPipeline getGenerateRedirectPipeline(final boolean doStaging, final boolean doPublic,
@@ -154,6 +192,13 @@ public class DOIConfig {
         );
     }
 
+    /**
+    * Get the Datacite Sync pipeline (Public / Staging)
+    * @param doStaging true to process Staging: datacite sync
+    * @param doPublic true to process Public: datacite sync
+    * @param pipeData optional pipeline data
+    * @return new pipeline instance
+    */
     @Bean
     @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public DataciteSyncPipeline getDataciteSyncPipeline(final boolean doStaging, final boolean doPublic,
diff --git a/src/main/java/fr/osug/doi/DataciteSyncPipeline.java b/src/main/java/fr/osug/doi/DataciteSyncPipeline.java
index 691edca..3192ae1 100644
--- a/src/main/java/fr/osug/doi/DataciteSyncPipeline.java
+++ b/src/main/java/fr/osug/doi/DataciteSyncPipeline.java
@@ -18,7 +18,7 @@ import org.slf4j.LoggerFactory;
 /**
  *
  */
-public class DataciteSyncPipeline extends AbstractPipeline<PipelineCommonData> {
+public final class DataciteSyncPipeline extends AbstractPipeline<PipelineCommonData> {
 
     private final static Logger logger = LoggerFactory.getLogger(DataciteSyncPipeline.class.getName());
 
@@ -38,10 +38,6 @@ public class DataciteSyncPipeline extends AbstractPipeline<PipelineCommonData> {
 
     @Override
     public void doExecute() throws IOException {
-        if (!doiConfig.isDataciteClientEnabled()) {
-            logger.warn("publishDatacite: skipping - datacite client disabled.");
-            return;
-        }
         logger.info("doStaging: {}", doStaging);
         logger.info("doPublic:  {}", doPublic);
 
@@ -108,37 +104,41 @@ public class DataciteSyncPipeline extends AbstractPipeline<PipelineCommonData> {
                     logger.warn("Ignoring {} - missing xml at {}", doiSuffix, doiFile);
                 }
             } else {
-                // only skip staging DOI:
-                // TODO: consider for public once it is tested:
-                final boolean exist = (isStaging && publishedDois != null) ? publishedDois.contains(doi.toUpperCase()) : false;
+                if (!doiConfig.isDataciteClientEnabled()) {
+                    logger.warn("skipping DOI [{}] - datacite client disabled", doi);
+                } else {
+                    // only skip staging DOI:
+                    // TODO: consider for public once it is tested:
+                    final boolean exist = (isStaging && publishedDois != null) ? publishedDois.contains(doi.toUpperCase()) : false;
 
-                boolean push = true;
+                    boolean push = true;
 
-                if (exist) {
-                    // verify that URL and metadata (MD5) are equivalent:
-                    if (url.equals(d.getDataciteUrl()) && d.getMetadataMd5().equals(d.getDataciteMetadataMd5())) {
-                        push = false;
+                    if (exist) {
+                        // verify that URL and metadata (MD5) are equivalent:
+                        if (url.equals(d.getDataciteUrl()) && d.getMetadataMd5().equals(d.getDataciteMetadataMd5())) {
+                            push = false;
+                        }
                     }
-                }
 
-                if (push) {
-                    logger.info("publish DOI [{}]", doi);
+                    if (push) {
+                        logger.info("publish DOI [{}]", doi);
 
-                    // Push DOI in staging phase:
-                    final String metadata = FileUtils.readFile(doiFile);
+                        // Push DOI in staging phase:
+                        final String metadata = FileUtils.readFile(doiFile);
 
-                    if (dc.publishDoi(doi, url, metadata)) {
-                        // update database:
-                        if (isStaging) {
-                            doiService.updateStagingDoiDatacite(doiSuffix, d.getMetadataMd5(), url, now);
+                        if (dc.publishDoi(doi, url, metadata)) {
+                            // update database:
+                            if (isStaging) {
+                                doiService.updateStagingDoiDatacite(doiSuffix, d.getMetadataMd5(), url, now);
+                            } else {
+                                doiService.updatePublicDoiDatacite(doiSuffix, d.getMetadataMd5(), url, now);
+                            }
                         } else {
-                            doiService.updatePublicDoiDatacite(doiSuffix, d.getMetadataMd5(), url, now);
+                            logger.error("Failed to push DOI[{}] to datacite", doi);
                         }
                     } else {
-                        logger.error("Failed to push DOI[{}] to datacite", doi);
+                        logger.info("skipping DOI [{}] - datacite is up-to-date", doi);
                     }
-                } else {
-                    logger.info("skipping DOI [{}] - datacite is up-to-date", doi);
                 }
             }
         }
diff --git a/src/main/java/fr/osug/doi/GeneratePipeline.java b/src/main/java/fr/osug/doi/GeneratePipeline.java
index 8699c88..cb5ecb1 100644
--- a/src/main/java/fr/osug/doi/GeneratePipeline.java
+++ b/src/main/java/fr/osug/doi/GeneratePipeline.java
@@ -30,7 +30,7 @@ import java.util.Date;
 /**
  *
  */
-public class GeneratePipeline extends AbstractPipeline<PipelineCommonData> {
+public final class GeneratePipeline extends AbstractPipeline<PipelineCommonData> {
 
     private final static Logger logger = LoggerFactory.getLogger(GeneratePipeline.class.getName());
 
diff --git a/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java b/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java
index 8fe01ac..d618e21 100644
--- a/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java
+++ b/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java
@@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory;
 /**
  *
  */
-public class GenerateRedirectPipeline extends AbstractPipeline<PipelineCommonData> {
+public final class GenerateRedirectPipeline extends AbstractPipeline<PipelineCommonData> {
 
     private final static Logger logger = LoggerFactory.getLogger(GenerateRedirectPipeline.class.getName());
 
diff --git a/src/main/java/fr/osug/doi/ProcessPipeline.java b/src/main/java/fr/osug/doi/ProcessPipeline.java
index efc13c9..18897b9 100644
--- a/src/main/java/fr/osug/doi/ProcessPipeline.java
+++ b/src/main/java/fr/osug/doi/ProcessPipeline.java
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
 /**
  *
  */
-public class ProcessPipeline extends AbstractPipeline<ProcessPipelineData> {
+public final class ProcessPipeline extends AbstractPipeline<ProcessPipelineData> {
 
     private final static Logger logger = LoggerFactory.getLogger(ProcessPipeline.class.getName());
 
diff --git a/src/main/java/fr/osug/doi/ProcessUrlPipeline.java b/src/main/java/fr/osug/doi/ProcessUrlPipeline.java
index d4f634a..31051bf 100644
--- a/src/main/java/fr/osug/doi/ProcessUrlPipeline.java
+++ b/src/main/java/fr/osug/doi/ProcessUrlPipeline.java
@@ -19,7 +19,7 @@ import org.slf4j.LoggerFactory;
 /**
  *
  */
-public class ProcessUrlPipeline extends AbstractPipeline<PipelineCommonData> {
+public final class ProcessUrlPipeline extends AbstractPipeline<PipelineCommonData> {
 
     private final static Logger logger = LoggerFactory.getLogger(ProcessUrlPipeline.class.getName());
 
diff --git a/src/main/java/fr/osug/doi/RemovePipeline.java b/src/main/java/fr/osug/doi/RemovePipeline.java
index 33015c6..397bf12 100644
--- a/src/main/java/fr/osug/doi/RemovePipeline.java
+++ b/src/main/java/fr/osug/doi/RemovePipeline.java
@@ -20,7 +20,7 @@ import org.slf4j.LoggerFactory;
 /**
  *
  */
-public class RemovePipeline extends AbstractPipeline<PipelineCommonData> {
+public final class RemovePipeline extends AbstractPipeline<PipelineCommonData> {
 
     private final static Logger logger = LoggerFactory.getLogger(RemovePipeline.class.getName());
 
-- 
GitLab