1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.renderkit.html.util;
20
21 import java.io.IOException;
22 import java.util.List;
23 import java.util.Map;
24
25 import javax.faces.context.FacesContext;
26 import javax.faces.context.ResponseWriter;
27 import javax.faces.event.PhaseEvent;
28 import javax.faces.event.PhaseId;
29 import javax.faces.event.PhaseListener;
30
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.myfaces.shared_tomahawk.config.MyfacesConfig;
34 import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
35 import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils;
36 import org.apache.myfaces.shared_tomahawk.renderkit.html.util.JavascriptUtils;
37
38
39
40
41
42
43
44
45
46
47 public class ExtensionsPhaseListener implements PhaseListener {
48
49 private static final Log log = LogFactory.getLog(ExtensionsPhaseListener.class);
50
51
52 public static final String ORG_APACHE_MYFACES_MY_FACES_JAVASCRIPT = "org.apache.myfaces.myFacesJavascript";
53 public static final String LISTENERS_MAP = "_MyFaces_inputAjax_listenersMap";
54
55 public PhaseId getPhaseId()
56 {
57 return PhaseId.RENDER_RESPONSE;
58 }
59
60 public void beforePhase(PhaseEvent event)
61 {
62 }
63
64 public void afterPhase(PhaseEvent event)
65 {
66 FacesContext facesContext = event.getFacesContext();
67
68 try
69 {
70 getJavaScriptCodeAndStoreInRequest(facesContext);
71 } catch (IOException e)
72 {
73 log.error("Exception while rendering extension filter code.",e);
74 }
75 }
76
77
78
79
80
81
82
83
84
85 private void getJavaScriptCodeAndStoreInRequest(FacesContext facesContext) throws IOException
86 {
87 Object myFacesJavascript = facesContext.getExternalContext().getRequestMap().get(ORG_APACHE_MYFACES_MY_FACES_JAVASCRIPT);
88
89 if (myFacesJavascript != null)
90 {
91 return;
92 }
93
94 facesContext.getExternalContext().getRequestMap().put(ORG_APACHE_MYFACES_MY_FACES_JAVASCRIPT, getCodeBeforeBodyEnd(facesContext));
95 }
96
97 private static String getCodeBeforeBodyEnd(FacesContext facesContext) throws IOException
98 {
99 ResponseWriter responseWriter = facesContext.getResponseWriter();
100 HtmlBufferResponseWriterWrapper writerWrapper = HtmlBufferResponseWriterWrapper
101 .getInstance(responseWriter);
102 facesContext.setResponseWriter(writerWrapper);
103
104 writeCodeBeforeBodyEnd(facesContext);
105
106
107
108 if(responseWriter!=null)
109 facesContext.setResponseWriter(responseWriter);
110
111
112 return writerWrapper.toString();
113 }
114
115
116
117
118
119
120
121
122
123
124
125
126 public static void writeCodeBeforeBodyEnd(FacesContext facesContext) throws IOException
127 {
128 ResponseWriter writer = facesContext.getResponseWriter();
129
130 MyfacesConfig myfacesConfig = MyfacesConfig.getCurrentInstance(facesContext.getExternalContext());
131 if (myfacesConfig.isDetectJavascript())
132 {
133 if (! JavascriptUtils.isJavascriptDetected(facesContext.getExternalContext()))
134 {
135
136 writer.startElement("script",null);
137 writer.writeAttribute("attr", HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null);
138 StringBuffer script = new StringBuffer();
139 script.append("document.location.replace('").
140 append(facesContext.getApplication().getViewHandler().getResourceURL(facesContext, "/_javascriptDetector_")).append("?goto=").append(facesContext.getApplication().getViewHandler().getActionURL(facesContext, facesContext.getViewRoot().getViewId())).append("');");
141 writer.writeText(script.toString(),null);
142 writer.endElement(HTML.SCRIPT_ELEM);
143 }
144 }
145
146 if (myfacesConfig.isAutoScroll())
147 {
148 HtmlRendererUtils.renderAutoScrollFunction(facesContext, writer);
149 }
150
151
152
153 try
154 {
155 List listeners = (List) facesContext.getExternalContext().getRequestMap().get("org.apache.myfaces.Listener");
156
157 if(listeners != null && listeners.size() > 0){
158 writer.startElement(HTML.SCRIPT_ELEM,null);
159 writer.writeAttribute("attr", HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null);
160 StringBuffer buff = new StringBuffer();
161 String mapName = LISTENERS_MAP;
162 buff.append("var ").append(mapName).append(" = new Object();\n");
163 for (int i = 0; i < listeners.size(); i++)
164 {
165 Map listenerItem = (Map) listeners.get(i);
166 String listenerId = (String) listenerItem.get("listenerId");
167 String listenOn = (String) listenerItem.get("listenOn");
168 String action = (String) listenerItem.get("action");
169 String eventType = (String) listenerItem.get("eventType");
170
171 buff.append("var _MyFaces_listenerItem = ").append(mapName).append("['").append(listenOn).append("'];\n");
172 buff.append("if(!_MyFaces_listenerItem) {\n");
173 buff.append(" _MyFaces_listenerItem = new Array();\n");
174 buff.append(" ").append(mapName).append("['").append(listenOn).append("'] = _MyFaces_listenerItem;\n");
175 buff.append("}\n");
176 buff.append("var _MyFaces_listener = new Object();\n");
177 buff.append("_MyFaces_listener['id'] = '").append(listenerId).append("';\n");
178 buff.append("_MyFaces_listener['action'] = '").append(action).append("';\n");
179 buff.append("_MyFaces_listener['eventType'] = '").append(eventType).append("';\n");
180 buff.append("_MyFaces_listenerItem[_MyFaces_listenerItem.length] = _MyFaces_listener;\n");
181 }
182 writer.write(buff.toString());
183 writer.endElement(HTML.SCRIPT_ELEM);
184 }
185 }
186 catch (Exception e)
187 {
188 log.error("Exception while rendering code for listeners.",e);
189 }
190 }
191 }