1 package org.apache.torque.task;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.io.File;
20 import java.io.FileInputStream;
21 import java.io.FileOutputStream;
22
23 import java.util.Iterator;
24 import java.util.Properties;
25
26 import org.apache.tools.ant.BuildException;
27
28 import org.apache.velocity.context.Context;
29
30 import org.apache.torque.engine.EngineException;
31 import org.apache.torque.engine.database.transform.XmlToAppData;
32 import org.apache.torque.engine.database.model.Database;
33
34
35 /***
36 * An extended Texen task used for generating SQL source from
37 * an XML schema describing a database structure.
38 *
39 * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
40 * @author <a href="mailto:jmcnally@collab.net>John McNally</a>
41 * @version $Id: TorqueSQLTask.java 239624 2005-08-24 12:18:03Z henning $
42 */
43 public class TorqueSQLTask extends TorqueDataModelTask
44 {
45
46
47
48
49 private String database;
50 private String suffix = "";
51
52 private String idTableXMLFile = null;
53
54 /***
55 *
56 * @param database
57 */
58 public void setDatabase(String database)
59 {
60 this.database = database;
61 }
62
63 /***
64 *
65 * @return
66 */
67 public String getDatabase()
68 {
69 return database;
70 }
71
72 /***
73 *
74 * @param suffix
75 */
76 public void setSuffix(String suffix)
77 {
78 this.suffix = suffix;
79 }
80
81 /***
82 *
83 * @return
84 */
85 public String getSuffix()
86 {
87 return suffix;
88 }
89
90 /***
91 * Set the path to the xml schema file that defines the id-table, used
92 * by the idbroker method.
93 *
94 * @param idXmlFile xml schema file
95 */
96 public void setIdTableXMLFile(String idXmlFile)
97 {
98 idTableXMLFile = idXmlFile;
99 }
100
101 /***
102 * Gets the id-table xml schema file path.
103 *
104 * @return Path to file.
105 */
106 public String getIdTableXMLFile()
107 {
108 return idTableXMLFile;
109 }
110
111 /***
112 * create the sql -> database map.
113 *
114 * @throws Exception
115 */
116 private void createSqlDbMap() throws Exception
117 {
118 if (getSqlDbMap() == null)
119 {
120 return;
121 }
122
123
124 Properties sqldbmap = new Properties();
125
126
127 File file = new File(getSqlDbMap());
128
129 if (file.exists())
130 {
131 FileInputStream fis = new FileInputStream(file);
132 sqldbmap.load(fis);
133 fis.close();
134 }
135
136 Iterator i = getDataModelDbMap().keySet().iterator();
137
138 while (i.hasNext())
139 {
140 String dataModelName = (String) i.next();
141 String sqlFile = dataModelName + suffix + ".sql";
142
143 String databaseName;
144
145 if (getDatabase() == null)
146 {
147 databaseName = (String) getDataModelDbMap().get(dataModelName);
148 }
149 else
150 {
151 databaseName = getDatabase();
152 }
153
154 sqldbmap.setProperty(sqlFile, databaseName);
155 }
156
157 sqldbmap.store(new FileOutputStream(getSqlDbMap()),
158 "Sqlfile -> Database map");
159 }
160
161 /***
162 * Create the database model necessary for the IDBroker tables.
163 * We use the model to generate the necessary SQL to create
164 * these tables. This method adds an AppData object containing
165 * the model to the context under the name "idmodel".
166 */
167 public void loadIdBrokerModel()
168 throws EngineException
169 {
170
171
172 XmlToAppData xmlParser = new XmlToAppData(getTargetDatabase(), null);
173 Database ad = xmlParser.parseFile(getIdTableXMLFile());
174
175 ad.setName("idmodel");
176 context.put("idmodel", ad);
177 }
178
179 /***
180 * Place our target database and target platform
181 * values into the context for use in the templates.
182 *
183 * @return the context
184 * @throws Exception
185 */
186 public Context initControlContext() throws Exception
187 {
188 super.initControlContext();
189 try
190 {
191 createSqlDbMap();
192
193
194
195 String f = getIdTableXMLFile();
196 if (f != null && f.length() > 0)
197 {
198 loadIdBrokerModel();
199 }
200 }
201 catch (EngineException ee)
202 {
203 throw new BuildException(ee);
204 }
205
206 return context;
207 }
208 }