All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nuiton.eugene.AbstractGenerator Maven / Gradle / Ivy

/*
 * #%L
 * EUGene :: EUGene Core
 * %%
 * Copyright (C) 2004 - 2017 Code Lutin, Ultreia.io
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation, either version 3 of the 
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public 
 * License along with this program.  If not, see
 * .
 * #L%
 */

package org.nuiton.eugene;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.eugene.models.Model;
import org.nuiton.eugene.writer.WriterReport;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;

/**
 * AbstractGenerator
 *
 * Created: 28 oct. 2009
 *
 * @param  type of Model
 * @author Florian Desbois - [email protected]
 */
public abstract class AbstractGenerator extends Template {

    private static final Log log = LogFactory.getLog(AbstractGenerator.class);

    protected AbstractGenerator parent;

    public AbstractGenerator() {
    }

    public AbstractGenerator(AbstractGenerator parent) {
        setParent(parent);
    }

    public void setParent(AbstractGenerator parent) {
        this.parent = parent;
    }

    @Override
    public boolean isOverwrite() {
        if (parent != null) {
            return parent.isOverwrite();
        }
        return super.isOverwrite();
    }

    @Override
    public String getEncoding() {
        if (parent != null) {
            return parent.getEncoding();
        }
        return super.getEncoding();
    }

    @Override
    public String getProperty(String name) {
        if (parent != null) {
            return parent.getProperty(name);
        }
        return super.getProperty(name);
    }

    @Override
    public long getLastModifiedSource() {
        if (parent != null) {
            return parent.getLastModifiedSource();
        }
        return super.getLastModifiedSource();
    }

    @Override
    public  V getProperty(String key, Class type) {
        if (parent != null) {
            return parent.getConfiguration().getProperty(key, type);
        }
        return getConfiguration().getProperty(key, type);
    }

    /**
     * @param file fichier a tester
     * @return vrai si le fichier passé en parametre est plus recent que
     * les sources sur generateur.
     */
    protected boolean isNewerThanSource(File file) {
        if (log.isDebugEnabled()) {
            log.debug("source date: " + getLastModifiedSource()
                      + " file date: " + file.lastModified() + " (" + file + ")");
        }
        return file.lastModified() > getLastModifiedSource();
    }

    protected File getDestinationFile(File destDir, String filename) {
        return new File(destDir, filename);
    }

    /**
     * Test if given package is allowed for generation.
     * An element can be generated if his package is in the
     * {@link #generatedPackages} list or if {@link #generatedPackages} is null
     * or empty.
     *
     * @param packageName package name to test
     * @return generation allowed
     */
    protected boolean canGeneratePackage(String packageName) {
        boolean canGenerate = true;
        if (parent != null) {
            return parent.canGeneratePackage(packageName);
        }
        // if not generation restriction, generate everything
        List generatedPackages = getGeneratedPackages();

        if (generatedPackages != null && !generatedPackages.isEmpty()) {
            canGenerate = false;

            // on doit donc tester que le package courant
            // soit est egal a un des element de la liste
            // soit commence par ca
            for (String generatedPackage : generatedPackages) {

                // cas egalité parfaites
                if (packageName != null &&
                    packageName.equals(generatedPackage)) {
                    canGenerate = true;
                }

                // cas commence par (on ajout un point à la fin)
                String localGeneratedPackage = generatedPackage;
                if (!localGeneratedPackage.endsWith(".")) {
                    localGeneratedPackage += ".";
                }
                if (packageName != null &&
                    packageName.startsWith(localGeneratedPackage)) {
                    canGenerate = true;
                }

            }
        }

        return canGenerate;
    }

    protected void write(File outputFile, MonitorWriter out) {

        if (!out.isModified()) {
            if (log.isDebugEnabled()) {
                log.debug("skip generation of " + outputFile + ", No content.");
            }
            return;
        }
        try {
            outputFile = outputFile.getCanonicalFile();

            if (!outputFile.getParentFile().exists()) {
                boolean b = outputFile.getParentFile().mkdirs();
                if (!b) {
                    throw new IllegalStateException(
                            "could not create directory " +
                            outputFile.getParentFile());
                }
            }

            WriterReport writerReport = getWriterReport();

            if (writerReport != null) {
                writerReport.addFile(getClass().getName(), outputFile, false);
            }

            try (Writer output = getWriter(outputFile)) {
                if (log.isDebugEnabled()) {
                    log.debug("Will generate file " + outputFile);
                }
                output.write(out.getBuffer().toString());
            }
        } catch (IOException eee) {
            if (log.isWarnEnabled()) {
                log.warn("Unable to write file : " +
                         outputFile.getAbsolutePath(), eee);
            }
            throw new RuntimeException(eee);
        }
    }

    protected Writer getWriter(File outputFile) throws IOException {

        FileOutputStream stream = new FileOutputStream(outputFile);
        Writer output;
        String encoding = getEncoding();
        if (encoding != null) {
            if (log.isDebugEnabled()) {
                log.debug("Force encoding to " + encoding + " : " + this);
            }
            output = new OutputStreamWriter(stream, encoding);
        } else {
            output = new OutputStreamWriter(stream);
        }
        return output;

    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy