You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gc...@apache.org on 2007/11/16 00:56:44 UTC

svn commit: r595495 - in /myfaces/trinidad/trunk/trinidad: trinidad-examples/trinidad-demo/src/main/webapp/components/ trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/ trinidad-impl/src/main/java/org/apache/myfaces/trinidadinter...

Author: gcrawford
Date: Thu Nov 15 15:56:42 2007
New Revision: 595495

URL: http://svn.apache.org/viewvc?rev=595495&view=rev
Log:
TRINIDAD-797 Date-picker does not use the converter's locale attribute if it differs from page locale

Patch provided by Yee-Wah Lee - thanks Yee-Wah.

1. Creates a scriptlet which loads a specified (named) locale.
2. Calls DateTimeConverter to load the scriptlet when a non-page locale is requested.
3. Adds examples of #2 in inputDate.jspx


Added:
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/NamedLocaleInfoScriptlet.java
Modified:
    myfaces/trinidad/trunk/trinidad/trinidad-examples/trinidad-demo/src/main/webapp/components/inputDate.jspx
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/DateTimeConverter.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LocaleInfoScriptlet.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/XhtmlScriptletFactory.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/resource/TrTranslationsResourceLoader.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFieldFormat.js

Modified: myfaces/trinidad/trunk/trinidad/trinidad-examples/trinidad-demo/src/main/webapp/components/inputDate.jspx
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-examples/trinidad-demo/src/main/webapp/components/inputDate.jspx?rev=595495&r1=595494&r2=595495&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-examples/trinidad-demo/src/main/webapp/components/inputDate.jspx (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-examples/trinidad-demo/src/main/webapp/components/inputDate.jspx Thu Nov 15 15:56:42 2007
@@ -68,6 +68,28 @@
                                     label="attached converter">
                 <tr:convertDateTime secondaryPattern="d/M/yyyy" pattern="yyyy/M/d" />
               </tr:inputDate>              
+
+              <tr:outputFormatted styleUsage="instruction"
+                 value="&lt;b>A inputDate with a converter attached from fr_FR locale (has 2-digit display for hours)&lt;/b>"/> 
+              <tr:inputDate id="mdf6" value="#{date.date5}"
+                                    label="attached converter with locale fr_FR">
+                <tr:convertDateTime locale="fr_FR" type="both" dateStyle="full"/>
+                </tr:inputDate>              
+
+              <tr:outputFormatted styleUsage="instruction"
+                 value="&lt;b>A inputDate with a converter attached from fr_BE locale (has 1-digit display for hours)&lt;/b>"/> 
+              <tr:inputDate id="mdf7" value="#{date.date5}"
+                                    label="attached converter with locale fr_BE">
+                <tr:convertDateTime locale="fr_BE" type="both" dateStyle="full"/>
+                </tr:inputDate>              
+
+              <tr:outputFormatted styleUsage="instruction"
+                 value="&lt;b>A inputDate with a converter attached from ja locale&lt;/b>"/> 
+              <tr:inputDate id="mdf8" value="#{date.date5}"
+                                    label="attached converter with locale ja">
+                <tr:convertDateTime locale="ja" type="date" dateStyle="full"/>
+                </tr:inputDate>              
+
               
             </tr:panelGroupLayout>
            </tr:panelHeader>

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/DateTimeConverter.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/DateTimeConverter.java?rev=595495&r1=595494&r2=595495&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/DateTimeConverter.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/DateTimeConverter.java Thu Nov 15 15:56:42 2007
@@ -19,8 +19,11 @@
 package org.apache.myfaces.trinidadinternal.convert;
 
 import java.io.IOException;
+
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -45,6 +48,7 @@
 import org.apache.myfaces.trinidadinternal.ui.laf.base.xhtml.XhtmlLafUtils;
 import org.apache.myfaces.trinidadinternal.util.JsonUtils;
 
+
 /**
  * <p>
  * This class implements client side equivalent of DateTimeConverter. This class
@@ -150,7 +154,8 @@
       _LOG
           .severe("The component is null, but it is needed for the client id, so no script written");
       return null;
-    }
+    }    
+        
     // Add a JavaScript Object to store the datefield formats
     // on the client-side. We currently store the format string
     // for each and every field. It'd be more efficient to have
@@ -170,11 +175,12 @@
       // this fetch could be at the place where we append, but has been
       // moved ahead to optimize use of StringBuilder
       String jsPattern = getJSPattern(context);
+      String loc = _getLocaleString (context);
 
       // FIX - figure out size!!!
-      // 65 chars for javascript + length of jspattern + 12 chars for
+      // 127 chars for javascript + length of jspattern + locale + 12 chars for
       // tranforming to name in the worst case.
-      StringBuilder buff = new StringBuilder(77 + jsPattern.length());
+      StringBuilder buff = new StringBuilder(139 + jsPattern.length() + loc.length());
 
       if (requestMap.get(_PATTERN_WRITTEN_KEY) == null)
       {
@@ -182,7 +188,7 @@
         // only create the _dfs object if it doesn't exist, so we don't
         // wipe out _dfs[xxx] values if we ppr the first date field on a
         // page with multiple date fields.
-        buff.append("if(window['_dfs'] == undefined){var _dfs=new Object();}");
+        buff.append("if(window['_dfs'] == undefined){var _dfs=new Object();}if(window['_dl'] == undefined){var _dl=new Object();}");
       }
 
       buff.append("_dfs[\"");
@@ -191,6 +197,12 @@
       buff.append(jsPattern);
       buff.append(";");
 
+      buff.append("_dl[\"");
+      buff.append(clientId);
+      buff.append("\"]=");
+      buff.append(loc);
+      buff.append(";");
+
       return buff.toString();
     } else
     {
@@ -202,13 +214,6 @@
 
   public String getClientConversion(FacesContext context, UIComponent component)
   {
-    // for now, we are disabling the client-side validation when the
-    // locale is not the page's locale.
-    if (_isDifferentLocale())
-    {
-      return null;
-    }
-
     String jsPattern = getJSPattern(context);
     Map<String, String> messages = new HashMap<String, String>();
     if (jsPattern != null)
@@ -244,7 +249,17 @@
       StringBuilder outBuffer = new StringBuilder();
       outBuffer.append("new TrDateTimeConverter(");
       outBuffer.append(jsPattern);
-      outBuffer.append(",null,'");
+      Locale loc = getLocale ();
+      if (loc != null)
+      {
+        outBuffer.append(",'");
+        outBuffer.append (loc.toString());
+        outBuffer.append ("','");        
+      }
+      else
+      {
+        outBuffer.append (",null,'");
+      }
       outBuffer.append(exampleString);
       outBuffer.append("','");
       outBuffer.append(escapedType);
@@ -278,7 +293,24 @@
 
   public Collection<String> getClientImportNames()
   {
-    return _IMPORT_NAMES;
+    // Load the library for the different locale, so that the locale elements
+    // are available for the client converter and validator.
+    if (_isDifferentLocale())
+    {
+      ArrayList<String> names = new ArrayList<String>(2);
+      names.add ("TrDateTimeConverter()");
+      // Load NamedLocaleInfoScriptlet  "LocaleInfo_<locale>"
+      String sloc =  getLocale().toString();
+      StringBuffer sb = new StringBuffer (11 + sloc.length());
+      sb.append ("LocaleInfo_");
+      sb.append (sloc);
+      names.add (sb.toString());
+      return names;
+    }
+    else
+    {
+      return _IMPORT_NAMES;
+    }
   }
 
   public String getClientLibrarySource(FacesContext context)
@@ -516,6 +548,26 @@
       buffer.append("']");
     }
     return buffer.toString();
+  }
+  
+  private String _getLocaleString (FacesContext context)
+  {
+    Locale dateTimeConverterLocale = getLocale();
+    if (dateTimeConverterLocale != null)
+    {
+      Locale defaultLocale = RenderingContext.getCurrentInstance()
+          .getLocaleContext().getFormattingLocale();
+      if (!(dateTimeConverterLocale.equals (defaultLocale)))
+      {
+        String loc = dateTimeConverterLocale.toString();
+        StringBuffer sb = new StringBuffer (2 + loc.length());
+        sb.append ("'");
+        sb.append (loc);
+        sb.append ("'");
+        return (sb.toString());
+      }
+    }
+    return "null";    
   }
 
   // Bug 4570591

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java?rev=595495&r1=595494&r2=595495&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java Thu Nov 15 15:56:42 2007
@@ -93,7 +93,7 @@
         outputDependency(context, arc, _dependencies[i]);
     }
 
-    XhtmlUtils.writeLibImport(context, arc, _getLibraryURL(context, arc));
+    XhtmlUtils.writeLibImport(context, arc, getLibraryURL(context, arc));
   }
 
   @Override
@@ -127,7 +127,7 @@
     return libraryName;
   }
 
-  private String _getLibraryURL(
+  protected String getLibraryURL(
     FacesContext        context,
     RenderingContext arc)
   {

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LocaleInfoScriptlet.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LocaleInfoScriptlet.java?rev=595495&r1=595494&r2=595495&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LocaleInfoScriptlet.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LocaleInfoScriptlet.java Thu Nov 15 15:56:42 2007
@@ -23,14 +23,15 @@
 import java.util.HashMap;
 import java.util.Locale;
 
-import javax.faces.context.ResponseWriter;
 import javax.faces.context.FacesContext;
-import org.apache.myfaces.trinidad.context.RenderingContext;
-import org.apache.myfaces.trinidad.context.LocaleContext;
+import javax.faces.context.ResponseWriter;
 
-import org.apache.myfaces.trinidadinternal.ui.laf.base.xhtml.LocaleList;
+import org.apache.myfaces.trinidad.context.LocaleContext;
+import org.apache.myfaces.trinidad.context.RenderingContext;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.XhtmlRenderer;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.XhtmlUtils;
+import org.apache.myfaces.trinidadinternal.ui.laf.base.xhtml.LocaleList;
+
 
 /**
  * Scriptlet for registering locale information.
@@ -113,8 +114,7 @@
     FacesContext        context,
     RenderingContext arc)
   {
-    Locale elementsLocale = _getJSLocaleElementsLocale(
-                                    arc.getLocaleContext().getFormattingLocale());
+    Locale elementsLocale = _getJSLocaleElementsLocale(getFormattingLocale(arc));
     String var = getSupportedLocaleVariant(arc);
     if (var != null)
     {
@@ -135,6 +135,10 @@
     return buffer.toString();
   }
 
+    protected Locale getFormattingLocale(RenderingContext arc) {
+      return arc.getLocaleContext().getFormattingLocale();
+    }
+
   /**
    * Returns the locale variant type to use when formatting dates. The locale
    * variant is a configuration parameter. It defaults to Java style locale
@@ -155,7 +159,7 @@
 
     return null;
   }
-
+  
   /**
    * Returns the Locale to use for loading a JavaScript resource,
    * given an input Locale
@@ -199,6 +203,7 @@
       return outLocale;
     }        
   }
+  
 
   static private final String    _RESOURCE_BASE = "resources/LocaleElements_";
   static private final Scriptlet _sInstance = new LocaleInfoScriptlet();

Added: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/NamedLocaleInfoScriptlet.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/NamedLocaleInfoScriptlet.java?rev=595495&view=auto
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/NamedLocaleInfoScriptlet.java (added)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/NamedLocaleInfoScriptlet.java Thu Nov 15 15:56:42 2007
@@ -0,0 +1,109 @@
+/*
+ *  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.
+ */
+package org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.jsLibs;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.trinidad.context.RenderingContext;
+import org.apache.myfaces.trinidadinternal.ui.laf.base.xhtml.LocaleList;
+
+
+/**
+ * Scriptlet for registering locale information. This scriptlet can be used to 
+ * locale information on demand, e.g. when a component runs in a different locale
+ * than the page locale.
+ * @version $Name:  $ ($Revision: adfrt/faces/adf-faces-impl/src/main/java/oracle/adfinternal/view/faces/renderkit/core/xhtml/jsLibs/LocaleInfoScriptlet.java#0 $) $Date: 10-nov-2005.19:02:47 $
+ */
+class NamedLocaleInfoScriptlet extends LocaleInfoScriptlet
+{
+  public static void registerNamedLocales () 
+  {
+    HashMap<Locale, Locale> supportedMap = LocaleList.getSupportedLocales();
+    Iterator<Locale> locales =  supportedMap.keySet().iterator();
+    
+    while (locales.hasNext())
+    {
+      Locale l = locales.next();
+      NamedLocaleInfoScriptlet ns = new NamedLocaleInfoScriptlet (l);
+      ns.registerSelf();
+    }      
+  }
+
+  public NamedLocaleInfoScriptlet (Locale namedlocale)
+  {
+     super ();
+     
+    // The namedLocale is an instance returned from LocaleList.getSupportedLocales()
+    // getSupportedLocales() is derived from Locale.getAvailableLocales()
+    // which accounts for <Country, Language> but not the Oracle variant. Use
+    // similar code to getLibraryName() to set the Locale variant. 
+    // See JSLocaleElementsGenerator.java in maven-i18n-plugin to check
+    // how LocaleList.java is generated
+    String var = getSupportedLocaleVariant(RenderingContext.getCurrentInstance());
+    if (var != null)
+    {
+      namedlocale = new Locale(namedlocale.getLanguage(),
+                               namedlocale.getCountry(),
+                               var);
+    }
+      
+    _locale = namedlocale;
+  }
+
+
+  /*
+   * Append an argument to the URL to indicate if this is the page locale
+   */
+  protected String getLibraryURL(
+    FacesContext        context,
+    RenderingContext arc)
+  {
+    StringBuffer sb = new StringBuffer (super.getLibraryURL(context, arc));
+    if (!(_locale.equals(arc.getLocaleContext().getFormattingLocale())))
+    {
+      sb.append("?skipTranslations=true");
+    }
+    return sb.toString();
+  }
+
+  /* Register as a distinct scriptlet for each locale, i.e. <country, language, Oraclevariant> */
+  @Override
+  public Object getScriptletKey()
+  {
+    String lib = (String) super.getScriptletKey();
+    String sLoc = _locale.toString();
+    
+    StringBuffer sb = new StringBuffer (lib.length() + 1 +  sLoc.length());
+    sb.append (lib);
+    sb.append ("_");
+    sb.append (sLoc);
+    return sb.toString();
+  }
+  
+  protected Locale getFormattingLocale(RenderingContext arc) 
+  {
+    return _locale;
+  }
+   
+  private Locale _locale;
+}

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/XhtmlScriptletFactory.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/XhtmlScriptletFactory.java?rev=595495&r1=595494&r2=595495&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/XhtmlScriptletFactory.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/XhtmlScriptletFactory.java Thu Nov 15 15:56:42 2007
@@ -72,6 +72,7 @@
     _sDateFieldScriptlet.registerSelf();
     _sPollScriptlet.registerSelf();
     LocaleInfoScriptlet.sharedInstance().registerSelf();
+    NamedLocaleInfoScriptlet.registerNamedLocales();
     ColorFormatInfoScriptlet.sharedInstance().registerSelf();
     DateFormatInfoScriptlet.sharedInstance().registerSelf();
     DefaultTimeZoneScriptlet.sharedInstance().registerSelf();

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/resource/TrTranslationsResourceLoader.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/resource/TrTranslationsResourceLoader.java?rev=595495&r1=595494&r2=595495&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/resource/TrTranslationsResourceLoader.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/resource/TrTranslationsResourceLoader.java Thu Nov 15 15:56:42 2007
@@ -18,10 +18,15 @@
  */
 package org.apache.myfaces.trinidadinternal.resource;
 
+import java.io.IOException;
+
+import java.util.Map;
+
 import javax.faces.context.FacesContext;
 
 import org.apache.myfaces.trinidad.skin.Skin;
 
+
 public class TrTranslationsResourceLoader extends TranslationsResourceLoader
 {
   /**
@@ -66,5 +71,28 @@
   protected Skin getSkin(FacesContext context)
   {
     return null;
+  }
+  
+  /*
+   * Override to return empty content when loading translations for
+   * something other than the page locale. This can happen if components
+   * on the page have a different locale than the page. 
+   */
+  @Override
+  protected String getString(String path) throws IOException
+  {
+    FacesContext context = FacesContext.getCurrentInstance();
+    Map params = context.getExternalContext().getRequestParameterMap();
+    
+    boolean skipTranslations = "true".equals(params.get("skipTranslations"));
+    if (skipTranslations)
+    {
+      return "";
+    }
+    else
+    {
+      return (super.getString (path));
+    }
+    
   }
 }

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFieldFormat.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFieldFormat.js?rev=595495&r1=595494&r2=595495&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFieldFormat.js (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFieldFormat.js Thu Nov 15 15:56:42 2007
@@ -22,8 +22,12 @@
   if (name && _dfs)
   {
     var format = _dfs[name];
-    if (format)
-      return new TrDateTimeConverter(format);
+    if (_dl)
+    {
+      var locale = _dl[name];
+      return new TrDateTimeConverter (format, locale);
+    }
+   return new TrDateTimeConverter(format);
   }
 
   return new TrDateTimeConverter();
@@ -47,4 +51,5 @@
     }
   }
 }
+