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 */
017 package org.apache.activemq.command;
018
019 import java.io.IOException;
020 import java.io.InputStream;
021 import java.net.MalformedURLException;
022 import java.net.URL;
023
024 import javax.jms.JMSException;
025
026 import org.apache.activemq.BlobMessage;
027 import org.apache.activemq.blob.BlobDownloader;
028 import org.apache.activemq.blob.BlobUploader;
029 import org.apache.activemq.util.JMSExceptionSupport;
030
031 /**
032 * An implementation of {@link BlobMessage} for out of band BLOB transfer
033 *
034 *
035 * @openwire:marshaller code="29"
036 */
037 public class ActiveMQBlobMessage extends ActiveMQMessage implements BlobMessage {
038 public static final byte DATA_STRUCTURE_TYPE = CommandTypes.ACTIVEMQ_BLOB_MESSAGE;
039
040 public static final String BINARY_MIME_TYPE = "application/octet-stream";
041
042 private String remoteBlobUrl;
043 private String mimeType;
044 private String name;
045 private boolean deletedByBroker;
046
047 private transient BlobUploader blobUploader;
048 private transient BlobDownloader blobDownloader;
049 private transient URL url;
050
051 public Message copy() {
052 ActiveMQBlobMessage copy = new ActiveMQBlobMessage();
053 copy(copy);
054 return copy;
055 }
056
057 private void copy(ActiveMQBlobMessage copy) {
058 super.copy(copy);
059 copy.setRemoteBlobUrl(getRemoteBlobUrl());
060 copy.setMimeType(getMimeType());
061 copy.setDeletedByBroker(isDeletedByBroker());
062 copy.setBlobUploader(getBlobUploader());
063 copy.setName(getName());
064 }
065
066 public byte getDataStructureType() {
067 return DATA_STRUCTURE_TYPE;
068 }
069
070 /**
071 * @openwire:property version=3 cache=false
072 */
073 public String getRemoteBlobUrl() {
074 return remoteBlobUrl;
075 }
076
077 public void setRemoteBlobUrl(String remoteBlobUrl) {
078 this.remoteBlobUrl = remoteBlobUrl;
079 url = null;
080 }
081
082 /**
083 * The MIME type of the BLOB which can be used to apply different content
084 * types to messages.
085 *
086 * @openwire:property version=3 cache=true
087 */
088 public String getMimeType() {
089 if (mimeType == null) {
090 return BINARY_MIME_TYPE;
091 }
092 return mimeType;
093 }
094
095 public void setMimeType(String mimeType) {
096 this.mimeType = mimeType;
097 }
098
099 public String getName() {
100 return name;
101 }
102
103 /**
104 * The name of the attachment which can be useful information if
105 * transmitting files over ActiveMQ
106 *
107 * @openwire:property version=3 cache=false
108 */
109 public void setName(String name) {
110 this.name = name;
111 }
112
113 /**
114 * @openwire:property version=3 cache=false
115 */
116 public boolean isDeletedByBroker() {
117 return deletedByBroker;
118 }
119
120 public void setDeletedByBroker(boolean deletedByBroker) {
121 this.deletedByBroker = deletedByBroker;
122 }
123
124 public String getJMSXMimeType() {
125 return getMimeType();
126 }
127
128 public InputStream getInputStream() throws IOException, JMSException {
129 if(blobDownloader == null) {
130 return null;
131 }
132 return blobDownloader.getInputStream(this);
133 }
134
135 public URL getURL() throws JMSException {
136 if (url == null && remoteBlobUrl != null) {
137 try {
138 url = new URL(remoteBlobUrl);
139 } catch (MalformedURLException e) {
140 throw JMSExceptionSupport.create(e);
141 }
142 }
143 return url;
144 }
145
146 public void setURL(URL url) {
147 this.url = url;
148 remoteBlobUrl = url != null ? url.toExternalForm() : null;
149 }
150
151 public BlobUploader getBlobUploader() {
152 return blobUploader;
153 }
154
155 public void setBlobUploader(BlobUploader blobUploader) {
156 this.blobUploader = blobUploader;
157 }
158
159 public BlobDownloader getBlobDownloader() {
160 return blobDownloader;
161 }
162
163 public void setBlobDownloader(BlobDownloader blobDownloader) {
164 this.blobDownloader = blobDownloader;
165 }
166
167 public void onSend() throws JMSException {
168 super.onSend();
169
170 // lets ensure we upload the BLOB first out of band before we send the
171 // message
172 if (blobUploader != null) {
173 try {
174 URL value = blobUploader.upload(this);
175 setURL(value);
176 } catch (IOException e) {
177 throw JMSExceptionSupport.create(e);
178 }
179 }
180 }
181
182 public void deleteFile() throws IOException, JMSException {
183 blobDownloader.deleteFile(this);
184 }
185 }