/* * QueryBuilder.java October 2002 * * Copyright (C) 2002, Niall Gallagher <niallg@users.sf.net> * * 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. */ package org.simpleframework.http.core; import static org.simpleframework.http.Protocol.APPLICATION; import static org.simpleframework.http.Protocol.URL_ENCODED; import org.simpleframework.http.ContentType; import org.simpleframework.http.Query; import org.simpleframework.http.Request; import org.simpleframework.http.message.Entity; import org.simpleframework.http.message.Header; /** * The <code>QueryBuilder</code> object is used to create the query. It is * created using the request URI query and a form post body if sent. The * application/x-www-form-urlencoded conent type identifies the body as contain * form data. If there are duplicates then they both are available from the * query that is built. * * @author Niall Gallagher */ class QueryBuilder { /** * This is the request that is used to acquire the data. */ private final Request request; /** * This is the header that is used to acquire the data. */ private final Header header; /** * Constructor for the <code>QueryBuilder</code> object. This will create an * object that can be used to construct a single query from the multiple * sources of data within the request entity. * * @param request * this is the request to build a query for * @param entity * this is the entity that contains the data */ public QueryBuilder(Request request, Entity entity) { this.header = entity.getHeader(); this.request = request; } /** * This method is used to acquire the query part from the HTTP request URI * target and a form post if it exists. Both the query and the form post are * merge together in a single query. * * @return the query associated with the HTTP target URI */ public Query build() { ; Query query = this.header.getQuery(); if (!this.isFormPost()) return query; return this.getQuery(query); } /** * This method is used to acquire the query part from the HTTP request URI * target and a form post if it exists. Both the query and the form post are * merge together in a single query. * * @param query * this is the URI query string to be used * * @return the query associated with the HTTP target URI */ private Query getQuery(Query query) { String body = this.getContent(); if (body == null) return query; return new QueryCombiner(query, body); } /** * This method attempts to acquire the content of the request body. If there * is an <code>IOException</code> acquiring the content of the body then * this will simply return a null value without reporting the exception. * * @return the content of the body, or null on error */ private String getContent() { try { return this.request.getContent(); } catch (Exception e) { return null; } } /** * This is used to determine if the content type is a form POST of type * application/x-www-form-urlencoded. Such a type is used when a HTML form * is used to post data to the server. * * @return this returns true if content type is a form post */ private boolean isFormPost() { ContentType type = this.request.getContentType(); if (type == null) return false; return this.isFormPost(type); } /** * This is used to determine if the content type is a form POST of type * application/x-www-form-urlencoded. Such a type is used when a HTML form * is used to post data to the server. * * @param type * the type to determine if its a form post * * @return this returns true if content type is a form post */ private boolean isFormPost(ContentType type) { String primary = type.getPrimary(); String secondary = type.getSecondary(); if (!primary.equals(APPLICATION)) return false; return secondary.equals(URL_ENCODED); } }