You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2018/12/15 15:49:32 UTC

[myfaces] branch master updated: refactored + better performance for string blank check

This is an automated email from the ASF dual-hosted git repository.

tandraschko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/master by this push:
     new 6063599  refactored + better performance for string blank check
6063599 is described below

commit 60635991962f27a0c1059e223f6e4ce0e150137a
Author: Thomas Andraschko <ta...@apache.org>
AuthorDate: Sat Dec 15 16:49:25 2018 +0100

    refactored + better performance for string blank check
---
 .../myfaces/application/ApplicationImpl.java       | 37 +++++-----
 .../search/SearchExpressionHandlerImpl.java        |  5 +-
 .../config/DefaultFacesConfigurationMerger.java    |  9 +--
 .../config/annotation/AnnotationConfigurator.java  | 13 ++--
 .../servlet/ServletExternalContextImpl.java        |  6 +-
 .../org/apache/myfaces/flow/impl/FlowScopeMap.java | 12 ++++
 .../renderkit/html/HtmlAjaxBehaviorRenderer.java   | 80 +++++++++-------------
 .../renderkit/html/HtmlCommandScriptRenderer.java  | 13 ++--
 .../renderkit/html/base/HtmlRendererUtils.java     | 30 ++++----
 .../java/org/apache/myfaces/util/LangUtils.java    | 27 ++++++++
 .../facelets/tag/composite/AttributeHandler.java   |  3 +-
 .../myfaces/webapp/AbstractFacesInitializer.java   |  3 +-
 12 files changed, 137 insertions(+), 101 deletions(-)

diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
index f72bd36..6d7439c 100755
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
@@ -123,6 +123,7 @@ import org.apache.myfaces.lifecycle.LifecycleImpl;
 import org.apache.myfaces.config.MyfacesConfig;
 import org.apache.myfaces.util.Assert;
 import org.apache.myfaces.util.ClassUtils;
+import org.apache.myfaces.util.LangUtils;
 import org.apache.myfaces.view.facelets.FaceletCompositionContext;
 import org.apache.myfaces.view.facelets.el.ELText;
 
@@ -1869,10 +1870,10 @@ public class ApplicationImpl extends Application
             // Get the annotation instance from the class and obtain the values of the name, library, and 
             // target attributes.
             String name = annotation.name();
-            if (name != null && name.length() > 0)
+            if (LangUtils.isNotEmpty(name))
             {
-                name = ELText.parse(getExpressionFactory(),
-                                    context.getELContext(), name).toString(context.getELContext());
+                name = ELText.parse(getExpressionFactory(),context.getELContext(), name)
+                        .toString(context.getELContext());
             }
             
             // Obtain the renderer-type for the resource name by passing name to 
@@ -1894,10 +1895,10 @@ public class ApplicationImpl extends Application
             
             // If library is the empty string, let library be null.
             String library = annotation.library();
-            if (library != null && library.length() > 0)
+            if (LangUtils.isNotEmpty(library))
             {
-                library = ELText.parse(getExpressionFactory(),
-                                       context.getELContext(), library).toString(context.getELContext());
+                library = ELText.parse(getExpressionFactory(), context.getELContext(), library)
+                        .toString(context.getELContext());
                 // If library is non-null, store it under the key "library".
                 attributes.put("library", library);
             }
@@ -1908,10 +1909,10 @@ public class ApplicationImpl extends Application
             
             // If target is the empty string, let target be null.
             String target = annotation.target();
