View Javadoc

1   /*
2    * $Id: StateFieldMarkerTools.java,v 1.3 2007/09/18 08:31:08 oeuillot Exp $
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   * @author Olivier Oeuillot
22   * @version $Revision: 1.3 $
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 }