You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2009/03/17 22:21:50 UTC

svn commit: r755404 - /myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/resource/ResourceImpl.java

Author: lu4242
Date: Tue Mar 17 21:21:47 2009
New Revision: 755404

URL: http://svn.apache.org/viewvc?rev=755404&view=rev
Log:
MYFACES-2166 Some Resources contains ValueExpressions that must be evaluated

Modified:
    myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/resource/ResourceImpl.java

Modified: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/resource/ResourceImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/resource/ResourceImpl.java?rev=755404&r1=755403&r2=755404&view=diff
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/resource/ResourceImpl.java (original)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/resource/ResourceImpl.java Tue Mar 17 21:21:47 2009
@@ -18,14 +18,20 @@
  */
 package org.apache.myfaces.resource;
 
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.PushbackInputStream;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
+import javax.el.ELContext;
+import javax.el.ValueExpression;
 import javax.faces.application.Resource;
-import javax.faces.context.FacesContext;
 import javax.faces.application.ResourceHandler;
+import javax.faces.context.FacesContext;
 
 import org.apache.myfaces.application.ResourceHandlerSupport;
 
@@ -61,7 +67,117 @@
     @Override
     public InputStream getInputStream()
     {
-        return getResourceLoader().getResourceInputStream(_resourceMeta);
+        if (couldResourceContainValueExpressions())
+        {
+            return new ValueExpressionFilterInputStream(
+                    getResourceLoader().getResourceInputStream(_resourceMeta)); 
+        }
+        else
+        {
+            return getResourceLoader().getResourceInputStream(_resourceMeta);            
+        }
+    }
+    
+    private boolean couldResourceContainValueExpressions()
+    {
+        String contentType = getContentType();
+
+        return ("text/css".equals(contentType) || 
+            "text/javascript".equals(contentType) || 
+            "application/x-javascript".equals(contentType) );
+    }
+
+    private class ValueExpressionFilterInputStream extends InputStream
+    {
+        private PushbackInputStream delegate;
+        
+        public ValueExpressionFilterInputStream(InputStream in)
+        {
+            super();
+            delegate = new PushbackInputStream(in,255);
+        }
+
+        @Override
+        public int read() throws IOException
+        {
+            int c1 = delegate.read();
+            
+            if (c1 == -1) return -1;
+            
+            if ( ((char)c1) == '#')
+            {
+                int c2 = delegate.read();
+                if (c2 == -1) return -1;
+                if (((char)c2) == '{')
+                {
+                    //It is a value expression. We need
+                    //to look for a occurrence of } to 
+                    //extract the expression and evaluate it,
+                    //the result should be unread.
+                    List<Integer> expressionList = new ArrayList<Integer>();
+                    int c3 = delegate.read();
+                    while ( c3 != -1 && ((char)c3) != '}' )
+                    {
+                        expressionList.add(c3);
+                        c3 = delegate.read();
+                    }
+                    
+                    if (c3 == -1)
+                    {
+                        //get back the data, because we can't
+                        //extract any value expression
+                        for (int i = 0; i < expressionList.size(); i++)
+                        {
+                            delegate.unread(expressionList.get(i));
+                        }
+                        delegate.unread(c2);
+                        return c1;
+                    }
+                    else
+                    {
+                        //EL expression found. Evaluate it and pushback
+                        //the result into the stream
+                        FacesContext context = FacesContext.getCurrentInstance();
+                        ELContext elContext = context.getELContext();
+                        ValueExpression ve = context.getApplication().
+                            getExpressionFactory().createValueExpression(
+                                    elContext,
+                                    "#{"+convertToExpression(expressionList)+"}",
+                                    String.class);
+                        
+                        String value = (String) ve.getValue(elContext);
+                        
+                        for (int i = value.length()-1; i >= 0 ; i--)
+                        {
+                            delegate.unread((int) value.charAt(i));
+                        }
+                        //read again
+                        return delegate.read();
+                    }
+                }
+                else
+                {
+                    delegate.unread(c2);
+                    return c1;
+                }
+            }
+            else
+            {
+                //just continue
+                return c1;
+            }
+        }
+        
+        private String convertToExpression(List<Integer> expressionList)
+        {
+            char[] exprArray = new char[expressionList.size()];
+            
+            for (int i = 0; i < expressionList.size(); i++)
+            {
+                exprArray[i] = (char) expressionList.get(i).intValue();
+            }
+            return String.valueOf(exprArray);
+        }
     }
 
     @Override