-            if (target != null && target.length() > 0)
+            if (LangUtils.isNotEmpty(target))
             {
-                target = ELText.parse(getExpressionFactory(),
-                                      context.getELContext(), target).toString(context.getELContext());
+                target = ELText.parse(getExpressionFactory(),context.getELContext(), target)
+                        .toString(context.getELContext());
                 // If target is non-null, store it under the key "target".
                 attributes.put("target", target);
                 context.getViewRoot().addComponentResource(context, output, target);
@@ -2309,10 +2310,10 @@ public class ApplicationImpl extends Application
             // Get the annotation instance from the class and obtain the values of the name, library, and
             // target attributes.
             String name = annotation.name();
-            if (name != null && name.length() > 0)
+            if (LangUtils.isNotEmpty(name))
             {
-                name = ELText.parse(getExpressionFactory(),
-                                    context.getELContext(), name).toString(context.getELContext());
+                name = ELText.parse(getExpressionFactory(), context.getELContext(), name)
+                        .toString(context.getELContext());
             }
 
             // Obtain the renderer-type for the resource name by passing name to
@@ -2335,10 +2336,10 @@ public class ApplicationImpl extends Application
 
             // If library is the empty string, let library be null.
             String library = annotation.library();
-            if (library != null && library.length() > 0)
+            if (LangUtils.isNotEmpty(library))
             {
-                library = ELText.parse(getExpressionFactory(),
-                                       context.getELContext(), library).toString(context.getELContext());
+                library = ELText.parse(getExpressionFactory(), context.getELContext(), library)
+                        .toString(context.getELContext());
                 // If library is non-null, store it under the key "library".
                 if ("this".equals(library))
                 {
@@ -2361,10 +2362,10 @@ public class ApplicationImpl extends Application
 
             // If target is the empty string, let target be null.
             String target = annotation.target();
-            if (target != null && target.length() > 0)
+            if (LangUtils.isNotEmpty(target))
             {
-                target = ELText.parse(getExpressionFactory(),
-                                      context.getELContext(), target).toString(context.getELContext());
+                target = ELText.parse(getExpressionFactory(), context.getELContext(), target)
+                        .toString(context.getELContext());
                 // If target is non-null, store it under the key "target".
                 attributes.put("target", target);
                 context.getViewRoot().addComponentResource(context, output, target);
diff --git a/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java b/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
index aa65f8d..3822687 100644
--- a/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
@@ -35,6 +35,7 @@ import javax.faces.component.search.SearchKeywordContext;
 import javax.faces.context.FacesContext;
 import org.apache.myfaces.util.SharedStringBuilder;
 import org.apache.myfaces.util.ComponentUtils;
+import org.apache.myfaces.util.LangUtils;
 
 /**
  *
@@ -597,7 +598,7 @@ public class SearchExpressionHandlerImpl extends SearchExpressionHandler
     @Override
     public boolean isPassthroughExpression(SearchExpressionContext searchExpressionContext, String topExpression)
     {
-        if (topExpression == null || topExpression.trim().isEmpty())
+        if (LangUtils.isBlank(topExpression))
         {
             return false;
         }
@@ -655,7 +656,7 @@ public class SearchExpressionHandlerImpl extends SearchExpressionHandler
     @Override
     public boolean isValidExpression(SearchExpressionContext searchExpressionContext, String topExpression)
     {
-        if (topExpression == null || topExpression.trim().isEmpty())
+        if (LangUtils.isBlank(topExpression))
         {
             return true;
         }
diff --git a/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationMerger.java b/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationMerger.java
index 23f8766..3f4cdf9 100644
--- a/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationMerger.java
+++ b/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationMerger.java
@@ -42,6 +42,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.apache.myfaces.util.LangUtils;
 
 /**
  * Default impl of the FacesConfigurationMerger-SPI.
@@ -418,7 +419,7 @@ public class DefaultFacesConfigurationMerger extends FacesConfigurationMerger
                     if (slot instanceof FacesConfigNameSlot)
                     {
                         String name = ((FacesConfigNameSlot) slot).getName();
-                        if (name != null && !name.isEmpty())
+                        if (LangUtils.isNotEmpty(name))
                         {
                             boolean founded = false;
                             for (int j = i+1; j < sortedList.size(); j++)
@@ -577,7 +578,7 @@ public class DefaultFacesConfigurationMerger extends FacesConfigurationMerger
                     if (slot instanceof FacesConfigNameSlot)
                     {
                         String name = ((FacesConfigNameSlot) slot).getName();
-                        if (name != null && !name.isEmpty())
+                        if (LangUtils.isNotEmpty(name))
                         {
                             boolean founded = false;
                             for (int j = i-1; j >= 0; j--)
@@ -601,7 +602,7 @@ public class DefaultFacesConfigurationMerger extends FacesConfigurationMerger
                     if (slot instanceof FacesConfigNameSlot)
                     {
                         String name = ((FacesConfigNameSlot) slot).getName();
-                        if (name != null && !name.isEmpty())
+                        if (LangUtils.isNotEmpty(name))
                         {
                             boolean founded = false;
                             for (int j = i+1; j < sortedList.size(); j++)
@@ -773,7 +774,7 @@ public class DefaultFacesConfigurationMerger extends FacesConfigurationMerger
         for (FacesConfig resource : appConfigResources)
         {
             String name = resource.getName();
-            if (name != null && !name.isEmpty())
+            if (LangUtils.isNotEmpty(name))
             {
                 availableReferences.add(name);
             }
diff --git a/impl/src/main/java/org/apache/myfaces/config/annotation/AnnotationConfigurator.java b/impl/src/main/java/org/apache/myfaces/config/annotation/AnnotationConfigurator.java
index ba38011..2fe80df 100644
--- a/impl/src/main/java/org/apache/myfaces/config/annotation/AnnotationConfigurator.java
+++ b/impl/src/main/java/org/apache/myfaces/config/annotation/AnnotationConfigurator.java
@@ -46,6 +46,7 @@ import org.apache.myfaces.config.impl.digester.elements.ConverterImpl;
 import org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl;
 import org.apache.myfaces.spi.AnnotationProvider;
 import org.apache.myfaces.spi.AnnotationProviderFactory;
+import org.apache.myfaces.util.LangUtils;
 
 /**
  * Configure all annotations that needs to be defined at startup.
@@ -110,7 +111,7 @@ public class AnnotationConfigurator
                                 + clazz.getName() + ')');
                     }
                     String value = comp.value();
-                    if (value == null || value.isEmpty())
+                    if (LangUtils.isEmpty(value))
                     {
                         String simpleName = clazz.getSimpleName();
                         value = Character.toLowerCase(simpleName.charAt(0)) + simpleName.substring(1);
@@ -120,18 +121,14 @@ public class AnnotationConfigurator
                     if (comp.createTag())
                     {
                         String tagName = comp.tagName();
-                        if (tagName != null && tagName.length() > 0)
-                        {
-                            //Ok
-                        }
-                        else
+                        if (LangUtils.isEmpty(tagName))
                         {
                             tagName = clazz.getSimpleName();
                             tagName = Character.toLowerCase(tagName.charAt(0)) + tagName.substring(1);
                         }
+
                         facesConfig.addComponentTagDeclaration(value, 
-                                new ComponentTagDeclarationImpl(value, 
-                                    comp.namespace(), tagName));
+                                new ComponentTagDeclarationImpl(value, comp.namespace(), tagName));
                     }
                 }
             }
diff --git a/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java b/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java
index 7e47da3..296caf5 100755
--- a/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java
@@ -60,6 +60,7 @@ import org.apache.myfaces.context.flash.FlashImpl;
 import org.apache.myfaces.util.Assert;
 import org.apache.myfaces.util.EnumerationIterator;
 import org.apache.myfaces.util.ExternalSpecifications;
+import org.apache.myfaces.util.LangUtils;
 
 /**
  * Implements the external context for servlet request. JSF 1.2, 6.1.3
@@ -912,13 +913,14 @@ public final class ServletExternalContextImpl extends ServletExternalContextImpl
         {
             for (Map.Entry<String, List<String>> pair : parameters.entrySet())
             {
-                if (pair.getKey() != null && pair.getKey().trim().length() != 0)
+                String key = pair.getKey();
+                if (LangUtils.isNotBlank(key))
                 {
                     if (paramMap == null)
                     {
                         paramMap = new HashMap<String, List<String>>();
                     }
-                    paramMap.put(pair.getKey(), pair.getValue());
+                    paramMap.put(key, pair.getValue());
                 }
             }
         }
diff --git a/impl/src/main/java/org/apache/myfaces/flow/impl/FlowScopeMap.java b/impl/src/main/java/org/apache/myfaces/flow/impl/FlowScopeMap.java
index f55daa6..99c0511 100644
--- a/impl/src/main/java/org/apache/myfaces/flow/impl/FlowScopeMap.java
+++ b/impl/src/main/java/org/apache/myfaces/flow/impl/FlowScopeMap.java
@@ -53,6 +53,7 @@ class FlowScopeMap implements Map<Object,Object>
         return _delegate;
     }
 
+    @Override
     public int size()
     {
         Map<Object,Object> map = getWrapped(false);
@@ -63,6 +64,7 @@ class FlowScopeMap implements Map<Object,Object>
         return map.size();
     }
 
+    @Override
     public boolean isEmpty()
     {
         Map<Object,Object> map = getWrapped(false);
@@ -73,6 +75,7 @@ class FlowScopeMap implements Map<Object,Object>
         return map.isEmpty();
     }
 
+    @Override
     public boolean containsKey(Object key)
     {
         Map<Object,Object> map = getWrapped(false);
@@ -83,6 +86,7 @@ class FlowScopeMap implements Map<Object,Object>
         return map.containsKey(key);
     }
 
+    @Override
     public boolean containsValue(Object value)
     {
         Map<Object,Object> map = getWrapped(false);
@@ -93,6 +97,7 @@ class FlowScopeMap implements Map<Object,Object>
         return map.containsValue(value);
     }
 
+    @Override
     public Object get(Object key)
     {
         Map<Object,Object> map = getWrapped(false);
@@ -103,11 +108,13 @@ class FlowScopeMap implements Map<Object,Object>
         return map.get(key);
     }
 
+    @Override
     public Object put(Object key, Object value)
     {
         return getWrapped(true).put(key, value);
     }
 
+    @Override
     public Object remove(Object key)
     {
         Map<Object,Object> map = getWrapped(false);
@@ -118,11 +125,13 @@ class FlowScopeMap implements Map<Object,Object>
         return map.remove(key);
     }
 
+    @Override
     public void putAll(Map<? extends Object, ? extends Object> m)
     {
         getWrapped(true).putAll(m);
     }
 
+    @Override
     public void clear()
     {
         Map<Object,Object> map = getWrapped(false);
@@ -133,16 +142,19 @@ class FlowScopeMap implements Map<Object,Object>
         map.clear();
     }
 
+    @Override
     public Set<Object> keySet()
     {
         return getWrapped(true).keySet();
     }
 
+    @Override
     public Collection<Object> values()
     {
         return getWrapped(true).values();
     }
 
+    @Override
     public Set<Entry<Object, Object>> entrySet()
     {
         return getWrapped(true).entrySet();
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java
index ae87a54..2a334ef 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java
@@ -40,6 +40,7 @@ import javax.faces.context.FacesContext;
 import javax.faces.event.AjaxBehaviorEvent;
 import javax.faces.event.PhaseId;
 import javax.faces.render.ClientBehaviorRenderer;
+import org.apache.myfaces.util.LangUtils;
 import org.apache.myfaces.util.SharedStringBuilder;
 
 /**
@@ -49,9 +50,6 @@ import org.apache.myfaces.util.SharedStringBuilder;
 public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
 {
 
-    private static final String QUOTE = "'";
-    private static final String BLANK = " ";
-
     private static final String AJAX_KEY_ONERROR = "onerror";
     private static final String AJAX_KEY_ONEVENT = "onevent";
     private static final String AJAX_KEY_EXECUTE = "execute";
@@ -63,13 +61,7 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
     private static final String AJAX_VAL_EVENT = "event";
     private static final String JS_AJAX_REQUEST = "jsf.ajax.request";
 
-    private static final String COLON = ":";
-    private static final String EMPTY = "";
-    private static final String COMMA = ",";
-
     private static final String ERR_NO_AJAX_BEHAVIOR = "The behavior must be an instance of AjaxBehavior";
-    private static final String L_PAREN = "(";
-    private static final String R_PAREN = ")";
 
     private static final String AJAX_SB = "oam.renderkit.AJAX_SB";
     private static final String AJAX_PARAM_SB = "oam.renderkit.AJAX_PARAM_SB";
@@ -155,12 +147,11 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         String render = mapToString(context, paramBuffer, AJAX_KEY_RENDER, behavior.getRender());
 
         String onError = behavior.getOnerror();
-        if (onError != null && !onError.trim().equals(EMPTY))
+        if (LangUtils.isNotBlank(onError))
         {
-            //onError = AJAX_KEY_ONERROR + COLON + onError;
             paramBuffer.setLength(0);
             paramBuffer.append(AJAX_KEY_ONERROR);
-            paramBuffer.append(COLON);
+            paramBuffer.append(':');
             paramBuffer.append(onError);
             onError = paramBuffer.toString();
         }
@@ -168,12 +159,13 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         {
             onError = null;
         }
+        
         String onEvent = behavior.getOnevent();
-        if (onEvent != null && !onEvent.trim().equals(EMPTY))
+        if (LangUtils.isNotBlank(onEvent))
         {
             paramBuffer.setLength(0);
             paramBuffer.append(AJAX_KEY_ONEVENT);
-            paramBuffer.append(COLON);
+            paramBuffer.append(':');
             paramBuffer.append(onEvent);
             onEvent = paramBuffer.toString();
         }
@@ -181,15 +173,13 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         {
             onEvent = null;
         }
-        /*
-         * since version 2.2
-         */
+
         String delay = behavior.getDelay();
-        if (delay != null && !delay.trim().equals(EMPTY))
+        if (LangUtils.isNotBlank(delay))
         {
             paramBuffer.setLength(0);
             paramBuffer.append(AJAX_KEY_DELAY);
-            paramBuffer.append(COLON);
+            paramBuffer.append(':');
             if ("none".equals(delay))
             {
                 paramBuffer.append('\'');
@@ -206,15 +196,13 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         {
             delay = null;
         }
-        /*
-         * since version 2.2
-         */
+
         String resetValues = Boolean.toString(behavior.isResetValues());
         if (resetValues.equals("true"))
         {
             paramBuffer.setLength(0);
             paramBuffer.append(AJAX_KEY_RESETVALUES);
-            paramBuffer.append(COLON);
+            paramBuffer.append(':');
             paramBuffer.append(resetValues);
             resetValues = paramBuffer.toString();
         }
@@ -266,11 +254,11 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         String event = context.getEventName();
 
         retVal.append(JS_AJAX_REQUEST);
-        retVal.append(L_PAREN);
+        retVal.append('(');
         retVal.append(sourceId);
-        retVal.append(COMMA);
+        retVal.append(',');
         retVal.append(AJAX_VAL_EVENT);
-        retVal.append(COMMA);
+        retVal.append(',');
 
         Collection<ClientBehaviorContext.Parameter> params = context.getParameters();
         int paramSize = (params != null) ? params.size() : 0;
@@ -332,15 +320,14 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
             }
         }
 
-        //parameterList.add(QUOTE + BEHAVIOR_EVENT + QUOTE + COLON + QUOTE + event + QUOTE);
         paramBuffer.setLength(0);
-        paramBuffer.append(QUOTE);
+        paramBuffer.append('\'');
         paramBuffer.append(ClientBehaviorContext.BEHAVIOR_EVENT_PARAM_NAME);
-        paramBuffer.append(QUOTE);
-        paramBuffer.append(COLON);
-        paramBuffer.append(QUOTE);
+        paramBuffer.append('\'');
+        paramBuffer.append(':');
+        paramBuffer.append('\'');
         paramBuffer.append(event);
-        paramBuffer.append(QUOTE);
+        paramBuffer.append('\'');
         parameterList.add(paramBuffer.toString());
 
         /**
@@ -350,7 +337,7 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
          */
         retVal.append(buildOptions(paramBuffer, parameterList));
 
-        retVal.append(R_PAREN);
+        retVal.append(')');
 
         return retVal;
     }
@@ -363,13 +350,13 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         //and the rest is up to the toString properly implemented
         //ANS: Both name and value should be quoted
         paramBuffer.setLength(0);
-        paramBuffer.append(QUOTE);
+        paramBuffer.append('\'');
         paramBuffer.append(param.getName());
-        paramBuffer.append(QUOTE);
-        paramBuffer.append(COLON);
-        paramBuffer.append(QUOTE);
+        paramBuffer.append('\'');
+        paramBuffer.append(':');
+        paramBuffer.append('\'');
         paramBuffer.append(param.getValue().toString());
-        paramBuffer.append(QUOTE);
+        paramBuffer.append('\'');
         parameterList.add(paramBuffer.toString());
     }
 
@@ -385,11 +372,11 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         for (int i = 0, size = options.size(); i < size; i++)
         {
             String option = options.get(i);
-            if (option != null && !option.trim().equals(EMPTY))
+            if (LangUtils.isNotBlank(option))
             {
                 if (!first)
                 {
-                    retVal.append(COMMA);
+                    retVal.append(',');
                 }
                 else
                 {
@@ -417,8 +404,8 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
         {
 
             retVal.append(target);
-            retVal.append(COLON);
-            retVal.append(QUOTE);
+            retVal.append(':');
+            retVal.append('\'');
 
             int cnt = 0;
 
@@ -459,7 +446,7 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
                 }
             }
 
-            retVal.append(QUOTE);
+            retVal.append('\'');
             return retVal.toString();
         }
         return null;
@@ -473,15 +460,14 @@ public class HtmlAjaxBehaviorRenderer extends ClientBehaviorRenderer
             int size, StringBuilder retVal, int cnt,
             String strVal, SearchExpressionContext searchExpressionContext)
     {
-        strVal = strVal.trim();
-        if (!EMPTY.equals(strVal))
+        if (LangUtils.isNotBlank(strVal))
         {
             SearchExpressionHandler handler = context.getFacesContext().getApplication().getSearchExpressionHandler();
-            String clientId = handler.resolveClientId(searchExpressionContext, strVal);
+            String clientId = handler.resolveClientId(searchExpressionContext, strVal.trim());
             retVal.append(clientId);
             if (cnt < size)
             {
-                retVal.append(BLANK);
+                retVal.append(' ');
             }
         }
     }
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlCommandScriptRenderer.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlCommandScriptRenderer.java
index ae1b390..2c802df 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlCommandScriptRenderer.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlCommandScriptRenderer.java
@@ -48,6 +48,7 @@ import org.apache.myfaces.renderkit.html.util.JavascriptContext;
 import org.apache.myfaces.renderkit.html.util.JavascriptUtils;
 import org.apache.myfaces.renderkit.html.util.ResourceUtils;
 import org.apache.myfaces.util.ComponentUtils;
+import org.apache.myfaces.util.LangUtils;
 import org.apache.myfaces.util.SharedStringBuilder;
 import org.apache.myfaces.util.StringUtils;
 
@@ -222,9 +223,8 @@ public class HtmlCommandScriptRenderer extends HtmlRenderer
                 searchExpressionContext);
 
         String onError = behavior.getOnerror();
-        if (onError != null && !onError.trim().isEmpty())
+        if (LangUtils.isNotBlank(onError))
         {
-            //onError = AJAX_KEY_ONERROR + COLON + onError;
             paramBuffer.setLength(0);
             paramBuffer.append(AJAX_KEY_ONERROR);
             paramBuffer.append(':');
@@ -235,8 +235,9 @@ public class HtmlCommandScriptRenderer extends HtmlRenderer
         {
             onError = null;
         }
+
         String onEvent = behavior.getOnevent();
-        if (onEvent != null && !onEvent.trim().isEmpty())
+        if (LangUtils.isNotBlank(onEvent))
         {
             paramBuffer.setLength(0);
             paramBuffer.append(AJAX_KEY_ONEVENT);
@@ -250,7 +251,7 @@ public class HtmlCommandScriptRenderer extends HtmlRenderer
         }
 
         String delay = behavior.getDelay();
-        if (delay != null && !delay.trim().isEmpty())
+        if (LangUtils.isNotBlank(delay))
         {
             paramBuffer.setLength(0);
             paramBuffer.append(AJAX_KEY_DELAY);
@@ -447,7 +448,7 @@ public class HtmlCommandScriptRenderer extends HtmlRenderer
         for (int i = 0, size = options.size(); i < size; i++)
         {
             String option = options.get(i);
-            if (option != null && !option.trim().isEmpty())
+            if (LangUtils.isNotBlank(option))
             {
                 if (!first)
                 {
@@ -467,7 +468,7 @@ public class HtmlCommandScriptRenderer extends HtmlRenderer
     private String resolveExpressionsAsParameter(StringBuilder retVal, String target, String expressions,
             SearchExpressionContext searchExpressionContext)
     {
-        if (expressions != null && !expressions.trim().isEmpty())
+        if (LangUtils.isNotBlank(expressions))
         {
             retVal.setLength(0);
             retVal.append(target);
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRendererUtils.java b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRendererUtils.java
index 37082e1..a91369c 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRendererUtils.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlRendererUtils.java
@@ -72,6 +72,7 @@ import org.apache.myfaces.renderkit.html.util.OutcomeTargetUtils;
 import org.apache.myfaces.util.ComponentUtils;
 import org.apache.myfaces.util.StringUtils;
 import org.apache.myfaces.renderkit.html.util.HTML;
+import org.apache.myfaces.util.LangUtils;
 
 public final class HtmlRendererUtils
 {
@@ -1513,7 +1514,7 @@ public final class HtmlRendererUtils
             String userEventCode, String serverEventCode)
     {
         List<String> finalParams = new ArrayList<>(3);
-        if (userEventCode != null && !userEventCode.trim().isEmpty())
+        if (LangUtils.isNotBlank(userEventCode))
         {
             // escape every ' in the user event code since it will
             // be a string attribute of jsf.util.chain
@@ -1525,11 +1526,12 @@ public final class HtmlRendererUtils
         getClientBehaviorScript(facesContext, uiComponent, sourceId,
                 eventName, clientBehaviors, behaviorCode, params);
         
-        if (behaviorCode != null && !behaviorCode.toString().trim().isEmpty())
+        String behaviorCodeStr = behaviorCode.toString();
+        if (LangUtils.isNotBlank(behaviorCodeStr))
         {
-            finalParams.add(behaviorCode.toString());
+            finalParams.add(behaviorCodeStr);
         }
-        if (serverEventCode != null && !serverEventCode.trim().isEmpty())
+        if (LangUtils.isNotBlank(serverEventCode))
         {
             finalParams.add('\'' + escapeJavaScriptForChain(serverEventCode) + '\'');
         }
@@ -1547,8 +1549,7 @@ public final class HtmlRendererUtils
             }
             else
             {
-                retVal.append("jsf.util.chain(document.getElementById('"
-                        + sourceId + "'), event,");
+                retVal.append("jsf.util.chain(document.getElementById('" + sourceId + "'), event,");
             }
             while (it.hasNext())
             {
@@ -1599,7 +1600,7 @@ public final class HtmlRendererUtils
             String userEventCode, String serverEventCode)
     {
         List<String> finalParams = new ArrayList<String>(3);
-        if (userEventCode != null && !userEventCode.trim().isEmpty())
+        if (LangUtils.isNotBlank(userEventCode))
         {
             finalParams.add('\'' + escapeJavaScriptForChain(userEventCode) + '\'');
         }
@@ -1616,15 +1617,20 @@ public final class HtmlRendererUtils
 
         // ClientBehaviors for both events have to be checked for the Submitting hint
         boolean submitting = submitting1 || submitting2;
-        if (behaviorCode != null && !behaviorCode.toString().trim().isEmpty())
+        
+        String behaviorCodeStr = behaviorCode.toString();
+        if (LangUtils.isNotBlank(behaviorCodeStr))
         {
-            finalParams.add(behaviorCode.toString());
+            finalParams.add(behaviorCodeStr);
         }
-        if (behaviorCode2 != null && !behaviorCode2.toString().trim().isEmpty())
+
+        String behaviorCode2Str = behaviorCode2.toString();
+        if (LangUtils.isNotBlank(behaviorCode2Str))
         {
-            finalParams.add(behaviorCode2.toString());
+            finalParams.add(behaviorCode2Str);
         }
-        if (serverEventCode != null && !serverEventCode.trim().isEmpty())
+
+        if (LangUtils.isNotBlank(serverEventCode))
         {
             finalParams.add('\'' + escapeJavaScriptForChain(serverEventCode) + '\'');
         }
diff --git a/impl/src/main/java/org/apache/myfaces/util/LangUtils.java b/impl/src/main/java/org/apache/myfaces/util/LangUtils.java
index c72bda0..4dd7878 100644
--- a/impl/src/main/java/org/apache/myfaces/util/LangUtils.java
+++ b/impl/src/main/java/org/apache/myfaces/util/LangUtils.java
@@ -25,8 +25,35 @@ public class LangUtils
         return value == null || value.isEmpty();
     }
     
+    public static boolean isBlank(String str)
+    {
+        if (str == null)
+        {
+            return true;
+        }
+        int strLen = str.length();
+        if (strLen == 0)
+        {
+            return true;
+        }
+
+        for (int i = 0; i < strLen; i++) 
+        {
+            if (!Character.isWhitespace(str.charAt(i)))
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
     public static boolean isNotEmpty(String value)
     {
         return !isEmpty(value);
     }
+    
+    public static boolean isNotBlank(String value)
+    {
+        return !isBlank(value);
+    }
 }
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java
index 2de677c..80421af 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttributeHandler.java
@@ -37,6 +37,7 @@ import javax.faces.view.facelets.TagHandler;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
 import org.apache.myfaces.util.ClassUtils;
+import org.apache.myfaces.util.LangUtils;
 import org.apache.myfaces.view.facelets.FaceletCompositionContext;
 
 /**
@@ -331,7 +332,7 @@ public class AttributeHandler extends TagHandler implements InterfaceDescriptorC
                     Class clazz = String.class;
                     
                     String type = _type.getValue(ctx);
-                    if (type != null && !type.trim().isEmpty())
+                    if (LangUtils.isNotBlank(type))
                     {
                         try
                         {
diff --git a/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java b/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
index 80f1066..2ef82b6 100644
--- a/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
+++ b/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
@@ -78,6 +78,7 @@ import org.apache.myfaces.spi.ServiceProviderFinder;
 import org.apache.myfaces.spi.ServiceProviderFinderFactory;
 import org.apache.myfaces.view.facelets.ViewPoolProcessor;
 import org.apache.myfaces.context.ReleasableExternalContext;
+import org.apache.myfaces.util.LangUtils;
 
 /**
  * Performs common initialization tasks.
@@ -434,7 +435,7 @@ public abstract class AbstractFacesInitializer implements FacesInitializer
     {
         String expressionFactoryClassName
                 = MyfacesConfig.getCurrentInstance(externalContext).getExpressionFactory();
-        if (expressionFactoryClassName != null && !expressionFactoryClassName.trim().isEmpty())
+        if (LangUtils.isNotBlank(expressionFactoryClassName))
         {
             if (log.isLoggable(Level.FINE))
             {