コード例 #1
0
  /**
   * Rebuilds the view state from the Base64 included String included with the request.
   *
   * @param stateString the Base64 encoded view state
   * @return the view state reconstructed from <code>stateString</code>
   */
  protected Object doGetState(String stateString) {
    ObjectInputStream ois = null;
    InputStream bis = new Base64InputStream(stateString);
    try {
      if (guard != null) {
        byte[] bytes = stateString.getBytes(RIConstants.CHAR_ENCODING);
        int numRead = bis.read(bytes, 0, bytes.length);
        byte[] decodedBytes = new byte[numRead];
        bis.reset();
        bis.read(decodedBytes, 0, decodedBytes.length);

        bytes = guard.decrypt(decodedBytes);
        if (bytes == null) return null;
        bis = new ByteArrayInputStream(bytes);
      }

      if (compressViewState) {
        bis = new GZIPInputStream(bis);
      }

      ois = serialProvider.createObjectInputStream(bis);

      long stateTime = 0;
      if (stateTimeoutEnabled) {
        try {
          stateTime = ois.readLong();
        } catch (IOException ioe) {
          // we've caught an exception trying to read the time
          // marker.  This most likely means a view that has been
          // around before upgrading to the release that included
          // this feature.  So, no marker, return null now to
          // cause a ViewExpiredException
          if (LOGGER.isLoggable(Level.FINE)) {
            LOGGER.fine(
                "Client state timeout is enabled, but unable to find the "
                    + "time marker in the serialized state.  Assuming state "
                    + "to be old and returning null.");
          }
          return null;
        }
      }
      Object structure = ois.readObject();
      Object state = ois.readObject();
      if (stateTime != 0 && hasStateExpired(stateTime)) {
        // return null if state has expired.  This should cause
        // a ViewExpiredException to be thrown
        return null;
      }

      return new Object[] {structure, state};

    } catch (java.io.OptionalDataException ode) {
      if (LOGGER.isLoggable(Level.SEVERE)) {
        LOGGER.log(Level.SEVERE, ode.getMessage(), ode);
      }
      throw new FacesException(ode);
    } catch (ClassNotFoundException cnfe) {
      if (LOGGER.isLoggable(Level.SEVERE)) {
        LOGGER.log(Level.SEVERE, cnfe.getMessage(), cnfe);
      }
      throw new FacesException(cnfe);
    } catch (IOException iox) {
      if (LOGGER.isLoggable(Level.SEVERE)) {
        LOGGER.log(Level.SEVERE, iox.getMessage(), iox);
      }
      throw new FacesException(iox);
    } finally {
      if (ois != null) {
        try {
          ois.close();
        } catch (IOException ioe) {
          // ignore
        }
      }
    }
  }