Android Open Source - sdk-android-2 Cache Downloader






From Project

Back to project page sdk-android-2.

License

The source code is released under:

Apache License

If you think the Android project sdk-android-2 listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2013 Medium Entertainment, Inc.
 *//  w  w  w.  jav a 2s.c  o  m
 * 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 com.playhaven.android.cache;

import com.playhaven.android.PlayHaven;
import com.playhaven.android.PlayHavenException;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

/**
 * Download an external file to store in the cache
 */
public class CacheDownloader implements Runnable
{
    /**
     * Amount to copy at a time
     */
    private static final int BLOCK_SIZE = 4096;

    /**
     * The URL to download
     */
    private URL url;

    /**
     * The handler to notify on success or failure
     */
    private CacheResponseHandler handler;

    /**
     * The file to populate from the URL
     */
    private File file;

    /**
     * Create a new cache downloader
     *
     * @param url to download
     * @param handler to notify of success or failure
     * @param file to populate from the URL
     */
    public CacheDownloader(String url, CacheResponseHandler handler, File file) throws MalformedURLException {
        this(new URL(url), handler, file);
    }

    /**
     * Create a new cache downloader
     *
     * @param url to download
     * @param handler to notify of success or failure
     * @param file to populate from the URL
     */
    public CacheDownloader(URL url, CacheResponseHandler handler, File file)
    {
        this.url = url;
        this.handler = handler;
        this.file = file;
    }

    /** {@inheritDoc}
     */
    @Override
    public void run() {
        try{
            PlayHaven.v("Caching %s", url);

            /**
             * Start by making sure the destination directory exists
             */
            File parentFile = file.getParentFile();
            if(parentFile != null)
            {
                if(!(parentFile.mkdirs() || parentFile.isDirectory()))
                    throw new IOException("Unable to create directory: " + parentFile.getAbsolutePath());
            }

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            /**
             * Use non-blocking IO for (hopefully) better performance
             */
            ReadableByteChannel in = Channels.newChannel(connection.getInputStream());
            WritableByteChannel out = Channels.newChannel(new FileOutputStream(file));
            ByteBuffer buffer = ByteBuffer.allocateDirect(BLOCK_SIZE);

            /**
             * Reads bytes from the channel into the given buffer.
             * @see ReadableByteChannel#read(java.nio.ByteBuffer)
             */
            while( in.read(buffer) != -1 )
            {
                /**
                 * The limit is set to the current position, then the position is set to zero, and the mark is cleared.
                 * @see java.nio.ByteBuffer#flip()
                 */
                buffer.flip();

                /**
                 * Writes bytes from the given buffer to the channel.
                 * @see WritableByteChannel#write
                 */
                out.write(buffer);

                /**
                 * The remaining bytes will be moved to the head of the buffer, starting from position zero.
                 * Then the position is set to remaining(); the limit is set to capacity; the mark is cleared.
                 * @see java.nio.ByteBuffer#compact()
                 */
                buffer.compact();
            }

            /**
             * make sure completely drained
             */
            buffer.flip();
            while(buffer.hasRemaining())
                out.write(buffer);

            /**
             * And clean up references
             */
            out.close();
            in.close();
            handler.cacheSuccess(new CachedInfo(url, file, true));
        }catch(PlayHavenException e){
            handler.cacheFail(url, e);
        }catch(IOException e2){
            handler.cacheFail(url, new PlayHavenException("Unable to obtain content: " + url.toExternalForm(), e2));
        } catch (Exception e3) {
            handler.cacheFail(url, new PlayHavenException("Unable to obtain content: " + url.toExternalForm(), e3.getMessage()));
        }
    }
}




Java Source Code List

