770 lines
32 KiB
Java
770 lines
32 KiB
Java
package org.gcube.portlets.user.statisticalalgorithmsimporter.server.generator;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.lang.ProcessBuilder.Redirect;
|
|
import java.nio.file.DirectoryStream;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.Paths;
|
|
import java.nio.file.StandardOpenOption;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.GregorianCalendar;
|
|
import java.util.List;
|
|
|
|
import org.apache.commons.io.FileUtils;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.server.blackbox.MainGenerator;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.server.storage.FilesStorage;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.server.util.ServiceCredentials;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.Constants;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.descriptor.SAIDescriptor;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.exception.StatAlgoImporterServiceException;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.project.Project;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.project.ProjectCompile;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.project.ProjectDeploy;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.project.ProjectSupportBashEdit;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.project.ProjectSupportBlackBox;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.project.ProjectSupportREdit;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.project.ProjectTarget;
|
|
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.workspace.ItemDescription;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
/**
|
|
*
|
|
* @author Giancarlo Panichi
|
|
*
|
|
*
|
|
*/
|
|
public class ProjectBuilder {
|
|
private static final String STATISTICAL_ALGORITHM_TARGET_FOLDER_NAME = "Target";
|
|
private static final String STATISTICAL_ALGORITHM_TARGET_FOLDER_DESCRIPTION = "Project Target";
|
|
private static final String STATISTICAL_ALGORITHM_DEPLOY_FOLDER_NAME = "Deploy";
|
|
private static final String STATISTICAL_ALGORITHM_DEPLOY_FOLDER_DESCRIPTION = "Project Deploy";
|
|
private static final String STATISTICAL_ALGORITHM_COMPILE_FOLDER_NAME = "Compile";
|
|
private static final String STATISTICAL_ALGORITHM_COMPILE_FOLDER_DESCRIPTION = "Project Compile";
|
|
private static final String STATISTICAL_ALGORITHM_BACKUP_FOLDER_NAME = "Backup";
|
|
private static final String STATISTICAL_ALGORITHM_BACKUP_FOLDER_DESCRIPTION = "Project Backup";
|
|
|
|
private static final String ALGORITHM_MIMETYPE = "text/plain";
|
|
private static final String ALGORITHM_DESCRIPTION = "Statistical Algorithm Java Code";
|
|
private static final String ALGORITHM_EXTENTION = ".java";
|
|
private static final String INFO_NAME = "Info";
|
|
private static final String INFO_MIMETYPE = "text/plain";
|
|
private static final String INFO_DESCRIPTION = "Info";
|
|
private static final String INFO_EXTENTION = ".txt";
|
|
private static final String PROJECT_PACKAGE_MIMETYPE = "application/zip";
|
|
private static final String PROJECT_PACKAGE_DESCRIPTION = "Statical Algorithm Project Package";
|
|
private static final String PROJECT_PACKAGE_EXTENTION = ".zip";
|
|
private static final String LOG_TXT = "log.txt";
|
|
private static final String LOG_JAR_TXT = "logjar.txt";
|
|
private static final String ECOLOGICAL_ENGINE_JAR = "ecological-engine.jar";
|
|
private static final String ECOLOGICAL_ENGINE_SMART_EXECUTOR_JAR = "ecological-engine-smart-executor.jar";
|
|
|
|
private static final String CODE_JAR_MIMETYPE = "application/java-archive";
|
|
private static final String CODE_JAR_DESCRIPTION = "Statistical Algorithm Jar";
|
|
private static final String JAR_EXTENTION = ".jar";
|
|
|
|
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
|
|
|
|
public static final Logger logger = LoggerFactory.getLogger(ProjectBuilder.class);
|
|
|
|
private Project project;
|
|
private ServiceCredentials serviceCredentials;
|
|
private SAIDescriptor saiDescriptor;
|
|
private Path algorithmJava;
|
|
private Path infoTXT;
|
|
|
|
public ProjectBuilder(Project project, ServiceCredentials serviceCredentials, SAIDescriptor saiDescriptor) {
|
|
logger.debug("ProjectBuilder");
|
|
this.project = project;
|
|
this.serviceCredentials = serviceCredentials;
|
|
this.saiDescriptor = saiDescriptor;
|
|
this.algorithmJava = null;
|
|
this.infoTXT = null;
|
|
}
|
|
|
|
public Project buildTarget() throws StatAlgoImporterServiceException {
|
|
logger.debug("Project Builder: Build Target");
|
|
checkInfoForBuild();
|
|
createShareInfo();
|
|
String backupFolderId = createBackupOfPackageProject();
|
|
createMainCodeIfRequest();
|
|
createTargetFolder();
|
|
createDeployFolder();
|
|
createProjectPackage(backupFolderId);
|
|
createCompileFolder();
|
|
createAlgorithm();
|
|
createIntegrationInfo();
|
|
createProjectJarFile();
|
|
try {
|
|
if (algorithmJava != null)
|
|
Files.delete(algorithmJava);
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
try {
|
|
if (infoTXT != null)
|
|
Files.delete(infoTXT);
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
return project;
|
|
|
|
}
|
|
|
|
public Project buildDeploy() throws StatAlgoImporterServiceException {
|
|
logger.debug("Project Builder: Deploy");
|
|
checkInfoForDeploy();
|
|
copyJarInDeploy();
|
|
return project;
|
|
}
|
|
|
|
public Project buildRepackage() throws StatAlgoImporterServiceException {
|
|
logger.debug("Project Builder: Repackage");
|
|
checkInfoForRepackage();
|
|
String backupFolderId = createBackupOfPackageProject();
|
|
createMainCodeIfRequest();
|
|
repackageProjectPackage(backupFolderId);
|
|
return project;
|
|
}
|
|
|
|
private void createMainCodeIfRequest() throws StatAlgoImporterServiceException {
|
|
if (project.getProjectConfig() != null && project.getProjectConfig().getProjectSupport() != null
|
|
&& (project.getProjectConfig().getProjectSupport() instanceof ProjectSupportBlackBox
|
|
|| project.getProjectConfig().getProjectSupport() instanceof ProjectSupportBashEdit)) {
|
|
if (project.getMainCode() != null && project.getMainCode().getItemDescription() != null) {
|
|
ItemDescription mainCodeItemDescription = project.getMainCode().getItemDescription();
|
|
if (mainCodeItemDescription.getId() != null && !mainCodeItemDescription.getId().isEmpty()) {
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
filesStorage.deleteItem(serviceCredentials.getUserName(), mainCodeItemDescription.getId());
|
|
}
|
|
}
|
|
MainGenerator mainGenerator = new MainGenerator();
|
|
if (saiDescriptor != null && saiDescriptor.getRemoteTemplateFile() != null
|
|
&& !saiDescriptor.getRemoteTemplateFile().isEmpty()) {
|
|
mainGenerator.createMain(serviceCredentials, project, saiDescriptor.getRemoteTemplateFile());
|
|
} else {
|
|
mainGenerator.createMain(serviceCredentials, project, Constants.REMOTE_TEMPLATE_FILE);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private void repackageProjectPackage(String backupFolderId) throws StatAlgoImporterServiceException {
|
|
List<String> idsToExclude = new ArrayList<String>();
|
|
if (backupFolderId != null && !backupFolderId.isEmpty()) {
|
|
logger.debug("Exclude Backup Folder Id: " + backupFolderId);
|
|
idsToExclude.add(backupFolderId);
|
|
}
|
|
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
|
|
if (project.getProjectTarget() != null && project.getProjectTarget().getFolder() != null
|
|
&& project.getProjectTarget().getFolder().getId() != null
|
|
&& !project.getProjectTarget().getFolder().getId().isEmpty()) {
|
|
String targetFolderId = project.getProjectTarget().getFolder().getId();
|
|
logger.debug("Exclude Target Folder Id: " + targetFolderId);
|
|
idsToExclude.add(targetFolderId);
|
|
}
|
|
|
|
File projectPackageFile = filesStorage.zipFolder(serviceCredentials.getUserName(),
|
|
project.getProjectFolder().getFolder().getId(), idsToExclude);
|
|
|
|
InputStream inputStream;
|
|
try {
|
|
inputStream = Files.newInputStream(projectPackageFile.toPath(), StandardOpenOption.READ);
|
|
} catch (IOException e) {
|
|
logger.error("Error input stream generation for project package file: " + e.getLocalizedMessage());
|
|
e.printStackTrace();
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
|
|
}
|
|
|
|
filesStorage.saveInputStreamInItem(serviceCredentials.getUserName(),
|
|
project.getProjectTarget().getProjectDeploy().getPackageProject().getId(), inputStream);
|
|
|
|
ItemDescription packageProjectItemDescription = filesStorage.getFileInfoOnWorkspace(
|
|
serviceCredentials.getUserName(),
|
|
project.getProjectTarget().getProjectDeploy().getPackageProject().getId());
|
|
String pLink = filesStorage.getPublicLink(serviceCredentials.getUserName(),
|
|
packageProjectItemDescription.getId());
|
|
packageProjectItemDescription.setPublicLink(pLink);
|
|
|
|
project.getProjectTarget().getProjectDeploy().setPackageProject(packageProjectItemDescription);
|
|
logger.debug("ProjectDeploy: " + project.getProjectTarget().getProjectDeploy());
|
|
|
|
try {
|
|
inputStream.close();
|
|
} catch (IOException e) {
|
|
logger.error("Error in input stream close: " + e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
if (projectPackageFile != null && projectPackageFile.exists()) {
|
|
projectPackageFile.delete();
|
|
}
|
|
|
|
}
|
|
|
|
private String createBackupOfPackageProject() throws StatAlgoImporterServiceException {
|
|
|
|
String backupFolderId = null;
|
|
if (project.getProjectTarget() != null && project.getProjectTarget().getProjectDeploy() != null
|
|
&& project.getProjectTarget().getProjectDeploy().getPackageProject() != null
|
|
&& project.getProjectTarget().getProjectDeploy().getPackageProject().getId() != null
|
|
&& !project.getProjectTarget().getProjectDeploy().getPackageProject().getId().isEmpty()) {
|
|
logger.debug("Create Backup of PackageProject");
|
|
backupFolderId = createBackupFolder();
|
|
if (backupFolderId != null && !backupFolderId.isEmpty()) {
|
|
try {
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
|
|
GregorianCalendar now = new GregorianCalendar();
|
|
|
|
String packageProjectNewName = project.getInputData().getProjectInfo().getAlgorithmNameToClassName()
|
|
+ "_backup_" + sdf.format(now.getTime()) + PROJECT_PACKAGE_EXTENTION;
|
|
|
|
filesStorage.copyItemOnFolderWithNewName(serviceCredentials.getUserName(),
|
|
project.getProjectTarget().getProjectDeploy().getPackageProject().getId(), backupFolderId,
|
|
packageProjectNewName);
|
|
|
|
} catch (Throwable e) {
|
|
logger.error("Error in backup: " + e.getLocalizedMessage(), e);
|
|
logger.info("Backup skipped");
|
|
}
|
|
} else {
|
|
logger.debug("BackupFolderId is null, the backup is not done");
|
|
}
|
|
} else {
|
|
logger.debug("First deploy, no backup needed");
|
|
}
|
|
return backupFolderId;
|
|
|
|
}
|
|
|
|
private void copyJarInDeploy() throws StatAlgoImporterServiceException {
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
if (project.getProjectTarget().getProjectDeploy().getCodeJar() != null
|
|
&& project.getProjectTarget().getProjectDeploy().getCodeJar().getId() != null
|
|
&& !project.getProjectTarget().getProjectDeploy().getCodeJar().getId().isEmpty()) {
|
|
filesStorage.deleteItem(serviceCredentials.getUserName(),
|
|
project.getProjectTarget().getProjectDeploy().getCodeJar().getId());
|
|
}
|
|
|
|
ItemDescription dCodeJar = filesStorage.copyItemOnFolder(serviceCredentials.getUserName(),
|
|
project.getProjectTarget().getProjectCompile().getCodeJar().getId(),
|
|
project.getProjectTarget().getProjectDeploy().getFolder().getId());
|
|
|
|
String pLink = filesStorage.getPublicLink(serviceCredentials.getUserName(), dCodeJar.getId());
|
|
dCodeJar.setPublicLink(pLink);
|
|
logger.debug("DeployableCodeJarItem:" + dCodeJar);
|
|
|
|
project.getProjectTarget().getProjectDeploy().setCodeJar(dCodeJar);
|
|
logger.debug("ProjectDeploy: " + project.getProjectTarget().getProjectDeploy());
|
|
}
|
|
|
|
private void checkInfoForRepackage() throws StatAlgoImporterServiceException {
|
|
if (project == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Found!");
|
|
}
|
|
|
|
if (project.getProjectFolder() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Folder Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Target Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getFolder() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Target Folder Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectDeploy() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Deploy Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectDeploy().getFolder() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Deploy Folder Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectDeploy().getPackageProject() == null
|
|
|| project.getProjectTarget().getProjectDeploy().getPackageProject().getId() == null
|
|
|| project.getProjectTarget().getProjectDeploy().getPackageProject().getId().isEmpty()) {
|
|
throw new StatAlgoImporterServiceException(
|
|
"Attention No Project Package Found. Try to create software before!");
|
|
}
|
|
|
|
}
|
|
|
|
private void checkInfoForDeploy() throws StatAlgoImporterServiceException {
|
|
if (project == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Found!");
|
|
}
|
|
|
|
if (project.getProjectFolder() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Folder Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Target Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getFolder() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Target Folder Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectDeploy() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Deploy Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectDeploy().getFolder() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Deploy Folder Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectDeploy().getPackageProject() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Package Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectCompile().getFolder() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Compile Folder Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectCompile().getCodeSource() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Source Code Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectCompile().getCodeJar() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Jar Code Found!");
|
|
}
|
|
|
|
if (project.getProjectTarget().getProjectCompile().getIntegrationInfo() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Integration Info Found!");
|
|
}
|
|
|
|
}
|
|
|
|
private void createDeployFolder() throws StatAlgoImporterServiceException {
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
filesStorage.deleteFolder(serviceCredentials.getUserName(), project.getProjectTarget().getFolder().getId(),
|
|
STATISTICAL_ALGORITHM_DEPLOY_FOLDER_NAME);
|
|
|
|
ItemDescription deployFolder = filesStorage.createFolder(serviceCredentials.getUserName(),
|
|
project.getProjectTarget().getFolder().getId(), STATISTICAL_ALGORITHM_DEPLOY_FOLDER_NAME,
|
|
STATISTICAL_ALGORITHM_DEPLOY_FOLDER_DESCRIPTION);
|
|
logger.debug("PublicFolder:" + deployFolder);
|
|
|
|
ProjectDeploy projectDeploy = new ProjectDeploy(deployFolder);
|
|
project.getProjectTarget().setProjectDeploy(projectDeploy);
|
|
|
|
}
|
|
|
|
private void checkInfoForBuild() throws StatAlgoImporterServiceException {
|
|
if (project == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Found!");
|
|
}
|
|
|
|
if (project.getProjectFolder() == null || project.getProjectFolder().getFolder() == null
|
|
|| project.getProjectFolder().getFolder().getId() == null
|
|
|| project.getProjectFolder().getFolder().getId().isEmpty()) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Folder Found!");
|
|
}
|
|
|
|
if (project.getInputData() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Input Set!");
|
|
}
|
|
|
|
if (project.getInputData().getProjectInfo() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Project Information Set!");
|
|
}
|
|
|
|
if (project.getInputData().getProjectInfo().getAlgorithmName() == null
|
|
|| project.getInputData().getProjectInfo().getAlgorithmName().isEmpty()) {
|
|
throw new StatAlgoImporterServiceException("Attention No Info Name Set!");
|
|
}
|
|
|
|
if (project.getInputData().getProjectInfo().getAlgorithmDescription() == null
|
|
|| project.getInputData().getProjectInfo().getAlgorithmDescription().isEmpty()) {
|
|
throw new StatAlgoImporterServiceException("Attention No Info Description Set!");
|
|
}
|
|
|
|
if (project.getInputData().getInterpreterInfo() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Interpreter Info Set!");
|
|
}
|
|
|
|
if (project.getInputData().getInterpreterInfo().getVersion() == null
|
|
|| project.getInputData().getInterpreterInfo().getVersion().isEmpty()) {
|
|
throw new StatAlgoImporterServiceException("Attention No Interpreter Version Set!");
|
|
}
|
|
|
|
if (project.getInputData().getListInputOutputVariables() == null
|
|
|| project.getInputData().getListInputOutputVariables().size() < 1) {
|
|
throw new StatAlgoImporterServiceException("Attention No Input/Output Set!");
|
|
}
|
|
|
|
if (project.getProjectConfig() == null || project.getProjectConfig().getProjectSupport() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention Invalid Project Configuration");
|
|
} else {
|
|
if (project.getProjectConfig().getProjectSupport() instanceof ProjectSupportREdit) {
|
|
if (project.getMainCode() == null || project.getMainCode().getItemDescription() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Main Code Set");
|
|
}
|
|
} else {
|
|
if (project.getProjectConfig().getProjectSupport() instanceof ProjectSupportBlackBox) {
|
|
ProjectSupportBlackBox projectSupportBlackBox = (ProjectSupportBlackBox) project.getProjectConfig()
|
|
.getProjectSupport();
|
|
|
|
if (projectSupportBlackBox.getBinaryItem() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Code Set");
|
|
}
|
|
} else {
|
|
if (project.getProjectConfig().getProjectSupport() instanceof ProjectSupportBashEdit) {
|
|
ProjectSupportBashEdit projectSupportBashEdit = (ProjectSupportBashEdit) project
|
|
.getProjectConfig().getProjectSupport();
|
|
|
|
if (projectSupportBashEdit.getBinaryItem() == null) {
|
|
throw new StatAlgoImporterServiceException("Attention No Code Set");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private void createShareInfo() throws StatAlgoImporterServiceException {
|
|
ProjectShareInfoBuilder projectShareInfoBuilder = new ProjectShareInfoBuilder(serviceCredentials, project);
|
|
projectShareInfoBuilder.create();
|
|
|
|
}
|
|
|
|
private void createProjectPackage(String backupFolderId) throws StatAlgoImporterServiceException {
|
|
|
|
List<String> idsToExclude = new ArrayList<String>();
|
|
if (backupFolderId != null && !backupFolderId.isEmpty()) {
|
|
logger.debug("Exclude Backup Folder Id: " + backupFolderId);
|
|
idsToExclude.add(backupFolderId);
|
|
}
|
|
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
|
|
if (project.getProjectTarget() != null && project.getProjectTarget().getFolder() != null
|
|
&& project.getProjectTarget().getFolder().getId() != null
|
|
&& !project.getProjectTarget().getFolder().getId().isEmpty()) {
|
|
String targetFolderId = project.getProjectTarget().getFolder().getId();
|
|
logger.debug("Exclude Target Folder Id: " + targetFolderId);
|
|
idsToExclude.add(targetFolderId);
|
|
}
|
|
|
|
File projectPackageFile = filesStorage.zipFolder(serviceCredentials.getUserName(),
|
|
project.getProjectFolder().getFolder().getId(), idsToExclude);
|
|
|
|
InputStream inputStream;
|
|
try {
|
|
inputStream = Files.newInputStream(projectPackageFile.toPath(), StandardOpenOption.READ);
|
|
} catch (IOException e) {
|
|
logger.error("Error input stream generation for project package file: " + e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
|
|
}
|
|
|
|
ItemDescription packageUrl = filesStorage.createItemOnWorkspace(serviceCredentials.getUserName(), inputStream,
|
|
project.getInputData().getProjectInfo().getAlgorithmNameToClassName() + PROJECT_PACKAGE_EXTENTION,
|
|
PROJECT_PACKAGE_DESCRIPTION, PROJECT_PACKAGE_MIMETYPE,
|
|
project.getProjectTarget().getProjectDeploy().getFolder().getId());
|
|
String pLink = filesStorage.getPublicLink(serviceCredentials.getUserName(), packageUrl.getId());
|
|
packageUrl.setPublicLink(pLink);
|
|
logger.debug("ProjectPackageItem:" + packageUrl);
|
|
project.getProjectTarget().getProjectDeploy().setPackageProject(packageUrl);
|
|
|
|
try {
|
|
inputStream.close();
|
|
} catch (IOException e) {
|
|
logger.error("Error in input stream close: " + e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
if (projectPackageFile != null && projectPackageFile.exists()) {
|
|
projectPackageFile.delete();
|
|
}
|
|
|
|
}
|
|
|
|
private void createTargetFolder() throws StatAlgoImporterServiceException {
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
filesStorage.deleteFolder(serviceCredentials.getUserName(), project.getProjectFolder().getFolder().getId(),
|
|
STATISTICAL_ALGORITHM_TARGET_FOLDER_NAME);
|
|
|
|
ItemDescription targetFolder = filesStorage.createFolder(serviceCredentials.getUserName(),
|
|
project.getProjectFolder().getFolder().getId(), STATISTICAL_ALGORITHM_TARGET_FOLDER_NAME,
|
|
STATISTICAL_ALGORITHM_TARGET_FOLDER_DESCRIPTION);
|
|
logger.debug("TargetFolder:" + targetFolder);
|
|
|
|
ProjectTarget projectTarget = new ProjectTarget(targetFolder);
|
|
project.setProjectTarget(projectTarget);
|
|
|
|
}
|
|
|
|
private void createCompileFolder() throws StatAlgoImporterServiceException {
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
filesStorage.deleteFolder(serviceCredentials.getUserName(), project.getProjectTarget().getFolder().getId(),
|
|
STATISTICAL_ALGORITHM_COMPILE_FOLDER_NAME);
|
|
|
|
ItemDescription compileFolder = filesStorage.createFolder(serviceCredentials.getUserName(),
|
|
project.getProjectTarget().getFolder().getId(), STATISTICAL_ALGORITHM_COMPILE_FOLDER_NAME,
|
|
STATISTICAL_ALGORITHM_COMPILE_FOLDER_DESCRIPTION);
|
|
logger.debug("CompileFolder:" + compileFolder);
|
|
|
|
ProjectCompile projectCompile = new ProjectCompile(compileFolder);
|
|
project.getProjectTarget().setProjectCompile(projectCompile);
|
|
}
|
|
|
|
private String createBackupFolder() throws StatAlgoImporterServiceException {
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
|
|
ItemDescription backupFolder = filesStorage.find(serviceCredentials.getUserName(),
|
|
project.getProjectFolder().getFolder().getId(), STATISTICAL_ALGORITHM_BACKUP_FOLDER_NAME);
|
|
|
|
String backupFolderId = null;
|
|
if (backupFolder != null && backupFolder.getId() != null && !backupFolder.getId().isEmpty()) {
|
|
backupFolderId = backupFolder.getId();
|
|
} else {
|
|
logger.debug("Create new BackupFolder");
|
|
ItemDescription newBackupFolder = filesStorage.createFolder(serviceCredentials.getUserName(),
|
|
project.getProjectFolder().getFolder().getId(), STATISTICAL_ALGORITHM_BACKUP_FOLDER_NAME,
|
|
STATISTICAL_ALGORITHM_BACKUP_FOLDER_DESCRIPTION);
|
|
logger.debug("BackupFolder created:" + backupFolder);
|
|
backupFolderId = newBackupFolder.getId();
|
|
|
|
}
|
|
logger.debug("BackupFolderId: " + backupFolderId);
|
|
return backupFolderId;
|
|
|
|
}
|
|
|
|
private void createAlgorithm() throws StatAlgoImporterServiceException {
|
|
logger.debug("ProjectBuilder create algorithm");
|
|
AlgorithmGenerator algorithmGenerator = new AlgorithmGenerator(project, serviceCredentials);
|
|
algorithmJava = algorithmGenerator.createAlgorithm();
|
|
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
ItemDescription codeSource;
|
|
|
|
try {
|
|
codeSource = filesStorage.createItemOnWorkspace(serviceCredentials.getUserName(),
|
|
Files.newInputStream(algorithmJava, StandardOpenOption.READ),
|
|
project.getInputData().getProjectInfo().getAlgorithmNameToClassName() + ALGORITHM_EXTENTION,
|
|
ALGORITHM_DESCRIPTION, ALGORITHM_MIMETYPE,
|
|
project.getProjectTarget().getProjectCompile().getFolder().getId());
|
|
String pLink = filesStorage.getPublicLink(serviceCredentials.getUserName(), codeSource.getId());
|
|
codeSource.setPublicLink(pLink);
|
|
} catch (IOException e) {
|
|
logger.error(e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
project.getProjectTarget().getProjectCompile().setCodeSource(codeSource);
|
|
logger.debug("ProjectCompile: " + project.getProjectTarget().getProjectCompile());
|
|
|
|
}
|
|
|
|
private void createIntegrationInfo() throws StatAlgoImporterServiceException {
|
|
InfoGenerator integrationInfoGenerator = new InfoGenerator(project, serviceCredentials);
|
|
infoTXT = integrationInfoGenerator.createInfo();
|
|
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
ItemDescription integrationItemDescription;
|
|
|
|
try {
|
|
integrationItemDescription = filesStorage.createItemOnWorkspace(serviceCredentials.getUserName(),
|
|
Files.newInputStream(infoTXT, StandardOpenOption.READ), INFO_NAME + INFO_EXTENTION,
|
|
INFO_DESCRIPTION, INFO_MIMETYPE,
|
|
project.getProjectTarget().getProjectCompile().getFolder().getId());
|
|
String pLink = filesStorage.getPublicLink(serviceCredentials.getUserName(),
|
|
integrationItemDescription.getId());
|
|
integrationItemDescription.setPublicLink(pLink);
|
|
} catch (IOException e) {
|
|
logger.error(e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
project.getProjectTarget().getProjectCompile().setIntegrationInfo(integrationItemDescription);
|
|
logger.debug("ProjectCompile: " + project.getProjectTarget().getProjectCompile());
|
|
|
|
}
|
|
|
|
private void createProjectJarFile() throws StatAlgoImporterServiceException {
|
|
|
|
FilesStorage storage = new FilesStorage();
|
|
|
|
Path tempDirectory;
|
|
try {
|
|
tempDirectory = Files.createTempDirectory("StatAlgorithmsJar");
|
|
} catch (IOException e) {
|
|
logger.error("Error creating temporal directory: " + e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
logger.debug("TempDir: " + tempDirectory);
|
|
|
|
File packageHome = new File(
|
|
tempDirectory.toAbsolutePath().toString() + File.separator + "org" + File.separator + "gcube"
|
|
+ File.separator + "dataanalysis" + File.separator + "executor" + File.separator + "rscripts");
|
|
packageHome.mkdirs();
|
|
Path packageHomeDir = packageHome.toPath();
|
|
|
|
Path ecologicalEngineJar = new File(tempDirectory.toFile(), ECOLOGICAL_ENGINE_JAR).toPath();
|
|
|
|
storage.downloadExternalInputFile(saiDescriptor.getEcologicalEngineJarUrl(), ecologicalEngineJar);
|
|
Path ecologicalEngineSmartExecutorJar = new File(tempDirectory.toFile(), ECOLOGICAL_ENGINE_SMART_EXECUTOR_JAR)
|
|
.toPath();
|
|
storage.downloadExternalInputFile(saiDescriptor.getEcologicalEngineSmartExecutorJarUrl(), ecologicalEngineSmartExecutorJar);
|
|
|
|
Path algorithmTempFile = new File(packageHomeDir.toFile(),
|
|
project.getInputData().getProjectInfo().getAlgorithmNameToClassName() + ALGORITHM_EXTENTION).toPath();
|
|
try {
|
|
Files.copy(algorithmJava, algorithmTempFile);
|
|
} catch (IOException e) {
|
|
logger.error("Error in alogrithm java copy in package directory: " + e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
Path infoTempFile = new File(tempDirectory.toFile(), INFO_NAME + INFO_EXTENTION).toPath();
|
|
try {
|
|
Files.copy(infoTXT, infoTempFile);
|
|
} catch (IOException e) {
|
|
logger.error("Error in info copy in temp directory: " + e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
createClassFile(tempDirectory, packageHomeDir);
|
|
|
|
try {
|
|
Files.delete(algorithmTempFile);
|
|
} catch (IOException e) {
|
|
logger.error("Error in delete java file in package directory: " + e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
createJarFile(tempDirectory, infoTempFile);
|
|
copyJarOnWorkspace(tempDirectory);
|
|
|
|
try {
|
|
FileUtils.cleanDirectory(tempDirectory.toFile());
|
|
FileUtils.deleteDirectory(tempDirectory.toFile());
|
|
} catch (IOException e) {
|
|
logger.error("Error in delete temp directory: " + e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException("Error deleting temp directory: " + e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
private void copyJarOnWorkspace(Path tempDirectory) throws StatAlgoImporterServiceException {
|
|
Path codeJar = Paths.get(tempDirectory.toString(),
|
|
project.getInputData().getProjectInfo().getAlgorithmNameToClassName() + JAR_EXTENTION);
|
|
|
|
FilesStorage filesStorage = new FilesStorage();
|
|
ItemDescription codeJarItemDescription;
|
|
|
|
try {
|
|
codeJarItemDescription = filesStorage.createItemOnWorkspace(serviceCredentials.getUserName(),
|
|
Files.newInputStream(codeJar, StandardOpenOption.READ),
|
|
project.getInputData().getProjectInfo().getAlgorithmNameToClassName() + JAR_EXTENTION,
|
|
CODE_JAR_DESCRIPTION, CODE_JAR_MIMETYPE,
|
|
project.getProjectTarget().getProjectCompile().getFolder().getId());
|
|
String pLink = filesStorage.getPublicLink(serviceCredentials.getUserName(), codeJarItemDescription.getId());
|
|
codeJarItemDescription.setPublicLink(pLink);
|
|
} catch (IOException e) {
|
|
logger.error(e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
project.getProjectTarget().getProjectCompile().setCodeJar(codeJarItemDescription);
|
|
logger.debug("ProjectCompile: " + project.getProjectTarget().getProjectCompile());
|
|
|
|
}
|
|
|
|
private void createClassFile(Path tempDirectory, Path packageHome) throws StatAlgoImporterServiceException {
|
|
|
|
try {
|
|
|
|
ProcessBuilder pb = new ProcessBuilder("javac", "-encoding", "utf-8", "-cp",
|
|
tempDirectory.toAbsolutePath().toString() + "/*",
|
|
packageHome.toAbsolutePath().toString() + File.separator
|
|
+ project.getInputData().getProjectInfo().getAlgorithmNameToClassName()
|
|
+ ALGORITHM_EXTENTION);
|
|
pb.directory(tempDirectory.toFile());
|
|
Path logTXT = new File(tempDirectory.toFile(), LOG_TXT).toPath();
|
|
|
|
pb.redirectErrorStream(true);
|
|
pb.redirectOutput(Redirect.appendTo(logTXT.toFile()));
|
|
logger.debug("Process: " + pb.toString());
|
|
Process process = pb.start();
|
|
|
|
// Wait to get exit value
|
|
int exitValue = process.waitFor();
|
|
logger.debug("Create Algo Class: Exit Value is " + exitValue);
|
|
|
|
DirectoryStream<Path> packageHomeStream = Files.newDirectoryStream(packageHome);
|
|
boolean createdFilesClass = false;
|
|
for (Path path : packageHomeStream) {
|
|
if (path.toString().endsWith(".class")) {
|
|
createdFilesClass = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!createdFilesClass) {
|
|
throw new StatAlgoImporterServiceException("Error in the creation of the class files!");
|
|
}
|
|
|
|
} catch (IOException | InterruptedException e) {
|
|
logger.error(e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
}
|
|
|
|
private void createJarFile(Path tempDirectory, Path infoTempFile) throws StatAlgoImporterServiceException {
|
|
try {
|
|
List<String> commands = new ArrayList<>();
|
|
commands.add("jar");
|
|
commands.add("-cvf");
|
|
commands.add(project.getInputData().getProjectInfo().getAlgorithmNameToClassName() + JAR_EXTENTION);
|
|
|
|
/*
|
|
* DirectoryStream<Path> directoryStream = Files
|
|
* .newDirectoryStream(tempDirectory); for (Path path :
|
|
* directoryStream) { if (path.toString().endsWith(".class"))
|
|
* commands.add(path.getFileName().toString());
|
|
*
|
|
* }
|
|
*/
|
|
|
|
commands.add("org");
|
|
commands.add(infoTempFile.getFileName().toString());
|
|
|
|
ProcessBuilder pb = new ProcessBuilder(commands);
|
|
pb.directory(tempDirectory.toFile());
|
|
Path logTXT = new File(tempDirectory.toFile(), LOG_JAR_TXT).toPath();
|
|
|
|
pb.redirectErrorStream(true);
|
|
pb.redirectOutput(Redirect.appendTo(logTXT.toFile()));
|
|
logger.debug("Process: " + pb.toString());
|
|
Process process = pb.start();
|
|
|
|
// Wait to get exit value
|
|
int exitValue = process.waitFor();
|
|
logger.debug("Create Algo Jar: Exit Value is " + exitValue);
|
|
|
|
} catch (IOException | InterruptedException e) {
|
|
logger.error(e.getLocalizedMessage(), e);
|
|
throw new StatAlgoImporterServiceException(e.getLocalizedMessage(), e);
|
|
}
|
|
|
|
}
|
|
|
|
}
|