/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You 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 com.esri.gpt.control.cart;
import com.esri.gpt.framework.collection.StringAttributeMap;
import com.esri.gpt.framework.context.BaseServlet;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.jsf.MessageBroker;
import com.esri.gpt.framework.util.Val;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet end-point for a simple implementation of an item cart based
* upon an in-memory (i.e. session) collection of ids.
*/
@SuppressWarnings("serial")
public class CartServlet extends BaseServlet {
/** class variables ========================================================= */
/** The Logger. */
private static Logger LOGGER = Logger.getLogger(CartServlet.class.getName());
/** methods ================================================================= */
/**
* Processes the HTTP request.
* @param request the HTTP request
* @param response HTTP response
* @param context request context
* @throws Exception if an exception occurs
*/
@Override
protected void execute(HttpServletRequest request,
HttpServletResponse response, RequestContext context) throws Exception {
String sMimeType = "application/json";
String sResponse = "";
String sCallback = "";
String sWarning = "";
boolean bGenerateInfo = true;
boolean bIncludeKeys = false;
MessageBroker msgBroker = null;
// determine the request type and execute
try {
String sLcUri = request.getRequestURI().toLowerCase();
StringAttributeMap cfg = context.getCatalogConfiguration().getParameters();
int maxItems = Val.chkInt(cfg.getValue("catalog.cart.maxItems"),10);
// determine the response format
String f = Val.chkStr(request.getParameter("f"));
if (f.equalsIgnoreCase("pjson")) {
sMimeType = "text/plain";
}
sCallback = Val.chkStr(request.getParameter("callback"));
// get the cart from the session
HttpSession session = request.getSession();
if (session == null) {
session = request.getSession(true);
}
String sSessionKey = Cart.class.getCanonicalName();
Cart cart = (Cart)session.getAttribute(sSessionKey);
if (cart == null) {
cart = new Cart();
session.setAttribute(sSessionKey,cart);
}
// add a key
if (sLcUri.endsWith("/add")) {
String sKey = Val.chkStr(request.getParameter("key"));
if ((sKey.length() > 0) && !cart.containsKey(sKey)) {
if (cart.size() < maxItems) {
cart.add(sKey);
} else {
sWarning = "cartWasFull";
}
}
// clear the cart
} else if (sLcUri.endsWith("/clear")) {
if (cart.size() > 0) {
cart.clear();
}
// include the keys within the response
} else if (sLcUri.endsWith("/keys")) {
bIncludeKeys = true;
// process the response
} else if (sLcUri.endsWith("/process")) {
/*
some examples of a processor for gpt/form/Cart.js
processor: "?processor=com.esri.gpt.control.cart.ZipXmls",
processor: "?processor=com.esri.gpt.control.cart.XslBundler"+
"&xslt="+encodeURIComponent("gpt/metadata/some.xslt")+
"&mimeType="+encodeURIComponent("text/html"),
"&contentDisposition="+encodeURIComponent("attachment; filename=tmp.xml"),
*/
bGenerateInfo = false;
KeysetProcessor processor = KeysetProcessor.newProcessor(request,context);
if (processor != null) {
processor.execute(request,response,context);
}
// remove a key
} else if (sLcUri.endsWith("/remove")) {
String sKey = Val.chkStr(request.getParameter("key"));
if (sKey.length() > 0) {
cart.remove(sKey);
}
}
// generate the response
if (bGenerateInfo) {
sResponse = this.generateJsonInfo(request,response,context,
msgBroker,cart,maxItems,sWarning,bIncludeKeys);
}
} catch (Throwable t) {
LOGGER.log(Level.SEVERE,"Exception:",t);
if (sMimeType == null) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} else {
sResponse = this.generateJsonError(request,response,context,
msgBroker,t);
}
} finally {
context.onExecutionPhaseCompleted();
}
// write the response
if ((sResponse != null) && (sResponse.length() > 0)) {
LOGGER.finest("cartResponse:\n"+sResponse);
if ((sCallback != null) && (sCallback.length() > 0)) {
sResponse = sCallback+"("+sResponse+")";
}
writeCharacterResponse(response,sResponse,"UTF-8",sMimeType+";charset=UTF-8");
}
}
/**
* Generates a JSON based error object.
* @param request the HTTP servlet request
* @param response the HTTP servlet response
* @param context the request context
* @param msgBroker the message broker
* @param t the exception
* @return the JSON string
*/
protected String generateJsonError(HttpServletRequest request,
HttpServletResponse response,
RequestContext context,
MessageBroker msgBroker,
Throwable t) {
String sMsg = Val.chkStr(t.getMessage());
if (sMsg.length() == 0) sMsg = t.toString();
StringBuilder sb = new StringBuilder();
sb.append("{\"error\":{");
sb.append("\"message\":\" ").append(Val.escapeStrForJson(sMsg)).append("\"");
sb.append("}}");
return sb.toString();
}
/**
* Generates a JSON based summary object for the cart.
* @param request the HTTP servlet request
* @param response the HTTP servlet response
* @param context the request context
* @param msgBroker the message broker
* @param cart the cart
* @param maxItems the maximum number of items
* @param warning optional warning message
* @param includeKeys optionally include the keys
* @return the JSON string
*/
protected String generateJsonInfo(HttpServletRequest request,
HttpServletResponse response,
RequestContext context,
MessageBroker msgBroker,
Cart cart,
int maxItems,
String warning,
boolean includeKeys) {
warning = Val.chkStr(warning);
String pfx = "\r\n ";
StringBuilder sb = new StringBuilder();
sb.append("{\"cart\":{");
sb.append(pfx+"\"size\": ").append(cart.size()).append(",");
sb.append(pfx+"\"maxItems\": ").append(maxItems);
if (warning.length() > 0) {
sb.append(",");
sb.append(pfx+"\"warning\":\" ").append(Val.escapeStrForJson(warning)).append("\"");
}
if (includeKeys) {
Set<String> keys = cart.keySet();
StringBuilder sbK = new StringBuilder();
for (String sKey: keys) {
if (sbK.length() > 0) {
sbK.append(",");
}
String sEsc = Val.escapeStrForJson(sKey);
sbK.append("\"").append(sEsc).append("\"");
}
sb.append(",");
sb.append(pfx+"\"keys\": [").append(sbK.toString()).append("]");
}
sb.append("\r\n}}");
return sb.toString();
}
}