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 }