1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.shared.resource;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.PushbackInputStream;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.logging.Level;
27 import java.util.logging.Logger;
28
29 import javax.el.ELContext;
30 import javax.el.ELException;
31 import javax.el.ValueExpression;
32 import javax.faces.context.FacesContext;
33 import javax.faces.event.ExceptionQueuedEvent;
34 import javax.faces.event.ExceptionQueuedEventContext;
35
36 import org.apache.myfaces.shared.util.io.DynamicPushbackInputStream;
37
38 public class ValueExpressionFilterInputStream extends InputStream
39 {
40 private PushbackInputStream delegate;
41 private String libraryName;
42 private String resourceName;
43
44 public ValueExpressionFilterInputStream(InputStream in, String libraryName, String resourceName)
45 {
46 super();
47 delegate = new DynamicPushbackInputStream(in,300);
48 }
49
50 @Override
51 public int read() throws IOException
52 {
53 int c1 = delegate.read();
54
55 if (c1 == -1)
56 {
57 return -1;
58 }
59
60 if ( ((char)c1) == '#')
61 {
62 int c2 = delegate.read();
63 if (c2 == -1)
64 {
65 return -1;
66 }
67 if (((char)c2) == '{')
68 {
69
70
71
72
73 List<Integer> expressionList = new ArrayList<Integer>();
74 int c3 = delegate.read();
75 while ( c3 != -1 && ((char)c3) != '}' )
76 {
77 expressionList.add(c3);
78 c3 = delegate.read();
79 }
80
81 if (c3 == -1)
82 {
83
84
85 for (int i = 0; i < expressionList.size(); i++)
86 {
87 delegate.unread(expressionList.get(i));
88 }
89 delegate.unread(c2);
90 return c1;
91 }
92 else
93 {
94
95
96 FacesContext context = FacesContext.getCurrentInstance();
97 ELContext elContext = context.getELContext();
98 try
99 {
100 ValueExpression ve = context.getApplication().
101 getExpressionFactory().createValueExpression(
102 elContext,
103 "#{"+convertToExpression(expressionList)+"}",
104 String.class);
105 String value = (String) ve.getValue(elContext);
106
107 for (int i = value.length()-1; i >= 0 ; i--)
108 {
109 delegate.unread((int) value.charAt(i));
110 }
111 }
112 catch(ELException e)
113 {
114 ExceptionQueuedEventContext equecontext = new ExceptionQueuedEventContext (
115 context, e, null);
116 context.getApplication().publishEvent (context, ExceptionQueuedEvent.class, equecontext);
117
118 Logger log = Logger.getLogger(ResourceImpl.class.getName());
119 if (log.isLoggable(Level.SEVERE))
120 {
121 log.severe("Cannot evaluate EL expression " + convertToExpression(expressionList)
122 + " in resource " + (libraryName == null?"":libraryName) + ":" +
123 (resourceName == null?"":resourceName));
124 }
125
126 delegate.unread(c3);
127 for (int i = expressionList.size()-1; i >= 0; i--)
128 {
129 delegate.unread(expressionList.get(i));
130 }
131 delegate.unread(c2);
132 return c1;
133 }
134
135
136 return delegate.read();
137 }
138 }
139 else
140 {
141 delegate.unread(c2);
142 return c1;
143 }
144 }
145 else
146 {
147
148 return c1;
149 }
150 }
151
152 private String convertToExpression(List<Integer> expressionList)
153 {
154 char[] exprArray = new char[expressionList.size()];
155
156 for (int i = 0; i < expressionList.size(); i++)
157 {
158 exprArray[i] = (char) expressionList.get(i).intValue();
159 }
160 return String.valueOf(exprArray);
161 }
162
163 @Override
164 public void close() throws IOException
165 {
166 delegate.close();
167 }
168 }