com.ibm.sbt.sample.web.util.SnippetServlet Maven / Gradle / Ivy
/*
* � Copyright IBM Corp. 2012
*
* 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 com.ibm.sbt.sample.web.util;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ibm.commons.runtime.servlet.BaseHttpServlet;
import com.ibm.commons.runtime.util.UrlUtil;
import com.ibm.commons.util.StringUtil;
import com.ibm.sbt.playground.assets.Node;
import com.ibm.sbt.playground.assets.RootNode;
import com.ibm.sbt.playground.assets.jssnippets.JSSnippet;
import com.ibm.sbt.playground.assets.jssnippets.JSSnippetAssetNode;
import com.ibm.sbt.playground.vfs.VFSFile;
/**
* @author mwallace
*/
public class SnippetServlet extends BaseHttpServlet {
private static final long serialVersionUID = 1L;
public static final String PARAM_FORMAT = "format"; //$NON-NLS-1$
public static final String PARAM_UNID = "unid"; //$NON-NLS-1$
public static final String PARAM_SNIPPET = "snippet"; //$NON-NLS-1$
public static final String FORMAT_JSON = "json"; //$NON-NLS-1$
public static final String FORMAT_XML = "xml"; //$NON-NLS-1$
public static final String FORMAT_GADGETS_JSON = "gadgets_json"; //$NON-NLS-1$
public static final String APPLICATION_JAVASCRIPT = "application/javascript"; //$NON-NLS-1$
public static final String APPLICATION_XML = "application/xml"; //$NON-NLS-1$
public static final String UTF8 = "utf-8"; //$NON-NLS-1$
static final String sourceClass = SnippetServlet.class.getName();
static final Logger logger = Logger.getLogger(sourceClass);
/*
* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
try {
String unid = request.getParameter(PARAM_UNID);
if (unid == null || unid.length() == 0) {
unid = request.getParameter(PARAM_SNIPPET);
}
String format = getFormat(request);
String str = null;
RootNode rootNode = SnippetFactory.getJsSnippets(getServletContext(), request);
if (unid != null && unid.length() > 0) {
VFSFile rootFile = SnippetFactory.getJsRootFile(getServletContext());
JSSnippet snippet = (JSSnippet) rootNode.loadAsset(rootFile, unid);
if (snippet == null) {
service400(request, response, "Invalid unid: {0}", unid);
return;
}
if (FORMAT_JSON.equals(format)) {
str = toJson(request, snippet);
} else {
str = toXml(request, snippet);
}
} else {
List children = rootNode.getAllChildrenFlat();
if (FORMAT_JSON.equals(format)) {
str = rootNode.getAsJson();
} else if (FORMAT_GADGETS_JSON.equals(format)) {
str = toGadgetsJson(request, children);
} else {
str = toXml(request, children);
}
}
// write response
PrintWriter writer = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), UTF8));
try {
// response is of type application/javascript
response.setStatus(HttpServletResponse.SC_OK);
boolean isJson = FORMAT_JSON.equals(format) || FORMAT_GADGETS_JSON.equals(format);
response.setContentType(isJson ? APPLICATION_JAVASCRIPT : APPLICATION_XML);
writer.write(str);
} finally {
writer.flush();
}
} catch (Exception e) {
logger.log(Level.SEVERE, "Error generating json for sample snippets", e);
}
}
/*
* Return format
*/
private String getFormat(HttpServletRequest request) {
String val = request.getParameter(PARAM_FORMAT);
if (val != null && val.length() > 0) {
if (FORMAT_GADGETS_JSON.equalsIgnoreCase(val)) {
return FORMAT_GADGETS_JSON;
}
if (FORMAT_JSON.equalsIgnoreCase(val)) {
return FORMAT_JSON;
}
if (FORMAT_XML.equalsIgnoreCase(val)) {
return FORMAT_XML;
}
}
return FORMAT_XML;
}
/*
* Return list of children in json notation
*/
private String toJson(HttpServletRequest request, List children) {
StringBuilder sb = new StringBuilder();
sb.append("{\n");
for (int i = 0; i < children.size(); i++) {
Node node = children.get(i);
if (node.isAsset()) {
JSSnippetNode snippetNode = (JSSnippetNode) node;
sb.append("\"").append(snippetNode.getUnid()).append("\": {\n");
sb.append(" \"level\": \"").append(snippetNode.getLevel()).append("\",\n");
sb.append(" \"path\": \"").append(snippetNode.getPath()).append("\",\n");
sb.append(" \"unid\": \"").append(snippetNode.getUnid()).append("\"\n");
sb.append(" \"url\": \"").append(snippetNode.getUrl(request)).append("\"\n");
sb.append((i + 1 < children.size()) ? "},\n" : "}\n");
}
}
sb.append("}\n");
return sb.toString();
}
/*
* Return list of children in gadgets json notation
*/
private String toGadgetsJson(HttpServletRequest request, List children) {
StringBuilder sb = new StringBuilder();
sb.append("{\"collections\": [\n");
for (int i = 0; i < children.size(); i++) {
Node node = children.get(i);
if (node.isAsset()) {
JSSnippetAssetNode snippetNode = (JSSnippetAssetNode) node;
String unid = snippetNode.getUnid();
String gadgetUrl = UrlUtil.getBaseUrl(request) + "/gadget/sampleRunner.jsp?snippet="
+ URLEncoder.encode(unid);
sb.append("{\n");
sb.append("\"name\": \"").append(snippetNode.getName()).append("\",\n");
sb.append("\"Description\": \"").append(snippetNode.getName()).append(" from ")
.append(snippetNode.getCategory()).append("\",\n");
sb.append("\"apps\" : [\n");
sb.append("{\"name\": \"").append(snippetNode.getName()).append("\", \"url\": \"")
.append(gadgetUrl).append("\"}\n");
sb.append("]\n");
sb.append((i + 1 < children.size()) ? "},\n" : "}\n");
}
}
sb.append("] }\n");
return sb.toString();
}
/*
* Return list of children in xml notation
*/
private String toXml(HttpServletRequest request, List children) {
StringBuilder sb = new StringBuilder();
sb.append("\n");
for (int i = 0; i < children.size(); i++) {
Node node = children.get(i);
if (node.isAsset()) {
sb.append(" \n");
}
}
sb.append(" \n");
return sb.toString();
}
/*
* Return snippet in json notation
*/
private String toJson(HttpServletRequest request, JSSnippet snippet) {
StringBuilder sb = new StringBuilder();
sb.append("{\n");
toJson(sb, "unid", snippet.getUnid());
toJson(sb, "js", snippet.getJs());
toJson(sb, "html", snippet.getHtml());
toJson(sb, "docHtml", snippet.getDocHtml());
toJson(sb, "css", snippet.getCss());
toJson(sb, "description", snippet.getDescription());
toJson(sb, "tags", snippet.getTags());
toJson(sb, "labels", snippet.getLabels());
sb.append("}\n");
return sb.toString();
}
/**
* @param snippet
* @param sb
*/
private void toJson(StringBuilder sb, String name, String[] values) {
if (values != null) {
toJson(sb, name, StringUtil.concatStrings(values, ',', true));
}
}
/**
* @param snippet
* @param sb
*/
private void toJson(StringBuilder sb, String name, String value) {
sb.append(" \"").append(name).append("\": \"");
encodeJson(sb, value, true);
sb.append("\",\n");
}
/** Minimum printable ASCII character */
private static final int ASCII_MIN = 32;
/** Maximum printable ASCII character */
private static final int ASCII_MAX = 126;
/*
* Encode for use as JSON value
*/
private void encodeJson(StringBuilder b, String s, boolean preventBackslash) {
if (s == null || s.length() == 0) {
return;
}
int length = s.length();
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
switch (c) {
case '\b':
b.append("\\b");break; //$NON-NLS-1$
case '\t':
b.append("\\t");break; //$NON-NLS-1$
case '\n':
b.append("\\n");break; //$NON-NLS-1$
case '\f':
b.append("\\f");break; //$NON-NLS-1$
case '\r':
b.append("\\r");break; //$NON-NLS-1$
case '\'':
b.append("\\'");break; //$NON-NLS-1$
case '\"':
b.append("\\\"");break; //$NON-NLS-1$
case '\\':
if (!preventBackslash) {
b.append("\\\\");}break; //$NON-NLS-1$
default: {
if ((c < ASCII_MIN) || (c > ASCII_MAX)) {
b.append("\\u"); //$NON-NLS-1$
b.append(StringUtil.toUnsignedHex(c, 4));
} else {
b.append(c);
}
}
}
}
}
/*
* Return snippet in xml notation
*/
private String toXml(HttpServletRequest request, JSSnippet snippet) {
StringBuilder sb = new StringBuilder();
sb.append("\n");
addCDataElement(sb, "unid", snippet.getUnid());
addCDataElement(sb, "js", snippet.getJs());
addCDataElement(sb, "html", snippet.getHtml());
addCDataElement(sb, "docHtml", snippet.getDocHtml());
addCDataElement(sb, "css", snippet.getCss());
addCDataElement(sb, "theme", snippet.getTheme());
addCDataElement(sb, "description", snippet.getDescription());
if (snippet.getTags() != null) {
addCDataElement(sb, "tags", StringUtil.concatStrings(snippet.getTags(), ',', true));
}
if (snippet.getLabels() != null) {
addCDataElement(sb, "labels", StringUtil.concatStrings(snippet.getLabels(), ',', true));
}
sb.append(" \n");
return sb.toString();
}
/*
* Create element with cdata section containing value
*/
private void addCDataElement(StringBuilder sb, String name, String value) {
sb.append("<").append(name).append(">");
if (value != null && value.length() != 0) {
sb.append("\n");
}
sb.append("").append(name).append(">\n");
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy