BodyFormencodedMarshaller.java :  » REST » pj2r » com » google » code » pj2r » beanutils » Java Open Source

Java Open Source » REST » pj2r 
pj2r » com » google » code » pj2r » beanutils » BodyFormencodedMarshaller.java
/*
 *  Copyright 2009 Johan Maasing.
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *  under the License.
 */
package com.google.code.pj2r.beanutils;

import com.google.code.pj2r.MarshallingException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;

/**
 * Marshaller that reads the request body as a x-www-formencoded stream to extract the incoming data.
 */
public class BodyFormencodedMarshaller extends BeanUtilsMarshaller {

  private String defaultEncoding = "ISO-8859-1";
  private final String FORM_CONTENT_TYPE = "application/x-www-form-urlencoded";

  public BodyFormencodedMarshaller() {
  }

  /*
   * Set the character encoding to use (needed for Jetty that sends using UTF-8).
   * @param encoding
   *
  public BodyFormencodedMarshaller(final String encoding) {
  this.defaultEncoding = encoding;
  }
   */
  
  /**
   * Extract the incoming data from the request body. Assumes the content is x-www-formencoded data.
   * @param request
   * @return
   */
  @Override
  protected Map<String, String[]> getDataMap(HttpServletRequest request) throws IOException, MarshallingException {
    String contentType = request.getContentType();
    if (contentType != null) {
      contentType = contentType.trim() ;
    }
    if ((contentType != null) && (!contentType.startsWith(FORM_CONTENT_TYPE))) {
      throw new MarshallingException(
          "Unable to marshall request, expected content type to be: " +
          FORM_CONTENT_TYPE +
          " but was " +
          contentType);
    }
    String encoding = (request.getCharacterEncoding() != null) ? request.getCharacterEncoding() : defaultEncoding;
    HashMap<String, ArrayList<String>> resultBuffer = new HashMap<String, ArrayList<String>>();
    InputStream stream = request.getInputStream();
    StringBuilder requestBody = new StringBuilder();
    int ch = stream.read();
    while (ch != -1) {
      requestBody.append((char) ch);
      ch = stream.read();
    }
    String[] params = requestBody.toString().split("&");
    for (int n = 0; n < params.length; n++) {
      addParameter(resultBuffer, params[n], encoding);
    }

    // Convert lists to arrays
    HashMap<String, String[]> result = new HashMap<String, String[]>();
    for (String key : resultBuffer.keySet()) {
      String[] values = resultBuffer.get(key).toArray(new String[0]);
      result.put(key, values);
    }
    return result;
  }

  private void addParameter(HashMap<String, ArrayList<String>> resultBuffer, String parameter, String encoding) throws UnsupportedEncodingException {
    if ((parameter != null) && (parameter.length() > 1)) {
      String[] parts = parameter.split("=");
      // Is there a key
      if (parts.length > 0) {
        if (parts[0].length() > 0) {
          String key = URLDecoder.decode(parts[0], encoding);

          // Get the value storage
          ArrayList<String> valueBuffer = resultBuffer.get(key);
          if (valueBuffer == null) {
            valueBuffer = new ArrayList<String>();
          }

          // Get the value (or if none set to empty string)
          String value = "";
          if ((parts.length > 1) && (parts[1].length() > 0)) {
            value = URLDecoder.decode(parts[1], encoding);
          }

          valueBuffer.add(value);
          resultBuffer.put(key, valueBuffer);
        }
      }
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.