001 package org.apache.torque.mojo;
002
003 import java.io.File;
004 import java.io.FileInputStream;
005 import java.io.FileOutputStream;
006 import java.io.IOException;
007
008 import org.apache.maven.plugin.MojoExecutionException;
009 import org.apache.torque.mojo.morph.MorphRequest;
010 import org.apache.torque.mojo.morph.Morpher;
011 import org.codehaus.plexus.util.FileUtils;
012
013 /**
014 * Common logic for morphing one file to another file
015 */
016 public abstract class AbstractMorphSingleMojo extends BaseMojo {
017
018 /**
019 * The file that will contain the morphed contents
020 */
021 private File newFile;
022
023 /**
024 * The file containing the contents to be morphed
025 */
026 private File oldFile;
027
028 /**
029 * Add logic to the basic skip() method for skipping based on a morph being needed
030 */
031 @Override
032 protected boolean skipMojo() {
033 // We may be skipping based on packaging of type 'pom'
034 if (super.skipMojo()) {
035 return true;
036 }
037
038 // If a morph is needed, we can't skip
039 boolean morphNeeded = isMorphNeeded();
040 if (morphNeeded) {
041 return false;
042 } else {
043 getLog().info("Skipping morph. Nothing has changed");
044 return true;
045 }
046 }
047
048 protected boolean isMorphNeeded() {
049 // The file they asked to morph does not exist
050 if (!getOldFile().exists()) {
051 getLog().debug("file:" + getOldFile().getAbsolutePath() + " does not exist");
052 return false;
053 }
054
055 // The new file does not exist, we need to morph
056 if (!getNewFile().exists()) {
057 return true;
058 }
059
060 // Extract the last modified timestamps
061 long oldLastModified = getOldFile().lastModified();
062 long newLastModified = getNewFile().lastModified();
063
064 // If old file has been modified since the new file was last modified,
065 // we need to morph
066 return oldLastModified > newLastModified;
067 }
068
069 protected abstract Morpher getMorpher(MorphRequest request, String artifactId);
070
071 @Override
072 protected void executeMojo() throws MojoExecutionException {
073 try {
074 getLog().info("From: " + oldFile.getAbsolutePath());
075 getLog().info(" To: " + newFile.getAbsolutePath());
076 FileUtils.forceMkdir(new File(FileUtils.getPath(newFile.getAbsolutePath())));
077 MorphRequest request = new MorphRequest(oldFile.getName(), new FileInputStream(oldFile),
078 new FileOutputStream(newFile));
079 request.setEncoding(getEncoding());
080 Morpher morpher = getMorpher(request, getProject().getArtifactId());
081 morpher.executeMorph();
082 } catch (IOException e) {
083 throw new MojoExecutionException("Unexpected error while attempting to morph " + oldFile.getAbsolutePath(),
084 e);
085 }
086 }
087
088 public File getNewFile() {
089 return newFile;
090 }
091
092 public void setNewFile(final File newFile) {
093 this.newFile = newFile;
094 }
095
096 public File getOldFile() {
097 return oldFile;
098 }
099
100 public void setOldFile(final File oldFile) {
101 this.oldFile = oldFile;
102 }
103 }