/* * Copyright 2014 K.M. Kim * * 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.skp.milonga.servlet.handler; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.map.ObjectMapper; import org.mozilla.javascript.Context; import org.mozilla.javascript.NativeFunction; import org.mozilla.javascript.NativeObject; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; /** * Atmos Function is converted to this controller to be used like Spring * Controller. This controller handles {@link HttpServletResponse}. * * @author kminkim * */ public class AtmosHttpRequestHandler { private NativeFunction atmosFunction; public AtmosHttpRequestHandler(NativeFunction atmosHandler) { this.atmosFunction = atmosHandler; } public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Context context = Context.enter(); Scriptable scope = context.initStandardObjects(); NativeObject result = (NativeObject) atmosFunction.call(context, scope, scope, new Object[] { request }); PrintWriter out = response.getWriter(); if(isResponse(result)) { Object responseContent = result.get("content"); out.print((String) responseContent); setCookie(result, response); } else { response.setContentType("application/json"); ObjectMapper om = new ObjectMapper(); String jsonStr = om.writeValueAsString(result); out.print(jsonStr); } out.flush(); } /** * set cookie from result of handler to HttpServletResponse * * @param result * return object of handler * @param response * HttpServletResponse */ @SuppressWarnings("unchecked") private void setCookie(NativeObject result, HttpServletResponse response) { Map<String, String> cookieMap = ScriptableObject.getTypedProperty( result, "cookie", Map.class); if (cookieMap == null) { return; } Iterator<Entry<String, String>> iterator = cookieMap.entrySet() .iterator(); while (iterator.hasNext()) { String name = iterator.next().getKey(); Cookie cookie = new Cookie(name, cookieMap.get(name)); response.addCookie(cookie); } } private boolean isResponse(NativeObject result) { Object[] members = new Object[] { "cookie", "getContent", "setContent", "setCookie" }; return Arrays.equals(result.getPrototype().getIds(), members); } }