software-versions-processor.../src/main/java/org/gcube/common/software/analyser/Analyser.java

168 lines
5.7 KiB
Java

package org.gcube.common.software.analyser;
import java.io.File;
import java.net.URL;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.com.fasterxml.jackson.databind.node.ObjectNode;
import org.gcube.common.software.export.SoftwareVersionExporter;
import org.gcube.common.software.model.ExporterConfig;
import org.gcube.common.software.model.GlobalConfig;
import org.gcube.common.software.model.SoftwareVersionConfig;
import org.gcube.common.software.model.SoftwareVersionFile;
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 Analyser {
private static final Logger logger = LoggerFactory.getLogger(Analyser.class);
protected ObjectMapper objectMapper;
protected File outputDirectory;
protected ObjectNode globalConfiguration;
protected ArrayNode versionConfigurations;
public Analyser() throws Exception {
this.objectMapper = Utils.getObjectMapper();
}
public void setOutputDirectory(File outputDirectory) {
this.outputDirectory = outputDirectory;
}
public ObjectNode getGlobalConfiguration() {
return globalConfiguration;
}
public void setGlobalConfiguration(ObjectNode originalGlobal) {
this.globalConfiguration = originalGlobal.deepCopy();
}
public ArrayNode getVersionConfigurations() {
return versionConfigurations;
}
public void setVersionConfigurations(ArrayNode originalVersions) {
this.versionConfigurations = originalVersions.deepCopy();
}
protected SoftwareVersionConfig actualizeSoftwareVersionConfig(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);
SoftwareVersionConfig softwareVersionConfig = objectMapper.treeToValue(swVersion, SoftwareVersionConfig.class);
List<SoftwareVersionFile> svfs = softwareVersionConfig.getFiles();
for(SoftwareVersionFile svf : svfs) {
URL url = svf.getURL();
String urlString = variables.replaceAllVariables(url.toString());
svf.setURL(new URL(urlString));
String desiredName = svf.getDesiredName();
desiredName = variables.replaceAllVariables(desiredName);
svf.setDesiredName(desiredName);
}
return softwareVersionConfig;
}
protected GlobalConfig actualizeGlobalConfig(JsonNode node) throws Exception {
Variables variables = objectMapper.treeToValue(node, Variables.class);
variables.parse();
JsonNode sc = objectMapper.convertValue(variables.getProperties(), JsonNode.class);
return objectMapper.treeToValue(sc, GlobalConfig.class);
}
protected void checkExporters(Set<String> availableExporterNames, Set<String> requestedExporterNames) throws Exception {
if(!availableExporterNames.containsAll(requestedExporterNames)) {
requestedExporterNames.removeAll(availableExporterNames);
throw new Exception("The following requested exporters does not exists " + requestedExporterNames);
}
}
public List<File> analyse() throws Exception {
GlobalConfig globalConfig = actualizeGlobalConfig(globalConfiguration);
globalConfig.setOriginalJson(globalConfiguration);
Map<String, Class<? extends SoftwareVersionExporter>> availableExporters = SoftwareVersionExporter.getAvailableExporters();
Map<String,ExporterConfig> requestedExporters = globalConfig.getExporters();
checkExporters(availableExporters.keySet(), requestedExporters.keySet());
if(outputDirectory==null) {
outputDirectory = new File(globalConfig.getFileName());
}
if(!outputDirectory.exists()) {
Files.createDirectories(outputDirectory.toPath());
}
SoftwareVersionConfig previous = null;
int i = 0;
List<File> outputFiles = new ArrayList<>();
for(i=0; i<versionConfigurations.size(); i++) {
ObjectNode versionConfig = (ObjectNode) versionConfigurations.get(i).deepCopy();
JsonNode actualizedVersionConfig = Utils.merge(globalConfiguration, versionConfig);
SoftwareVersionConfig softwareVersionConfig = actualizeSoftwareVersionConfig(actualizedVersionConfig);
softwareVersionConfig.setOriginalJson(versionConfig);
softwareVersionConfig.setPrevious(previous);
logger.trace("Going to process {}", softwareVersionConfig.getTitle());
for(String className : requestedExporters.keySet()) {
logger.debug("Going to export with {}", className);
Class<? extends SoftwareVersionExporter> exporterClass = availableExporters.get(className);
ExporterConfig exporterConfig = requestedExporters.get(className);
SoftwareVersionExporter sve = exporterClass.newInstance();
sve.setOutputDirectory(outputDirectory);
sve.setGlobalConfig(globalConfig);
sve.setSoftwareVersionConfig(softwareVersionConfig);
sve.setExporterConfig(exporterConfig);
sve.setFirst(i==0);
boolean last = i==(versionConfigurations.size()-1);
sve.setLast(last);
sve.export();
if(last) {
outputFiles.add(sve.getOutputFile());
}
}
Thread.sleep(TimeUnit.SECONDS.toMillis(2));
previous = softwareVersionConfig;
}
return outputFiles;
}
}