* Rewrote handling of URL based locators to use a shared UrlAssetInfo.
* The AssetInfo.openStream() must create a new stream each time (required by javadoc/spec) git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8592 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
d8682c94c3
commit
177c88d645
@ -66,6 +66,10 @@ public abstract class AssetInfo {
|
||||
/**
|
||||
* Implementations of this method should return an {@link InputStream}
|
||||
* allowing access to the data represented by the {@link AssetKey}.
|
||||
* <p>
|
||||
* Each invocation of this method should return a new stream to the
|
||||
* asset data, starting at the beginning of the file.
|
||||
*
|
||||
* @return The asset data.
|
||||
*/
|
||||
public abstract InputStream openStream();
|
||||
|
@ -32,14 +32,17 @@
|
||||
|
||||
package com.jme3.asset.plugins;
|
||||
|
||||
import com.jme3.asset.*;
|
||||
import com.jme3.asset.AssetInfo;
|
||||
import com.jme3.asset.AssetKey;
|
||||
import com.jme3.asset.AssetLoadException;
|
||||
import com.jme3.asset.AssetLocator;
|
||||
import com.jme3.asset.AssetManager;
|
||||
import com.jme3.asset.AssetNotFoundException;
|
||||
import com.jme3.system.JmeSystem;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
@ -51,25 +54,6 @@ public class ClasspathLocator implements AssetLocator {
|
||||
private static final Logger logger = Logger.getLogger(ClasspathLocator.class.getName());
|
||||
private String root = "";
|
||||
|
||||
private static class ClasspathAssetInfo extends AssetInfo {
|
||||
|
||||
private URLConnection conn;
|
||||
|
||||
public ClasspathAssetInfo(AssetManager manager, AssetKey key, URLConnection conn){
|
||||
super(manager, key);
|
||||
this.conn = conn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream openStream() {
|
||||
try{
|
||||
return conn.getInputStream();
|
||||
}catch (IOException ex){
|
||||
return null; // failure..
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ClasspathLocator(){
|
||||
}
|
||||
|
||||
@ -127,10 +111,11 @@ public class ClasspathLocator implements AssetLocator {
|
||||
}
|
||||
|
||||
try{
|
||||
URLConnection conn = url.openConnection();
|
||||
conn.setUseCaches(false);
|
||||
return new ClasspathAssetInfo(manager, key, conn);
|
||||
return UrlAssetInfo.create(manager, key, url);
|
||||
}catch (IOException ex){
|
||||
// This is different handling than URL locator
|
||||
// since classpath locating would return null at the getResource()
|
||||
// call, otherwise there's a more critical error...
|
||||
throw new AssetLoadException("Failed to read URL " + url, ex);
|
||||
}
|
||||
}
|
||||
|
66
engine/src/desktop/com/jme3/asset/plugins/UrlAssetInfo.java
Normal file
66
engine/src/desktop/com/jme3/asset/plugins/UrlAssetInfo.java
Normal file
@ -0,0 +1,66 @@
|
||||
package com.jme3.asset.plugins;
|
||||
|
||||
import com.jme3.asset.AssetInfo;
|
||||
import com.jme3.asset.AssetKey;
|
||||
import com.jme3.asset.AssetLoadException;
|
||||
import com.jme3.asset.AssetManager;
|
||||
import com.jme3.asset.AssetNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
|
||||
/**
|
||||
* Handles loading of assets from a URL
|
||||
*
|
||||
* @author Kirill Vainer
|
||||
*/
|
||||
public class UrlAssetInfo extends AssetInfo {
|
||||
|
||||
private URL url;
|
||||
private InputStream in;
|
||||
|
||||
public static UrlAssetInfo create(AssetManager assetManager, AssetKey key, URL url) throws IOException {
|
||||
// Check if URL can be reached. This will throw
|
||||
// IOException which calling code will handle.
|
||||
URLConnection conn = url.openConnection();
|
||||
conn.setUseCaches(false);
|
||||
InputStream in = conn.getInputStream();
|
||||
|
||||
// For some reason url cannot be reached?
|
||||
if (in == null){
|
||||
return null;
|
||||
}else{
|
||||
return new UrlAssetInfo(assetManager, key, url, in);
|
||||
}
|
||||
}
|
||||
|
||||
private UrlAssetInfo(AssetManager assetManager, AssetKey key, URL url, InputStream in) throws IOException {
|
||||
super(assetManager, key);
|
||||
this.url = url;
|
||||
this.in = in;
|
||||
}
|
||||
|
||||
public boolean hasInitialConnection(){
|
||||
return in != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream openStream() {
|
||||
if (in != null){
|
||||
// Reuse the already existing stream (only once)
|
||||
InputStream in2 = in;
|
||||
in = null;
|
||||
return in2;
|
||||
}else{
|
||||
// Create a new stream for subsequent invocations.
|
||||
try {
|
||||
URLConnection conn = url.openConnection();
|
||||
conn.setUseCaches(false);
|
||||
return conn.getInputStream();
|
||||
} catch (IOException ex) {
|
||||
throw new AssetLoadException("Failed to read URL " + url, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -53,21 +53,6 @@ public class UrlLocator implements AssetLocator {
|
||||
private static final Logger logger = Logger.getLogger(UrlLocator.class.getName());
|
||||
private URL root;
|
||||
|
||||
private static class UrlAssetInfo extends AssetInfo {
|
||||
|
||||
private InputStream in;
|
||||
|
||||
public UrlAssetInfo(AssetManager manager, AssetKey key, InputStream in){
|
||||
super(manager, key);
|
||||
this.in = in;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream openStream() {
|
||||
return in;
|
||||
}
|
||||
}
|
||||
|
||||
public void setRootPath(String rootPath) {
|
||||
try {
|
||||
this.root = new URL(rootPath);
|
||||
@ -78,22 +63,9 @@ public class UrlLocator implements AssetLocator {
|
||||
|
||||
public AssetInfo locate(AssetManager manager, AssetKey key) {
|
||||
String name = key.getName();
|
||||
|
||||
try{
|
||||
URL url = new URL(root, name);
|
||||
URLConnection conn = url.openConnection();
|
||||
conn.setUseCaches(false);
|
||||
conn.setDoOutput(false);
|
||||
InputStream in;
|
||||
try {
|
||||
in = conn.getInputStream();
|
||||
if (in == null)
|
||||
return null;
|
||||
} catch (FileNotFoundException ex){
|
||||
return null;
|
||||
}
|
||||
|
||||
return new UrlAssetInfo(manager, key, in);
|
||||
return UrlAssetInfo.create(manager, key, url);
|
||||
}catch (IOException ex){
|
||||
logger.log(Level.WARNING, "Error while locating " + name, ex);
|
||||
return null;
|
||||
|
Loading…
x
Reference in New Issue
Block a user