Implementing version management

This commit is contained in:
Luca Frosini 2023-01-11 17:39:01 +01:00
parent d93351144d
commit ae391e637f
10 changed files with 164 additions and 134 deletions

View File

@ -1,15 +1,12 @@
package org.gcube.common.software.analyser;
import java.io.File;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.gcube.com.fasterxml.jackson.core.JsonProcessingException;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode;
import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode;
import org.gcube.common.software.model.SoftwareConcept;
import org.gcube.common.software.model.SoftwareVersion;
import org.gcube.common.software.model.Variables;
@ -42,8 +39,10 @@ public class SoftwareConceptAnalyser {
protected JsonNode actualize(JsonNode version) throws Exception {
Variables variables = objectMapper.treeToValue(version, Variables.class);
Set<String> missingVariables = variables.parse();
if(missingVariables.size()>0) {
throw new Exception("");
int size = missingVariables.size();
if(size>0) {
throw new Exception("The following variables has been used but not defined or cannot be actualised" +
missingVariables.toArray(new String[size]).toString());
}
JsonNode swVersion = objectMapper.convertValue(variables.getProperties(), JsonNode.class);
return swVersion;
@ -70,6 +69,7 @@ public class SoftwareConceptAnalyser {
softwareVersion.getPrevious()!=null ? softwareVersion.getPrevious().getVersion(): null);
SoftwareVersionAnalyser softwareVersionAnalyser = new SoftwareVersionAnalyser(softwareVersion);
softwareVersionAnalyser.setOriginalJson(jsonNode);
softwareVersionAnalyser.setFirst(i==0);
softwareVersionAnalyser.analyse();

View File

@ -2,11 +2,12 @@ package org.gcube.common.software.analyser;
import java.util.List;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode;
import org.gcube.common.software.model.SoftwareVersion;
import org.gcube.common.software.model.SoftwareVersionFile;
import org.gcube.common.software.process.export.SoftwareVersionExporter;
import org.gcube.common.software.process.publish.SoftwareVersionPublisher;
import org.gcube.common.software.utils.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -17,6 +18,7 @@ public class SoftwareVersionAnalyser {
private static final Logger logger = LoggerFactory.getLogger(SoftwareConceptAnalyser.class);
protected JsonNode originalJson;
protected SoftwareVersion softwareVersion;
protected boolean first;
@ -32,26 +34,39 @@ public class SoftwareVersionAnalyser {
this.first = first;
}
public void setOriginalJson(JsonNode jsonNode) {
this.originalJson = jsonNode;
}
public void analyse() throws Exception {
ObjectMapper objectMapper = Utils.getObjectMapper();
logger.debug("SoftwareVersion: {}", objectMapper.writeValueAsString(softwareVersion));
List<SoftwareVersionFile> files = softwareVersion.getFiles();
for(SoftwareVersionFile file : files) {
}
ObjectNode publishers = (ObjectNode) originalJson.get("publishers");
List<SoftwareVersionPublisher> svps = SoftwareVersionPublisher.getPublishers();
for(SoftwareVersionPublisher svp: svps) {
JsonNode conf = publishers.get(svp.getClass().getSimpleName());
svp.setSpecificConfiguration(conf);
svp.setSoftwareVersion(softwareVersion);
svp.setObjectMapper(objectMapper);
svp.setFirst(first);
svp.publish();
}
ObjectNode exporters = (ObjectNode) originalJson.get("exporters");
List<SoftwareVersionExporter> sves = SoftwareVersionExporter.getExporters();
for(SoftwareVersionExporter sve: sves) {
JsonNode conf = publishers.get(exporters.getClass().getSimpleName());
sve.setSpecificConfiguration(conf);
sve.setSoftwareVersion(softwareVersion);
sve.setObjectMapper(objectMapper);
sve.setFirst(first);
sve.export();
}
}
}

View File

@ -5,7 +5,6 @@ import java.util.List;
import java.util.Set;
import org.gcube.com.fasterxml.jackson.annotation.JsonFormat;
import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore;
import org.gcube.com.fasterxml.jackson.annotation.JsonProperty;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode;

View File

@ -30,6 +30,9 @@ public class SoftwareVersion extends SoftwareConcept {
@JsonIgnore
protected Boolean newDeposition;
@JsonIgnore
protected Variables variables;
@JsonProperty(VERSION_PROPERTY_NAME)
protected String version;
@ -80,6 +83,16 @@ public class SoftwareVersion extends SoftwareConcept {
public void setNewDeposition(Boolean newVersion) {
this.newDeposition = newVersion;
}
@JsonIgnore
public Variables getVariables() {
return variables;
}
@JsonIgnore
public void setVariables(Variables variables) {
this.variables = variables;
}
@JsonGetter(value = VERSION_PROPERTY_NAME)
public String getVersion() {

View File

@ -0,0 +1,35 @@
package org.gcube.common.software.process;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.common.software.model.SoftwareVersion;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public abstract class SoftwareVersionProcessor {
protected SoftwareVersion softwareVersion;
protected JsonNode configuration;
protected boolean first;
public SoftwareVersion getSoftwareVersion() {
return softwareVersion;
}
public void setSoftwareVersion(SoftwareVersion softwareVersion) {
this.softwareVersion = softwareVersion;
}
public boolean isFirst() {
return first;
}
public void setFirst(boolean first) {
this.first = first;
}
public void setSpecificConfiguration(JsonNode conf) {
this.configuration = conf;
}
}

View File

@ -3,14 +3,13 @@ package org.gcube.common.software.process.export;
import java.util.ArrayList;
import java.util.List;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
import org.gcube.common.software.model.SoftwareVersion;
import org.gcube.common.software.process.SoftwareVersionProcessor;
import org.gcube.common.software.process.export.biblatex.BibLaTeXSoftwareVersionExporter;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public abstract class SoftwareVersionExporter {
public abstract class SoftwareVersionExporter extends SoftwareVersionProcessor {
public static List<SoftwareVersionExporter> getExporters() {
List<SoftwareVersionExporter> sves = new ArrayList<>();
@ -18,34 +17,6 @@ public abstract class SoftwareVersionExporter {
return sves;
}
protected SoftwareVersion softwareVersion;
protected ObjectMapper objectMapper;
protected boolean first;
public SoftwareVersion getSoftwareVersion() {
return softwareVersion;
}
public void setSoftwareVersion(SoftwareVersion softwareVersion) {
this.softwareVersion = softwareVersion;
}
public ObjectMapper getObjectMapper() {
return objectMapper;
}
public void setObjectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
public boolean isFirst() {
return first;
}
public void setFirst(boolean first) {
this.first = first;
}
public abstract void export() throws Exception;
}

View File

@ -3,14 +3,13 @@ package org.gcube.common.software.process.publish;
import java.util.ArrayList;
import java.util.List;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
import org.gcube.common.software.model.SoftwareVersion;
import org.gcube.common.software.process.SoftwareVersionProcessor;
import org.gcube.common.software.process.publish.zenodo.ZenodoSoftwareVersionPublisher;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public abstract class SoftwareVersionPublisher {
public abstract class SoftwareVersionPublisher extends SoftwareVersionProcessor {
public static List<SoftwareVersionPublisher> getPublishers() {
List<SoftwareVersionPublisher> svps = new ArrayList<>();
@ -18,34 +17,6 @@ public abstract class SoftwareVersionPublisher {
return svps;
}
protected SoftwareVersion softwareVersion;
protected ObjectMapper objectMapper;
protected boolean first;
public SoftwareVersion getSoftwareVersion() {
return softwareVersion;
}
public void setSoftwareVersion(SoftwareVersion softwareVersion) {
this.softwareVersion = softwareVersion;
}
public ObjectMapper getObjectMapper() {
return objectMapper;
}
public void setObjectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
public boolean isFirst() {
return first;
}
public void setFirst(boolean first) {
this.first = first;
}
public abstract void publish() throws Exception;
}

View File

@ -16,6 +16,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.ws.rs.client.Client;
@ -25,6 +26,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode;
import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode;
import org.gcube.common.gxhttp.request.GXHTTPStringRequest;
@ -32,6 +34,7 @@ import org.gcube.common.software.config.Config;
import org.gcube.common.software.model.ElaborationType;
import org.gcube.common.software.model.SoftwareVersionFile;
import org.gcube.common.software.process.publish.SoftwareVersionPublisher;
import org.gcube.common.software.utils.Utils;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
@ -151,12 +154,9 @@ public class ZenodoSoftwareVersionPublisher extends SoftwareVersionPublisher {
String id = getZenodoIDFromDOIURL(softwareVersion.getVersionDOIURL());
gxHTTPStringRequest.path(DEPOSITION_PATH.replace(":id", id));
ObjectNode body = objectMapper.createObjectNode();
ObjectNode metadata = generateMetadata();
body.set(METADATA_FIELD_NAME, metadata);
HttpURLConnection httpURLConnection = gxHTTPStringRequest.put(objectMapper.writeValueAsString(body));
HttpURLConnection httpURLConnection = gxHTTPStringRequest.put(Utils.getObjectMapper().writeValueAsString(metadata));
getResponse(httpURLConnection);
}
@ -253,7 +253,7 @@ public class ZenodoSoftwareVersionPublisher extends SoftwareVersionPublisher {
String res = result.toString();
logger.trace("Server returned content : {}", res);
return objectMapper.readTree(res);
return Utils.getObjectMapper().readTree(res);
} finally {
connection.disconnect();
}
@ -272,12 +272,9 @@ public class ZenodoSoftwareVersionPublisher extends SoftwareVersionPublisher {
gxHTTPStringRequest.header("Accept", "application/json");
gxHTTPStringRequest.path(DEPOSITIONS_COLLECTION_PATH);
ObjectNode body = objectMapper.createObjectNode();
ObjectNode metadata = generateMetadata();
body.set(METADATA_FIELD_NAME, metadata);
HttpURLConnection httpURLConnection = gxHTTPStringRequest.post(objectMapper.writeValueAsString(body));
HttpURLConnection httpURLConnection = gxHTTPStringRequest.post(Utils.getObjectMapper().writeValueAsString(metadata));
response = getResponse(httpURLConnection);
URL conceptDOIURL = createZenodoDOIURLFromID(response.get("conceptrecid").asText());
@ -287,10 +284,72 @@ public class ZenodoSoftwareVersionPublisher extends SoftwareVersionPublisher {
finalize();
}
private ArrayNode getAuthors(){
ArrayNode authors = softwareVersion.getAuthors().deepCopy();
return authors;
}
private String getDescription() {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(configuration.get("html_description").asText());
String codeLocation = softwareVersion.getCodeLocation();
if(codeLocation!=null) {
String htmlCodeLocation = configuration.get("html_code_location").asText();
htmlCodeLocation = Utils.replaceVariable("code_location", codeLocation, htmlCodeLocation);
stringBuffer.append(htmlCodeLocation);
}
return stringBuffer.toString();
}
private ArrayNode getGrants(){
ArrayNode grants = softwareVersion.getGrants().deepCopy();
for(JsonNode g : grants) {
ObjectNode grant = (ObjectNode) g;
grant.remove("name");
grant.remove("url");
}
return grants;
}
private ArrayNode getKeywords(){
Set<String> keywords = softwareVersion.getKeywords();
ObjectMapper objectMapper = Utils.getObjectMapper();
ArrayNode keywordsArrayNode = objectMapper.createArrayNode();
for(String keyword : keywords) {
keywordsArrayNode.add(keyword);
}
return keywordsArrayNode;
}
private String getLicense() {
return softwareVersion.getLicense().get("id").asText();
}
private String getDate() {
return Utils.getDateAsString(softwareVersion.getDate());
}
private ObjectNode generateMetadata() {
// TODO Auto-generated method stub
return null;
ObjectMapper objectMapper = Utils.getObjectMapper();
ObjectNode metadatWrapper = objectMapper.createObjectNode();
ObjectNode metadata = objectMapper.createObjectNode();
metadata.put("access_right", "open");
metadata.put("upload_type", "software");
metadata.replace("creators", getAuthors());
metadata.put("description", getDescription());
metadata.replace("grants", getGrants());
metadata.replace("keywords", getKeywords());
metadata.put("license", getLicense());
metadata.put("publication_date", getDate());
metadata.put("title", softwareVersion.getTitle());
metadata.put("version", softwareVersion.getVersion());
metadatWrapper.set(METADATA_FIELD_NAME, metadata);
return metadatWrapper;
}
public void update() throws Exception {

View File

@ -2,7 +2,6 @@ package org.gcube.common.software.analyser;
import java.io.File;
import org.gcube.common.software.model.SoftwareConcept;
import org.gcube.common.software.utils.FileUtils;
import org.junit.Test;

View File

@ -146,9 +146,7 @@
"gcube_release_ticket": null,
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1139446",
"code_location": null,
"publish": false,
"export": true
"code_location": null
},
{
"version": "1.1.0",
@ -168,9 +166,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/12988",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1140461",
"code_location": null,
"publish": false,
"export": true
"code_location": null
},
{
"version": "1.2.0",
@ -186,9 +182,7 @@
"gcube_release_ticket": null,
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1140750",
"code_location": null,
"publish": false,
"export": true
"code_location": null
},
{
"version": "1.3.0",
@ -208,9 +202,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/16743",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1143572",
"code_location": null,
"publish": false,
"export": true
"code_location": null
},
{
"version": "1.4.0",
@ -220,9 +212,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/17294",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1143583",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "1.4.1",
@ -232,9 +222,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/18335",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1143585",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "1.4.2",
@ -244,9 +232,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/18507",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1143586",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "1.4.3",
@ -256,9 +242,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/19322",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1143587",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "1.4.4",
@ -268,9 +252,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/20648",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1143589",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "1.4.5",
@ -280,9 +262,7 @@
"gcube_release_ticket": "https://support.d4science.org/issues/20920",
"doi_url": "https://doi.org/10.5072/zenodo.1139445",
"version_doi_url": "https://doi.org/10.5072/zenodo.1143590",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "2.0.0",
@ -291,9 +271,7 @@
"gcube_release_version": "5.2.0",
"gcube_release_ticket": "https://support.d4science.org/issues/19738",
"version_doi_url": "https://doi.org/10.5072/zenodo.1139069",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "2.1.0",
@ -302,9 +280,7 @@
"gcube_release_version": "5.7.0",
"gcube_release_ticket": "https://support.d4science.org/issues/21685/",
"version_doi_url": "https://doi.org/10.5072/zenodo.1139070",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "2.2.0",
@ -313,9 +289,7 @@
"gcube_release_version": "5.11.0",
"gcube_release_ticket": "https://support.d4science.org/issues/22943",
"version_doi_url": "https://doi.org/10.5072/zenodo.1139322",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "2.3.0",
@ -324,9 +298,7 @@
"gcube_release_version": "5.13.0",
"gcube_release_ticket": "https://support.d4science.org/issues/23374",
"version_doi_url": "https://doi.org/10.5072/zenodo.1139680",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "2.4.0",
@ -335,9 +307,7 @@
"gcube_release_version": "5.13.1",
"gcube_release_ticket": "https://support.d4science.org/issues/23650",
"version_doi_url" : "https://doi.org/10.5072/zenodo.1144798",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
},
{
"version": "2.4.1",
@ -346,9 +316,7 @@
"gcube_release_version": "5.14.0",
"gcube_release_ticket": "https://support.d4science.org/issues/23885",
"version_doi_url" : "https://doi.org/10.5072/zenodo.1144799",
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}",
"publish": false,
"export": true
"code_location": "https://code-repo.d4science.org/gCubeSystem/{{name}}/releases/tag/v{{version}}"
}
],
"publishers": {