1 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 38 public class Translation 39 { 40 41 public static final String XML_TAG = "compiereTrl"; 42 43 public static final String XML_ATTRIBUTE_TABLE = "table"; 44 45 public static final String XML_ATTRIBUTE_LANGUAGE = "language"; 46 47 48 public static final String XML_ROW_TAG = "row"; 49 50 public static final String XML_ROW_ATTRIBUTE_ID = "id"; 51 52 public static final String XML_ROW_ATTRIBUTE_TRANSLATED = "trl"; 53 54 55 public static final String XML_VALUE_TAG = "value"; 56 57 public static final String XML_VALUE_ATTRIBUTE_COLUMN = "column"; 58 59 public static final String XML_VALUE_ATTRIBUTE_ORIGINAL = "original"; 60 61 62 private boolean m_IsCentrallyMaintained = false; 63 64 65 private Logger log = Logger.getCLogger(getClass()); 66 67 76 public String importTrl (String directory, int AD_Client_ID, String AD_Language, String Trl_Table) 77 { 78 String 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 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 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 e) 99 { 100 log.error("importTrl", e); 101 return e.toString(); 102 } 103 } 105 106 107 115 public String exportTrl (String directory, int AD_Client_ID, String AD_Language, String Trl_Table) 116 { 117 String 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 tableName = Trl_Table; 123 int pos = tableName.indexOf("_Trl"); 124 String Base_Table = Trl_Table.substring(0, pos); 125 if (isBaseLanguage) 126 tableName = Base_Table; 127 String keyColumn = Base_Table + "_ID"; 128 String [] trlColumns = getTrlColumns (Base_Table); 129 StringBuffer sql = null; 131 try 132 { 133 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 134 DocumentBuilder builder = factory.newDocumentBuilder(); 136 138 Document document = builder.newDocument(); 139 document.appendChild(document.createComment(Compiere.getSummaryAscii())); 140 141 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 sql = new StringBuffer ("SELECT "); 148 if (isBaseLanguage) 149 sql.append("'Y',"); else 151 sql.append("t.IsTranslated,"); 152 sql.append("t.").append(keyColumn); 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 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 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))); row.setAttribute(XML_ROW_ATTRIBUTE_TRANSLATED, rs.getString(1)); 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 origString = rs.getString(trlColumns[i] + "O"); if (origString == null) 192 origString = ""; 193 String valueString = rs.getString(trlColumns[i]); 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 DOMSource source = new DOMSource(document); 208 TransformerFactory tFactory = TransformerFactory.newInstance(); 209 Transformer transformer = tFactory.newTransformer(); 210 out.createNewFile(); 212 StreamResult result = new StreamResult(out); 213 transformer.transform (source, result); 215 } 216 catch (SQLException e) 217 { 218 log.error("exportTrl - " + sql.toString(), e); 219 } 220 catch (Exception e) 221 { 222 log.error("exportTrl", e); 223 } 224 225 return ""; 226 } 228 233 private String [] getTrlColumns (String Base_Table) 234 { 235 m_IsCentrallyMaintained = false; 236 String 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 String [] retValue = new String [list.size()]; 278 list.toArray(retValue); 279 return retValue; 280 } 282 283 284 291 public String validateLanguage (String AD_Language) 292 { 293 String 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 if (!recordExists) 321 { 322 log.error("validateLanguage - Language does not exist: " + AD_Language); 323 return "Language does not exist: " + AD_Language; 324 } 325 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 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 } 349 355 private void process (String directory, String AD_Language, String 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 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 table = (String )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 } 396 400 public static void main (String [] 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 Env.initTest (6, false); 411 String directory = args[0]; 412 String AD_Language = args[1]; 413 String mode = args[2]; 414 415 Translation trl = new Translation(); 416 String 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 } 425 } | Popular Tags |