package com.jogamp.common.net; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; /** * Generic resource location protocol connection, * using another sub-protocol as the vehicle for a piggyback protocol. *

* The details of the sub-protocol can be queried using {@link #getSubProtocol()}. *

*

* See example in {@link AssetURLConnection}. *

*/ public abstract class PiggybackURLConnection extends URLConnection { protected URL subUrl; protected URLConnection subConn; protected I context; /** * @param url the specific URL for this instance * @param context the piggyback context, defining state independent code and constants */ protected PiggybackURLConnection(final URL url, final I context) { super(url); this.context = context; } /** *

* Resolves the URL via {@link PiggybackURLContext#resolve(String)}, * see {@link AssetURLContext#resolve(String)} for an example. *

* * {@inheritDoc} */ @Override public synchronized void connect() throws IOException { if(!connected) { subConn = context.resolve(url.getPath()); subUrl = subConn.getURL(); connected = true; } } @Override public InputStream getInputStream() throws IOException { if(!connected) { throw new IOException("not connected"); } return subConn.getInputStream(); } /** * Returns the entry name of the asset. *
     * Plain     asset:test/lala.txt
     * Resolved  asset:jar:file:/data/app/jogamp.test.apk!/assets/test/lala.txt
     * Result          test/lala.txt
     * 
* @throws IOException is not connected **/ public abstract String getEntryName() throws IOException; /** * Returns the resolved sub protocol of the asset or null, ie: *
     * Plain     asset:test/lala.txt
     * Resolved  asset:jar:file:/data/app/jogamp.test.apk!/assets/test/lala.txt
     * Result          jar:file:/data/app/jogamp.test.apk!/assets/test/lala.txt
     * 
* * @throws IOException is not connected */ public URL getSubProtocol() throws IOException { if(!connected) { throw new IOException("not connected"); } return subUrl; } }