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