Java tutorial
/* * 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(); } }; } }