KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > compiere > install > Translation


1 /******************************************************************************
2  * The contents of this file are subject to the Compiere License Version 1.1
3  * ("License"); You may not use this file except in compliance with the License
4  * You may obtain a copy of the License at http://www.compiere.org/license.html
5  * Software distributed under the License is distributed on an "AS IS" basis,
6  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
7  * the specific language governing rights and limitations under the License.
8  * The Original Code is Compiere ERP & CRM Business Solution
9  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
10  * Portions created by Jorg Janke are Copyright (C) 1999-2002 Jorg Janke, parts
11  * created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
12  * Contributor(s): ______________________________________.
13  *****************************************************************************/

14 package org.compiere.install;
15
16 import java.io.*;
17 import java.sql.*;
18 import java.util.*;
19
20 import org.w3c.dom.*;
21 import javax.xml.parsers.*;
22 import javax.xml.transform.*;
23 import javax.xml.transform.stream.*;
24 import javax.xml.transform.dom.*;
25 import org.xml.sax.*;
26 import org.xml.sax.helpers.*;
27
28 import org.compiere.Compiere;
29 import org.compiere.util.*;
30
31
32 /**
33  * Translation Table Import + Export
34  *
35  * @author Jorg Janke
36  * @version $Id: Translation.java,v 1.8 2003/10/04 03:52:36 jjanke Exp $
37  */

