package org.gcube.dataanalysis.dataminer.poolmanager.process; ***REMOVED*** import java.io.InputStream; ***REMOVED*** import java.util.HashMap; ***REMOVED*** import java.util.Map; import java.util.Vector; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.Algorithm; import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.Dependency; ***REMOVED*** ***REMOVED*** public class AlgorithmPackageParser { /** * The name of the file containing algorithm metadata. Expected in the root * directory of the package. */ private final String METADATA_FILE_NAME = "Info.txt", METADATA_USERNAME = "Username", METADATA_FULLNAME = "Full Name", METADATA_EMAIL = "Email", METADATA_LANGUAGE = "Language", METADATA_CATEGORY = "Algorithm Category", METADATA_ALGORITHM_NAME = "Algorithm Name", METADATA_ALGORITHM_DESCRIPTION = "Algorithm Description", METADATA_CLASS_NAME = "Class Name", ***REMOVED*** private static final String METADATA_PACKAGES = "Packages"; METADATA_KEY_VALUE_SEPARATOR = ":"; private final int BUFFER_SIZE = 4096; private Logger logger; public AlgorithmPackageParser() { this.logger = LoggerFactory.getLogger(AlgorithmPackageParser.class); ***REMOVED*** public Algorithm parsePackage(String url) throws IOException { String packageMetadata = this.getPackageMetadata(url); if (packageMetadata == null) { this.logger.warn("WARNING: No metadata found for " + url); return null; ***REMOVED*** else { Map> parsedMetadata = this.parseMetadata(packageMetadata); Algorithm a = this.createAlgorithm(parsedMetadata); a.setPackageURL(url); return a; ***REMOVED*** ***REMOVED*** private String getPackageMetadata(String url) throws IOException { InputStream is = new URL(url).openStream(); ZipInputStream zipIs = new ZipInputStream(is); ZipEntry entry = zipIs.getNextEntry(); String out = null; while (entry != null) { if (METADATA_FILE_NAME.equalsIgnoreCase(entry.getName())) { out = this.getEntryContent(zipIs); break; ***REMOVED*** entry = zipIs.getNextEntry(); ***REMOVED*** is.close(); zipIs.close(); return out; ***REMOVED*** private String getEntryContent(ZipInputStream zipIn) throws IOException { StringBuilder s = new StringBuilder(); byte[] buffer = new byte[BUFFER_SIZE]; int read = 0; while ((read = zipIn.read(buffer)) != -1) { s.append(new String(buffer, 0, read)); ***REMOVED*** return s.toString(); ***REMOVED*** private Map> parseMetadata(String metadata) { Map> out = new HashMap>(); String[] lines = metadata.split("\n"); String key = null; String value = null; for (String line : lines) { ***REMOVED*** skip empty lines if (line.trim().isEmpty()) { continue; ***REMOVED*** ***REMOVED*** scan lines one by one, looking for key and values String[] parts = line.split(METADATA_KEY_VALUE_SEPARATOR); if (parts.length > 1) { ***REMOVED*** key and value on the same line key = parts[0].trim(); value = line.substring(parts[0].length() + 1).trim(); ***REMOVED*** else if (parts.length == 1) { ***REMOVED*** either a key or a value if (line.trim().endsWith(METADATA_KEY_VALUE_SEPARATOR)) { ***REMOVED*** key key = parts[0].trim(); value = null; ***REMOVED*** else { ***REMOVED*** value value = line.trim(); ***REMOVED*** ***REMOVED*** ***REMOVED*** add key+value to the map if (key != null && value != null) { List values = out.get(key); if (values == null) { values = new Vector<>(); out.put(key, values); ***REMOVED*** values.add(value); this.logger.debug(key + METADATA_KEY_VALUE_SEPARATOR + " " + values); ***REMOVED*** ***REMOVED*** return out; ***REMOVED*** ***REMOVED*** private Algorithm createAlgorithm(Map> metadata) { ***REMOVED*** Algorithm out = new Algorithm(); ***REMOVED*** out.setName(extractSingleValue(metadata, METADATA_ALGORITHM_NAME)); ***REMOVED*** out.setDescription(extractSingleValue(metadata, METADATA_ALGORITHM_DESCRIPTION)); ***REMOVED*** out.setClazz(extractSingleValue(metadata, METADATA_CLASS_NAME)); ***REMOVED*** List dependencies = extractMultipleValues(metadata, METADATA_PACKAGES); ***REMOVED*** if (dependencies != null) { ***REMOVED*** for (String pkg : dependencies) { ***REMOVED*** Dependency dep = new Dependency(); ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("os"); ***REMOVED*** out.addDependency(dep); ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** return out; ***REMOVED*** ***REMOVED*** private Algorithm createAlgorithm(Map> metadata) { Algorithm out = new Algorithm(); out.setName(extractSingleValue(metadata, METADATA_ALGORITHM_NAME)); out.setDescription(extractSingleValue(metadata, METADATA_ALGORITHM_DESCRIPTION)); out.setClazz(extractSingleValue(metadata, METADATA_CLASS_NAME)); out.setEmail(extractSingleValue(metadata, METADATA_EMAIL)); out.setFullname(extractSingleValue(metadata, METADATA_FULLNAME)); out.setUsername(extractSingleValue(metadata, METADATA_USERNAME)); out.setLanguage(extractSingleValue(metadata, METADATA_LANGUAGE)); out.setCategory(extractSingleValue(metadata, METADATA_CATEGORY)); List dependencies = extractMultipleValues(metadata, "Package Name"); if (dependencies != null) { for (String pkg : dependencies) { Dependency dep = new Dependency(); dep.setName(pkg); out.addDependency(dep); ***REMOVED*** ***REMOVED*** ***REMOVED*** List rdependencies = extractMultipleValues(metadata, "cran"); ***REMOVED*** if (rdependencies != null) { ***REMOVED*** for (String pkg : rdependencies) { ***REMOVED*** Dependency dep = new Dependency(); ***REMOVED*** ***REMOVED*** ***REMOVED***if (pkg.startsWith("os:")){ ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("cran"); ***REMOVED*** out.addDependency(dep); ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** List defdependencies = extractMultipleValues(metadata, "Packages"); ***REMOVED*** if (defdependencies != null) { ***REMOVED*** for (String pkg : defdependencies) { ***REMOVED*** Dependency dep = new Dependency(); ***REMOVED*** ***REMOVED*** ***REMOVED***if (pkg.startsWith("os:")){ ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("os"); ***REMOVED*** out.addDependency(dep); ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** List osdependencies = extractMultipleValues(metadata, "os"); ***REMOVED*** if (osdependencies != null) { ***REMOVED*** for (String pkg : osdependencies) { ***REMOVED*** Dependency dep = new Dependency(); ***REMOVED*** ***REMOVED*** ***REMOVED***if (pkg.startsWith("os:")){ ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("os"); ***REMOVED*** out.addDependency(dep); ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** List gitdependencies = extractMultipleValues(metadata, "github"); ***REMOVED*** if (gitdependencies != null) { ***REMOVED*** for (String pkg : gitdependencies) { ***REMOVED*** Dependency dep = new Dependency(); ***REMOVED*** ***REMOVED*** ***REMOVED***if (pkg.startsWith("os:")){ ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("github"); ***REMOVED*** out.addDependency(dep); ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** List cdependencies = extractMultipleValues(metadata, "custom"); ***REMOVED*** if (cdependencies != null) { ***REMOVED*** for (String pkg : cdependencies) { ***REMOVED*** Dependency dep = new Dependency(); ***REMOVED*** ***REMOVED*** ***REMOVED***if (pkg.startsWith("os:")){ ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("custom"); ***REMOVED*** out.addDependency(dep); ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** ***REMOVED*** if (pkg.startsWith("r:")){ ***REMOVED*** ***REMOVED***String results = StringEscapeUtils.escapeJava(pkg); ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("cran"); ***REMOVED*** ***REMOVED*** ***REMOVED*** if (pkg.startsWith("custom:")){ ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("custom"); ***REMOVED*** ***REMOVED*** ***REMOVED*** if (!pkg.startsWith("os:")&&!pkg.startsWith("r:")&&!pkg.startsWith("custom:")){ ***REMOVED*** dep.setName(pkg); ***REMOVED*** dep.setType("os"); ***REMOVED*** ***REMOVED*** return out; ***REMOVED*** private static String extractSingleValue(Map> metadata, String key) { List l = metadata.get(key); if (l != null && l.size() == 1) { return l.get(0); ***REMOVED*** else { return null; ***REMOVED*** ***REMOVED*** private static List extractMultipleValues( Map> metadata, String key) { List l = metadata.get(key); if (l != null) { return new Vector<>(l); ***REMOVED*** else { return null; ***REMOVED*** ***REMOVED*** public static void main(String[] args) { AlgorithmPackageParser ap = new AlgorithmPackageParser(); String txt = "Username: giancarlo.panichi\n"+ "Full Name: Giancarlo Panichi\n"+ "Email: g.panichi@isti.cnr.it\n"+ "Language: R\n"+ "Algorithm Name: RBLACKBOX\n"+ "Class Name: org.gcube.dataanalysis.executor.rscripts.RBlackBox\n"+ "Algorithm Description: RBlackBox\n"+ "Algorithm Category: BLACK_BOX\n"+ "Interpreter Version: 3.2.1\n"+ "Packages:\n"+ "Package Name: DBI\n"+ "Package Name: RPostgreSQL\n"+ "Package Name: raster\n"+ "Package Name: maptools\n"+ "Package Name: sqldf\n"+ "Package Name: RJSONIO\n"+ "Package Name: httr \n"+ "Package Name: data.table"; ap.parseMetadata(txt); ***REMOVED*** ***REMOVED***