dataminer-algorithm-importer/src/main/java/org/gcube/dataanalysis/wps/mapper/ClassGenerator.java

184 lines
7.0 KiB
Java

package org.gcube.dataanalysis.wps.mapper;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import org.gcube.contentmanagement.lexicalmatcher.utils.FileTools;
import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration;
import org.gcube.dataanalysis.ecoengine.datatypes.StatisticalType;
import org.gcube.dataanalysis.ecoengine.interfaces.ComputationalAgent;
import org.gcube.dataanalysis.ecoengine.interfaces.GenericAlgorithm;
import org.gcube.dataanalysis.ecoengine.interfaces.Model;
import org.gcube.dataanalysis.ecoengine.processing.factories.ProcessorsFactory;
import org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mapping.StatisticalTypeToWPSType;
public class ClassGenerator {
private String configPath = "./cfg/";
private String generationPath = "./src/main/java/org/gcube/dataanalysis/wps/statisticalmanager/synchserver/mappedclasses/";
private StatisticalTypeToWPSType converter;
private String packageString = null;
private String javaFileName = null;
public ClassGenerator(String algorithmName, String implementation, String generationPath, String configPath) throws Exception {
this.generationPath = generationPath;
this.configPath = configPath;
converter = new StatisticalTypeToWPSType();
this.javaFileName = generateEcologicalEngineClasses(algorithmName, implementation);
}
public String getPackageString() {
return packageString;
}
public String getJavaFileName() {
return javaFileName;
}
private String generateEcologicalEngineClasses(String algorithmName, String implementation) throws Exception {
AlgorithmConfiguration config = new AlgorithmConfiguration();
config.setConfigPath(configPath);
config.setAlgorithmClassLoader(Thread.currentThread().getContextClassLoader());
// set scope etc..
HashMap<String, List<String>> algorithms = ProcessorsFactory.getAllFeatures(config);
for (String algorithmSet : algorithms.keySet()) {
List<String> parametersList = algorithms.get(algorithmSet);
System.out.println(algorithmSet + ":" + parametersList.toString());
for (String algorithm : parametersList) {
if (!algorithm.equals(algorithmName))
continue;
// got an algorithm
System.out.println("Algorithm: " + algorithm);
String description = ""; // get this information
StringBuffer classWriter = new StringBuffer();
List<StatisticalType> inputs = null;
StatisticalType outputs = null;
// build class preamble
config.setAgent(algorithm);
config.setModel(algorithm);
config.setAlgorithmClassLoader(Thread.currentThread().getContextClassLoader());
String interfaceString = "";
Object impl = Class.forName(implementation).newInstance();
if ((impl instanceof GenericAlgorithm))
{
GenericAlgorithm ga = (GenericAlgorithm)impl;
inputs = ga.getInputParameters();
description = ga.getDescription();
try
{
outputs = ga.getOutput();
}
catch (Exception e)
{
outputs = null;
}
}
else if (impl instanceof Model){
Model ca = (Model)impl;
inputs = ca.getInputParameters();
description = ca.getDescription();
try
{
outputs = ca.getOutput();
}
catch (Exception e)
{
outputs = null;
}
}
else if ((impl instanceof ComputationalAgent))
{
ComputationalAgent ca = (ComputationalAgent)impl;
inputs = ca.getInputParameters();
description = ca.getDescription();
try
{
outputs = ca.getOutput();
}
catch (Exception e)
{
outputs = null;
}
}
else
{
throw new Exception("invalid algorithm class "+impl.getClass());
}
try{
if (algorithmSet.equals("DISTRIBUTIONS")) {
packageString = "generators";
interfaceString = "IGenerator";
} else if (algorithmSet.equals("TRANSDUCERS")) {
packageString = "transducerers";
interfaceString = "ITransducer";
} else if (algorithmSet.equals("MODELS")) {
packageString = "modellers";
interfaceString = "IModeller";
} else if (algorithmSet.equals("CLUSTERERS")) {
packageString = "clusterers";
interfaceString = "IClusterer";
} else if (algorithmSet.equals("TEMPORAL_ANALYSIS")) {
} else if (algorithmSet.equals("EVALUATORS")) {
packageString = "evaluators";
interfaceString = "IEvaluator";
}
}catch(Exception e){
System.out.println("Error in retrieving output:");
e.printStackTrace();
}
classWriter.append(((String) StatisticalTypeToWPSType.templates.get("package")).replace("#PACKAGE#", packageString) + "\n" + ((String) StatisticalTypeToWPSType.templates.get("import")) + "\n");
System.out.println("Class preamble: \n" + classWriter.toString());
// build class description
String classdescription = (String) StatisticalTypeToWPSType.templates.get("description");
//modification of 20/07/15
classdescription = classdescription.replace("#TITLE#", algorithm).replace("#ABSTRACT#", description).replace("#CLASSNAME#", algorithm).replace("#PACKAGE#", packageString);
System.out.println("Class description : \n" + classdescription);
String classdefinition = (String) StatisticalTypeToWPSType.templates.get("class_definition");
classdefinition = classdefinition.replace("#CLASSNAME#", algorithm).replace("#INTERFACE#", interfaceString);
System.out.println("Class definition: \n" + classdefinition);
classWriter.append(classdescription + "\n");
classWriter.append(classdefinition + "\n");
// attach scope input deprecated!
// classWriter.append((String) StatisticalTypeToWPSType.templates.get("scopeInput") + "\n");
// classWriter.append((String) StatisticalTypeToWPSType.templates.get("usernameInput") + "\n");
for (StatisticalType input : inputs) {
System.out.println(input);
String wpsInput = converter.convert2WPSType(input, true, config);
if (wpsInput != null) {
classWriter.append(wpsInput + "\n");
System.out.println("Input:\n" + wpsInput);
}
}
if (outputs != null) {
System.out.println("Alg. Output:\n" + outputs);
String wpsOutput = converter.convert2WPSType(outputs, false, config);
classWriter.append(wpsOutput + "\n");
System.out.println("Output:\n" + wpsOutput);
}
else
System.out.println("Output is empty!");
// add potential outputs
classWriter.append((String) StatisticalTypeToWPSType.templates.getProperty("optionalOutput") + "\n");
classWriter.append((String) StatisticalTypeToWPSType.templates.get("class_closure"));
System.out.println("Class:\n" + classWriter.toString());
System.out.println("Saving...");
File dirs = new File(generationPath + packageString);
if (!dirs.exists()) dirs.mkdirs();
FileTools.saveString(generationPath + packageString+"/"+algorithm + ".java", classWriter.toString(), true, "UTF-8");
return generationPath + packageString+"/"+algorithm + ".java";
}
}
return null;
}
}