* 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}
|
* Implementations of this method should return an {@link InputStream}
|
||||||
* allowing access to the data represented by the {@link AssetKey}.
|
* 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.
|
* @return The asset data.
|
||||||
*/
|
*/
|
||||||
public abstract InputStream openStream();
|
public abstract InputStream openStream();
|
||||||
|
@ -32,14 +32,17 @@
|
|||||||
|
|
||||||
package com.jme3.asset.plugins;
|
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 com.jme3.system.JmeSystem;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.util.logging.Logger;
|
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 static final Logger logger = Logger.getLogger(ClasspathLocator.class.getName());
|
||||||
private String root = "";
|
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(){
|
public ClasspathLocator(){
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,10 +111,11 @@ public class ClasspathLocator implements AssetLocator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
URLConnection conn = url.openConnection();
|
return UrlAssetInfo.create(manager, key, url);
|
||||||
conn.setUseCaches(false);
|
|
||||||
return new ClasspathAssetInfo(manager, key, conn);
|
|
||||||
}catch (IOException ex){
|
}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);
|
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 static final Logger logger = Logger.getLogger(UrlLocator.class.getName());
|
||||||
private URL root;
|
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) {
|
public void setRootPath(String rootPath) {
|
||||||
try {
|
try {
|
||||||
this.root = new URL(rootPath);
|
this.root = new URL(rootPath);
|
||||||
@ -78,22 +63,9 @@ public class UrlLocator implements AssetLocator {
|
|||||||
|
|
||||||
public AssetInfo locate(AssetManager manager, AssetKey key) {
|
public AssetInfo locate(AssetManager manager, AssetKey key) {
|
||||||
String name = key.getName();
|
String name = key.getName();
|
||||||
|
|
||||||
try{
|
try{
|
||||||
URL url = new URL(root, name);
|
URL url = new URL(root, name);
|
||||||
URLConnection conn = url.openConnection();
|
return UrlAssetInfo.create(manager, key, url);
|
||||||
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);
|
|
||||||
}catch (IOException ex){
|
}catch (IOException ex){
|
||||||
logger.log(Level.WARNING, "Error while locating " + name, ex);
|
logger.log(Level.WARNING, "Error while locating " + name, ex);
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user