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