Author: spepping
Date: Wed Oct  6 07:07:38 2010
New Revision: 1004907

URL: http://svn.apache.org/viewvc?rev=1004907&view=rev
Log:
Making fallback from (lang,country) to (lang) consistent

Added:
    
xmlgraphics/fop/trunk/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml
   (with props)
Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/hyphenation/Hyphenator.java

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/hyphenation/Hyphenator.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/hyphenation/Hyphenator.java?rev=1004907&r1=1004906&r2=1004907&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/hyphenation/Hyphenator.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/hyphenation/Hyphenator.java 
Wed Oct  6 07:07:38 2010
@@ -76,8 +76,9 @@ public final class Hyphenator {
     }
 
     /**
-     * Returns a hyphenation tree for a given language and country. The 
hyphenation trees are
-     * cached.
+     * Returns a hyphenation tree for a given language and country,
+     * with fallback from (lang,country) to (lang).
+     * The hyphenation trees are cached.
      * @param lang the language
      * @param country the country (may be null or "none")
      * @param resolver resolver to find the hyphenation files
@@ -89,11 +90,62 @@ public final class Hyphenator {
         String llccKey = HyphenationTreeCache.constructLlccKey(lang, country);
         HyphenationTreeCache cache = getHyphenationTreeCache();
 
-        // See if there was an error finding this hyphenation tree before
+        // If this hyphenation tree has been registered as missing, return 
immediately
         if (cache.isMissing(llccKey)) {
             return null;
         }
 
+        HyphenationTree hTree = getHyphenationTree2(lang, country, resolver, 
hyphPatNames);
+
+        // fallback to lang only
+        if (hTree == null && country != null && !country.equals("none")) {
+            String llKey = HyphenationTreeCache.constructLlccKey(lang, null);
+            if (!cache.isMissing(llKey)) {
+                hTree = getHyphenationTree2(lang, null, resolver, 
hyphPatNames);
+                if (hTree != null && log.isDebugEnabled()) {
+                    log.debug("Couldn't find hyphenation pattern "
+                              + "for lang=\"" + lang + "\",country=\"" + 
country + "\"."
+                              + " Using general language pattern "
+                              + "for lang=\"" + lang + "\" instead.");
+                }
+                if (hTree == null) {
+                    // no fallback; register as missing
+                    cache.noteMissing(llKey);
+                } else {
+                    // also register for (lang,country)
+                    cache.cache(llccKey, hTree);
+                }
+            }
+        }
+
+        if (hTree == null) {
+            // (lang,country) and (lang) tried; register as missing
+            cache.noteMissing(llccKey);
+            log.error("Couldn't find hyphenation pattern "
+                      + "for lang=\"" + lang + "\""
+                      + (country != null && !country.equals("none")
+                              ? ",country=\"" + country + "\""
+                              : "")
+                      + ".");
+        }
+
+        return hTree;
+    }
+
+    /**
+     * Returns a hyphenation tree for a given language and country
+     * The hyphenation trees are cached.
+     * @param lang the language
+     * @param country the country (may be null or "none")
+     * @param resolver resolver to find the hyphenation files
+     * @param hyphPatNames the map with user-configured hyphenation pattern 
file names
+     * @return the hyphenation tree
+     */
+    private static HyphenationTree getHyphenationTree2(String lang,
+            String country, HyphenationTreeResolver resolver, Map 
hyphPatNames) {
+        String llccKey = HyphenationTreeCache.constructLlccKey(lang, country);
+        HyphenationTreeCache cache = getHyphenationTreeCache();
+
         HyphenationTree hTree;
         // first try to find it in the cache
         hTree = getHyphenationTreeCache().getHyphenationTree(lang, country);
@@ -105,6 +157,7 @@ public final class Hyphenator {
         if (key == null) {
             key = llccKey;
         }
+
         if (resolver != null) {
             hTree = getUserHyphenationTree(key, resolver);
         }
@@ -115,10 +168,8 @@ public final class Hyphenator {
         // put it into the pattern cache
         if (hTree != null) {
             cache.cache(llccKey, hTree);
-        } else {
-            log.error("Couldn't find hyphenation pattern " + llccKey);
-            cache.noteMissing(llccKey);
         }
+
         return hTree;
     }
 
@@ -173,31 +224,11 @@ public final class Hyphenator {
         try {
             is = getResourceStream(key);
             if (is == null) {
-                if (key.length() == 5) {
-                    String lang = key.substring(0, 2);
-                    is = getResourceStream(lang);
-                    if (is != null) {
-                        if (log.isDebugEnabled()) {
-                            log.debug("Couldn't find hyphenation pattern '"
-                                    + key
-                                    + "'. Using general language pattern '"
-                                    + lang
-                                    + "' instead.");
-                        }
-                    } else {
-                        if (log.isDebugEnabled()) {
-                            log.debug("Couldn't find precompiled hyphenation 
pattern "
-                                    + lang + " in resources.");
-                        }
-                        return null;
-                    }
-                } else {
-                    if (log.isDebugEnabled()) {
-                        log.debug("Couldn't find precompiled hyphenation 
pattern "
-                                               + key + " in resources");
-                    }
-                    return null;
+                if (log.isDebugEnabled()) {
+                    log.debug("Couldn't find precompiled hyphenation pattern "
+                              + key + " in resources");
                 }
+                return null;
             }
             hTree = readHyphenationTree(is);
         } finally {

Added: 
xmlgraphics/fop/trunk/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml?rev=1004907&view=auto
==============================================================================
--- 
xmlgraphics/fop/trunk/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml
 (added)
+++ 
xmlgraphics/fop/trunk/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml
 Wed Oct  6 07:07:38 2010
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+  <info>
+    <p>
+      Checks fallback from hyphenation pattern for (lang,country) to 
hyphenation pattern for (lang)
+    </p>
+  </info>
+  <fo>
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
+
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="simple"
+                  page-height="29.7cm"
+                  page-width="21cm"
+                  margin-top="1cm"
+                  margin-bottom="2cm"
+                  margin-left="7cm"
+                  margin-right="3cm">
+      <fo:region-body margin-top="1.5cm"/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <!-- end: defines page layout -->
+
+
+  <fo:page-sequence master-reference="simple">
+
+    <fo:flow flow-name="xsl-region-body"
+                text-align="justify">
+
+      <fo:block font-size="12pt"
+            font-family="sans-serif"
+            background-color="blue"
+            color="white"
+            text-align="start">
+        language="en",country="IN"
+      </fo:block>
+      <fo:block font-size="12pt"
+                font-family="sans-serif"
+                space-after="3pt"
+                language="en"
+                               country="IN"
+                hyphenate="true"
+                hyphenation-ladder-count="no-limit"
+                >
+        This document has been reviewed by W3C Members and other interested 
parties and has been endorsed by the Director as a
+        W3C Recommendation. It is a stable document and may be used as 
reference material or cited as a normative reference from
+        another document. W3C's role in making the Recommendation is to draw 
attention to the specification and to promote its
+        widespread deployment. This enhances the functionality and 
interoperability of the Web.
+      </fo:block>
+
+      <fo:block font-size="12pt"
+            font-family="sans-serif"
+            background-color="blue"
+            color="white"
+            text-align="start">
+        language="em"
+      </fo:block>
+      <fo:block font-size="12pt"
+                font-family="sans-serif"
+                space-after="3pt"
+                language="em"
+                hyphenate="true"
+                hyphenation-ladder-count="no-limit"
+                >
+        This document has been reviewed by W3C Members and other interested 
parties and has been endorsed by the Director as a
+        W3C Recommendation. It is a stable document and may be used as 
reference material or cited as a normative reference from
+        another document. W3C's role in making the Recommendation is to draw 
attention to the specification and to promote its
+        widespread deployment. This enhances the functionality and 
interoperability of the Web.
+      </fo:block>
+
+      <fo:block font-size="12pt"
+            font-family="sans-serif"
+            background-color="blue"
+            color="white"
+            text-align="start">
+        language="em",country="IN"
+      </fo:block>
+      <fo:block font-size="12pt"
+                font-family="sans-serif"
+                space-after="3pt"
+                language="em"
+                               country="IN"
+                hyphenate="true"
+                hyphenation-ladder-count="no-limit"
+                >
+        This document has been reviewed by W3C Members and other interested 
parties and has been endorsed by the Director as a
+        W3C Recommendation. It is a stable document and may be used as 
reference material or cited as a normative reference from
+        another document. W3C's role in making the Recommendation is to draw 
attention to the specification and to promote its
+        widespread deployment. This enhances the functionality and 
interoperability of the Web.
+      </fo:block>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
+
+  </fo>
+
+  <checks>
+    <eval expected="8" 
xpath="count(//pageViewport[1]//flow/block[2]/lineArea)"/>
+    <eval expected="Di-" 
xpath="//pageViewport[1]//flow/block[2]/lineArea[2]/text/word[10]"/>
+    <eval expected="norma-" 
xpath="//pageViewport[1]//flow/block[2]/lineArea[4]/text/word[12]"/>
+    <eval expected="mak-" 
xpath="//pageViewport[1]//flow/block[2]/lineArea[5]/text/word[9]"/>
+    <eval expected="specifi-" 
xpath="//pageViewport[1]//flow/block[2]/lineArea[6]/text/word[10]"/>
+    <eval expected="en-" 
xpath="//pageViewport[1]//flow/block[2]/lineArea[7]/text/word[9]"/>
+
+    <eval expected="9" 
xpath="count(//pageViewport[1]//flow/block[4]/lineArea)"/>
+    <eval expected="by" 
xpath="//pageViewport[1]//flow/block[4]/lineArea[2]/text/word[9]"/>
+    <eval expected="cited" 
xpath="//pageViewport[1]//flow/block[4]/lineArea[4]/text/word[10]"/>
+    <eval expected="document." 
xpath="//pageViewport[1]//flow/block[4]/lineArea[5]/text/word[7]"/>
+    <eval expected="to" 
xpath="//pageViewport[1]//flow/block[4]/lineArea[6]/text/word[10]"/>
+    <eval expected="deployment." 
xpath="//pageViewport[1]//flow/block[4]/lineArea[7]/text/word[8]"/>
+
+    <eval expected="9" 
xpath="count(//pageViewport[1]//flow/block[6]/lineArea)"/>
+    <eval expected="by" 
xpath="//pageViewport[1]//flow/block[6]/lineArea[2]/text/word[9]"/>
+    <eval expected="cited" 
xpath="//pageViewport[1]//flow/block[6]/lineArea[4]/text/word[10]"/>
+    <eval expected="document." 
xpath="//pageViewport[1]//flow/block[6]/lineArea[5]/text/word[7]"/>
+    <eval expected="to" 
xpath="//pageViewport[1]//flow/block[6]/lineArea[6]/text/word[10]"/>
+    <eval expected="deployment." 
xpath="//pageViewport[1]//flow/block[6]/lineArea[7]/text/word[8]"/>
+  </checks>
+</testcase>

Propchange: 
xmlgraphics/fop/trunk/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xmlgraphics/fop/trunk/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml
------------------------------------------------------------------------------
    svn:keywords = Id



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to