159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.asset.plugins;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetInfo;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetKey;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetLoadException;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetManager;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.InputStream;
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.net.URL;
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.net.URLConnection;
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Handles loading of assets from a URL
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Kirill Vainer
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class UrlAssetInfo extends AssetInfo {
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private URL url;
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private InputStream in;
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static UrlAssetInfo create(AssetManager assetManager, AssetKey key, URL url) throws IOException {
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // Check if URL can be reached. This will throw
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // IOException which calling code will handle.
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        URLConnection conn = url.openConnection();
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        conn.setUseCaches(false);
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        InputStream in = conn.getInputStream();
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // For some reason url cannot be reached?
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (in == null){
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return null;
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }else{
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return new UrlAssetInfo(assetManager, key, url, in);
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private UrlAssetInfo(AssetManager assetManager, AssetKey key, URL url, InputStream in) throws IOException {
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super(assetManager, key);
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.url = url;
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.in = in;
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean hasInitialConnection(){
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return in != null;
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public InputStream openStream() {
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (in != null){
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            // Reuse the already existing stream (only once)
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            InputStream in2 = in;
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            in = null;
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return in2;
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }else{
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            // Create a new stream for subsequent invocations.
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            try {
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                URLConnection conn = url.openConnection();
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                conn.setUseCaches(false);
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return conn.getInputStream();
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            } catch (IOException ex) {
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new AssetLoadException("Failed to read URL " + url, ex);
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
66