All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mindsnacks.zinc.classes.jobs.ZincDownloader Maven / Gradle / Ivy

package com.mindsnacks.zinc.classes.jobs;

import com.github.kevinsawicki.http.HttpRequest;
import com.google.gson.Gson;
import com.mindsnacks.zinc.classes.ZincJobFactory;
import com.mindsnacks.zinc.classes.ZincLogging;
import com.mindsnacks.zinc.classes.data.*;
import com.mindsnacks.zinc.classes.fileutils.FileHelper;
import com.mindsnacks.zinc.exceptions.ZincRuntimeException;

import java.io.File;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;

/**
 * User: NachoSoto
 * Date: 9/3/13
 */
public class ZincDownloader implements ZincJobFactory {
    private final Gson mGson;

    public ZincDownloader(final Gson gson) {
        mGson = gson;
    }

    @Override
    public Callable downloadCatalog(final SourceURL sourceURL) {
        final URL url;
        try {
            url = sourceURL.getCatalogFileURL();
        } catch (MalformedURLException e) {
            throw new ZincRuntimeException("Error getting catalog file URL for source: " + sourceURL, e);
        }

        return new ZincDownloadObjectJob(createRequestExecutor(), url, mGson, ZincCatalog.class);
    }

    @Override
    public Callable downloadManifest(final SourceURL sourceURL, final String bundleName, final int version) {
        final URL manifestFileURL;
        try {
            manifestFileURL = sourceURL.getManifestFileURL(bundleName, version);
        } catch (MalformedURLException e) {
            throw new ZincRuntimeException("Invalid manifest URL: " + sourceURL, e);
        }
        return new ZincDownloadObjectJob(createRequestExecutor(), manifestFileURL, mGson, ZincManifest.class);
    }

    @Override
    public Callable downloadArchive(final URL url, final File root, final String child, final boolean override) {
        return new ZincDownloadArchiveJob(createRequestExecutor(), url, root, child, override);
    }

    @Override
    public Callable cloneBundle(final ZincCloneBundleRequest request, final Future catalogFuture) {
        return new ZincCloneBundleJob(request, this, catalogFuture);
    }

    @Override
    public Callable downloadBundle(final ZincCloneBundleRequest request, final Future catalogFuture) {
        return new ZincDownloadBundleJob(request, this, catalogFuture);
    }

    @Override
    public Callable downloadFile(final URL url,
                                             final File root,
                                             final String child,
                                             final boolean override) {
        return new ZincDownloadFileJob(createRequestExecutor(), url, root, child, override);
    }

    @Override
    public Callable unarchiveBundle(final ZincBundle downloadedBundle,
                                                final ZincCloneBundleRequest request,
                                                final ZincManifest manifest) {
        return new ZincUnarchiveBundleJob(downloadedBundle, request, manifest, new FileHelper(mGson));
    }

    private ZincRequestExecutor createRequestExecutor() {
        return new ZincRequestExecutor() {
            @Override
            public InputStream get(final URL url) throws AbstractZincDownloadJob.DownloadFileError {
                ZincLogging.log("ZincRequestExecutor", "Downloading " + url);

                try {
                    final HttpRequest request = getRequest(url);
                    final int code = request.code();

                    if (code == HttpURLConnection.HTTP_OK) {
                        return request.buffer();
                    } else {
                        throw new AbstractZincDownloadJob.DownloadFileError(String.format("Error downloading file at url '%s'. Status code: %d", url, code));
                    }
                } catch (HttpRequest.HttpRequestException e) {
                    throw new AbstractZincDownloadJob.DownloadFileError("Error downloading file at url '" + url + "'", e);
                }
            }

            private HttpRequest getRequest(final URL url) {
                return HttpRequest.get(url).acceptGzipEncoding().uncompress(true);
            }
        };
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy