270 lines
10 KiB
Java
270 lines
10 KiB
Java
/* Copyright (c) 2006 Google Inc.
|
|
*
|
|
* 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 sample.gbase.recipe;
|
|
|
|
import com.google.api.gbase.client.GoogleBaseService;
|
|
import com.google.api.gbase.client.ServiceErrors;
|
|
import com.google.gdata.util.ServiceException;
|
|
|
|
import java.io.IOException;
|
|
import java.util.HashSet;
|
|
import java.util.Set;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
import javax.servlet.ServletContext;
|
|
import javax.servlet.ServletException;
|
|
import javax.servlet.http.HttpServlet;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
/**
|
|
* Contains the names of the HTML input fields used to edit a recipe.
|
|
* Has methods that are generally useful, for example for logging
|
|
* or validating values.
|
|
* Has methods to extract values from servlet context init parameters.
|
|
* Has methods used for passing objects from a servlet to a JSP.
|
|
*/
|
|
public class RecipeUtil {
|
|
|
|
public static final String ID_PARAMETER = "oid";
|
|
public static final String APPLICATION_NAME_PARAMETER = "applicationName";
|
|
public static final String TITLE_PARAMETER = "title";
|
|
public static final String URL_PARAMETER = "url";
|
|
public static final String DESCRIPTION_PARAMETER = "description";
|
|
public static final String MAIN_INGREDIENT_PARAMETER = "mainIngredient";
|
|
public static final String CUISINE_PARAMETER = "cuisine";
|
|
public static final String COOKING_TIME_PARAMETER = "cookingTime";
|
|
public static final String DEVELOPER_KEY_PARAMETER = "key";
|
|
|
|
public static final String COOKING_TIME_UNIT = "minutes";
|
|
|
|
public static final String RECIPE_ATTRIBUTE = "recipe";
|
|
public static final String RECIPESEARCH_ATTRIBUTE = "recipeSearch";
|
|
public static final String RECIPESEARCH_ERROR = "recipeSearchError";
|
|
public static final String RECIPESEARCH_ERROR_DESCRIPTION =
|
|
"recipeSearchErrorDescription";
|
|
public static final String RECIPESEARCH_ERROR_OBJECT =
|
|
"recipeSearchErrorService";
|
|
public static final String MESSAGE_ATTRIBUTE = "message";
|
|
|
|
public static final String RECIPE_ITEMTYPE_QUERY =
|
|
"[item type : recipe | recipes]";
|
|
|
|
/** Pattern used for finding the unsupported characters in the query string.*/
|
|
private static final Pattern QUERY_REPLACE_PATTERN =
|
|
Pattern.compile("\\p{Punct}");
|
|
|
|
public static final String ERROR_JSP = "/WEB-INF/recipeError.jsp";
|
|
|
|
/**
|
|
* Builds a HashSet containing the specified values,
|
|
* filtering the null and empty ones.
|
|
*
|
|
* @param values usually an array returned by request.getParameterValues()
|
|
* @return a HashSet containing the nonempty values
|
|
*/
|
|
public static Set<String> validateValues(String[] values) {
|
|
Set<String> valuesList = new HashSet<String>();
|
|
if (values != null) {
|
|
for (String value : values) {
|
|
value = cleanQueryString(value);
|
|
if (value != null && ! "".equals(value)) {
|
|
valuesList.add(value);
|
|
}
|
|
}
|
|
}
|
|
return valuesList;
|
|
}
|
|
|
|
/**
|
|
* Cleans the {@code searchString} set by the user, by removing the special
|
|
* punctuation characters not allowed directly in a query.
|
|
*
|
|
* @param searchString the string set by the user
|
|
* @return the String to be used for executing the query to Google Base.
|
|
*/
|
|
public static String cleanQueryString(String searchString) {
|
|
Matcher matcher = QUERY_REPLACE_PATTERN.matcher(searchString);
|
|
return matcher.replaceAll(" ").trim();
|
|
}
|
|
|
|
/**
|
|
* Logs an exception in a convenient format,
|
|
* using the log method of a servlet context.
|
|
*
|
|
* @param servlet the servlet used to log the exception
|
|
* @param e exception to be logged
|
|
*/
|
|
public static void logServiceException(HttpServlet servlet,
|
|
ServiceException e) {
|
|
if (e.getResponseBody() != null) {
|
|
// Log the full error message and response code.
|
|
servlet.log(e.getMessage() + " " +
|
|
e.getHttpErrorCodeOverride() + " " +
|
|
e.getResponseContentType() + ": " +
|
|
e.getResponseBody(), e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets a RecipeSearch as an attribute of a HttpServletRequest.
|
|
*
|
|
* @param request a request that will be passed to a JSP
|
|
* @param results the RecipeSearch, executed or not
|
|
*/
|
|
public static void setRecipeSearch(HttpServletRequest request,
|
|
RecipeSearch results) {
|
|
request.setAttribute(RECIPESEARCH_ATTRIBUTE, results);
|
|
}
|
|
|
|
/**
|
|
* Gets from a HttpServletRequest a RecipeSearch that was previously set
|
|
* using {@link #setRecipeSearch}.
|
|
* If it is missing, a NullPointerException is thrown.
|
|
*
|
|
* @param request a request passed from a Servlet
|
|
* @return a non-null RecipeSearch
|
|
*/
|
|
public static RecipeSearch getRecipeSearch(HttpServletRequest request) {
|
|
RecipeSearch results = (RecipeSearch)request.getAttribute(
|
|
RECIPESEARCH_ATTRIBUTE);
|
|
if (null == results) {
|
|
throw new NullPointerException("recipe search results are missing");
|
|
}
|
|
return results;
|
|
}
|
|
|
|
/**
|
|
* Gets the error message, or {@code null} if no error message was set in the
|
|
* request.
|
|
*
|
|
* @param request the request in which the method will locate the error
|
|
* @return the error message, or {@code null} if no message was set
|
|
*/
|
|
public static String getRecipeError(HttpServletRequest request) {
|
|
return (String)request.getAttribute(RECIPESEARCH_ERROR);
|
|
}
|
|
|
|
/**
|
|
* Gets the error message, or {@code null} if no error message was set in the
|
|
* request.
|
|
*
|
|
* @param request the request in which the method will locate the error
|
|
* @return the error message, or {@code null} if no message was set
|
|
*/
|
|
public static String getRecipeErrorDescription(HttpServletRequest request) {
|
|
return (String)request.getAttribute(RECIPESEARCH_ERROR_DESCRIPTION);
|
|
}
|
|
|
|
/**
|
|
* Gets the errors obtained from Google Base, or {@code null} if no service
|
|
* error was set in the request.
|
|
*
|
|
* @param request the request in which the method will locate the error
|
|
* @return the service errors, or {@code null} if no service errors were set
|
|
*/
|
|
public static ServiceErrors getRecipeErrorObject(HttpServletRequest request) {
|
|
return (ServiceErrors)request.getAttribute(RECIPESEARCH_ERROR_OBJECT);
|
|
}
|
|
|
|
/**
|
|
* Forwards the request to the error page, for displaying the specified
|
|
* {@code errorMessage} and the {@code description}. No service errors will
|
|
* be displayed.
|
|
*
|
|
* @param request the request object
|
|
* @param response the response object
|
|
* @param errorMessage the error message to be displayed
|
|
* @param description the description of the error message, {@code null} if
|
|
* no description should be displayed.
|
|
* @throws ServletException
|
|
* @throws IOException
|
|
*/
|
|
public static void forwardToErrorPage(HttpServletRequest request,
|
|
HttpServletResponse response, String errorMessage)
|
|
throws ServletException, IOException {
|
|
request.setAttribute(RECIPESEARCH_ERROR, errorMessage);
|
|
request.getRequestDispatcher(ERROR_JSP).forward(request, response);
|
|
}
|
|
|
|
/**
|
|
* Forwards the request to the error page, for displaying the information
|
|
* contained by the {@code se} parameter. This method registers the service
|
|
* errors too, using a {@link ServiceErrors} object.
|
|
*
|
|
* @param request the request object
|
|
* @param response the response object
|
|
* @param se the service error containing the information for the error page
|
|
* @throws ServletException
|
|
* @throws IOException
|
|
*/
|
|
public static void forwardToErrorPage(HttpServletRequest request,
|
|
HttpServletResponse response, ServiceException se)
|
|
throws ServletException, IOException {
|
|
request.setAttribute(RECIPESEARCH_ERROR, se.getMessage());
|
|
request.setAttribute(RECIPESEARCH_ERROR_DESCRIPTION, se.getResponseBody());
|
|
request.setAttribute(RECIPESEARCH_ERROR_OBJECT, new ServiceErrors(se));
|
|
request.getRequestDispatcher(ERROR_JSP).forward(request, response);
|
|
}
|
|
|
|
/**
|
|
* Gets the GoogleBaseService object created by {@link AuthenticationFilter}
|
|
* or creates a new one if <code>AuthenticationFilter</code> has not been
|
|
* applied yet.
|
|
*
|
|
* @param req
|
|
* @param servletContext
|
|
* @return a GoogleBaseService object
|
|
*/
|
|
public static GoogleBaseService getGoogleBaseService(HttpServletRequest req,
|
|
ServletContext servletContext) {
|
|
GoogleBaseService service;
|
|
service = (GoogleBaseService) req.getAttribute(
|
|
AuthenticationFilter.SERVICE_ATTRIBUTE);
|
|
if (service == null) {
|
|
service = new GoogleBaseService(
|
|
servletContext.getInitParameter(APPLICATION_NAME_PARAMETER),
|
|
servletContext.getInitParameter(DEVELOPER_KEY_PARAMETER));
|
|
req.setAttribute(AuthenticationFilter.SERVICE_ATTRIBUTE, service);
|
|
}
|
|
return service;
|
|
}
|
|
|
|
/**
|
|
* Gets a MostUsedValues that was previously set using
|
|
* {@link #setMostUsedValues}.
|
|
*
|
|
* @param servletContext
|
|
* @return a non-null initialized MostUsedValues
|
|
*/
|
|
public static MostUsedValues getMostUsedValues(ServletContext servletContext)
|
|
throws ServletException {
|
|
MostUsedValues mostUsedValues = (MostUsedValues)
|
|
servletContext.getAttribute(RecipeListener.MOST_USED_VALUES_ATTRIBUTE);
|
|
if (null == mostUsedValues) {
|
|
throw new ServletException("Most used values cache is missing");
|
|
}
|
|
return mostUsedValues;
|
|
}
|
|
|
|
public static void setMostUsedValues(ServletContext servletContext,
|
|
MostUsedValues mostUsedValues) {
|
|
servletContext.setAttribute(RecipeListener.MOST_USED_VALUES_ATTRIBUTE,
|
|
mostUsedValues);
|
|
}
|
|
}
|