| /** |
| * 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.activemq.web.controller; |
| |
| import java.util.Iterator; |
| import java.util.Map; |
| import javax.jms.JMSException; |
| import javax.jms.Message; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import org.apache.activemq.command.ActiveMQDestination; |
| import org.apache.activemq.web.BrokerFacade; |
| import org.apache.activemq.web.DestinationFacade; |
| import org.apache.activemq.web.WebClient; |
| import org.springframework.web.servlet.ModelAndView; |
| import org.springframework.web.servlet.mvc.Controller; |
| |
| /** |
| * Sends a message |
| */ |
| public class SendMessage extends DestinationFacade implements Controller { |
| |
| private String jmsText; |
| private boolean jmsPersistent; |
| private int jmsPriority; |
| private int jmsTimeToLive = -1; |
| private String jmsCorrelationID; |
| private String jmsReplyTo; |
| private String jmsType; |
| private int jmsMessageCount = 1; |
| private String jmsMessageCountHeader = "JMSXMessageNumber"; |
| private boolean redirectToBrowse; |
| |
| public SendMessage(BrokerFacade brokerFacade) { |
| super(brokerFacade); |
| } |
| |
| public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { |
| WebClient client = WebClient.getWebClient(request); |
| ActiveMQDestination dest = createDestination(); |
| |
| sendMessages(request, client, dest); |
| if (redirectToBrowse) { |
| if (isQueue()) { |
| return new ModelAndView("redirect:browse.jsp?destination=" + getJMSDestination()); |
| } |
| } |
| return redirectToBrowseView(); |
| } |
| |
| protected void sendMessages(HttpServletRequest request, WebClient client, ActiveMQDestination dest) |
| throws JMSException { |
| if (jmsMessageCount <= 1) { |
| jmsMessageCount = 1; |
| } |
| for (int i = 0; i < jmsMessageCount; i++) { |
| Message message = createMessage(client, request); |
| appendHeaders(message, request); |
| if (jmsMessageCount > 1) { |
| message.setIntProperty(jmsMessageCountHeader, i + 1); |
| } |
| |
| client.send(dest, message, jmsPersistent, jmsPriority, jmsTimeToLive); |
| } |
| } |
| |
| // Properties |
| // ------------------------------------------------------------------------- |
| |
| public String getJMSCorrelationID() { |
| return jmsCorrelationID; |
| } |
| |
| public void setJMSCorrelationID(String correlationID) { |
| if (correlationID != null) { |
| correlationID = correlationID.trim(); |
| } |
| jmsCorrelationID = correlationID; |
| } |
| |
| public String getJMSReplyTo() { |
| return jmsReplyTo; |
| } |
| |
| public void setJMSReplyTo(String replyTo) { |
| if (replyTo != null) { |
| replyTo = replyTo.trim(); |
| } |
| jmsReplyTo = replyTo; |
| } |
| |
| public String getJMSType() { |
| return jmsType; |
| } |
| |
| public void setJMSType(String type) { |
| if (type != null) { |
| type = type.trim(); |
| } |
| jmsType = type; |
| } |
| |
| public boolean isJMSPersistent() { |
| return jmsPersistent; |
| } |
| |
| public void setJMSPersistent(boolean persistent) { |
| this.jmsPersistent = persistent; |
| } |
| |
| public int getJMSPriority() { |
| return jmsPriority; |
| } |
| |
| public void setJMSPriority(int priority) { |
| this.jmsPriority = priority; |
| } |
| |
| public String getJMSText() { |
| return jmsText; |
| } |
| |
| public void setJMSText(String text) { |
| this.jmsText = text; |
| } |
| |
| public int getJMSTimeToLive() { |
| return jmsTimeToLive; |
| } |
| |
| public void setJMSTimeToLive(int timeToLive) { |
| this.jmsTimeToLive = timeToLive; |
| } |
| |
| public int getJMSMessageCount() { |
| return jmsMessageCount; |
| } |
| |
| public void setJMSMessageCount(int copies) { |
| jmsMessageCount = copies; |
| } |
| |
| public String getJMSMessageCountHeader() { |
| return jmsMessageCountHeader; |
| } |
| |
| public void setJMSMessageCountHeader(String messageCountHeader) { |
| if (messageCountHeader != null) { |
| messageCountHeader = messageCountHeader.trim(); |
| } |
| jmsMessageCountHeader = messageCountHeader; |
| } |
| |
| // Implementation methods |
| // ------------------------------------------------------------------------- |
| protected Message createMessage(WebClient client, HttpServletRequest request) throws JMSException { |
| if (jmsText != null) { |
| return client.getSession().createTextMessage(jmsText); |
| } |
| // TODO create Bytes message from request body... |
| return client.getSession().createMessage(); |
| } |
| |
| @SuppressWarnings("rawtypes") |
| protected void appendHeaders(Message message, HttpServletRequest request) throws JMSException { |
| message.setJMSCorrelationID(jmsCorrelationID); |
| if (jmsReplyTo != null && jmsReplyTo.trim().length() > 0) { |
| message.setJMSReplyTo(ActiveMQDestination.createDestination(jmsReplyTo, ActiveMQDestination.QUEUE_TYPE)); |
| } |
| message.setJMSType(jmsType); |
| |
| // now lets add all of the parameters |
| Map map = request.getParameterMap(); |
| if (map != null) { |
| for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { |
| Map.Entry entry = (Map.Entry) iter.next(); |
| String name = (String) entry.getKey(); |
| if (name.equals("secret")) { |
| continue; |
| } |
| Object value = entry.getValue(); |
| if (isValidPropertyName(name)) { |
| if (value instanceof String[]) { |
| String[] array = (String[]) value; |
| if (array.length > 0) { |
| value = array[0]; |
| } else { |
| value = null; |
| } |
| } |
| if ((name.equals("AMQ_SCHEDULED_DELAY") || name.equals("AMQ_SCHEDULED_PERIOD"))) { |
| if (value != null) { |
| String str = value.toString().trim(); |
| if (str.length() > 0) { |
| message.setLongProperty(name, Long.parseLong(str)); |
| } |
| } |
| } else if (name.equals("AMQ_SCHEDULED_REPEAT")) { |
| if (value != null) { |
| String str = value.toString().trim(); |
| if (str.length() > 0) { |
| message.setIntProperty(name, Integer.parseInt(str)); |
| } |
| } |
| } else if (name.equals("AMQ_SCHEDULED_CRON")) { |
| if (value != null) { |
| String str = value.toString().trim(); |
| if (str.length() > 0) { |
| message.setStringProperty(name, str); |
| } |
| } |
| } else { |
| if (value instanceof String) { |
| String text = value.toString().trim(); |
| if (text.length() == 0) { |
| value = null; |
| } else { |
| value = text; |
| } |
| } |
| if (value != null) { |
| message.setObjectProperty(name, value); |
| } |
| } |
| } |
| } |
| } |
| } |
| protected boolean isValidPropertyName(String name) { |
| // allow JMSX extensions or non JMS properties |
| return name.startsWith("JMSX") || !name.startsWith("JMS"); |
| } |
| |
| public String[] getSupportedHttpMethods() { |
| return new String[]{"POST"}; |
| } |
| } |