90 lines
3.2 KiB
Java
90 lines
3.2 KiB
Java
package org.gcube.common.software.analyser;
|
|
|
|
import java.io.File;
|
|
import java.util.Set;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
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.common.software.model.SoftwareConcept;
|
|
import org.gcube.common.software.model.SoftwareVersion;
|
|
import org.gcube.common.software.model.Variables;
|
|
import org.gcube.common.software.utils.Utils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
/**
|
|
* @author Luca Frosini (ISTI - CNR)
|
|
*/
|
|
public class SoftwareConceptAnalyser {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(SoftwareConceptAnalyser.class);
|
|
|
|
public static final String CONCEPT_FILENAME_EXTENSION = ".json";
|
|
|
|
protected ObjectMapper objectMapper;
|
|
protected JsonNode jsonNode;
|
|
|
|
public SoftwareConceptAnalyser(File jsonFile) throws Exception {
|
|
this.objectMapper = Utils.getObjectMapper();
|
|
this.jsonNode = objectMapper.readTree(jsonFile);
|
|
}
|
|
|
|
public SoftwareConceptAnalyser(String json) throws Exception {
|
|
this.objectMapper = Utils.getObjectMapper();
|
|
this.jsonNode = objectMapper.readTree(json);
|
|
}
|
|
|
|
protected SoftwareVersion actualize(JsonNode version) throws Exception {
|
|
Variables variables = objectMapper.treeToValue(version, Variables.class);
|
|
Set<String> missingVariables = variables.parse();
|
|
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);
|
|
SoftwareVersion softwareVersion = objectMapper.treeToValue(swVersion, SoftwareVersion.class);
|
|
softwareVersion.setVariables(variables);
|
|
return softwareVersion;
|
|
}
|
|
|
|
public void analyse() throws Exception {
|
|
JsonNode concept = jsonNode.get("concept");
|
|
SoftwareConcept softwareConcept = objectMapper.treeToValue(concept, SoftwareConcept.class);
|
|
ArrayNode versions = (ArrayNode) jsonNode.get("versions");
|
|
|
|
String name = softwareConcept.getName();
|
|
SoftwareVersion previous = null;
|
|
|
|
for(int i=0; i<versions.size(); i++) {
|
|
JsonNode version = Utils.merge(concept, versions.get(i));
|
|
SoftwareVersion softwareVersion = actualize(version);
|
|
|
|
softwareVersion.setPrevious(previous);
|
|
if(previous!=null) {
|
|
previous.setNext(softwareVersion);
|
|
}
|
|
|
|
logger.trace("Going to process {} {} (previous version {})",
|
|
name, softwareVersion.getVersion(),
|
|
softwareVersion.getPrevious()!=null ? softwareVersion.getPrevious().getVersion(): null);
|
|
|
|
SoftwareVersionAnalyser softwareVersionAnalyser = new SoftwareVersionAnalyser(softwareVersion);
|
|
softwareVersionAnalyser.setOriginalJson(jsonNode);
|
|
softwareVersionAnalyser.setFirst(i==0);
|
|
softwareVersionAnalyser.analyse();
|
|
|
|
previous = softwareVersion;
|
|
|
|
Thread.sleep(TimeUnit.SECONDS.toMillis(2));
|
|
}
|
|
|
|
logger.debug("{}", objectMapper.writeValueAsString(softwareConcept));
|
|
File file = new File(name+CONCEPT_FILENAME_EXTENSION);
|
|
objectMapper.writeValue(file, softwareConcept);
|
|
}
|
|
|
|
}
|