You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by tl...@apache.org on 2006/11/09 12:14:42 UTC
svn commit: r472861 - in
/incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource:
ExtendedURIResolver.java URIResolver.java
Author: tli
Date: Thu Nov 9 03:14:36 2006
New Revision: 472861
URL: http://svn.apache.org/viewvc?view=rev&rev=472861
Log:
revert and investigate for error
Modified:
incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java
incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/URIResolver.java
Modified: incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java?view=diff&rev=472861&r1=472860&r2=472861
==============================================================================
--- incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java (original)
+++ incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java Thu Nov 9 03:14:36 2006
@@ -21,19 +21,74 @@
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.Stack;
import org.xml.sax.InputSource;
+
public class ExtendedURIResolver {
- private URIResolver currentResolver;
+ private Stack<ResolverInfo> stack = new Stack<ResolverInfo>();
+ private org.apache.cxf.resource.URIResolver currentResolver;
private Stack<InputStream> resourceOpened = new Stack<InputStream>();
-
+ private class ResolverInfo {
+ String uri;
+ org.apache.cxf.resource.URIResolver resolver;
+ public ResolverInfo(String uri, org.apache.cxf.resource.URIResolver resolver) {
+ this.uri = uri;
+ this.resolver = resolver;
+ }
+ public String getUri() {
+ return uri;
+ }
+ public org.apache.cxf.resource.URIResolver getResolver() {
+ return resolver;
+ }
+ }
+
public InputSource resolve(String schemaLocation, String baseUri) {
try {
- currentResolver = new URIResolver();
+ if (baseUri != null) {
+ URI check = null;
+ if (baseUri.startsWith("classpath:")) {
+ check = new URI(baseUri.substring(10));
+ } else if (baseUri.startsWith("jar:")) {
+ int i = baseUri.indexOf("!");
+ if (i != -1) {
+ String bu = baseUri.substring(i + 1);
+ check = new URI(bu.startsWith("file:") ? bu : "file:" + bu);
+ } else {
+ check = new URI(baseUri);
+ }
+ } else {
+ baseUri = baseUri.startsWith("file:") ? baseUri : "file:" + baseUri;
+ check = new URI(baseUri);
+ }
+ if (check.isAbsolute()) {
+ currentResolver = new org.apache.cxf.resource.URIResolver();
+ stack.addElement(new ResolverInfo(schemaLocation, currentResolver));
+ } else {
+ while (!stack.isEmpty()) {
+ ResolverInfo ri = stack.pop();
+ if (ri.getUri().equals(baseUri)) {
+ currentResolver = ri.getResolver();
+ stack.addElement(ri);
+ break;
+ }
+ }
+ stack.addElement(new ResolverInfo(schemaLocation, currentResolver));
+ }
+ if (currentResolver == null) {
+ throw new RuntimeException("invalidate schema import");
+ }
+ } else {
+ if (currentResolver == null) {
+ currentResolver = new org.apache.cxf.resource.URIResolver();
+ }
+ }
currentResolver.resolveStateful(baseUri, schemaLocation, getClass());
if (currentResolver.isResolved()) {
if (currentResolver.getURI() != null && currentResolver.getURI().isAbsolute()) {
@@ -50,12 +105,14 @@
return source;
}
- } catch (Exception e) {
+ } catch (IOException e) {
+ // move on...
+ } catch (URISyntaxException use) {
// move on...
}
return new InputSource(schemaLocation);
}
-
+
public void close() {
try {
while (!resourceOpened.isEmpty()) {
@@ -66,9 +123,9 @@
// move on...
}
}
-
+
public String getLatestImportURI() {
return currentResolver.getURI().toString();
}
-
+
}
Modified: incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/URIResolver.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/URIResolver.java?view=diff&rev=472861&r1=472860&r2=472861
==============================================================================
--- incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/URIResolver.java (original)
+++ incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/resource/URIResolver.java Thu Nov 9 03:14:36 2006
@@ -27,6 +27,7 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
+import java.util.Stack;
import org.apache.cxf.common.classloader.ClassLoaderUtils;
@@ -45,8 +46,23 @@
private URI uri;
private InputStream is;
private Class calling;
+
+ private Stack<Location> history = new Stack<Location>();
- private String lastImportUrl;
+ private class Location {
+ private String base;
+ private String relative;
+ public Location(String base, String relative) {
+ this.base = base;
+ this.relative = relative;
+ }
+ public String getBase() {
+ return base;
+ }
+ public String getRelative() {
+ return relative;
+ }
+ }
public URIResolver() throws IOException {
}
@@ -58,7 +74,7 @@
public URIResolver(String baseUriStr, String uriStr) throws IOException {
this(baseUriStr, uriStr, null);
}
-
+
public URIResolver(String baseUriStr, String uriStr, Class calling) throws IOException {
this.calling = (calling != null) ? calling : getClass();
@@ -73,73 +89,97 @@
}
}
- private String getAbsoluteUrlStr(String baseUriStr, String uriStr) throws MalformedURLException {
+
+ public void resolveStateful(String baseUriStr, String uriStr, Class callingCls) throws IOException {
+ this.calling = (callingCls != null) ? callingCls : getClass();
+
+ if (uriStr.startsWith("classpath:")) {
+ tryClasspath(uriStr);
+ } else if (baseUriStr != null && baseUriStr.startsWith("jar:")) {
+ tryJarState(baseUriStr, uriStr);
+ } else if (uriStr.startsWith("jar:")) {
+ tryJar(uriStr);
+ } else {
+ tryFileSystemState(baseUriStr, uriStr);
+ }
+ }
+
+ private URI getAbsoluteFileStr(String baseUriStr, String uriStr) throws MalformedURLException {
URI relative;
URI base;
- try {
- relative = new URI(uriStr);
+ try {
+ File uriFile = new File(uriStr);
+ uriFile = new File(uriFile.getAbsolutePath());
+ if (uriFile.exists()) {
+ relative = uriFile.toURI();
+ } else {
+ relative = new URI(uriStr);
+ }
if (relative.isAbsolute()) {
- return new URI(uriStr).toString();
+ return new URI(uriStr);
} else if (baseUriStr != null) {
- String prefix = "file:";
- if (baseUriStr.startsWith("classpath:")) {
- baseUriStr = baseUriStr.substring(10);
- prefix = "";
- } else if (baseUriStr.startsWith("jar:")) {
- int i = baseUriStr.indexOf("!");
- if (i != -1) {
- baseUriStr = baseUriStr.substring(i + 1);
- } else {
- baseUriStr = baseUriStr.substring(4);
- }
- prefix = "";
- } else if (baseUriStr.startsWith("file:")) {
- prefix = "";
- }
base = new URI(baseUriStr);
if (base.isAbsolute()) {
- return prefix + base.resolve(relative).toString();
+ return base.resolve(relative);
} else {
+ Location location = null;
// assume that the outmost element of history is parent
- if (lastImportUrl != null) {
- URI result = new URI(lastImportUrl).resolve(relative);
- return prefix + result.toString();
+ while (!history.empty()) {
+ location = history.pop();
+ if (location.getRelative().equals(baseUriStr)) {
+ break;
+ } else {
+ location = null;
+ }
+ }
+ if (location != null) {
+ URI result = getAbsoluteFileStr(location.base, location.relative).resolve(relative);
+ history.push(location);
+ return result;
} else {
return null;
}
}
- }
+ }
} catch (URISyntaxException e) {
return null;
}
return null;
}
-
- public void resolveStateful(String baseUriStr, String uriStr, Class callingCls)
- throws IOException, MalformedURLException, URISyntaxException {
-
- this.calling = (callingCls != null) ? callingCls : getClass();
-
+
+ private void tryFileSystemState(String baseUriStr, String uriStr)
+ throws IOException, MalformedURLException {
if (baseUriStr == null && uriStr == null) {
return;
- }
- String finalRelative = getAbsoluteUrlStr(baseUriStr, uriStr);
- if (finalRelative != null) {
- if (finalRelative.startsWith("file:")) {
- File targetFile = new File(new URI(finalRelative));
+ }
+ URI finalRelative = getAbsoluteFileStr(baseUriStr, uriStr);
+ try {
+ if (!(new URI(uriStr)).isAbsolute()) {
+ history.push(new Location(baseUriStr, uriStr));
+ }
+ if (finalRelative != null) {
+ File targetFile = new File(finalRelative.toString().startsWith("file:") ? finalRelative
+ : new URI("file:" + finalRelative.toString()));
if (!targetFile.exists()) {
- tryClasspath(finalRelative.substring(5));
+ tryClasspath(finalRelative.toString().substring(5));
return;
+ }
+ URI target;
+ if (targetFile.exists()) {
+ target = targetFile.toURI();
} else {
- uri = targetFile.toURI();
- is = targetFile.toURI().toURL().openStream();
+ target = finalRelative;
+ }
+ if (target.isAbsolute()) {
+ uri = target;
+ is = target.toURL().openStream();
}
- } else {
- tryClasspath(finalRelative);
}
+ } catch (URISyntaxException ue) {
+ // move on
}
}
-
+
private void tryFileSystem(String baseUriStr, String uriStr) throws IOException, MalformedURLException {
try {
URI relative;
@@ -151,7 +191,7 @@
} else {
relative = new URI(uriStr);
}
-
+
if (relative.isAbsolute()) {
uri = relative;
is = relative.toURL().openStream();
@@ -168,7 +208,7 @@
} else {
base = new URI(baseUriStr);
}
-
+
base = base.resolve(relative);
if (base.isAbsolute()) {
is = base.toURL().openStream();
@@ -195,7 +235,22 @@
}
}
-
+ private void tryJarState(String baseStr, String uriStr) throws IOException {
+ int i = baseStr.indexOf('!');
+ if (i == -1) {
+ tryFileSystemState(baseStr, uriStr);
+ return;
+ }
+ baseStr = baseStr.substring(i + 1);
+ URI u = getAbsoluteFileStr(baseStr.startsWith("file:") ? baseStr : "file:" + baseStr, uriStr);
+ // remove the prefix "file:"
+ tryClasspath(u.toString().substring(5));
+ if (is != null) {
+ return;
+ }
+ tryFileSystemState("", uriStr);
+ }
+
private void tryJar(String baseStr, String uriStr) throws IOException {
int i = baseStr.indexOf('!');
if (i == -1) {
@@ -211,10 +266,10 @@
} catch (URISyntaxException e) {
// do nothing
}
-
+
tryFileSystem("", uriStr);
}
-
+
private void tryJar(String uriStr) throws IOException {
int i = uriStr.indexOf('!');
if (i == -1) {
@@ -223,7 +278,7 @@
uriStr = uriStr.substring(i + 1);
tryClasspath(uriStr);
}
-
+
private void tryClasspath(String uriStr) throws IOException {
if (uriStr.startsWith("classpath:")) {
uriStr = uriStr.substring(10);
@@ -233,17 +288,7 @@
tryRemote(uriStr);
} else {
try {
- lastImportUrl = url.toString();
- if (lastImportUrl.startsWith("jar:")) {
- int i = lastImportUrl.indexOf("!");
- if (i != -1) {
- uri = new URI(url.toString().substring(i + 1));
- } else {
- uri = new URI(url.toString().substring(4));
- }
- } else {
- uri = new URI(url.toString());
- }
+ uri = new URI(url.toString());
} catch (URISyntaxException e) {
// How would this occurr??
}
@@ -282,12 +327,8 @@
public File getFile() {
return file;
}
-
+
public boolean isResolved() {
return is != null;
- }
-
- public String getLastImportUrl() {
- return lastImportUrl;
}
}