details:   https://code.openbravo.com/erp/devel/pi/rev/f8c3d0a4f7a4
changeset: 32608:f8c3d0a4f7a4
user:      Asier Lostalé <asier.lostale <at> openbravo.com>
date:      Fri Aug 11 16:21:42 2017 +0200
summary:   fixed bug 36755: inefficient translate task

  Several improvements applied:
    * A single invocation is performed instead one per file extension.
    * Look for labels just once regardless number of installed translations.
    * Cache all labels in memory so that a single query is performed to look for
      them up instead of one per each label found in files.
    * Execute all DB updates in a single transaction
    * Reduced log vebosity (specially when no modules in development)

diffstat:

 build.xml                                               |    4 -
 src-trl/src/org/openbravo/translate/Translate.java      |  752 +++++----------
 src-trl/src/org/openbravo/translate/Translate_data.xsql |  187 +---
 src/build.xml                                           |   55 +-
 4 files changed, 296 insertions(+), 702 deletions(-)

diffs (truncated from 1288 to 300 lines):

diff -r b9227826b5dc -r f8c3d0a4f7a4 build.xml
--- a/build.xml Wed Aug 30 14:10:12 2017 +0200
+++ b/build.xml Fri Aug 11 16:21:42 2017 +0200
@@ -712,10 +712,6 @@
     <ant dir="${base.src}" target="translate" inheritAll="true" 
inheritRefs="true" />
   </target>
 
-  <target name="translate.modules" depends="init">
-    <ant dir="${base.src}" target="translate.modules" inheritAll="true" 
inheritRefs="true" />
-  </target>
-
   <target name="installWebService" depends="init">
     <ant dir="${base.src}" target="installWebService" inheritAll="true" 
inheritRefs="true">
       <property name="wsdd" value="1" />
diff -r b9227826b5dc -r f8c3d0a4f7a4 
src-trl/src/org/openbravo/translate/Translate.java
--- a/src-trl/src/org/openbravo/translate/Translate.java        Wed Aug 30 
14:10:12 2017 +0200
+++ b/src-trl/src/org/openbravo/translate/Translate.java        Fri Aug 11 
16:21:42 2017 +0200
@@ -18,13 +18,27 @@
  */
 package org.openbravo.translate;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.sql.Connection;
+import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.StringTokenizer;
-import java.util.Vector;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
 
 import javax.servlet.ServletException;
 
@@ -33,74 +47,63 @@
 import org.apache.xerces.parsers.SAXParser;
 import org.openbravo.database.CPStandAlone;
 import org.openbravo.database.SessionInfo;
-import org.openbravo.utils.DirFilter;
+import org.openbravo.exception.NoConnectionAvailableException;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
-import org.xml.sax.ext.LexicalHandler;
 import org.xml.sax.helpers.DefaultHandler;
 
 /**
+ * Looks for translatable elements in html, fo, srpt and jrxml files inserting 
them in
+ * ad_textinterfaces table.
+ * 
  * @author Fernando Iriazabal
- * 
- *         Translate the HTML file of the folder especified
  **/
