/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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 org.apache.ode.axis2.httpbinding; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.Server; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Request; import org.apache.ode.utils.DOMUtils; import org.apache.ode.utils.StreamUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import java.io.IOException; /** * @author <a href="mailto:midon@intalio.com">Alexis Midon</a> */ public class ArithmeticsJettyWrapper { protected Server server; private ContextHandlerCollection handlerColl; public ArithmeticsJettyWrapper() throws Exception { this(7070); } public ArithmeticsJettyWrapper(int port) throws Exception { server = new Server(port); // Adding the buildr handler to control our server lifecycle ContextHandler context = new ContextHandler(); context.setContextPath("/HttpBindingTestService"); Handler handler = new ArithmeticsServiceHandler(); context.setHandler(handler); handlerColl = new ContextHandlerCollection(); handlerColl.setHandlers(new Handler[]{context}); server.addHandler(handlerColl); } private class ArithmeticsServiceHandler extends AbstractHandler { /* 6 urls to handle: (GET) http://localhost:8080/HttpBindingTestService/OlaElMundo-GET/plus/(left):(right) (GET) http:// ........ /OlaElMundo-GET/minus?left=&right= (POST) http:// ........ /OlaElMundo-POST/plus (POST) http:// ........ /OlaElMundo-POST/minus (POST) http:// ........ /SalutLaTerre/addition (POST) http:// ........ /SalutLaTerre/sumOfIntegers */ public void handle(String s, HttpServletRequest request, HttpServletResponse response, int i) throws IOException, ServletException { try { String method = request.getMethod(); String uri = request.getRequestURI(); if ("/HttpBindingTestService/".equals(uri)) { response.getWriter().println("HttpBindingTestService ready!"); } else if (uri.contains("OlaElMundo-GET") || uri.contains("OlaElMundo-DELETE")) { // if (!"GET".equalsIgnoreCase(method)) { if (false) { response.sendError(405, "Expecting method is GET"); } else { if (!uri.contains("plus") && !uri.contains("minus")) { response.sendError(404); } else { boolean ok = true; int left = 0, right = 0; try { if (uri.contains("plus")) { int index = uri.lastIndexOf("/"); String[] op = uri.substring(index + 1).split(":"); left = Integer.parseInt(op[0]); right = Integer.parseInt(op[1]); } else if (uri.contains("minus")) { left = Integer.parseInt(request.getParameter("left")); right = -1 * Integer.parseInt(request.getParameter("right")); } else { ok = false; } } catch (NumberFormatException e) { ok = false; } if (!ok) { response.sendError(400); } else { Document doc = DOMUtils.newDocument(); Element resElt = doc.createElement("theresult"); resElt.setTextContent(String.valueOf(left + right)); response.getOutputStream().print(DOMUtils.domToString(resElt)); response.getOutputStream().close(); response.setStatus(200); } } } } else if (uri.contains("OlaElMundo-POST") || uri.contains("OlaElMundo-PUT")) { // if (!"POST".equalsIgnoreCase(method)) { if (false) { response.sendError(405, "Expecting method is POST"); return; } else { String operation; if (!uri.contains("plus") && !uri.contains("minus")) { response.sendError(404); } else { // parse body, form-urlencoded int res = Integer.MIN_VALUE; boolean ok = true; StringBuffer sb = null; String body = new String(StreamUtils.read(request.getInputStream())); if (!body.matches("[^=]*=[+-]?\\d*&[^=]*=[+-]?\\d*")) { ok = false; } else { String[] sp = body.split("&"); String[] op0 = sp[0].split("="); String[] op1 = sp[1].split("="); try { int left, right; if (op0[0].equals("left")) { left = Integer.valueOf(op0[1]); right = Integer.valueOf(op1[1]); } else { left = Integer.valueOf(op1[1]); right = Integer.valueOf(op0[1]); } if (uri.contains("minus")) { right = -1 * right; } res = left + right; } catch (NumberFormatException e) { ok = false; } } if (!ok) { response.sendError(400); } else { Element resElt = DOMUtils.newDocument().createElement("theresult"); resElt.setTextContent(String.valueOf(res)); response.getOutputStream().print(DOMUtils.domToString(resElt)); response.setStatus(200); } } } } else if (uri.contains("SalutLaTerre")) { if (!"POST".equalsIgnoreCase(method)) { response.sendError(405, "Expecting method is POST"); return; } else { if (uri.contains("addition")) { Document bodyDoc = parseBody(request.getInputStream(), response); if (bodyDoc != null) { // we expect the element operandList if (!"operandList".equals(bodyDoc.getDocumentElement().getNodeName())) { response.sendError(400, "The first element should be named operandList"); } else { Element firstOperand = DOMUtils.getFirstChildElement(bodyDoc.getDocumentElement()); Element secondElement = DOMUtils.getNextSiblingElement(firstOperand); String left = DOMUtils.getTextContent(firstOperand); String right = DOMUtils.getTextContent(secondElement); Element res = bodyDoc.createElementNS("http://ode/bpel/arithmetics", "theresult"); res.setTextContent(String.valueOf(Integer.valueOf(left) + Integer.valueOf(right))); response.getOutputStream().print(DOMUtils.domToString(res)); response.setStatus(200); } } } else if (uri.contains("sumOfIntegers")) { Document bodyDoc = parseBody(request.getInputStream(), response); if (bodyDoc != null) { Element firstOperand = DOMUtils.getFirstChildElement(bodyDoc.getDocumentElement()); Element secondElement = DOMUtils.getNextSiblingElement(firstOperand); int left = Integer.valueOf(DOMUtils.getTextContent(firstOperand)); int right = Integer.valueOf(DOMUtils.getTextContent(secondElement)); int min = Math.min(left,right); int max = Math.max(left,right); // Element arrayElt = bodyDoc.createElement("sumOfInteger"); Element anElt = bodyDoc.createElementNS("http://ode/bpel/arithmetics", "sumOfInteger"); Element msg = bodyDoc.createElement("msg"); Element resultIs = bodyDoc.createElement("resultIs"); msg.setTextContent("A dummy message we don't care about. Only purpose is to have a complex type"); resultIs.setTextContent(String.valueOf((max*(max+1)-min*(min+1))/2)); anElt.appendChild(msg); anElt.appendChild(resultIs); response.getOutputStream().print(DOMUtils.domToString(anElt)); response.setStatus(200); } } else { response.sendError(404); } } } } catch (Exception e) { response.sendError(500, e.getMessage()); } finally { ((Request) request).setHandled(true); } } private Document parseBody(ServletInputStream bodyStream, HttpServletResponse response) throws IOException { if (bodyStream == null) { response.sendError(400, "Missing body!"); } else { try { return DOMUtils.parse(bodyStream); } catch (SAXException e) { response.sendError(400, "Failed to parse body! " + e.getMessage()); } } return null; } } public static void main(String[] args) { try { new ArithmeticsJettyWrapper(); } catch (Exception e) { e.printStackTrace(); } } }