1
2
3
4
5 package org.rcfaces.core.internal.tools;
6
7 import java.io.IOException;
8 import java.io.StringWriter;
9 import java.util.Map;
10
11 import javax.faces.application.StateManager;
12 import javax.faces.context.FacesContext;
13 import javax.faces.context.ResponseWriter;
14
15 import org.apache.commons.logging.Log;
16 import org.apache.commons.logging.LogFactory;
17 import org.rcfaces.core.internal.Constants;
18
19
20
21
22
23
24 public class StateFieldMarkerTools {
25 private static final String REVISION = "$Revision: 1.3 $";
26
27 private static final Log LOG = LogFactory
28 .getLog(StateFieldMarkerTools.class);
29
30 private static final String STATE_FIELD_MARKER_PROPERTY = "org.rcfaces.core.internal.STATE_FIELD_MARKER";
31
32 public static String getStateFieldMarker(FacesContext facesContext) {
33 Map applicationMap = facesContext.getExternalContext()
34 .getApplicationMap();
35
36 String stateFieldMarker = (String) applicationMap
37 .get(STATE_FIELD_MARKER_PROPERTY);
38 if (stateFieldMarker != null) {
39 return stateFieldMarker;
40 }
41
42 synchronized (STATE_FIELD_MARKER_PROPERTY) {
43 stateFieldMarker = (String) applicationMap
44 .get(STATE_FIELD_MARKER_PROPERTY);
45 if (stateFieldMarker != null) {
46 return stateFieldMarker;
47 }
48
49 stateFieldMarker = getStateMarker(facesContext);
50
51 applicationMap.put(STATE_FIELD_MARKER_PROPERTY, stateFieldMarker);
52 }
53
54 LOG.info("Save state field marker is '" + stateFieldMarker + "'.");
55 return stateFieldMarker;
56 }
57
58 private static String getStateMarker(FacesContext facesContext) {
59
60 Map map = facesContext.getExternalContext().getInitParameterMap();
61 String stateMarker = (String) map
62 .get(Constants.SAVE_STATE_FIELD_MARKER_PARAMETER);
63 if (stateMarker != null) {
64 LOG
65 .debug("Save state marker is defined into application init parameters.");
66 return stateMarker;
67 }
68
69 try {
70 stateMarker = System
71 .getProperty(Constants.SAVE_STATE_FIELD_MARKER_SYSTEM_PARAMETER);
72 if (stateMarker != null) {
73 LOG
74 .debug("Save state marker is defined into system parameters.");
75
76 return stateMarker;
77 }
78
79 } catch (Throwable th) {
80 LOG.debug("Search into System properties.", th);
81 }
82
83 StringWriter writer = new StringWriter(512);
84 ResponseWriter oldResponseWriter = facesContext.getResponseWriter();
85 try {
86 ResponseWriter responseWriter = oldResponseWriter
87 .cloneWithWriter(writer);
88 facesContext.setResponseWriter(responseWriter);
89
90 facesContext.getApplication().getViewHandler().writeState(
91 facesContext);
92
93 String marker = writer.toString();
94
95 if (LOG.isTraceEnabled()) {
96 LOG.trace("Marker=" + marker);
97 }
98
99 return marker;
100
101 } catch (IOException e) {
102 LOG.info("Can not get state marker.", e);
103
104 return "";
105
106 } finally {
107 facesContext.setResponseWriter(oldResponseWriter);
108 }
109 }
110
111 public static String getStateValue(FacesContext facesContext) throws IOException {
112
113 StringWriter writer = new StringWriter(512);
114 ResponseWriter oldResponseWriter = facesContext.getResponseWriter();
115 try {
116 ResponseWriter responseWriter;
117 if (oldResponseWriter != null) {
118 responseWriter = oldResponseWriter.cloneWithWriter(writer);
119
120 } else {
121 responseWriter = facesContext.getRenderKit()
122 .createResponseWriter(writer, null, "UTF-8");
123
124 }
125 facesContext.setResponseWriter(responseWriter);
126
127 StateManager stateManager = facesContext.getApplication()
128 .getStateManager();
129 stateManager.writeState(facesContext, stateManager
130 .saveView(facesContext));
131
132 String state = writer.toString();
133
134 if (LOG.isTraceEnabled()) {
135 LOG.trace("State=" + state);
136 }
137
138 return state;
139
140 } catch (IOException e) {
141 LOG.debug("Can not get value of serialized state of view.", e);
142
143 throw e;
144
145 } finally {
146 if (oldResponseWriter != null) {
147 facesContext.setResponseWriter(oldResponseWriter);
148 }
149 }
150 }
151
152 }