package org.genmymodel.customgen.project; import java.io.File; import java.io.IOException; import java.nio.file.Files; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.util.Zip4jConstants; import org.apache.commons.io.FileUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; /** * This class provides an IProject wrapper. It represents * a GenMyModel custom generator project. * * @author Vincent Aranega */ public class GenMyModelProject { public final static String CODEGEN_FOLDER = "codegen"; public final static String METAMODEL_FOLDER = "metamodels"; public final static String TRANSFO_FOLDER = "transformations"; private final static String GENERATOR_XML = "generator.xml"; protected IProject handledProject; public GenMyModelProject(IProject project) { setIProject(project); /*if (!getIProject().isOpen()) { try { getIProject().open(null); } catch (CoreException e) { e.printStackTrace(); } }*/ } /** * Gets the wrapped IProject. * @return An IProject. */ public IProject getIProject() { return handledProject; } /** * Sets the wrapped IProject. * @param handledProject The IProject to wrap. */ public void setIProject(IProject handledProject) { this.handledProject = handledProject; } /** * Gets the folder that contains code generation script. * @return The codegen IFolder. */ public IFolder getCodegenFolder() { return getIProject().getFolder(CODEGEN_FOLDER); } /** * Checks if the codegen folder exists. * @return True if the codegen folder exists. */ public boolean codegenFolderExist() { return getCodegenFolder().exists(); } /** * Gets the folder that contains intermediate metamodels. * @return The metamodels IFolder. */ public IFolder getMetamodelsFolder() { return getIProject().getFolder(METAMODEL_FOLDER); } /** * Checks if the metamodels folder exists. * @return True if the metamodels folder exists. */ public boolean metamodelsFolderExist() { return getMetamodelsFolder().exists(); } /** * Gets the folder that contains model to model transformations. * @return The transformations IFolder. */ public IFolder getTransformationsFolder() { return getIProject().getFolder(TRANSFO_FOLDER); } /** * Checks if the transformations folder exists. * @return True if the transformations folder exists. */ public boolean tranformationsFolderExist() { return getTransformationsFolder().exists(); } /** * Gets the generator.xml file. * @return The generator.xml IFile. */ public IFile getGeneratorXMLFile() { return getIProject().getFile(GENERATOR_XML); } /** * Checks if the generator.xml exists. * @return True if the generator.xml exists. */ public boolean generatorXMLExist() { return getGeneratorXMLFile().exists(); } /** * Zips a GenMyModel project. * @return A File representing the created zip. * @throws IOException If an I/O error occurs. * @throws ZipException If an error occurs during file zipping. */ public File zipMe() throws IOException, ZipException { File tmpFolder = Files.createTempDirectory("GMM-").toFile(); String destFolder = tmpFolder.getAbsolutePath() + "/" + getIProject().getName(); /* IOFileFilter genXMLFile = FileFilterUtils.and(FileFilterUtils.fileFileFilter(), FileFilterUtils.nameFileFilter(GENERATOR_XML)); IOFileFilter codegenFile = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), FileFilterUtils.nameFileFilter(CODEGEN_FOLDER)); IOFileFilter mmFile = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), FileFilterUtils.nameFileFilter(METAMODEL_FOLDER)); IOFileFilter transfoFile = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), FileFilterUtils.nameFileFilter(TRANSFO_FOLDER)); FileFilter filter = FileFilterUtils.or(genXMLFile, codegenFile, mmFile, transfoFile); FileUtils.copyDirectory(new File(getIProject().getLocationURI()), destFolder, filter);*/ if (codegenFolderExist()) { FileUtils.copyDirectory(new File(getCodegenFolder().getLocationURI()), new File(destFolder + "/" + CODEGEN_FOLDER)); } if (metamodelsFolderExist()) { FileUtils.copyDirectory(new File(getMetamodelsFolder().getLocationURI()), new File(destFolder + "/" + METAMODEL_FOLDER)); } if (tranformationsFolderExist()) { FileUtils.copyDirectory(new File(getTransformationsFolder().getLocationURI()), new File(destFolder + "/" + TRANSFO_FOLDER)); } if (generatorXMLExist()) { FileUtils.copyFile(new File(getGeneratorXMLFile().getLocationURI()), new File(destFolder + "/" + GENERATOR_XML)); } if (!new File(destFolder).exists()) { return null; } ZipFile zip = new ZipFile(new File(tmpFolder.getAbsolutePath() + "/out.zip")); ZipParameters p = new ZipParameters(); p.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); p.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); zip.addFolder(destFolder, p); return zip.getFile(); } }