001    /*
002     @license.text@
003      */
004    package biz.hammurapi.ant;
005    
006    import java.io.File;
007    import java.io.FileReader;
008    import java.io.IOException;
009    import java.io.InputStream;
010    import java.io.InputStreamReader;
011    import java.io.StringReader;
012    import java.net.URL;
013    import java.sql.SQLException;
014    
015    import org.apache.tools.ant.BuildException;
016    import org.apache.tools.ant.Task;
017    
018    import biz.hammurapi.sql.SQLProcessor;
019    
020    /**
021     * Executes SQL script
022     * 
023     * @ant.task name="Script" category="Common"
024     * @author Pavel Vlasov
025     *
026     * @version $Revision: 1.1 $
027     */
028    public class Script extends Task {
029            private String script="";
030            private String delimiter=";";
031            private ConnectionEntry connectionEntry;
032            
033            /**
034             * Connection
035             * @ant.not-required
036             * @param connectionEntry
037             */
038            public void addConfiguredConnection(ConnectionEntry connectionEntry) {
039                    this.connectionEntry=connectionEntry;
040            }
041            
042            /**
043             * Statements delimiter (single character). Defaults to ';'
044             * @ant.not-required
045             * @param delimiter
046             */
047            public void setDelimiter(String delimiter) {
048                    this.delimiter=delimiter;
049            }
050            
051            /**
052             * Script text. Required if file is not set.
053             * @ant.not-required
054             * @param text
055             */
056            public void  addText(String text) {
057                    script+=text;
058            }
059            
060            private File file;
061            private URL url;
062            private String resource;
063                    
064            /**
065             * Script file.  One and only one of 'file', 'url', or 'resource' is required.
066             * @ant.required
067             * @param file
068             */
069            public void setFile(File file) {
070                    if (url!=null) {
071                            throw new BuildException("File and URL are mutually exclusive. URL already set");
072                    }
073                    if (resource!=null) {
074                            throw new BuildException("File and resource are mutually exclusive. Resource already set");
075                    }
076                    this.file = file;
077            }
078            
079            /**
080             * Script classloader resource.  One and only one of 'file', 'url', or 'resource' is required.
081             * @ant.required
082             * @param file
083             */
084            public void setResource(String resource) {
085                    if (url!=null) {
086                            throw new BuildException("Resource and URL are mutually exclusive. URL already set");
087                    }
088                    if (file!=null) {
089                            throw new BuildException("File and resource are mutually exclusive. File already set");
090                    }
091                    this.resource = resource;
092            }
093            
094            /**
095             * Script URL. One and only one of 'file', 'url', or 'resource' is required. 
096             * @ant.required
097             * @param url
098             */
099            public void setUrl(URL url) {
100                    if (file!=null) {
101                            throw new BuildException("File and URL are mutually exclusive. File already set");
102                    }               
103                    if (resource!=null) {
104                            throw new BuildException("Resource and URL are mutually exclusive. Resource already set");
105                    }               
106                    this.url = url;
107            }
108            
109            public void execute(SQLProcessor processor) throws IOException, SQLException {
110                    if (script.trim().length()>0) {
111                            processor.executeScript(new StringReader(script), delimiter.charAt(0));
112                    }
113                    
114                    if (file!=null) {
115                            processor.executeScript(new FileReader(file), delimiter.charAt(0));
116                    }
117                    
118                    if (url!=null) {
119                            processor.executeScript(new InputStreamReader(url.openStream()), delimiter.charAt(0));
120                    }
121                    
122                    if (resource!=null) {
123                            InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(resource);
124                            if (resourceAsStream==null) {
125                                    throw new BuildException("Resource not found: "+resource);
126                            }
127                            processor.executeScript(new InputStreamReader(resourceAsStream), delimiter.charAt(0));
128                    }               
129            }
130            
131            public void execute() throws BuildException {
132                    try {
133                            execute(new SQLProcessor(connectionEntry.getDataSource(),null));
134                    } catch (IOException e) {
135                            throw new  BuildException(e);
136                    } catch (SQLException e) {
137                            throw new  BuildException(e);
138                    }
139            }
140    }