* 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
3.0
sha..rd 13 years ago
parent d8682c94c3
commit 177c88d645
  1. 4
      engine/src/core/com/jme3/asset/AssetInfo.java
  2. 35
      engine/src/desktop/com/jme3/asset/plugins/ClasspathLocator.java
  3. 66
      engine/src/desktop/com/jme3/asset/plugins/UrlAssetInfo.java
  4. 30
      engine/src/desktop/com/jme3/asset/plugins/UrlLocator.java

@ -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);
}
}

@ -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…
Cancel
Save