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.blob;
018
019import java.net.MalformedURLException;
020import java.net.URISyntaxException;
021import java.net.URL;
022
023/**
024 * The policy for configuring how BLOBs (Binary Large OBjects) are transferred
025 * out of band between producers, brokers and consumers.
026 *
027 * 
028 */
029public class BlobTransferPolicy {
030    private String defaultUploadUrl = "http://localhost:8080/uploads/";
031    private String brokerUploadUrl;
032    private String uploadUrl;
033    private int bufferSize = 128 * 1024;
034    private BlobUploadStrategy uploadStrategy;
035    private BlobDownloadStrategy downloadStrategy;
036
037    /**
038     * Returns a copy of this policy object
039     */
040    public BlobTransferPolicy copy() {
041        BlobTransferPolicy that = new BlobTransferPolicy();
042        that.defaultUploadUrl = this.defaultUploadUrl;
043        that.brokerUploadUrl = this.brokerUploadUrl;
044        that.uploadUrl = this.uploadUrl;
045        that.bufferSize = this.bufferSize;
046        that.uploadStrategy = this.uploadStrategy;
047        that.downloadStrategy = this.downloadStrategy;
048        return that;
049    }
050
051    public String getUploadUrl() {
052        if (uploadUrl == null) {
053            uploadUrl = getBrokerUploadUrl();
054            if (uploadUrl == null) {
055                uploadUrl = getDefaultUploadUrl();
056            }
057        }
058        return uploadUrl;
059    }
060
061    /**
062     * Sets the upload URL to use explicitly on the client which will
063     * overload the default or the broker's URL. This allows the client to decide
064     * where to upload files to irrespective of the brokers configuration.
065     */
066    public void setUploadUrl(String uploadUrl) {
067        this.uploadUrl = uploadUrl;
068    }
069
070    public String getBrokerUploadUrl() {
071        return brokerUploadUrl;
072    }
073
074    /**
075     * Called by the JMS client when a broker advertises its upload URL
076     */
077    public void setBrokerUploadUrl(String brokerUploadUrl) {
078        this.brokerUploadUrl = brokerUploadUrl;
079    }
080
081    public String getDefaultUploadUrl() {
082        return defaultUploadUrl;
083    }
084
085    /**
086     * Sets the default upload URL to use if the broker does not
087     * have a configured upload URL
088     */
089    public void setDefaultUploadUrl(String defaultUploadUrl) {
090        this.defaultUploadUrl = defaultUploadUrl;
091    }
092
093    public BlobUploadStrategy getUploadStrategy() {
094        if (uploadStrategy == null) {
095            uploadStrategy = createUploadStrategy();
096        }
097        return uploadStrategy;
098    }
099
100    public BlobDownloadStrategy getDownloadStrategy() {
101        if(downloadStrategy == null) {
102            downloadStrategy = createDownloadStrategy();
103        }
104        return downloadStrategy;
105    }
106
107    /**
108     * Sets the upload strategy to use for uploading BLOBs to some URL
109     */
110    public void setUploadStrategy(BlobUploadStrategy uploadStrategy) {
111        this.uploadStrategy = uploadStrategy;
112    }
113
114    public int getBufferSize() {
115        return bufferSize;
116    }
117
118    /**
119     * Sets the default buffer size used when uploading or downloading files
120     */
121    public void setBufferSize(int bufferSize) {
122        this.bufferSize = bufferSize;
123    }
124
125    /**
126     * Returns the upload strategy depending on the information from the
127     * uploadURL. Currently supportet HTTP and FTP
128     * 
129     * @return
130     */
131    protected BlobUploadStrategy createUploadStrategy() {
132        BlobUploadStrategy strategy;
133        try {
134            URL url = new URL(getUploadUrl());
135
136            if(url.getProtocol().equalsIgnoreCase("FTP")) {
137                strategy = new FTPBlobUploadStrategy(this);
138            } else if (url.getProtocol().equalsIgnoreCase("FILE")) {
139                strategy = new FileSystemBlobStrategy(this);
140            } else {
141                strategy = new DefaultBlobUploadStrategy(this);
142            }
143        } catch (MalformedURLException e) {
144            strategy = new DefaultBlobUploadStrategy(this);
145        } catch (URISyntaxException e) {
146            strategy = new DefaultBlobUploadStrategy(this);
147        }
148        return strategy;
149    }
150    
151    /**
152     * Returns the download strategy depending on the information from the
153     * uploadURL. Currently supportet HTTP and FTP
154     * 
155     * @return
156     */
157    protected BlobDownloadStrategy createDownloadStrategy() {
158        BlobDownloadStrategy strategy;
159        try {
160            URL url = new URL(getUploadUrl());
161            
162            if(url.getProtocol().equalsIgnoreCase("FTP")) {
163                strategy = new FTPBlobDownloadStrategy(this);
164            } else if (url.getProtocol().equalsIgnoreCase("FILE")) {
165                strategy = new FileSystemBlobStrategy(this);
166            } else {
167                strategy = new DefaultBlobDownloadStrategy(this);
168            }
169        } catch (MalformedURLException e) {
170            strategy = new DefaultBlobDownloadStrategy(this);
171        } catch (URISyntaxException e) {
172            strategy = new DefaultBlobDownloadStrategy(this);
173        }
174        return strategy;
175    }
176
177    
178}