You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ma...@apache.org on 2010/07/08 17:23:25 UTC

svn commit: r961803 [2/2] - in /myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/menu: ./ GroupNode.java ImmutableGroupNode.java ImmutableItemNode.java ItemNode.java MenuNode.java MenuUtils.java

Added: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/menu/MenuUtils.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/menu/MenuUtils.java?rev=961803&view=auto
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/menu/MenuUtils.java (added)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/menu/MenuUtils.java Thu Jul  8 15:23:24 2010
@@ -0,0 +1,450 @@
+/*
+ *  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.trinidad.menu;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Set;
+
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+import org.apache.myfaces.trinidad.util.ContainerUtils;
+import org.apache.myfaces.trinidad.util.ThreadLocalUtils;
+
+/**
+ * Menu Utilities used by the Menu Model internal code.
+ * All classes are package private.
+ *
+ */
+public class MenuUtils
+{
+  MenuUtils() {}
+
+  //=======================================================================
+  // String, Stringbuffer utilities
+  //=======================================================================
+  /**
+   * Returns a String with the first occurrence of str1 replaced with str2
+   * in fullstring
+   * 
+   * @param fullstring - The full string
+   * @param str1 - String to be found in fullstring
+   * @param str2 - String to replace the first occurrence of str1
+   * @return String
+   */
+  static String stringReplaceFirst(String fullstring, String str1, String str2)
+  {
+    if (fullstring == null)
+      return null;
+    
+    StringBuffer returnStr = 
+      stringBufferReplaceFirst(new StringBuffer(fullstring), str1, str2);
+    return returnStr.toString();
+  }
+
+  /**
+   * Returns a StringBuffer with the first occurrence of str1 replaced with str2
+   * in fullBuf
+   * 
+   * @param fullBuf - The full stringbuffer
+   * @param str1 - String to be found in fullBuf
+   * @param str2 - String to replace the first occurrence of str1
+   * @return StringBuffer
+   */
+  static StringBuffer stringBufferReplaceFirst(StringBuffer fullBuf, String str1, 
+                                               String str2)
+  {
+    if (fullBuf == null)
+      return null;
+    
+    String fullstr = fullBuf.toString();
+    
+    // All Cases that just return fullBuf
+    if (str1 == null || str2 == null)
+      return fullBuf;
+    if ("".equals(fullstr) && !"".equals(str1))
+      return fullBuf;
+
+    // if the string being replaced is not found, return    
+    int startIdx = fullBuf.indexOf(str1);
+    if (startIdx == -1)
+      return fullBuf;
+    
+    // We are ok, now go ahead
+    int foundLen = str1.length();
+    int endIdx = startIdx + foundLen;
+    
+    StringBuffer returnBuf = fullBuf.replace(startIdx, endIdx, str2);
+    return returnBuf;
+  }
+
+  //=======================================================================
+  // Bound Value/EL Expression utilities
+  //=======================================================================
+  
+  /**
+   * Gets the bound value of an EL expression
+   * 
+   * @param elExpression - String representing an EL expression
+   */
+  static public <T> T getBoundValue(String elExpression, Class<T> desiredClass)
+  {
+    try
+    {
+      if (desiredClass == null)
+        throw new NullPointerException();
+
+      FacesContext ctx = FacesContext.getCurrentInstance();
+      return (T) ctx.getApplication().evaluateExpressionGet(ctx,
+                                                            elExpression,
+                                                            desiredClass);
+    }
+    catch (Exception ex)
+    {
+      _LOG.severe("EL Expression " + elExpression + 
+                  " is invalid or returned a bad value.\n", ex);
+      _LOG.severe(ex);
+      return null;
+    }
+  }
+  
+  /**
+   * Evaluate an attribute value string representing a boolean value 
+   * and return its boolean value.  There are 3 possible valid values for
+   * boolStr:
+   * o EL Expression (that returns a boolean)
+   * o the string "true"
+   * o the string "false"
+   * 
+   * In the case of another string being passed in, the default value
+   * of the attribute is returned.
+   * 
+   * @param boolStr - String to be evaluated into a boolean.
+   * @param defaultVal - The default boolean value to be returned in the case
+   *                     where and invalid boolstr is passed in.
+   * @return boolean value equivalent of boolStr
+   */
+  static boolean evalBoolean (String boolStr, boolean defaultVal)
+  {
+    if (   boolStr != null 
+        && ContainerUtils.isValueReference(boolStr)
+       )
+    {
+      Boolean bValue = getBoundValue(boolStr, Boolean.class);
+      return bValue.booleanValue();
+    }
+    else
+    {    
+      if ("true".equals(boolStr) || "false".equals(boolStr))
+        return (Boolean.valueOf(boolStr)).booleanValue();
+      else
+        return defaultVal;
+    }
+  }
+
+  /**
+   * Evaluate a string representing an EL expression.
+   * 
+   * @param propVal - string to be evaluated.
+   * @return the string bound value of the EL Expression
+   */
+  static String evalString(String propVal)
+  {
+    if (   propVal != null 
+        && ContainerUtils.isValueReference(propVal)
+       )
+    {
+      String elVal = getBoundValue(propVal, String.class);
+      return elVal;
+    }
+    return propVal;
+  }
+
+  /**
+   * Evaluate a string representing an EL expression.
+   * 
+   * @param propVal - string to be evaluated.
+   * @return the int bound value of the EL Expression
+   */
+  static int evalInt(String propVal)
+  {
+    if (   propVal != null 
+        && ContainerUtils.isValueReference(propVal)
+       )
+    {
+      Integer elVal = getBoundValue(propVal, Integer.class);
+      return elVal.intValue();
+    }
+    return Integer.parseInt(propVal);
+  }
+  
+  /**
+   * Create a ResourceBundle and put it on the Session map.
+   * 
+   * @param resBundle - String containing name of class containing the resource
+   *                    bundle.
+   * @param key - ThreadLocal key for the resource bundle being put on the
+   *              requestMap
+   */
+  @SuppressWarnings("unchecked")
+  static void loadBundle(String resBundle, ThreadLocal<String> key)
+  {
+    FacesContext facesContext = FacesContext.getCurrentInstance();
+    Map<String, Object> applicationMap = 
+      facesContext.getExternalContext().getApplicationMap();
+
+    // Get the view root locale
+    Locale requestLocale = facesContext.getViewRoot().getLocale();
+
+    // Make sure it is not null
+    if (requestLocale == null)
+    {
+      requestLocale = facesContext.getApplication().getDefaultLocale();
+    }
+    
+    // Is there a bundle with this key already on the session map?
+    _BundleMap bundleMap = (_BundleMap) applicationMap.get(key.get());
+    
+    // if so, get its locale.  If the locale has not 
+    // changed, just return, i.e. use the existing bundle
+    if (bundleMap != null)
+    {
+      Locale bundleLocale = bundleMap.getLocale();
+      
+      if (bundleLocale == null)
+      {
+        ResourceBundle rb = bundleMap.getBundle();
+        bundleLocale = rb.getLocale();
+      }
+      
+      if (requestLocale == bundleLocale)
+      {
+        // the bundle on the applicationMap is ok so just return
+        return;
+      }
+    }
+
+    String bundleName = null;
+
+    if (resBundle != null) 
+    {
+      // if _bundleName is an EL, then get its value
+      if (ContainerUtils.isValueReference(resBundle)) 
+      {
+        bundleName = MenuUtils.getBoundValue(resBundle, String.class);
+      } 
+      else
+      {
+        bundleName = resBundle ;
+      }
+    }
+
+    final ResourceBundle bundle;
+    
+    try
+    {
+      bundle = ResourceBundle.getBundle(bundleName, requestLocale);
+    }
+    catch (MissingResourceException e)
+    {
+      _LOG.severe("RESOURCE_BUNDLE_NOT_FOUND", bundleName);
+      _LOG.severe(e);
+      return;
+    }
+ 
+    // Put the bundle in the map.  At this point the key is 
+    // unique because of the handler Id we inserted when loadBundle
+    // was called.
+    applicationMap.put(key.get(), new _BundleMap(bundle, requestLocale));
+  }
+
+  /**
+   * Create a ResourceBundle and put it on the Session map.
+   * The key is made into a ThreadLocal to ensure that this the resource
+   * bundle is threadsafe.
+   * 
+   * @param resBundleName - String containing name of class containing the 
+   *                        resource bundle.
+   * @param resBundleKey - String key for the resource bundle being put on the
+   *                       requestMap
+   */
+  @SuppressWarnings("unchecked")
+  static public void loadBundle(String resBundleName, String resBundleKey)
+  {
+    ThreadLocal<String> bundleKey = ThreadLocalUtils.newRequestThreadLocal();
+    
+    bundleKey.set(resBundleKey);    
+    loadBundle(resBundleName, bundleKey);
+  }
+  
+  /**
+   * Map containing a resource bundle and its key that is placed 
+   * on the http request map.  This resource bundle is used by the menu
+   * model metadata to externalize strings, such as tab labels, for 
+   * translation.
+   */
+  @SuppressWarnings("unchecked")
+  static private class _BundleMap implements Map<String, String>
+  {
+    private ResourceBundle _bundle;
+    private Locale _locale;
+    private List<String> _values;
+
+    public _BundleMap(ResourceBundle bundle)
+    {
+      _bundle = bundle;
+      _locale = bundle.getLocale();
+    }
+
+    public _BundleMap(ResourceBundle bundle, Locale locale)
+    {
+      _bundle = bundle;
+      _locale = locale;
+    }
+
+    //Optimized methods
+    public String get(Object key)
+    {
+      try 
+      {
+        return _bundle.getString(key.toString());
+      } 
+      catch (Exception e) 
+      {
+        return "!!!" + key + "!!!";
+      }
+    }
+
+    public boolean isEmpty()
+    {
+      return !_bundle.getKeys().hasMoreElements();
+    }
+
+    public boolean containsKey(Object key)
+    {
+      return _bundle.getObject(key.toString()) != null;
+    }
+
+    //Unoptimized methods
+    public Collection<String> values()
+    {
+        if (_values == null)
+        {
+          _values = new ArrayList<String>();
+          for (Enumeration<String> enumer = _bundle.getKeys(); 
+               enumer.hasMoreElements(); )
+          {
+            String v = _bundle.getString(enumer.nextElement());
+            _values.add(v);
+          }
+        }
+        return _values;
+    }
+
+    public int size()
+    {
+      return values().size();
+    }
+
+    public boolean containsValue(Object value)
+    {
+      return values().contains(value);
+    }
+
+    public Set<Map.Entry<String, String>> entrySet()
+    {
+      Set<Map.Entry<String, String>> set = new HashSet<Map.Entry<String, String>>();
+      
+      for (Enumeration<String> enumer = _bundle.getKeys(); enumer.hasMoreElements(); )
+      {
+        final String k = enumer.nextElement();
+        set.add(new Map.Entry<String, String>()
+        {
+          public String getKey()
+          {
+            return k;
+          }
+
+          public String getValue()
+          {
+            return _bundle.getString(k);
+          }
+
+          public String setValue(String value)
+          {
+            throw new UnsupportedOperationException();
+          }
+        });
+      }
+      return set;
+    }
+
+    public Set<String> keySet()
+    {
+      Set<String> set = new HashSet<String>();
+      for (Enumeration<String> enumer = _bundle.getKeys(); enumer.hasMoreElements(); )
+      {
+        set.add(enumer.nextElement());
+      }
+      return set;
+    }
+
+    //Unsupported methods
+    public String remove(Object key)
+    {
+      throw new UnsupportedOperationException();
+    }
+
+    public void putAll(Map<? extends String, ? extends String> t)
+    {
+      throw new UnsupportedOperationException();
+    }
+
+    public String put(String key, String value)
+    {
+      throw new UnsupportedOperationException();
+    }
+
+    public void clear()
+    {
+      throw new UnsupportedOperationException();
+    }
+    
+    public ResourceBundle getBundle()
+    {
+      return _bundle;
+    }
+
+    public Locale getLocale()
+    {
+      return _locale;
+    }
+  }  // endclass _BundleMap
+
+  private final static TrinidadLogger _LOG = 
+                        TrinidadLogger.createTrinidadLogger(MenuUtils.class);
+}