001 package org.apache.torque.mojo;
002
003 import java.io.File;
004 import java.util.List;
005 import java.util.Properties;
006 import java.util.Set;
007 import java.util.TreeSet;
008
009 import org.apache.maven.plugin.MojoExecutionException;
010 import org.apache.maven.plugin.MojoFailureException;
011 import org.apache.tools.ant.DirectoryScanner;
012 import org.apache.torque.engine.database.model.Database;
013 import org.apache.torque.engine.database.model.Table;
014 import org.kuali.core.db.torque.SetUtils;
015 import org.kuali.core.db.torque.Utils;
016
017 /**
018 * This mojo identifies data files that are present on the file system but are not present in schema.xml. This can
019 * happen if a table is removed from the schema.
020 *
021 * It sets a project property called "impex.data.invalid". This property is a comma delimited list of filenames that
022 * have no match in the db schema.
023 *
024 * @goal id-invalid-data-files
025 */
026 public class IdentifyInvalidDataFiles extends BaseMojo {
027 private static final String FS = System.getProperty("file.separator");
028
029 /**
030 * @parameter expression="${extension}" default-value=".xml"
031 * @required
032 */
033 private String extension;
034
035 /**
036 * @parameter expression="${dataDir}" default-value="${project.basedir}/src/main/impex"
037 * @required
038 */
039 private File dataDir;
040
041 /**
042 * @parameter expression="${dataDirIncludes}" default-value="*.xml"
043 */
044 private String dataDirIncludes;
045
046 /**
047 * @parameter expression="${dataDirExcludes}" default-value="schema.xml"
048 */
049 private String dataDirExcludes;
050
051 /**
052 * @parameter expression="${schemaXMLFile}" default-value="src/main/impex/schema.xml"
053 */
054 private String schemaXMLFile;
055
056 /**
057 * @parameter expression="${targetDatabase}" default-value="oracle"
058 */
059 private String targetDatabase;
060
061 @Override
062 protected void executeMojo() throws MojoExecutionException, MojoFailureException {
063 Utils utils = new Utils();
064 try {
065 getLog().info("Examining " + dataDir.getAbsolutePath());
066 Database db = utils.getDatabase(schemaXMLFile, targetDatabase);
067 DirectoryScanner ds = getDirectoryScanner();
068 Set<File> existing = getExistingFiles(ds);
069 Set<File> allowed = getDatabaseFiles(db);
070 Set<File> invalid = SetUtils.difference(existing, allowed);
071 getLog().info(existing.size() + " data files currently exist");
072 getLog().info(invalid.size() + " of those are invalid");
073 StringBuilder sb = new StringBuilder();
074 int count = 0;
075 for (File file : invalid) {
076 if (count != 0) {
077 sb.append(",");
078 }
079 sb.append("**/src/main/impex/" + file.getName());
080 getLog().info("Marked for removal: " + file.getName());
081 count++;
082 }
083 Properties properties = getProject().getProperties();
084 properties.setProperty("impex.data.invalid", sb.toString());
085 } catch (Exception e) {
086 throw new MojoExecutionException("Error executing mojo", e);
087 }
088 }
089
090 protected Set<File> getDatabaseFiles(Database db) {
091 List<?> tables = db.getTables();
092 Set<File> files = new TreeSet<File>();
093 for (Object object : tables) {
094 Table table = (Table) object;
095 String tableName = table.getName();
096 String filename = dataDir.getAbsolutePath() + FS + tableName + extension;
097 File file = new File(filename);
098 files.add(file);
099 }
100 return files;
101 }
102
103 protected Set<File> getExistingFiles(DirectoryScanner ds) {
104 ds.scan();
105 String[] relativeFilenames = ds.getIncludedFiles();
106 Set<File> files = new TreeSet<File>();
107 for (int i = 0; i < relativeFilenames.length; i++) {
108 String filename = ds.getBasedir().getAbsolutePath() + FS + relativeFilenames[i];
109 File file = new File(filename);
110 files.add(file);
111 }
112 return files;
113 }
114
115 protected DirectoryScanner getDirectoryScanner() {
116 DirectoryScanner ds = new DirectoryScanner();
117 ds.setBasedir(dataDir);
118 ds.setIncludes(new String[] { dataDirIncludes });
119 ds.setExcludes(new String[] { dataDirExcludes });
120 return ds;
121 }
122
123 protected File getFile(Table table) {
124 String tableName = table.getName();
125 String filename = dataDir.getAbsolutePath() + FS + tableName + extension;
126 File file = new File(filename);
127 return file;
128 }
129
130 public File getDataDir() {
131 return dataDir;
132 }
133
134 public void setDataDir(File dataDir) {
135 this.dataDir = dataDir;
136 }
137
138 public String getDataDirIncludes() {
139 return dataDirIncludes;
140 }
141
142 public void setDataDirIncludes(String dataDirIncludes) {
143 this.dataDirIncludes = dataDirIncludes;
144 }
145
146 public String getDataDirExcludes() {
147 return dataDirExcludes;
148 }
149
150 public void setDataDirExcludes(String dataDirExcludes) {
151 this.dataDirExcludes = dataDirExcludes;
152 }
153
154 public String getSchemaXMLFile() {
155 return schemaXMLFile;
156 }
157
158 public void setSchemaXMLFile(String schemaXMLFile) {
159 this.schemaXMLFile = schemaXMLFile;
160 }
161
162 public String getExtension() {
163 return extension;
164 }
165
166 public void setExtension(String extension) {
167 this.extension = extension;
168 }
169
170 public String getTargetDatabase() {
171 return targetDatabase;
172 }
173
174 public void setTargetDatabase(String targetDatabase) {
175 this.targetDatabase = targetDatabase;
176 }
177
178 }