neembuu.uploader.external.HttpUtil.java Source code

Java tutorial

Introduction

Here is the source code for neembuu.uploader.external.HttpUtil.java

Source

/* 
 * Copyright 2015 Shashank Tulsyan <shashaank at neembuu.com>.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package neembuu.uploader.external;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import neembuu.uploader.external.UpdateProgressUI.Content;
import neembuu.uploader.httpclient.NUHttpClient;
import neembuu.uploader.httpclient.httprequest.NUHttpGet;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;

/**
 *
 * @author Shashank
 */
public class HttpUtil {
    public static void update(String url, Path localPath, final Content c) throws IOException {
        NUHttpGet httpGet = new NUHttpGet(url);
        // you cannot use the same http client, or else the program will
        // simply get stuck. This update thing happens concurrently.
        // more than 10-20 plugins might update in parallel.
        // How? user may click button very fast, that's how.
        HttpResponse httpResponse = NUHttpClient.newHttpClient().execute(httpGet);

        try (FileChannel fc = FileChannel.open(localPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE,
                StandardOpenOption.TRUNCATE_EXISTING)) {
            long contentLength = httpResponse.getEntity().getContentLength();
            fc.transferFrom(wrap(httpResponse.getEntity().getContent(), httpResponse.getEntity(), c, contentLength),
                    0, contentLength);
        }
    }

    private static ReadableByteChannel wrap(final InputStream is, final HttpEntity he, final Content c,
            final double contentLength) {
        return new ReadableByteChannel() {
            double total = 0;

            @Override
            public int read(ByteBuffer dst) throws IOException {
                byte[] b = new byte[dst.capacity()];
                int r = is.read(b);
                //this sleep is just to slow down update to see, if the UI is working or not !
                // NU's update is very very very fast
                //try{Thread.sleep(1000);}catch(Exception a){}
                dst.put(b, 0, r);
                total += r;
                c.setProgress(total / contentLength);
                return r;
            }

            @Override
            public boolean isOpen() {
                return he.isStreaming();
            }

            @Override
            public void close() throws IOException {
                is.close();
            }
        };
    }
}