diff --git a/resources/xsl/4.1/doi2landing.xsl b/resources/xsl/4.1/doi2landing.xsl index dcf94ec8e93c2337c65d6040f375156a5131f0e2..c5711f9ffcd6aa9010522d7e7f8b47ef7b47026e 100644 --- a/resources/xsl/4.1/doi2landing.xsl +++ b/resources/xsl/4.1/doi2landing.xsl @@ -26,6 +26,9 @@ <xsl:param name="data_access_html" select="''"/> <xsl:param name="data_access_url" select="''"/> + <xsl:param name="data_access_alt_html" select="''"/> + <xsl:param name="data_access_alt_url" select="''"/> + <!-- optional external landing page --> <xsl:param name="landing_page_url" select="''"/> @@ -130,6 +133,27 @@ </a> </p> </xsl:if> + <xsl:if test="$data_access_alt_url"> + <xsl:choose> + <xsl:when test="$data_access_alt_html = ''">Missing alternative instructions to access data or services !</xsl:when> + <xsl:otherwise> + <!-- load fragment --> + <xsl:variable name="fragment" select="document($data_access_alt_html)"/> + + <xsl:choose> + <xsl:when test="count($fragment/xhtml:html/xhtml:body/child::node()) = 0">Missing alternative instructions to access data or services !</xsl:when> + <xsl:otherwise> + <xsl:copy-of select="$fragment/xhtml:html/xhtml:body/child::node()"/> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + <p> + <a href="{$data_access_alt_url}" target="_blank"> + <xsl:value-of select="$data_access_alt_url"/> + </a> + </p> + </xsl:if> </div> </div> </xsl:template> diff --git a/src/main/java/fr/osug/doi/GeneratePipeline.java b/src/main/java/fr/osug/doi/GeneratePipeline.java index 8695b2eb79ba6434eac4d655020122ed51cb02d2..66c1ab69666aa2683af455d3cf2650b7f9d18c6d 100644 --- a/src/main/java/fr/osug/doi/GeneratePipeline.java +++ b/src/main/java/fr/osug/doi/GeneratePipeline.java @@ -50,7 +50,9 @@ public final class GeneratePipeline extends AbstractPipeline<PipelineCommonData> // xslt parameters (doi2landing): private final static String XSLT_PARAM_DATA_ACCESS_HTML = "data_access_html"; + private final static String XSLT_PARAM_DATA_ACCESS_ALT_HTML = "data_access_alt_html"; private final static String XSLT_PARAM_DATA_ACCESS_URL = "data_access_url"; + private final static String XSLT_PARAM_DATA_ACCESS_ALT_URL = "data_access_alt_url"; private final static String XSLT_PARAM_EMBEDDED = "embedded"; private final static String XSLT_PARAM_EMBEDDED_FULL = "full"; private final static String XSLT_PARAM_EMBEDDED_HEADER = "header"; @@ -147,11 +149,17 @@ public final class GeneratePipeline extends AbstractPipeline<PipelineCommonData> final File dataAccessFileLocation = new File(projectConfig.getProjectConf(), ProjectConfig.CONFIG_ACCESS_INSTRUCTIONS); final File dataAccessFile = FileUtils.getFile(dataAccessFileLocation); + final File dataAccessAltFileLocation = new File(projectConfig.getProjectConf(), ProjectConfig.CONFIG_ACCESS_INSTRUCTIONS_ALT); + final File dataAccessAltFile = FileUtils.getFile(dataAccessAltFileLocation); + final Map<String, Object> xslParameters = new HashMap<String, Object>(8); xslParameters.put(XSLT_PARAM_DATE, pipeData.now.toString()); if (dataAccessFile != null) { xslParameters.put(XSLT_PARAM_DATA_ACCESS_HTML, dataAccessFile.toURI().toString()); } + if (dataAccessAltFile != null) { + xslParameters.put(XSLT_PARAM_DATA_ACCESS_ALT_HTML, dataAccessAltFile.toURI().toString()); + } final String projectName = projectConfig.getProjectName(); final Date now = pipeData.now; @@ -180,6 +188,15 @@ public final class GeneratePipeline extends AbstractPipeline<PipelineCommonData> xslParameters.remove(XSLT_PARAM_DATA_ACCESS_URL); } + // Get (optional) specific alternative data access URL: + final String dataAccessAltUrl = d.getDataAccessAltUrl(); + if (dataAccessAltUrl != null) { + logger.debug("dataAccessAltUrl: {}", dataAccessAltUrl); + xslParameters.put(XSLT_PARAM_DATA_ACCESS_ALT_URL, dataAccessAltUrl); + } else { + xslParameters.remove(XSLT_PARAM_DATA_ACCESS_ALT_URL); + } + // Get external Landing page URL: final String landingPageUrl = d.getLandingExtUrl(); if (landingPageUrl != null) { diff --git a/src/main/java/fr/osug/doi/ProcessUrlPipeline.java b/src/main/java/fr/osug/doi/ProcessUrlPipeline.java index 91c1cc3d86d22bd834b83512ef79b98437e823ae..15c346616abed300f71783c71cb70c6e56d8ef54 100644 --- a/src/main/java/fr/osug/doi/ProcessUrlPipeline.java +++ b/src/main/java/fr/osug/doi/ProcessUrlPipeline.java @@ -64,6 +64,15 @@ public final class ProcessUrlPipeline extends AbstractPipeline<PipelineCommonDat if (defaultDataAccessUrl == null) { logger.warn("Missing default data access url"); } + // optional alternative url: + final String defaultDataAccessAltUrl = projectConfig.getProperty(ProjectConfig.CONF_KEY_DATA_ACCESS_ALT_URL); + if (defaultDataAccessAltUrl != null) { + final File dataAccessAltFileLocation = new File(projectConfig.getProjectConf(), ProjectConfig.CONFIG_ACCESS_INSTRUCTIONS_ALT); + final File dataAccessAltFile = FileUtils.getFile(dataAccessAltFileLocation); + if (dataAccessAltFile == null) { + logger.warn("Missing dataAccessAltFile: {}", dataAccessAltFileLocation); + } + } final List<? extends DoiCommon> dList = dbr.findByProject(projectName); @@ -92,6 +101,17 @@ public final class ProcessUrlPipeline extends AbstractPipeline<PipelineCommonDat doiData.addError("Missing data access url"); } else { checkUrl(doiData, dataAccessUrl, true); + logger.debug("dataAccessUrl {}", dataAccessUrl); + } + + // Get (optional) specific alternative data access URL: + String dataAccessAltUrl = projectConfig.getUrlDataAccessAlt(doiSuffix); + if (dataAccessAltUrl == null) { + dataAccessAltUrl = defaultDataAccessAltUrl; + } + if (dataAccessAltUrl != null) { + checkUrl(doiData, dataAccessAltUrl, true); + logger.debug("dataAccessAltUrl {}", dataAccessAltUrl); } // Get external Landing page URL: @@ -101,7 +121,7 @@ public final class ProcessUrlPipeline extends AbstractPipeline<PipelineCommonDat logger.debug("landingPageUrl: {}", landingPageExtUrl); } - changed |= doiService.updateStagingDoiUrls(doiSuffix, dataAccessUrl, landingPageExtUrl, + changed |= doiService.updateStagingDoiUrls(doiSuffix, dataAccessUrl, dataAccessAltUrl, landingPageExtUrl, doiData.isValid(), doiData.messagesToString(), now); } @@ -116,11 +136,16 @@ public final class ProcessUrlPipeline extends AbstractPipeline<PipelineCommonDat private void checkUrl(final PipelineCommonDoiData doiData, final String url, final boolean binary) { logger.debug("checkUrl: {}", url); - Integer check = checkUrlCache.get(url); - if (check == null) { - final String doc = doiConfig.getUrlChecker().getResource(url, binary); - check = checkDocument(doc); - checkUrlCache.put(url, check); + int check = DOC_EMPTY; + if (url != null) { + final Integer cached = checkUrlCache.get(url); + if (cached != null) { + check = cached.intValue(); + } else { + final String doc = doiConfig.getUrlChecker().getResource(url, binary); + check = checkDocument(doc); + checkUrlCache.put(url, check); + } } logger.debug("check: {}", check); switch (check) { diff --git a/src/main/java/fr/osug/doi/ProjectConfig.java b/src/main/java/fr/osug/doi/ProjectConfig.java index 31389f0cc309d53be52c9e32cdc162dc6ea73a35..bbac3e8de20930c53eb83c85e404b11193a885e1 100644 --- a/src/main/java/fr/osug/doi/ProjectConfig.java +++ b/src/main/java/fr/osug/doi/ProjectConfig.java @@ -29,7 +29,10 @@ public final class ProjectConfig { public final static String CONF_PROJECT = "project.properties"; public final static String CONFIG_ACCESS_INSTRUCTIONS = "access_instruction.html"; + public final static String CONFIG_ACCESS_INSTRUCTIONS_ALT = "access_instruction_alt.html"; + public final static String CONF_URL_MAP_DATA_ACCESS = "doi_url_data_access.csv"; + public final static String CONF_URL_MAP_DATA_ACCESS_ALT = "doi_url_data_access_alt.csv"; public final static String CONF_URL_MAP_LANDING_PAGE = "doi_url_landing_page.csv"; private final static String CONF_OVERRIDE_NAMES_CSV = "names_override" + Const.FILE_EXT_CSV; @@ -42,6 +45,8 @@ public final class ProjectConfig { /** general data access url = "dataAccessUrl" */ public final static String CONF_KEY_DATA_ACCESS_URL = "dataAccessUrl"; + /** general data access alternative url = "dataAccessAltUrl" */ + public final static String CONF_KEY_DATA_ACCESS_ALT_URL = "dataAccessAltUrl"; /** generate embedded fragments = "generate_embedded" */ public final static String CONF_KEY_GENERATE_EMBEDDED = "generate_embedded"; @@ -52,6 +57,7 @@ public final class ProjectConfig { // lazy: private Properties properties = null; private Map<String, String> urlMapDataAccess = null; + private Map<String, String> urlMapDataAccessAlt = null; private Map<String, String> urlMapLandingPages = null; // Directories: private File metadataDir = null; @@ -236,6 +242,18 @@ public final class ProjectConfig { return getUrlMapDataAccess().get(doiSuffix); } + /* DataAccess Alternative Url Mapping */ + private Map<String, String> getUrlMapDataAccessAlt() throws IOException { + if (urlMapDataAccessAlt == null) { + urlMapDataAccessAlt = CsvUtil.loadUrlMapping(new File(this.projectConf, CONF_URL_MAP_DATA_ACCESS_ALT)); + } + return urlMapDataAccessAlt; + } + + public String getUrlDataAccessAlt(final String doiSuffix) throws IOException { + return getUrlMapDataAccessAlt().get(doiSuffix); + } + /* LandingPage Url Mapping */ private Map<String, String> getUrlMapLandingPage() throws IOException { if (urlMapLandingPages == null) { diff --git a/src/main/java/fr/osug/doi/domain/DoiCommon.java b/src/main/java/fr/osug/doi/domain/DoiCommon.java index 4ed2bebffa3b3679b16472b6d8737f916d357830..d2d922a1964722eb5cc825a7e37d78aa3a3a3615 100644 --- a/src/main/java/fr/osug/doi/domain/DoiCommon.java +++ b/src/main/java/fr/osug/doi/domain/DoiCommon.java @@ -52,6 +52,9 @@ public abstract class DoiCommon implements Persistable<Long> { /* url fields */ @Column(name = "data_access_url") private String dataAccessUrl; + + @Column(name = "data_access_alt_url") + private String dataAccessAltUrl; @Column(name = "landing_ext_url") private String landingExtUrl; @@ -116,6 +119,14 @@ public abstract class DoiCommon implements Persistable<Long> { this.dataAccessUrl = dataAccessUrl; } + public String getDataAccessAltUrl() { + return dataAccessAltUrl; + } + + public void setDataAccessAltUrl(String dataAccessAltUrl) { + this.dataAccessAltUrl = dataAccessAltUrl; + } + public String getLandingExtUrl() { return landingExtUrl; } @@ -181,6 +192,7 @@ public abstract class DoiCommon implements Persistable<Long> { + ", updateDate='" + updateDate + "'" + ", metadataMd5='" + metadataMd5 + "'" + ", dataAccessUrl='" + dataAccessUrl + "'" + + ", dataAccessAltUrl='" + dataAccessAltUrl + "'" + ", landingExtUrl='" + landingExtUrl + "'" + ", landingLocUrl='" + landingLocUrl + "'" + ", dataciteMetadataMd5='" + dataciteMetadataMd5 + "'" diff --git a/src/main/java/fr/osug/doi/service/DoiService.java b/src/main/java/fr/osug/doi/service/DoiService.java index 14c17f23b1f18e0abe723daf96715ea265dfc4a3..67474a13a21dfb9bf1ef68aa6418db4df2607d48 100644 --- a/src/main/java/fr/osug/doi/service/DoiService.java +++ b/src/main/java/fr/osug/doi/service/DoiService.java @@ -193,7 +193,8 @@ public class DoiService { @Transactional public boolean updateStagingDoiUrls(final String identifier, - final String dataAccessUrl, final String landingExtUrl, + final String dataAccessUrl, final String dataAccessAltUrl, + final String landingExtUrl, final boolean urlValid, final String urlLog, final Date now) { @@ -211,6 +212,12 @@ public class DoiService { doiStaging.setDataAccessUrl(dataAccessUrl); changed = true; } + final String oldDataAccessAltUrl = doiStaging.getDataAccessAltUrl(); + if ((dataAccessAltUrl != null && !dataAccessAltUrl.equals(oldDataAccessAltUrl)) + || (oldDataAccessAltUrl != null && !oldDataAccessUrl.equals(dataAccessUrl))) { + doiStaging.setDataAccessAltUrl(dataAccessAltUrl); + changed = true; + } final String oldLandingExtUrl = doiStaging.getLandingExtUrl(); if ((landingExtUrl != null && !landingExtUrl.equals(oldLandingExtUrl)) || (oldLandingExtUrl != null && !oldLandingExtUrl.equals(landingExtUrl))) { @@ -334,6 +341,7 @@ public class DoiService { doiPublic.setUpdateDate(now); doiPublic.setMetadataMd5(metadataMd5); doiPublic.setDataAccessUrl(doiStaging.getDataAccessUrl()); + doiPublic.setDataAccessAltUrl(doiStaging.getDataAccessAltUrl()); doiPublic.setLandingExtUrl(doiStaging.getLandingExtUrl()); // TODO: handle external url checks diff --git a/src/main/resources/db/migration/V1_1__altDataAccessUrl.sql b/src/main/resources/db/migration/V1_1__altDataAccessUrl.sql new file mode 100644 index 0000000000000000000000000000000000000000..1f0429b765b61bd79d1817678c178b5a344c84e6 --- /dev/null +++ b/src/main/resources/db/migration/V1_1__altDataAccessUrl.sql @@ -0,0 +1,10 @@ + +/* DOI STAGING */ +alter table doi_staging + add column data_access_alt_url varchar(1024); + +/* DOI PUBLIC */ +alter table doi_public + add column data_access_alt_url varchar(1024); + +/* EOF */ \ No newline at end of file