/* * Copyright (C) 2015 * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.cleverbus.admin.web.msg; import java.io.PrintWriter; import java.io.StringWriter; import java.util.UUID; import javax.annotation.Nullable; import org.cleverbus.common.log.Log; import org.cleverbus.core.common.directcall.DirectCall; import org.cleverbus.core.common.directcall.DirectCallParams; import org.cleverbus.core.common.directcall.DirectCallRegistry; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; /** * Controller for direct call form. * * @author <a href="mailto:petr.juza@cleverlance.com">Petr Juza</a> */ @Controller public class DirectCallController { private static final String VIEW_NAME = "externalCall"; private static final String CALL_RESULT_ATTR = "callResult"; private static final String CALL_RESULT_ERR_ATTR = "callResultError"; @Autowired private DirectCallRegistry callRegistry; @Autowired private DirectCall directCall; @RequestMapping(value = "/directCall", method = RequestMethod.GET) public String showForm(@ModelAttribute("model") ModelMap modelMap) { return VIEW_NAME; } @RequestMapping(value = "/directCall", method = RequestMethod.POST) public String processCallForm(@ModelAttribute("model") ModelMap modelMap, @RequestParam("body") String body, @RequestParam("uri") String uri, @RequestParam("senderRef") String senderRef, @RequestParam("soapAction") @Nullable String soapAction, @RequestParam("header") String header) { Assert.hasText(body, "the body must not be empty"); Assert.hasText(uri, "the uri must not be empty"); Assert.hasText(senderRef, "the senderRef must not be empty"); // generate unique ID String callId = UUID.randomUUID().toString(); // save params into registry DirectCallParams params = new DirectCallParams(body, uri, senderRef, soapAction, StringUtils.trimToNull(header)); callRegistry.addParams(callId, params); // call external system via internal servlet route try { Log.debug("Calling external system with callId=" + callId + ", params: " + params); String res = directCall.makeCall(callId); modelMap.put(CALL_RESULT_ATTR, MessageController.prettyPrintXML(res)); } catch (Exception ex) { // error occurred StringWriter strOut = new StringWriter(); PrintWriter resStr = new PrintWriter(strOut); ExceptionUtils.printRootCauseStackTrace(ex, resStr); modelMap.put(CALL_RESULT_ERR_ATTR, strOut.toString()); } modelMap.put("header", header); modelMap.put("body", body); modelMap.put("uri", uri); modelMap.put("senderRef", senderRef); modelMap.put("soapAction", soapAction); return VIEW_NAME; } }