38 public class Translation
39 {
40     /** XML Element Tag */
41     public static final String JavaDoc XML_TAG = "compiereTrl";
42     /** XML Attribute Table */
43     public static final String JavaDoc XML_ATTRIBUTE_TABLE = "table";
44     /** XML Attribute Language */
45     public static final String JavaDoc XML_ATTRIBUTE_LANGUAGE = "language";
46
47     /** XML Row Tag */
48     public static final String JavaDoc XML_ROW_TAG = "row";
49     /** XML Row Attribute ID */
50     public static final String JavaDoc XML_ROW_ATTRIBUTE_ID = "id";
51     /** XML Row Attribute Translated */
52     public static final String JavaDoc XML_ROW_ATTRIBUTE_TRANSLATED = "trl";
53
54     /** XML Value Tag */
55     public static final String JavaDoc XML_VALUE_TAG = "value";
56     /** XML Value Column */
57     public static final String JavaDoc XML_VALUE_ATTRIBUTE_COLUMN = "column";
58     /** XML Value Original */
59     public static final String JavaDoc XML_VALUE_ATTRIBUTE_ORIGINAL = "original";
60
61     /** Table is centrally maintained */
62     private boolean m_IsCentrallyMaintained = false;
63
64
65     private Logger log = Logger.getCLogger(getClass());
66
67     /**
68      * Import Translation.
69      * Uses TranslationHandler to update translation
70      * @param directory file directory
71      * @param AD_Client_ID only certain client if id >= 0
72      * @param AD_Language language
73      * @param Trl_Table table
74      * @return status message
75      */

76     public String JavaDoc importTrl (String JavaDoc directory, int AD_Client_ID, String JavaDoc AD_Language, String JavaDoc Trl_Table)
77     {
78         String JavaDoc fileName = directory + File.separator + Trl_Table + "_" + AD_Language + ".xml";
79         log.info("importTrl - " + fileName);
80         File in = new File (fileName);
81         if (!in.exists())
82         {
83             String JavaDoc msg = "File does not exist: " + fileName;
84             log.error("importTrl - " + msg);
85             return msg;
86         }
87
88         try
89         {
90             TranslationHandler handler = new TranslationHandler(AD_Client_ID);
91             SAXParserFactory factory = SAXParserFactory.newInstance();
92         // factory.setValidating(true);
93
SAXParser parser = factory.newSAXParser();
94             parser.parse(in, handler);
95             log.info("importTrl - Updated=" + handler.getUpdateCount());
96             return Msg.getMsg(Env.getCtx(), "Updated") + "=" + handler.getUpdateCount();
97         }
98         catch (Exception JavaDoc e)
99         {
100             log.error("importTrl", e);
101             return e.toString();
102         }
103     } // importTrl
104

105     /*************************************************************************/
106
107     /**
108      * Import Translation
109      * @param directory file directory
110      * @param AD_Client_ID only certain client if id >= 0
111      * @param AD_Language language
112      * @param Trl_Table translation table _Trl
113      * @return status message
114      */

115     public String JavaDoc exportTrl (String JavaDoc directory, int AD_Client_ID, String JavaDoc AD_Language, String JavaDoc Trl_Table)
116     {
117         String JavaDoc fileName = directory + File.separator + Trl_Table + "_" + AD_Language + ".xml";
118         log.info("exportTrl - " + fileName);
119         File out = new File(fileName);
120
121         boolean isBaseLanguage = Language.isBaseLanguage(AD_Language);
122         String JavaDoc tableName = Trl_Table;
123         int pos = tableName.indexOf("_Trl");
124         String JavaDoc Base_Table = Trl_Table.substring(0, pos);
125         if (isBaseLanguage)
126             tableName = Base_Table;
127         String JavaDoc keyColumn = Base_Table + "_ID";
128         String JavaDoc[] trlColumns = getTrlColumns (Base_Table);
129         //
130
StringBuffer JavaDoc sql = null;
131         try
132         {
133             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
134             // System.out.println(factory.getClass().getName());
135
DocumentBuilder builder = factory.newDocumentBuilder();
136             // <!DOCTYPE compiereTrl SYSTEM "http://www.compiere.org/dtd/compiereTrl.dtd">
137

138             Document document = builder.newDocument();
139             document.appendChild(document.createComment(Compiere.getSummaryAscii()));
140
141             // Root
142
Element root = document.createElement(XML_TAG);
143             root.setAttribute(XML_ATTRIBUTE_LANGUAGE, AD_Language);
144             root.setAttribute(XML_ATTRIBUTE_TABLE, Base_Table);
145             document.appendChild(root);
146             //
147
sql = new StringBuffer JavaDoc ("SELECT ");
148             if (isBaseLanguage)
149                 sql.append("'Y',"); // 1
150
else
151                 sql.append("t.IsTranslated,");
152             sql.append("t.").append(keyColumn); // 2
153
//
154
for (int i = 0; i < trlColumns.length; i++)
155                 sql.append(", t.").append(trlColumns[i])
156                     .append(",o.").append(trlColumns[i]).append(" AS ").append(trlColumns[i]).append("O");
157             //
158
sql.append(" FROM ").append(tableName).append(" t")
159                 .append(" INNER JOIN ").append(Base_Table)
160                 .append(" o ON (t.").append(keyColumn).append("=o.").append(keyColumn).append(")");
161             boolean haveWhere = false;
162             if (!isBaseLanguage)
163             {
164                 sql.append(" WHERE t.AD_Language=?");
165                 haveWhere = true;
166             }
167             if (m_IsCentrallyMaintained)
168             {
169                 sql.append (haveWhere ? " AND " : " WHERE ").append ("o.IsCentrallyMaintained='N'");
170                 haveWhere = true;
171             }
172             if (AD_Client_ID >= 0)
173                 sql.append(haveWhere ? " AND " : " WHERE ").append("o.AD_Client_ID=").append(AD_Client_ID);
174             sql.append(" ORDER BY t.").append(keyColumn);
175             //
176
PreparedStatement pstmt = DB.prepareStatement(sql.toString());
177             if (!isBaseLanguage)
178                 pstmt.setString(1, AD_Language);
179             ResultSet rs = pstmt.executeQuery();
180             int rows = 0;
181             while (rs.next())
182             {
183                 Element row = document.createElement (XML_ROW_TAG);
184                 row.setAttribute(XML_ROW_ATTRIBUTE_ID, String.valueOf(rs.getInt(2))); // KeyColumn
185
row.setAttribute(XML_ROW_ATTRIBUTE_TRANSLATED, rs.getString(1)); // IsTranslated
186
for (int i = 0; i < trlColumns.length; i++)
187                 {
188                     Element value = document.createElement (XML_VALUE_TAG);
189                     value.setAttribute(XML_VALUE_ATTRIBUTE_COLUMN, trlColumns[i]);
190                     String JavaDoc origString = rs.getString(trlColumns[i] + "O"); // Original Value
191
if (origString == null)
192                         origString = "";
193                     String JavaDoc valueString = rs.getString(trlColumns[i]); // Value
194
if (valueString == null)
195                         valueString = "";
196                     value.setAttribute(XML_VALUE_ATTRIBUTE_ORIGINAL, origString);
197                     value.appendChild(document.createTextNode(valueString));
198                     row.appendChild(value);
199                 }
200                 root.appendChild(row);
201                 rows++;
202             }
203             rs.close();
204             pstmt.close();
205             log.info("exportTrl - Records=" + rows + ", DTD=" + document.getDoctype());
206             //
207
DOMSource source = new DOMSource(document);
208             TransformerFactory tFactory = TransformerFactory.newInstance();
209             Transformer transformer = tFactory.newTransformer();
210             // Output
211
out.createNewFile();
212             StreamResult result = new StreamResult(out);
213             // Transform
214
transformer.transform (source, result);
215         }
216         catch (SQLException e)
217         {
218             log.error("exportTrl - " + sql.toString(), e);
219         }
220         catch (Exception JavaDoc e)
221         {
222             log.error("exportTrl", e);
223         }
224
225         return "";
226     } // exportTrl
227

228     /**
229      * Get Columns for Table
230      * @param Base_Table table
231      * @return array of translated columns
232      */

233     private String JavaDoc[] getTrlColumns (String JavaDoc Base_Table)
234     {
235         m_IsCentrallyMaintained = false;
236         String JavaDoc sql = "SELECT TableName FROM AD_Table t"
237             + " INNER JOIN AD_Column c ON (c.AD_Table_ID=t.AD_Table_ID AND c.ColumnName='IsCentrallyMaintained') "
238             + "WHERE t.TableName=? AND c.IsActive='Y'";
239         try
240         {
241             PreparedStatement pstmt = DB.prepareStatement(sql);
242             pstmt.setString(1, Base_Table);
243             ResultSet rs = pstmt.executeQuery();
244             if (rs.next())
245                 m_IsCentrallyMaintained = true;
246             rs.close();
247             pstmt.close();
248         }
249         catch (SQLException e)
250         {
251             log.error("getTrlColumns (IsCentrallyMaintained)", e);
252         }
253
254         sql = "SELECT ColumnName "
255             + "FROM AD_Column c"
256             + " INNER JOIN AD_Table t ON (c.AD_Table_ID=t.AD_Table_ID) "
257             + "WHERE t.TableName=?"
258             + " AND c.AD_Reference_ID IN (10,14) "
259             + "ORDER BY IsMandatory DESC, ColumnName";
260         ArrayList list = new ArrayList();
261         try
262         {
263             PreparedStatement pstmt = DB.prepareStatement(sql);
264             pstmt.setString(1, Base_Table + "_Trl");
265             ResultSet rs = pstmt.executeQuery();
266             while (rs.next())
267                 list.add(rs.getString(1));
268             rs.close();
269             pstmt.close();
270         }
271         catch (SQLException e)
272         {
273             log.error("getTrlColumns", e);
274         }
275
276         // Convert to Array
277
String JavaDoc[] retValue = new String JavaDoc[list.size()];
278         list.toArray(retValue);
279         return retValue;
280     } // getTrlColumns
281

282     /*************************************************************************/
283
284     /**
285      * Validate Language.
286      * - Check if AD_Language record exists
287      * - Check Trl table records
288      * @param AD_Language language
289      * @return "" if validated - or error message
290      */

291     public String JavaDoc validateLanguage (String JavaDoc AD_Language)
292     {
293         String JavaDoc sql = "SELECT IsActive, IsSystemLanguage "
294             + "FROM AD_Language "
295             + "WHERE AD_Language=?";
296         boolean recordExists = false;
297         boolean isActive = false;
298         boolean isSystemLanguage = false;
299         try
300         {
301             PreparedStatement pstmt = DB.prepareStatement(sql);
302             pstmt.setString(1, AD_Language);
303             ResultSet rs = pstmt.executeQuery();
304             if (rs.next())
305             {
306                 recordExists = true;
307                 isActive = "Y".equals(rs.getString(1));
308                 isSystemLanguage = "Y".equals(rs.getString(2));
309             }
310             rs.close();
311             pstmt.close();
312         }
313         catch (SQLException e)
314         {
315             log.error("validateLanguage - " + sql, e);
316             return e.toString();
317         }
318
319         // No AD_Language Record
320
if (!recordExists)
321         {
322             log.error("validateLanguage - Language does not exist: " + AD_Language);
323             return "Language does not exist: " + AD_Language;
324         }
325         // Language exists
326
if (!isActive || !isSystemLanguage)
327         {
328             log.error("validateLanguage - Language not active or not system language: " + AD_Language);
329             return "Language not active or not system language: " + AD_Language;
330         }
331         // Validate Translation
332
try
333         {
334             log.info("validateLanguage - Start Validating ... " + AD_Language);
335             sql = "{CALL AD_Language_Create(NULL)}";
336             CallableStatement cstmt = DB.prepareCall(sql);
337             cstmt.execute();
338             cstmt.close();
339             log.info("validateLanguage - Validation complete");
340         }
341         catch (SQLException e)
342         {
343             log.error("Translation.validateLanguage", e);
344             return e.toString();
345         }
346         return "";
347     } // validateLanguage
348

349     /**
350      * Process
351      * @param directory directory
352      * @param AD_Language language
353      * @param mode mode
354      */

355     private void process (String JavaDoc directory, String JavaDoc AD_Language, String JavaDoc mode)
356     {
357         File dir = new File(directory);
358         if (!dir.exists())
359             dir.mkdir();
360         dir = new File(directory);
361         if (!dir.exists())
362         {
363             System.out.println("Cannot create directory " + directory);
364             System.exit(1);
365         }
366
367         String JavaDoc sql = "SELECT Name, TableName "
368             + "FROM AD_Table "
369             + "WHERE TableName LIKE '%_Trl' "
370             + "ORDER BY 1";
371         ArrayList trlTables = new ArrayList();
372         try
373         {
374             PreparedStatement pstmt = DB.prepareStatement(sql);
375             ResultSet rs = pstmt.executeQuery();
376             while (rs.next())
377                 trlTables.add(rs.getString(2));
378             rs.close();
379             pstmt.close();
380         }
381         catch (SQLException e)
382         {
383             log.error("Translation.process (Table)", e);
384         }
385
386         for (int i = 0; i < trlTables.size(); i++)
387         {
388             String JavaDoc table = (String JavaDoc)trlTables.get(i);
389             if (mode.startsWith("i"))
390                 importTrl(directory, -1, AD_Language, table);
391             else
392                 exportTrl(directory, -1, AD_Language, table);
393         }
394     } // process
395

396     /**
397      * Batch Interface
398      * @param args directory AD_Language import/export
399      */

400     public static void main (String JavaDoc[] args)
401     {
402         if (args.length != 3)
403         {
404             System.out.println("format : java Translation directory AD_Language import|export");
405             System.out.println("example: java Translation /Compiere2/data/de_DE de_DE import");
406             System.out.println("example: java Translation /Compiere2/data/fr_FR fr_FR export");
407             System.exit(1);
408         }
409         //
410
Env.initTest (6, false);
411         String JavaDoc directory = args[0];
412         String JavaDoc AD_Language = args[1];
413         String JavaDoc mode = args[2];
414
415         Translation trl = new Translation();
416         String JavaDoc msg = trl.validateLanguage (AD_Language);
417         if (msg.length() > 0)
418             System.err.println(msg);
419         else
420             trl.process (directory, AD_Language, mode);
421
422         System.exit(0);
423     } // main
424

425 } // Translation
Popular Tags