001    /**
002     * Copyright 2004-2012 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.apache.torque.mojo;
017    
018    import java.io.File;
019    import java.io.FileInputStream;
020    import java.io.FileOutputStream;
021    import java.io.IOException;
022    
023    import org.apache.maven.plugin.MojoExecutionException;
024    import org.apache.torque.mojo.morph.MorphRequest;
025    import org.apache.torque.mojo.morph.Morpher;
026    import org.codehaus.plexus.util.FileUtils;
027    
028    /**
029     * Common logic for morphing one file to another file
030     */
031    public abstract class AbstractMorphSingleMojo extends BaseMojo {
032    
033            /**
034             * The artifactId (aka database schema)
035             *
036             * @parameter expression="${impex.artifactId}" default-value="${project.artifactId}"
037             * @required
038             */
039            private String artifactId;
040    
041            /**
042             * The file that will contain the morphed contents
043             */
044            private File newFile;
045    
046            /**
047             * The file containing the contents to be morphed
048             */
049            private File oldFile;
050    
051            /**
052             * Add logic to the basic skip() method for skipping based on a morph being needed
053             */
054            @Override
055            protected boolean skipMojo() {
056                    // We may be skipping based on packaging of type 'pom'
057                    if (super.skipMojo()) {
058                            return true;
059                    }
060    
061                    // If a morph is needed, we can't skip
062                    boolean morphNeeded = isMorphNeeded();
063                    if (morphNeeded) {
064                            return false;
065                    } else {
066                            getLog().info("Skipping morph.  Nothing has changed");
067                            return true;
068                    }
069            }
070    
071            protected boolean isMorphNeeded() {
072                    // The file they asked to morph does not exist
073                    if (!getOldFile().exists()) {
074                            getLog().debug("file:" + getOldFile().getAbsolutePath() + " does not exist");
075                            return false;
076                    }
077    
078                    // The new file does not exist, we need to morph
079                    if (!getNewFile().exists()) {
080                            return true;
081                    }
082    
083                    // Extract the last modified timestamps
084                    long oldLastModified = getOldFile().lastModified();
085                    long newLastModified = getNewFile().lastModified();
086    
087                    // If old file has been modified since the new file was last modified,
088                    // we need to morph
089                    return oldLastModified > newLastModified;
090            }
091    
092            protected abstract Morpher getMorpher(MorphRequest request, String artifactId);
093    
094            @Override
095            protected void executeMojo() throws MojoExecutionException {
096                    try {
097                            getLog().info("From: " + oldFile.getAbsolutePath());
098                            getLog().info("  To: " + newFile.getAbsolutePath());
099                            FileUtils.forceMkdir(new File(FileUtils.getPath(newFile.getAbsolutePath())));
100                            MorphRequest request = new MorphRequest(oldFile.getName(), new FileInputStream(oldFile), new FileOutputStream(newFile));
101                            request.setEncoding(getEncoding());
102                            Morpher morpher = getMorpher(request, artifactId);
103                            morpher.executeMorph();
104                    } catch (IOException e) {
105                            throw new MojoExecutionException("Unexpected error while attempting to morph " + oldFile.getAbsolutePath(), e);
106                    }
107            }
108    
109            public File getNewFile() {
110                    return newFile;
111            }
112    
113            public void setNewFile(final File newFile) {
114                    this.newFile = newFile;
115            }
116    
117            public File getOldFile() {
118                    return oldFile;
119            }
120    
121            public void setOldFile(final File oldFile) {
122                    this.oldFile = oldFile;
123            }
124    
125            public String getArtifactId() {
126                    return artifactId;
127            }
128    
129            public void setArtifactId(String artifactId) {
130                    this.artifactId = artifactId;
131            }
132    }