/** * 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"}; } }