net.leadware.hibernate4.maven.plugin.ShemaExportMojo.java Source code

Java tutorial

Introduction

Here is the source code for net.leadware.hibernate4.maven.plugin.ShemaExportMojo.java

Source

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package net.leadware.hibernate4.maven.plugin;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.FileUtils;
import org.hibernate.cfg.Configuration;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;

/**
 * Mojo executant le goal hbm2ddl 
 * @author <a href="mailto:jetune@leadware.net">Jean-Jacques ETUNE NGI</a>
 * @since 22 dec. 2013 - 12:48:12
 */
@SuppressWarnings("deprecation")
@Mojo(name = "hbm2ddl", defaultPhase = LifecyclePhase.PROCESS_TEST_RESOURCES, threadSafe = true, requiresProject = true, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
public class ShemaExportMojo extends AbstractMojo {

    /**
     * Projet Maven en cours
     */
    @Component
    private MavenProject project;

    /**
     * Nom de l'unite de persistence
     */
    @Parameter
    private String unitName;

    /**
     * Delimiteur
     */
    @Parameter(defaultValue = ";")
    private String delimiter;

    /**
     * Fichier d'exportation des scripts de nettoyage
     */
    @Parameter(defaultValue = "${project.build.directory}/hibernate/drop.sql")
    private String dropOutputFile;

    /**
     * Fichier d'exportation des scripts de creation
     */
    @Parameter(defaultValue = "${project.build.directory}/hibernate/create.sql")
    private String createOutputFile;

    /**
     * Fichier d'exportation des scripts de mise a jour
     */
    @Parameter
    private String updateOutputFile;

    /**
     * Dialecte de generation
     */
    @Parameter
    private String dialect;

    /**
     * Fichier de persistence
     */
    @Parameter
    private String persistenceFile;

    /**
     * Scripts additionnels
     */
    @Parameter(property = "extendedScripts")
    private ExtendedScripts extendedScripts;

    /*
     * (non-Javadoc)
     * @see org.apache.maven.plugin.Mojo#execute()
     */
    public void execute() throws MojoExecutionException, MojoFailureException {

        // Un log
        getLog().info("Exportation de l'Unite de persistence: " + unitName + ".");

        // Initialisation du repertoire de sortie
        initOutputDirectory();

        // Fichier de drop
        File dropFile = new File(dropOutputFile.trim());

        // Fichier de drop
        File createFile = new File(createOutputFile.trim());

        // Fichier de drop
        File updateFile = null;

        // Obtention du Thread courant
        final Thread currentThread = Thread.currentThread();

        // Obtention du stream de sortie
        final PrintStream oldOut = System.out;

        // Obtention du classloader du thread en cours
        final ClassLoader oldClassLoader = currentThread.getContextClassLoader();

        try {

            // Positionnement de la sortie par defaut
            System.setOut(new PrintStream(new ByteArrayOutputStream()));

            // Positionnement du classloader avec ajout des chemins de classe du projet maven sous-jacent
            currentThread.setContextClassLoader(buildClassLoader(oldClassLoader));

            // Configuration EJB3
            Ejb3Configuration jpaConfiguration = null;

            // Si le fichier de persistence est renseigne
            if (persistenceFile != null && !persistenceFile.trim().isEmpty()) {

                // On positionne le fichier de persistence
                jpaConfiguration = new Ejb3Configuration().addFile(persistenceFile).configure(unitName, null);

            } else {

                // Configuration EJB3
                jpaConfiguration = new Ejb3Configuration().configure(unitName, null);
            }

            // Configuration Hibernate
            Configuration configuration = jpaConfiguration.getHibernateConfiguration();

            // Si le dialect a ete precise dans la configuration du plugin
            if (dialect != null && !dialect.trim().isEmpty())
                configuration.setProperty("hibernate.dialect", dialect.trim());

            // Exporteur de schema
            SchemaExport exporter = new SchemaExport(configuration);

            // Positionnement du delimiteur
            exporter.setDelimiter(delimiter);

            // Positionnement du fichier de sortie en drop
            exporter.setOutputFile(dropFile.getAbsolutePath());

            // Exportation des scripts drop
            exporter.execute(true, false, true, false);

            // Positionnement du fichier de sortie en create
            exporter.setOutputFile(createFile.getAbsolutePath());

            // Exportation des scripts drop
            exporter.execute(true, false, false, true);

            // Si le chemin des scripts de mise a jour est positionne
            if (updateOutputFile != null && !updateOutputFile.trim().isEmpty()) {

                // Modificateur de schema
                SchemaUpdate updater = new SchemaUpdate(configuration);

                // Fichier de drop
                updateFile = new File(updateOutputFile.trim());

                // Positionnement du fichier de sortie en create
                updater.setOutputFile(updateFile.getAbsolutePath());

                // Exportation des scripts drop
                updater.execute(true, true);
            }

            // Si il ya des cripts additionnels
            if (extendedScripts != null) {

                // Parcours de la liste des scripts de creation
                for (String script : extendedScripts.getCreateScripts()) {

                    // Tentative de construction d'un File sur le la chaine script
                    File scriptFile = new File(script);

                    // Si l'objet existe et est un fichier
                    if (scriptFile.exists() && scriptFile.isFile()) {

                        // Ajout de son contenu dans le fichier de script en cours
                        FileUtils.fileAppend(createFile.getAbsolutePath(), "\n\n" + FileUtils.fileRead(scriptFile));

                    } else {

                        // Ajout du script dans le fichier
                        FileUtils.fileAppend(createFile.getAbsolutePath(), "\n\t" + script);
                    }
                }

                // Parcours de la liste des scripts de suppression
                for (String script : extendedScripts.getDropScripts()) {

                    // Tentative de construction d'un File sur le la chaine script
                    File scriptFile = new File(script);

                    // Si l'objet existe et est un fichier
                    if (scriptFile.exists() && scriptFile.isFile()) {

                        // Ajout de son contenu dans le fichier de script en cours
                        FileUtils.fileAppend(dropFile.getAbsolutePath(), "\n\n" + FileUtils.fileRead(scriptFile));

                    } else {

                        // Ajout du script dans le fichier
                        FileUtils.fileAppend(dropFile.getAbsolutePath(), "\n\t" + script);
                    }
                }

                // Si le chemin des scripts de mise a jour est positionne
                if (updateOutputFile != null && !updateOutputFile.trim().isEmpty()) {

                    // Parcours de la liste des scripts de mise a jour
                    for (String script : extendedScripts.getUpdateScripts()) {

                        // Tentative de construction d'un File sur le la chaine script
                        File scriptFile = new File(script);

                        // Si l'objet existe et est un fichier
                        if (scriptFile.exists() && scriptFile.isFile()) {

                            // Ajout de son contenu dans le fichier de script en cours
                            FileUtils.fileAppend(updateFile.getAbsolutePath(),
                                    "\n\n" + FileUtils.fileRead(scriptFile));

                        } else {

                            // Ajout du script dans le fichier
                            FileUtils.fileAppend(updateFile.getAbsolutePath(), "\n\t" + script);
                        }
                    }

                }
            }

        } catch (Exception e) {

            // On relance
            throw new MojoExecutionException(e.getMessage(), e);

        } finally {

            // On repositionne la sortie standard
            System.setOut(oldOut);

            // On repositionne le classloader
            currentThread.setContextClassLoader(oldClassLoader);
        }
    }

    /**
     * Methode d'initialisation du repertoire de sortie
     */
    private void initOutputDirectory() {

        // Fichier create
        File createDir = new File(createOutputFile.trim()).getParentFile();

        // Si le repertoire n'existe pas
        if (!createDir.exists())
            createDir.mkdirs();

        // Fichier drop
        File dropDir = new File(dropOutputFile.trim()).getParentFile();

        // Si le repertoire n'existe pas
        if (!dropDir.exists())
            dropDir.mkdirs();

        // Si le fichier de mise a jour est renseigne
        if (updateOutputFile != null && !updateOutputFile.trim().isEmpty()) {

            // Fichier drop
            File updateDir = new File(updateOutputFile.trim()).getParentFile();

            // Si le repertoire n'existe pas
            if (!updateDir.exists())
                updateDir.mkdirs();

        }
    }

    @SuppressWarnings("unchecked")
    private ClassLoader buildClassLoader(final ClassLoader delegate) {

        try {

            // Liste des chemins de classes
            final List<String> classpathElements = new ArrayList<String>();

            // Ajout des chemins de classe de compilation
            classpathElements.addAll(project.getCompileClasspathElements());

            // Ajout des chemins de classe d'execution
            classpathElements.addAll(project.getRuntimeClasspathElements());

            // Ajout des chemins de classe de build
            classpathElements.add(project.getBuild().getOutputDirectory());

            // Tableau des URL du classpath
            final URL urls[] = new URL[classpathElements.size()];

            // Parcours de la liste des chemins de classes
            for (int i = 0; i < classpathElements.size(); ++i) {

                // Ajout de l'URL
                urls[i] = new File(classpathElements.get(i)).toURI().toURL();
            }

            // Construction du ClassLoader
            ClassLoader buildedClassloader = new URLClassLoader(urls, delegate);

            // On retourne le Classloader
            return buildedClassloader;

        } catch (Exception e) {

            // Un Log
            getLog().debug("Erreur lors de la construction de ClassLoader Maven pour le Plugin");

            // On retourne le ClassLoader actuel
            return this.getClass().getClassLoader();
        }
    }
}