/* * Copyright (c) 2009-2012 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'jMonkeyEngine' nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.jme3.asset.plugins; import com.jme3.asset.*; import com.jme3.system.JmeSystem; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.logging.Logger; /** * The <code>ClasspathLocator</code> looks up an asset in the classpath. * * This locator is used by default in all jME3 projects (unless * {@link AssetManager#unregisterLocator(java.lang.String, java.lang.Class) unregistered} * ). * Unlike Java's default resource loading mechanism, the <code>ClasspathLocator</code> * enforces case-sensitivity on platforms which do not have it such as Windows. * Therefore, it is critical to provide a path matching the case of the file on * the filesystem. This also ensures that the file can be loaded if it was * later included in a <code>.JAR</code> file instead of a folder. * * @author Kirill Vainer */ public class ClasspathLocator implements AssetLocator { private static final Logger logger = Logger.getLogger(ClasspathLocator.class.getName()); private String root = ""; public ClasspathLocator(){ } public void setRootPath(String rootPath) { this.root = rootPath; if (root.equals("/")) root = ""; else if (root.length() > 1){ if (root.startsWith("/")){ root = root.substring(1); } if (!root.endsWith("/")) root += "/"; } } public AssetInfo locate(AssetManager manager, AssetKey key) { URL url; String name = key.getName(); if (name.startsWith("/")) name = name.substring(1); name = root + name; // if (!name.startsWith(root)){ // name = root + name; // } if (JmeSystem.isLowPermissions()){ url = ClasspathLocator.class.getResource("/" + name); }else{ url = Thread.currentThread().getContextClassLoader().getResource(name); } if (url == null) return null; if (url.getProtocol().equals("file")){ try { String path = new File(url.toURI()).getCanonicalPath(); // convert to / for windows if (File.separatorChar == '\\'){ path = path.replace('\\', '/'); } // compare path if (!path.endsWith(name)){ throw new AssetNotFoundException("Asset name doesn't match requirements.\n"+ "\"" + path + "\" doesn't match \"" + name + "\""); } } catch (URISyntaxException ex) { throw new AssetLoadException("Error converting URL to URI", ex); } catch (IOException ex){ throw new AssetLoadException("Failed to get canonical path for " + url, ex); } } try{ 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); } } }