1 /***
2 Transformation - Transformations in Octopus Loader.
3 Copyright (C) 2002-2004 Together
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Lesser General Public License for more details.
12 You should have received a copy of the GNU Lesser General Public
13 License along with this library; if not, write to the Free Software
14 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 Transformation.java
16 Date: 05.04.2004.
17 @version 1.0
18 @author: Zoran Milakovic zoran@prozone.co.yu
19 @author: Milosevic Sinisa sinisa@prozone.co.yu
20 */
21
22 package org.webdocwf.util.loader.transformation;
23
24 import java.lang.reflect.Constructor;
25 import java.sql.Connection;
26 import java.sql.ResultSet;
27 import java.sql.SQLException;
28 import java.sql.Statement;
29 import java.util.ArrayList;
30 import java.util.List;
31 import java.util.Vector;
32
33 import org.w3c.dom.Element;
34 import org.w3c.dom.Node;
35 import org.w3c.dom.NodeList;
36 import org.webdocwf.util.loader.ConfigReader;
37 import org.webdocwf.util.loader.LoaderException;
38 import org.webdocwf.util.loader.OctopusXMLUtil;
39 import org.webdocwf.util.loader.logging.Logger;
40
41 /***
42 *
43 * Transformation - transformations in Octopus Loader.
44 */
45 public class Transformation {
46
47
48
49 private String transformationName;
50 private String transformationClassName;
51 private String transformatorConfigName;
52
53 private Vector sourceColumnNames = new Vector();
54
55 private List transformationTargetColumns = new ArrayList();
56
57 private Transformer transformer;
58 private Logger logger;
59 private JavaScriptEvaluator jsEvaluator;
60 private Element transformationDocFragment;
61
62
63 public Transformation(String name, String className, String configString, Element doc) throws Exception {
64
65 this.transformationName = name;
66 this.transformationClassName = className;
67 this.transformatorConfigName = configString;
68 this.transformationDocFragment = doc;
69 String javaScriptExpression = "";
70
71 NodeList childNodes = this.transformationDocFragment.getElementsByTagName("javaScript");
72 if ( childNodes.item(0) != null ){
73 javaScriptExpression = childNodes.item(0).getFirstChild().getNodeValue();
74 }
75 try {
76 init();
77 if (javaScriptExpression != ""){
78 //instantiate JavaScriptEvaluator for transformation with javaScript
79 jsEvaluator = new JavaScriptEvaluator();
80 jsEvaluator.setExpression(javaScriptExpression);
81 jsEvaluator.setVariableNames(this.sourceColumnNames);
82 this.transformer = (Transformer) jsEvaluator;
83 }else{
84 //instantiate transformer
85 Class transformatorClass = Class.forName(this.transformationClassName);
86 Class[] ArgClassArray = new Class[] { };
87 Object[] ArgObject = new Object[] { };
88 Constructor transConstructor = transformatorClass.getDeclaredConstructor(ArgClassArray);
89 this.transformer = (Transformer)(transConstructor.newInstance(ArgObject));
90 }
91 if(transformatorConfigName != null && this.transformer != null) {
92 this.transformer.configure(transformatorConfigName);
93 }
94
95 }catch(Exception e) {
96 throw new LoaderException("Error during transformation!",e);
97 }
98 }
99
100 public Transformation(String name, String className, Element doc) throws Exception {
101 new Transformation(name,className,null,doc);
102 }
103
104 /***
105 * This method set logger object
106 */
107 public void setLogger(Logger logger) {
108 if (this.transformer instanceof JavaScriptEvaluator){
109 jsEvaluator.setLogger(logger);
110 }else{
111 this.logger = logger;
112 }
113
114 }
115
116 private void init() {
117 initSourceColumns();
118 initTargetColumns();
119 }
120
121
122
123 /***
124 * @param doc represents Object document
125 * @param importJob represents current import job
126 */
127 private void initSourceColumns() {
128 //ZK change this because of problem with reading xml file, because of method importValue which reads all data from <importDefinition>tag
129 if (this.transformationDocFragment!=null){
130 this.sourceColumnNames = OctopusXMLUtil.importValueForTransform(this.transformationDocFragment, "sourceColumn","name");
131 }
132 }
133
134 private void initTargetColumns() {
135 Vector targetColumnNames = OctopusXMLUtil.importValueForTransform(this.transformationDocFragment, "targetColumn","name");
136 Vector targetTableNames = OctopusXMLUtil.importValueForTransform(this.transformationDocFragment, "targetColumn","tableName");
137 Vector targetTableIDs = OctopusXMLUtil.importValueForTransform(this.transformationDocFragment, "targetColumn","tableID");
138 Vector targetValueModes = OctopusXMLUtil.importValueForTransform(this.transformationDocFragment, "targetColumn","valueMode");
139 for(int i = 0; i < targetColumnNames.size(); i++) {
140 this.transformationTargetColumns.add(new TransformationTargetColumn(
141 (String)targetColumnNames.get(i),
142 (String)targetTableNames.get(i),
143 (String)targetTableIDs.get(i),
144 (String)targetValueModes.get(i)
145 ));
146 }
147
148 }
149
150
151 /***
152 * Returns Vector with source column names
153 * @return vector
154 */
155 public Vector getSourceColumnNames() {
156 return this.sourceColumnNames;
157 }
158
159 /***
160 * Returns Vector with target column names
161 * @return vector
162 */
163 public Vector getTargetColumnNames() {
164 Vector retVal = new Vector();
165 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
166 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getName() );
167 }
168 return retVal;
169 }
170
171 /***
172 * Returns Vector with target column names
173 * @param index logical table index
174 * @return vector
175 */
176 public Vector getTargetColumnNames(int index) {
177 Vector retVal = new Vector();
178 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
179 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getTableID().equals( String.valueOf(index) ) )
180 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getName() );
181 }
182
183 return retVal;
184 }
185
186 /***
187 * Returns Vector with target column types
188 * @param index logical table index
189 * @return vector
190 */
191 public Vector getTargetColumnTypes(int index) {
192 Vector retVal = new Vector();
193 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
194 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getTableID().equals( String.valueOf(index) ) )
195 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getType() );
196 // else
197 // retVal.add(null);
198 }
199 return retVal;
200 }
201
202 /***
203 * Returns Vector with target column types on ordered places, and
204 * add null if in this place logic table is different than specified
205 * @param index logical table index
206 * @return vector
207 */
208 public Vector getOrderedTargetColumnTypes(int index) {
209 Vector retVal = new Vector();
210 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
211 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getTableID().equals( String.valueOf(index) ) )
212 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getType() );
213 else
214 retVal.add(null);
215 }
216 return retVal;
217 }
218
219 /***
220 * Returns Vector with target value modes
221 * @param index logical table index
222 * @return vector
223 */
224 public Vector getTargetValueModes(int index) {
225 Vector retVal = new Vector();
226 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
227 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getTableID().equals( String.valueOf(index) ) )
228 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getValueMode() );
229 }
230 return retVal;
231 }
232
233 /***
234 * Returns Vector with target key column names
235 * @param index logical table index
236 * @return vector
237 */
238 public Vector getTargetKeyColumnNames(int index) {
239 Vector retVal = new Vector();
240 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
241 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getTableID().equals( String.valueOf(index) ) ) {
242 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getValueMode().equals("Key") )
243 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getName() );
244 }
245 }
246 return retVal;
247 }
248
249 /***
250 * Returns Vector with target column names for specified table
251 * @param tableName name of table
252 * @return vector
253 */
254 public Vector getTargetColumnNames(String tableName) {
255 Vector retVal = new Vector();
256 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
257 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getTableName().equals(tableName) )
258 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getName() );
259 }
260 return retVal;
261 }
262
263
264 /***
265 * Returns Vector with target key column names
266 * @return vector
267 */
268 public Vector getTargetKeyColumnNames() {
269 Vector retVal = new Vector();
270 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
271 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getValueMode().equals("Key") )
272 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getName() );
273 }
274 return retVal;
275 }
276
277 /***
278 * Returns Vector with target value mode
279 * @return vector
280 */
281 public Vector getTargetValueMode() {
282 Vector retVal = new Vector();
283 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
284 retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getValueMode() );
285 }
286 return retVal;
287 }
288
289
290 /***
291 * Returns Vector with target column types
292 * @return vector
293 */
294 // public Vector getTargetColumnTypes() {
295 // Vector retVal = new Vector();
296 // for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
297 // retVal.add( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getValueMode() );
298 // }
299 // return retVal;
300 // }
301
302
303 /***
304 * This method read value of sub counter parameter
305 * @param sourceValues values to transform
306 * @return vector transformed values
307 * @throws SQLException
308 */
309 public Vector transformValues(Vector sourceValues) throws Exception{
310 Vector results = new Vector();
311 try {
312 results.addAll(this.transformer.transformValue(sourceValues));
313 } catch (Exception except) {
314 throw except;
315 }
316 return results;
317
318 }
319 /***
320 * This method returns transformation name
321 * @return String which represents transformation name
322 */
323 public String getName() {
324 return this.transformationName;
325 }
326
327
328 /***
329 * Method transformationColumnTypes is used to put types of transformation columns into
330 * global vector sorted in target tables. If there is an error, Exception
331 * "SQLException" or "NullPointerException" is thrown.
332 * @param c Connection to target database.
333 * @param firstColumn is first column
334 * @param columnsSuportedTarget is true if driver for target database supports getColumns method
335 * @param configReaderTarget is ConfigReader object for target database
336 * @throws SQLException Constructs an SQLException object with a reason.
337 * @throws NullPointerException Constructs a NullPointerException with the specified detail message.
338 */
339 public void transformationColumnTypes(
340 Connection c,
341 int firstColumn,
342 boolean columnsSuportedTarget, ConfigReader configReaderTarget) throws SQLException, NullPointerException {
343 int iCnt = 0;
344 try {
345 List tableNames = this.getTargetTableNames();
346 for(int k = 0; k < tableNames.size(); k++) {
347 Vector columnNames = this.getTargetColumnNames(tableNames.get(k).toString());
348 Statement stmtTrans = c.createStatement();
349 //Vector typs = new Vector();
350 Vector subTyps = new Vector();
351 String strQuery = "select ";
352 ResultSet rsetTrans=null;
353 if (columnNames.size() != 0) {
354 for (int i = 0; i < columnNames.size(); i++) {
355 strQuery += columnNames.get(i).toString() +
356 ", ";
357 }
358 strQuery = strQuery.substring(0, strQuery.length() - 2);
359 strQuery += " from " + tableNames.get(k).toString();
360 if (columnsSuportedTarget){
361 rsetTrans = c.getMetaData().getColumns( c.getCatalog(), null, tableNames.get(k).toString(), "%" );
362 String columnName = "";
363 String columnType = "";
364 while(rsetTrans.next()){
365 columnName = rsetTrans.getString(3+firstColumn);
366 columnType = rsetTrans.getString(5+firstColumn);
367 for (int j = 0; j < columnNames.size(); j++) {
368 if( columnNames.get(j).toString().equalsIgnoreCase( columnName ) ){
369 this.setType(tableNames.get(k).toString(),columnNames.get(j).toString(),columnType);
370 //typs.add(columnType);
371 }
372 }
373 }
374 }else{//TODO ZK ADDED stmtConstant.setMaxRows(1). Place this as parameter in conf file, like maxRowsSuported
375 if (configReaderTarget.getMaxRowsSupported()){
376 stmtTrans.setMaxRows(1);
377 }
378 rsetTrans = stmtTrans.executeQuery(strQuery);
379 for (int j = 0; j < columnNames.size(); j++) {
380 this.setType( tableNames.get(k).toString(),
381 columnNames.get(j).toString(),
382 rsetTrans.getMetaData().getColumnTypeName(j + firstColumn) );
383 //typs.add(rsetConstant.getMetaData().getColumnTypeName(j + firstColumn));
384 }
385 }
386 rsetTrans.close();
387 }
388 stmtTrans.close();
389 }
390 // this.hmTargetColumnTypes.addAll(typs);
391 }
392 catch (SQLException ex) {
393 throw ex;
394 }
395 catch (NullPointerException ex) {
396 throw ex;
397 }
398 }
399
400 public List getTargetTableNames() {
401 List retVal = new ArrayList();
402 Element transformation = this.transformationDocFragment;
403 NodeList nodeList = transformation.getChildNodes();
404 String tableName = "";
405 for(int i = 0; i < nodeList.getLength(); i++) {
406 if( nodeList.item(i).getNodeType() != Node.ELEMENT_NODE )
407 continue;
408 if( !nodeList.item(i).getNodeName().equals("targetColumns"))
409 continue;
410 Element targetColumns = (Element)nodeList.item(i);
411 NodeList targetColumnElements = targetColumns.getElementsByTagName("targetColumn");
412 for(int j = 0; j < targetColumnElements.getLength();j++) {
413 Element targetColumn = (Element)targetColumnElements.item(j);
414 tableName = targetColumn.getAttribute("tableName");
415 if( !retVal.contains(tableName) )
416 retVal.add(tableName);
417 }
418 }
419 return retVal;
420 }
421
422 public String getTargetTableID() {
423 Element transformation = this.transformationDocFragment;
424 NodeList nodeList = transformation.getChildNodes();
425 for(int i = 0; i < nodeList.getLength(); i++) {
426 if( nodeList.item(i).getNodeType() != Node.ELEMENT_NODE )
427 continue;
428 if( !nodeList.item(i).getNodeName().equals("targetColumns"))
429 continue;
430 Element targetColumns = (Element)nodeList.item(i);
431 Element targetColumn = (Element)targetColumns.getElementsByTagName("targetColumn").item(0);
432 return targetColumn.getAttribute("tableID");
433 }
434 return null;
435 }
436
437 private void setType(String tableName, String columnName, String type) {
438 for(int i = 0; i < this.transformationTargetColumns.size(); i++) {
439 if( ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getTableName().equals(tableName) &&
440 ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).getName().equals(columnName) )
441 ((TransformationTargetColumn)this.transformationTargetColumns.get(i)).setType(type);
442 }
443 }
444
445 /***
446 * This method reset all variables
447 */
448 public void reset() {
449 this.sourceColumnNames = new Vector();
450 this.transformationTargetColumns = new ArrayList();
451 }
452
453 public void release() throws Exception{
454 this.transformer.release();
455 }
456 }
This page was automatically generated by Maven