-public class Translate extends DefaultHandler implements LexicalHandler {
-  protected static CPStandAlone pool;
-  static XMLReader parser;
-  static TranslateData[] toLanguage;
-  static String actualLanguage;
-  static String fileTermination;
+public class Translate extends DefaultHandler {
+  private static CPStandAlone pool;
+  private static final Pattern LETTER_PATTERN = Pattern.compile("[a-zA-Z]");
+  private static final List<String> translatableExtensions = 
Arrays.asList("html", "fo", "srpt",
+      "jrxml");
+  private static final Logger log = Logger.getLogger(Translate.class);
 
-  static boolean isHtml = false;
+  private XMLReader parser;
+  private String extension;
 
-  static String actualTag;
-  static String actualFile;
-  static String actualPrefix;
-  static StringBuffer translationText;
-  static int count = 0;
-  static ArrayList<String> moduleDirectories;
-  static String moduleName = "";
-  static String moduleLang = "";
-  static String moduleID = "";
-  static boolean translateModule = true;
-  static final String[] tokens = { "-", ":" };
+  private String actualTag;
+  private String actualFile;
+  private String actualPrefix;
+  private StringBuilder translationText;
+  private int count = 0;
 
-  static Logger log4j = Logger.getLogger(Translate.class);
+  private String moduleLang = "";
+  private String moduleID = "";
+  private Path moduleBasePath;
+  private Connection conn;
+  private boolean canTranslateModule = true;
 
-  /**
-   * Constructor
-   * 
-   * @param xmlPoolFile
-   *          Path to the Openbravo.properties file.
-   * @throws ServletException
-   */
-  public Translate(String xmlPoolFile) throws ServletException {
+  private static Map<String, List<TranslateData>> allLabels;
+  private static HashSet<String> modsInDev = new HashSet<>();
+
+  private static void init(String xmlPoolFile) {
     pool = new CPStandAlone(xmlPoolFile);
   }
 
+  private Translate() {
+  }
+
   /**
-   * Constructor
-   * 
-   * @param xmlPoolFile
-   *          Path to the Openbravo.properties file.
    * @param _fileTermination
    *          File extension to filter.
-   * @throws ServletException
    */
-  public Translate(String xmlPoolFile, String _fileTermination) throws 
ServletException {
-    this(xmlPoolFile);
-    fileTermination = _fileTermination;
-    isHtml = fileTermination.toLowerCase().endsWith("html");
+  public Translate(String _fileTermination) throws ServletException {
+    extension = _fileTermination;
+    boolean isHtml = extension.toLowerCase().endsWith("html");
     if (isHtml)
       parser = new org.cyberneko.html.parsers.SAXParser();
     else
       parser = new SAXParser();
     parser.setEntityResolver(new LocalEntityResolver());
     parser.setContentHandler(this);
-    toLanguage = TranslateData.systemLanguage(pool);
-    if (toLanguage.length == 0)
-      log4j.warn("No system languages defined, translation will parse all 
files.");
   }
 
   /**
@@ -110,66 +113,71 @@
    *          List of arguments. There is 2 call ways, with 2 arguments; the 
first one is the
    *          attribute to indicate if the AD_TEXTINTERFACES must be cleaned 
("clean") and the
    *          second one is the Openbravo.properties path. The other way is 
with more arguments,
-   *          where: 0- Openbravo.properties path. 1- File extension. 2- Path 
where are the files to
-   *          translate. 3- Relative path.
-   * @throws Exception
+   *          where: 0- Openbravo.properties path. 1- Path where are the files 
to translate.
    */
   public static void main(String argv[]) throws Exception {
     PropertyConfigurator.configure("log4j.lcf");
-    String dirIni;
-    boolean boolFilter;
-    DirFilter dirFilter = null;
-    String relativePath = "";
 
-    if ((argv.length == 2)) {
-      if (argv[0].equals("clean")) {
-        log4j.debug("clean AD_TEXTINTERFACES");
-        final Translate translate = new Translate(argv[1]);
-        translate.clean();
-        return;
-      } else if (argv[0].equals("remove")) {
-        log4j.debug("remove AD_TEXTINTERFACES");
-        final Translate translate = new Translate(argv[1]);
-        translate.remove();
-        return;
+    if (argv.length != 2) {
+      log.error("Usage: Translate Openbravo.properties 
[clean|remove|sourceDir]");
+      log.error("Received: " + Arrays.asList(argv));
+      return;
+    }
+
+    init(argv[0]);
+    Translate translate;
+    switch (argv[1]) {
+    case "clean":
+      log.debug("clean AD_TEXTINTERFACES");
+      translate = new Translate();
+      translate.clean();
+      return;
+    case "remove":
+      log.debug("remove AD_TEXTINTERFACES");
+      translate = new Translate();
+      translate.remove();
+      return;
+    }
+
+    Path obPath = Paths.get(argv[1]).normalize();
+
+    TranslateData[] mods = TranslateData.getModulesInDevelopment(pool);
+    for (TranslateData mod : mods) {
+      modsInDev.add(mod.id);
+    }
+    for (TranslateData mod : mods) {
+      Path path;
+      if ("0".equals(mod.id)) {
+        path = obPath.resolve("src");
+      } else {
+        path = obPath.resolve(Paths.get("modules", mod.javapackage, "src"));
+        if (!Files.exists(path)) {
+          continue;
+        }
+      }
+      log.info("Looking for translatable elements in " + mod.javapackage + " 
(" + mod.name + ")");
+
+      for (String extension : translatableExtensions) {
+        translate = new Translate(extension);
+        translate.moduleLang = mod.lang;
+        translate.moduleID = mod.id;
+        translate.moduleBasePath = path;
+
+        translate.execute();
+        if (translate.count > 0) {
+          log.info("  parsed " + translate.count + " " + extension + " files");
+        }
+
+        if (!translate.canTranslateModule) {
+          break;
+        }
       }
     }
 
-    if (argv.length < 3) {
-      log4j.error("Usage: java Translate Openbravo.properties fileTermination 
sourceDir");
-      return;
+    if (mods.length == 0) {
+      log.info("No modules in development to look for translatable elements.");
     }
-
-    final Translate translate = new Translate(argv[0], argv[1]);
-
-    dirIni = argv[2].replace("\\", "/");
-
-    if (argv.length > 3) {
-      moduleDirectories = getDirectories(argv[3]);
-      log4j.info("Translation for modules");
-    }
-    boolFilter = true;
-    dirFilter = new DirFilter(fileTermination);
-    log4j.info("directory source: " + dirIni);
-    log4j.info("file termination: " + fileTermination);
-
-    final File path = new File(dirIni, relativePath);
-    if (!path.exists()) {
-      log4j.error("Can't find directory: " + dirIni);
-      translate.destroy();
-      return;
-    }
-    if (moduleDirectories == null) {
-      if (TranslateData.isInDevelopmentModule(pool, "0")) {
-        listDir(path, boolFilter, dirFilter, relativePath, true, "", 0, "");
-        log4j.info("Translated files for " + fileTermination + ": " + count);
-      } else
-        log4j.info("Core is not in development: skipping it");
-    } else {
-      listDir(path, boolFilter, dirFilter, relativePath, false, "", 0, "");
-      log4j.info("Translated files for " + fileTermination + ": " + count);
-    }
-    translate.destroy();
+    destroy();
   }
 
   /**
@@ -179,115 +187,52 @@
     try {
       TranslateData.clean(pool);
     } catch (final Exception e) {
-      log4j.error("clean error", e);
+      log.error("clean error", e);
     }
   }
 
   private void remove() {
     try {
-      TranslateData.remove(pool);
+      int n = TranslateData.remove(pool);
+      if (n > 0) {
+        log.info("Removed " + n + " unused elements");
+      }
     } catch (final Exception e) {
-      log4j.error("remove error", e);
+      log.error("remove error", e);
     }

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to