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),
101                        new FileOutputStream(newFile));
102                request.setEncoding(getEncoding());
103                Morpher morpher = getMorpher(request, artifactId);
104                morpher.executeMorph();
105            } catch (IOException e) {
106                throw new MojoExecutionException("Unexpected error while attempting to morph " + oldFile.getAbsolutePath(),
107                        e);
108            }
109        }
110    
111        public File getNewFile() {
112            return newFile;
113        }
114    
115        public void setNewFile(final File newFile) {
116            this.newFile = newFile;
117        }
118    
119        public File getOldFile() {
120            return oldFile;
121        }
122    
123        public void setOldFile(final File oldFile) {
124            this.oldFile = oldFile;
125        }
126    
127        public String getArtifactId() {
128            return artifactId;
129        }
130    
131        public void setArtifactId(String artifactId) {
132            this.artifactId = artifactId;
133        }
134    }