001    package org.apache.torque.mojo;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.io.File;
023    import java.util.Collections;
024    import java.util.Comparator;
025    import java.util.List;
026    import java.util.Vector;
027    
028    import org.apache.commons.collections.comparators.ReverseComparator;
029    import org.apache.maven.plugin.MojoExecutionException;
030    import org.apache.torque.util.SimpleScanner;
031    import org.apache.torque.util.TransactionComparator;
032    import org.kuali.db.jdbc.Transaction;
033    
034    /**
035     * Executes SQL for creating tables, primary keys, constraints, indexes, relationships, and views inside a database.
036     * Also populates the tables with a default set of data.
037     * 
038     * @goal import
039     */
040    public class ImportMojo extends AbstractSQLExecutorMojo {
041            private static final String FS = System.getProperty("file.separator");
042    
043            public enum Order {
044                    ASCENDING, DESCENDING, NONE;
045            }
046    
047            /**
048             * This is the directory to scan for SQL files to import. ${targetDatabase} gets appended to this value
049             * 
050             * @parameter expression="${importDir}" default-value="${project.build.directory}/classes/sql"
051             * @required
052             */
053            private File importDir;
054    
055            /**
056             * @parameter expression="${importDirIncludes}" default-value="*.sql"
057             */
058            private String importDirIncludes;
059    
060            /**
061             * @parameter expression="${importDirExcludes}" default-value=""
062             */
063            private String importDirExcludes = "";
064    
065            /**
066             * Set the order in which the SQL files will be executed. Possible values are <code>ASCENDING</code> and
067             * <code>DESCENDING</code> and <code>NONE</code>. Default value is <code>ASCENDING</code>
068             * 
069             * @parameter expression="${order}"
070             */
071            private String order = Order.ASCENDING.toString();
072    
073            protected void updateImportDir() {
074                    String path = importDir.getAbsolutePath();
075                    if (!path.endsWith(FS)) {
076                            path += FS;
077                    }
078                    path += getTargetDatabase();
079                    importDir = new File(path);
080            }
081    
082            protected Vector<Transaction> getTransactions(List<File> files) {
083                    Vector<Transaction> transactions = new Vector<Transaction>();
084                    for (File file : files) {
085                            Transaction t = new Transaction();
086                            t.setResourceLocation(file.getAbsolutePath());
087                            transactions.add(t);
088                    }
089                    return transactions;
090            }
091    
092            @Override
093            protected void configureTransactions() throws MojoExecutionException {
094                    updateImportDir();
095                    List<File> files = new SimpleScanner(importDir, importDirIncludes, importDirExcludes).getFiles();
096                    transactions = getTransactions(files);
097                    sortTransactions(transactions);
098            }
099    
100            /**
101             * Sort the transaction list.
102             */
103            @SuppressWarnings("unchecked")
104            protected void sortTransactions(Vector<Transaction> transactions) {
105                    Comparator<Transaction> comparator = new TransactionComparator<Transaction>(getProject().getArtifactId());
106                    if (Order.ASCENDING.toString().equals(order)) {
107                            Collections.sort(transactions, comparator);
108                    } else if (Order.DESCENDING.toString().equals(order)) {
109                            Collections.sort(transactions, new ReverseComparator(comparator));
110                    }
111            }
112    
113            public File getImportDir() {
114                    return importDir;
115            }
116    
117            public void setImportDir(File importDirectory) {
118                    this.importDir = importDirectory;
119            }
120    
121            public String getImportDirIncludes() {
122                    return importDirIncludes;
123            }
124    
125            public void setImportDirIncludes(String importDirectoryIncludes) {
126                    this.importDirIncludes = importDirectoryIncludes;
127            }
128    
129            public String getImportDirExcludes() {
130                    return importDirExcludes;
131            }
132    
133            public void setImportDirExcludes(String importDirectoryExcludes) {
134                    this.importDirExcludes = importDirectoryExcludes;
135            }
136    
137            public String getOrder() {
138                    return order;
139            }
140    
141            public void setOrder(String order) {
142                    this.order = order;
143            }
144    }