/*
 * Copyright (c) 2007-2013 The Broad Institute, Inc.
 * SOFTWARE COPYRIGHT NOTICE
 * This software and its documentation are the copyright of the Broad Institute, Inc. All rights are reserved.
 *
 * This software is supplied without any warranty or guaranteed support whatsoever. The Broad Institute is not responsible for its use, misuse, or functionality.
 *
 * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
 * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
 */

package org.broad.igv.util.stream;

import org.broad.igv.util.HttpUtils;
import org.broad.tribble.util.URLHelper;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * @author jrobinso
 * @date Jul 6, 2011
 */
public class IGVUrlHelper implements URLHelper {

    URL url;

    public IGVUrlHelper(URL url) {
        this.url = url;
    }

    public URL getUrl() {
        return url;
    }

    public long getContentLength() throws IOException {
        return HttpUtils.getInstance().getContentLength(url);
    }

    public InputStream openInputStream() throws IOException {
        return HttpUtils.getInstance().openConnectionStream(url);
    }

    public InputStream openInputStreamForRange(long start, long end) throws IOException {

        String byteRange = "bytes=" + start + "-" + end;
        Map<String, String> params = new HashMap();
        params.put("Range", byteRange);
        return HttpUtils.getInstance().openConnectionStream(url, params);
    }

    public boolean exists() {
        return HttpUtils.getInstance().resourceAvailable(url);
    }
}

@@ -578,16 +578,48 @@
 tream;%0A%0A
+import org.apache.log4j.Logger;%0A
 import o
@@ -647,16 +647,16 @@
 pUtils;%0A
-
 import o
@@ -745,16 +745,55 @@
 Stream;%0A
+import java.net.MalformedURLException;%0A
 import j
@@ -949,24 +949,87 @@
 RLHelper %7B%0A%0A
+    static Logger log = Logger.getLogger(IGVUrlHelper.class);%0A%0A
     URL url;
@@ -1661,71 +1661,1077 @@
     
-return HttpUtils.getInstance().openConnectionStream(url, params
+//Hack for web services which strip range header%0A        URL url = addStartEndQueryString(start, end);%0A        return HttpUtils.getInstance().openConnectionStream(url, params);%0A    %7D%0A%0A    /**%0A     * Add query parameters which should more properly be in Range header field%0A     * to query string%0A     * @param start start byte%0A     * @param end end byte%0A     * @throws MalformedURLException%0A     */%0A    private URL addStartEndQueryString(long start, long end) throws MalformedURLException %7B%0A%0A        log.debug(%22old url: %22 + this.url);%0A        String surl = url.toExternalForm();%0A        String nurl = surl;%0A%0A        String toadd = String.format(%22start=%25d&end=%25d%22, start, end);%0A        String%5B%5D parts = surl.split(%22%5C%5C?%22, 2);%0A        //TODO For now only mess with the string if we already have query parameters%0A        //nurl = String.format(%22%25s?%25s%22, parts%5B0%5D, toadd);%0A        if(parts.length == 2)%7B%0A            nurl = String.format(%22%25s?%25s%22, parts%5B0%5D, toadd);%0A            nurl += %22&%22 + parts%5B1%5D;%0A        %7D%0A        log.debug(%22new url: %22 + nurl);%0A        return new URL(nurl
 );%0A 

Add query parameters for start/end