IDEMPIERE-478 Zk: Theme. Fixed can't load theme resources from osgi fragment.
This commit is contained in:
parent
14f2125874
commit
5665ebd487
|
@ -24,7 +24,7 @@
|
||||||
<classpathentry exported="true" kind="lib" path="lib/zk.jar" sourcepath="lib/src/zk-sources.jar"/>
|
<classpathentry exported="true" kind="lib" path="lib/zk.jar" sourcepath="lib/src/zk-sources.jar"/>
|
||||||
<classpathentry exported="true" kind="lib" path="lib/zkplus.jar"/>
|
<classpathentry exported="true" kind="lib" path="lib/zkplus.jar"/>
|
||||||
<classpathentry exported="true" kind="lib" path="lib/zul.jar" sourcepath="lib/src/zul-sources.jar"/>
|
<classpathentry exported="true" kind="lib" path="lib/zul.jar" sourcepath="lib/src/zul-sources.jar"/>
|
||||||
<classpathentry exported="true" kind="lib" path="lib/zweb.jar" sourcepath="lib/zweb-sources.jar"/>
|
<classpathentry exported="true" kind="lib" path="lib/zweb.jar" sourcepath="lib/src/zweb-sources.jar"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
<classpathentry exported="true" kind="lib" path="lib/ckez.jar"/>
|
<classpathentry exported="true" kind="lib" path="lib/ckez.jar"/>
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
/* ResourceCaches.java
|
||||||
|
|
||||||
|
Purpose:
|
||||||
|
|
||||||
|
Description:
|
||||||
|
|
||||||
|
History:
|
||||||
|
Tue Aug 30 18:31:05 2005, Created by tomyeh
|
||||||
|
|
||||||
|
Copyright (C) 2005 Potix Corporation. All Rights Reserved.
|
||||||
|
|
||||||
|
{{IS_RIGHT
|
||||||
|
This program is distributed under LGPL Version 2.1 in the hope that
|
||||||
|
it will be useful, but WITHOUT ANY WARRANTY.
|
||||||
|
}}IS_RIGHT
|
||||||
|
*/
|
||||||
|
package org.zkoss.web.util.resource;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
|
import org.zkoss.lang.SystemException;
|
||||||
|
import org.zkoss.util.logging.Log;
|
||||||
|
import org.zkoss.web.servlet.Servlets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utilities to load (and parse) the Servlet resource.
|
||||||
|
* Notice that {@link ResourceCache} and {@link ResourceLoader}
|
||||||
|
* must be used rather than
|
||||||
|
* {@link org.zkoss.util.resource.ResourceCache}
|
||||||
|
* and {@link org.zkoss.util.resource.Loader}.
|
||||||
|
*
|
||||||
|
* <p>Usage:
|
||||||
|
* <ol>
|
||||||
|
* <li>Implements a loader by extending from {@link ResourceLoader}.</li>
|
||||||
|
* <li>Creates a resource cache ({@link ResourceCache})
|
||||||
|
* by use of the loader in the previous step.</li>
|
||||||
|
* <li>Invoke {@link #get} to load the resource.</li>
|
||||||
|
* </ol>
|
||||||
|
*
|
||||||
|
* @author tomyeh
|
||||||
|
*/
|
||||||
|
public class ResourceCaches {
|
||||||
|
private static final Log log = Log.lookup(ResourceCaches.class);
|
||||||
|
|
||||||
|
/** Loads, parses and returns the resource of the specified URI,
|
||||||
|
* or null if not found. The parser is defined by the loader defined
|
||||||
|
* in {@link ResourceCache}.
|
||||||
|
*
|
||||||
|
* @param cache the resource cache.
|
||||||
|
* Note: its loader must extend from {@link ResourceLoader}.
|
||||||
|
* @param path the URI path
|
||||||
|
* @param extra the extra parameter that will be passed to
|
||||||
|
* {@link ResourceLoader#parse(String,File,Object)} and
|
||||||
|
* {@link ResourceLoader#parse(String,URL,Object)}
|
||||||
|
*/
|
||||||
|
public static final <V>
|
||||||
|
V get(ResourceCache<V> cache, ServletContext ctx, String path, Object extra) {
|
||||||
|
//20050905: Tom Yeh
|
||||||
|
//We don't need to handle the default name if user specifies only a dir
|
||||||
|
//because it is handled by the container directlys
|
||||||
|
//And, web developer has to specify <welcome-file> in web.xml
|
||||||
|
URL url = null;
|
||||||
|
if (path == null || path.length() == 0) path = "/";
|
||||||
|
else if (path.charAt(0) != '/') {
|
||||||
|
if (path.indexOf("://") > 0) {
|
||||||
|
try {
|
||||||
|
url = new URL(path);
|
||||||
|
} catch (java.net.MalformedURLException ex) {
|
||||||
|
throw new SystemException(ex);
|
||||||
|
}
|
||||||
|
}else path = '/' + path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (url == null) {
|
||||||
|
if (path.startsWith("/~")) {
|
||||||
|
final ServletContext ctx0 = ctx;
|
||||||
|
final String path0 = path;
|
||||||
|
final int j = path.indexOf('/', 2);
|
||||||
|
final String ctxpath;
|
||||||
|
if (j >= 0) {
|
||||||
|
ctxpath = "/" + path.substring(2, j);
|
||||||
|
path = path.substring(j);
|
||||||
|
} else {
|
||||||
|
ctxpath = "/" + path.substring(2);
|
||||||
|
path = "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
final ExtendletContext extctx =
|
||||||
|
Servlets.getExtendletContext(ctx, ctxpath.substring(1));
|
||||||
|
if (extctx != null) {
|
||||||
|
url = extctx.getResource(path);
|
||||||
|
// if (log.debugable()) log.debug("Resolving "+path0+" to "+url);
|
||||||
|
if (url == null)
|
||||||
|
return null;
|
||||||
|
try {
|
||||||
|
return cache.get(new ResourceInfo(path, url, extra));
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
final IOException ioex = getIOException(ex);
|
||||||
|
if (ioex == null)
|
||||||
|
throw SystemException.Aide.wrap(ex);
|
||||||
|
log.warningBriefly("Unable to load "+url, ioex);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = ctx.getContext(ctxpath);
|
||||||
|
if (ctx == null) { //failed
|
||||||
|
// if (log.debugable()) log.debug("Context not found: "+ctxpath);
|
||||||
|
ctx = ctx0; path = path0;//restore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final String flnm = ctx.getRealPath(path);
|
||||||
|
if (flnm != null) {
|
||||||
|
File file = new File(flnm);
|
||||||
|
if (file.exists()) {
|
||||||
|
try {
|
||||||
|
return cache.get(new ResourceInfo(path, file, extra));
|
||||||
|
//it is loader's job to check the existence
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
final IOException ioex = getIOException(ex);
|
||||||
|
if (ioex == null)
|
||||||
|
throw SystemException.Aide.wrap(ex);
|
||||||
|
log.warningBriefly("Unable to load "+flnm, ioex);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//try url because some server uses JAR format
|
||||||
|
try {
|
||||||
|
if (url == null)
|
||||||
|
url = ctx.getResource(path);
|
||||||
|
if (url != null)
|
||||||
|
return cache.get(new ResourceInfo(path, url, extra));
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
final IOException ioex = getIOException(ex);
|
||||||
|
if (ioex == null)
|
||||||
|
throw SystemException.Aide.wrap(ex);
|
||||||
|
log.warningBriefly("Unable to load "+path, ioex);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
//don't eat exceptions other than IOException
|
||||||
|
private static IOException getIOException(Throwable ex) {
|
||||||
|
for (; ex != null; ex = ex.getCause())
|
||||||
|
if (ex instanceof IOException)
|
||||||
|
return (IOException)ex;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue