001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.activemq.web.controller;
018
019import java.util.Iterator;
020import java.util.Map;
021import javax.jms.JMSException;
022import javax.jms.Message;
023import javax.servlet.http.HttpServletRequest;
024import javax.servlet.http.HttpServletResponse;
025import org.apache.activemq.command.ActiveMQDestination;
026import org.apache.activemq.web.BrokerFacade;
027import org.apache.activemq.web.DestinationFacade;
028import org.apache.activemq.web.WebClient;
029import org.springframework.web.servlet.ModelAndView;
030import org.springframework.web.servlet.mvc.Controller;
031
032/**
033 * Sends a message
034 */
035public class SendMessage extends DestinationFacade implements Controller {
036
037    private String jmsText;
038    private boolean jmsPersistent;
039    private int jmsPriority;
040    private int jmsTimeToLive = -1;
041    private String jmsCorrelationID;
042    private String jmsReplyTo;
043    private String jmsType;
044    private int jmsMessageCount = 1;
045    private String jmsMessageCountHeader = "JMSXMessageNumber";
046    private boolean redirectToBrowse;
047
048    public SendMessage(BrokerFacade brokerFacade) {
049        super(brokerFacade);
050    }
051
052    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
053        WebClient client = WebClient.getWebClient(request);
054        ActiveMQDestination dest = createDestination();
055
056        sendMessages(request, client, dest);
057        if (redirectToBrowse) {
058            if (isQueue()) {
059                return new ModelAndView("redirect:browse.jsp?destination=" + getJMSDestination());
060            }
061        }
062        return redirectToBrowseView();
063    }
064
065    protected void sendMessages(HttpServletRequest request, WebClient client, ActiveMQDestination dest)
066            throws JMSException {
067        if (jmsMessageCount <= 1) {
068            jmsMessageCount = 1;
069        }
070        for (int i = 0; i < jmsMessageCount; i++) {
071            Message message = createMessage(client, request);
072            appendHeaders(message, request);
073            if (jmsMessageCount > 1) {
074                message.setIntProperty(jmsMessageCountHeader, i + 1);
075            }
076
077            client.send(dest, message, jmsPersistent, jmsPriority, jmsTimeToLive);
078        }
079    }
080
081    // Properties
082    // -------------------------------------------------------------------------
083
084    public String getJMSCorrelationID() {
085        return jmsCorrelationID;
086    }
087
088    public void setJMSCorrelationID(String correlationID) {
089        if (correlationID != null) {
090            correlationID = correlationID.trim();
091        }
092        jmsCorrelationID = correlationID;
093    }
094
095    public String getJMSReplyTo() {
096        return jmsReplyTo;
097    }
098
099    public void setJMSReplyTo(String replyTo) {
100        if (replyTo != null) {
101            replyTo = replyTo.trim();
102        }
103        jmsReplyTo = replyTo;
104    }
105
106    public String getJMSType() {
107        return jmsType;
108    }
109
110    public void setJMSType(String type) {
111        if (type != null) {
112            type = type.trim();
113        }
114        jmsType = type;
115    }
116
117    public boolean isJMSPersistent() {
118        return jmsPersistent;
119    }
120
121    public void setJMSPersistent(boolean persistent) {
122        this.jmsPersistent = persistent;
123    }
124
125    public int getJMSPriority() {
126        return jmsPriority;
127    }
128
129    public void setJMSPriority(int priority) {
130        this.jmsPriority = priority;
131    }
132
133    public String getJMSText() {
134        return jmsText;
135    }
136
137    public void setJMSText(String text) {
138        this.jmsText = text;
139    }
140
141    public int getJMSTimeToLive() {
142        return jmsTimeToLive;
143    }
144
145    public void setJMSTimeToLive(int timeToLive) {
146        this.jmsTimeToLive = timeToLive;
147    }
148
149    public int getJMSMessageCount() {
150        return jmsMessageCount;
151    }
152
153    public void setJMSMessageCount(int copies) {
154        jmsMessageCount = copies;
155    }
156
157    public String getJMSMessageCountHeader() {
158        return jmsMessageCountHeader;
159    }
160
161    public void setJMSMessageCountHeader(String messageCountHeader) {
162        if (messageCountHeader != null) {
163            messageCountHeader = messageCountHeader.trim();
164        }
165        jmsMessageCountHeader = messageCountHeader;
166    }
167
168    // Implementation methods
169    // -------------------------------------------------------------------------
170    protected Message createMessage(WebClient client, HttpServletRequest request) throws JMSException {
171        if (jmsText != null) {
172            return client.getSession().createTextMessage(jmsText);
173        }
174        // TODO create Bytes message from request body...
175        return client.getSession().createMessage();
176    }
177
178    @SuppressWarnings("rawtypes")
179    protected void appendHeaders(Message message, HttpServletRequest request) throws JMSException {
180        message.setJMSCorrelationID(jmsCorrelationID);
181        if (jmsReplyTo != null && jmsReplyTo.trim().length() > 0) {
182            message.setJMSReplyTo(ActiveMQDestination.createDestination(jmsReplyTo, ActiveMQDestination.QUEUE_TYPE));
183        }
184        message.setJMSType(jmsType);
185
186        // now lets add all of the parameters
187        Map map = request.getParameterMap();
188        if (map != null) {
189            for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) {
190                Map.Entry entry = (Map.Entry) iter.next();
191                String name = (String) entry.getKey();
192                if (name.equals("secret")) {
193                    continue;
194                }
195                Object value = entry.getValue();
196                if (isValidPropertyName(name)) {
197                    if (value instanceof String[]) {
198                        String[] array = (String[]) value;
199                        if (array.length > 0) {
200                            value = array[0];
201                        } else {
202                            value = null;
203                        }
204                    }
205                    if ((name.equals("AMQ_SCHEDULED_DELAY") || name.equals("AMQ_SCHEDULED_PERIOD"))) {
206                        if (value != null) {
207                            String str = value.toString().trim();
208                            if (str.length() > 0) {
209                                message.setLongProperty(name, Long.parseLong(str));
210                            }
211                        }
212                    } else if (name.equals("AMQ_SCHEDULED_REPEAT")) {
213                        if (value != null) {
214                            String str = value.toString().trim();
215                            if (str.length() > 0) {
216                                message.setIntProperty(name, Integer.parseInt(str));
217                            }
218                        }
219                    } else if (name.equals("AMQ_SCHEDULED_CRON")) {
220                        if (value != null) {
221                            String str = value.toString().trim();
222                            if (str.length() > 0) {
223                                message.setStringProperty(name, str);
224                            }
225                        }
226                    } else {
227                        if (value instanceof String) {
228                            String text = value.toString().trim();
229                            if (text.length() == 0) {
230                                value = null;
231                            } else {
232                                value = text;
233                            }
234                        }
235                        if (value != null) {
236                            message.setObjectProperty(name, value);
237                        }
238                    }
239                }
240            }
241        }
242    }
243    protected boolean isValidPropertyName(String name) {
244        // allow JMSX extensions or non JMS properties
245        return name.startsWith("JMSX") || !name.startsWith("JMS");
246    }
247
248    public String[] getSupportedHttpMethods() {
249        return new String[]{"POST"};
250    }
251}