com.playhaven.android.DeviceId.java
com.playhaven.android.PlacementListener.java
com.playhaven.android.Placement.java
com.playhaven.android.PlayHavenException.java
com.playhaven.android.PlayHaven.java
com.playhaven.android.PushPlacement.java
com.playhaven.android.cache.BulkCacheDownloader.java
com.playhaven.android.cache.CacheCleaner.java
com.playhaven.android.cache.CacheDownloader.java
com.playhaven.android.cache.CacheResponseHandler.java
com.playhaven.android.cache.Cache.java
com.playhaven.android.cache.CachedInfo.java
com.playhaven.android.cache.package-info.java
com.playhaven.android.compat.UnityCompat.java
com.playhaven.android.compat.VendorCompat.java
com.playhaven.android.data.ContentUnitType.java
com.playhaven.android.data.CustomEvent.java
com.playhaven.android.data.DataCollectionField.java
com.playhaven.android.data.JsonUrlExtractor.java
com.playhaven.android.data.Purchase.java
com.playhaven.android.data.Reward.java
com.playhaven.android.data.package-info.java
com.playhaven.android.diagnostic.APIValidationIndicators.java
com.playhaven.android.diagnostic.DiagnosticApp.java
com.playhaven.android.diagnostic.DiagnosticPreferences.java
com.playhaven.android.diagnostic.InstrumentationReceiver.java
com.playhaven.android.diagnostic.Launcher.java
com.playhaven.android.diagnostic.OutputBox.java
com.playhaven.android.diagnostic.RequestTypeAdapter.java
com.playhaven.android.diagnostic.RequestType.java
com.playhaven.android.examples.ContentExample2.java
com.playhaven.android.examples.ContentExample.java
com.playhaven.android.examples.DialogExample.java
com.playhaven.android.examples.DisplayOptExample.java
com.playhaven.android.examples.EmbeddedExample.java
com.playhaven.android.examples.IAPTrackingExample.java
com.playhaven.android.examples.LoggingExample.java
com.playhaven.android.examples.MoreGamesExample.java
com.playhaven.android.examples.NoContent1Example.java
com.playhaven.android.examples.NoContent2Example.java
com.playhaven.android.examples.OnResumeExample.java
com.playhaven.android.examples.OpenExample.java
com.playhaven.android.examples.OptInExample.java
com.playhaven.android.examples.PreloadDialogExample.java
com.playhaven.android.examples.PreloadExample.java
com.playhaven.android.examples.PurchaseExample.java
com.playhaven.android.examples.RewardExample.java
com.playhaven.android.examples.WebviewFullscreenExample.java
com.playhaven.android.push.GCMBroadcastReceiver.java
com.playhaven.android.push.GCMRegistrationRequest.java
com.playhaven.android.push.NotificationBuilder.java
com.playhaven.android.push.PushReceiver.java
com.playhaven.android.req.ContentDispatchRequest.java
com.playhaven.android.req.ContentDispatchType.java
com.playhaven.android.req.ContentRequest.java
com.playhaven.android.req.ContentUnitRequest.java
com.playhaven.android.req.CustomEventRequest.java
com.playhaven.android.req.Identifier.java
com.playhaven.android.req.InstallRequest.java
com.playhaven.android.req.MetadataRequest.java
com.playhaven.android.req.NoContentException.java
com.playhaven.android.req.NoIdentifierException.java
com.playhaven.android.req.OpenRequest.java
com.playhaven.android.req.PlayHavenRequest.java
com.playhaven.android.req.PurchaseTrackingRequest.java
com.playhaven.android.req.PushTrackingRequest.java
com.playhaven.android.req.RequestListener.java
com.playhaven.android.req.ServerErrorHandler.java
com.playhaven.android.req.SignatureException.java
com.playhaven.android.req.SubcontentRequest.java
com.playhaven.android.req.UrlRequest.java
com.playhaven.android.req.UserAgent.java
com.playhaven.android.req.package-info.java
com.playhaven.android.util.DisplayUtil.java
com.playhaven.android.util.GoogleAdvertisementUtil.java
com.playhaven.android.util.GooglePlayServicesUtil.java
com.playhaven.android.util.JsonUtil.java
com.playhaven.android.util.KontagentUtil.java
com.playhaven.android.util.MemoryReporter.java
com.playhaven.android.util.TimeZoneFormatter.java
com.playhaven.android.util.package-info.java
com.playhaven.android.view.Badge.java
com.playhaven.android.view.ChildView.java
com.playhaven.android.view.DefaultPlayHavenListener.java
com.playhaven.android.view.FrameManager.java
com.playhaven.android.view.FullScreen.java
com.playhaven.android.view.HTMLView.java
com.playhaven.android.view.MoreGames.java
com.playhaven.android.view.NativeView.java
com.playhaven.android.view.PlayHavenListener.java
com.playhaven.android.view.PlayHavenView.java
com.playhaven.android.view.Windowed.java
com.playhaven.android.view.package-info.java
com.playhaven.android.package-info.java
javax.annotation.Generated.java
javax.annotation.package-info.java
${package}.__artifactId__Activity.java