001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.geronimo.axis2.util;
020
021 import java.io.File;
022 import java.io.IOException;
023 import java.io.InputStream;
024 import java.net.URI;
025 import java.net.URISyntaxException;
026 import java.net.URL;
027
028 /**
029 */
030 public class SimpleURIResolver {
031
032 private URI uri;
033 private URL url;
034 private InputStream is;
035
036 public SimpleURIResolver() {
037 }
038
039 public SimpleURIResolver(String path) throws IOException {
040 this("", path);
041 }
042
043 public SimpleURIResolver(String baseUriStr, String uriStr) throws IOException {
044 if (baseUriStr != null && baseUriStr.startsWith("jar:")) {
045 tryJar(baseUriStr, uriStr);
046 } else if (uriStr.startsWith("jar:")) {
047 tryJar(uriStr);
048 } else {
049 tryFileSystem(baseUriStr, uriStr);
050 }
051 }
052
053 public void resolve(String baseUriStr, String uriStr) throws IOException {
054 this.uri = null;
055 this.url = null;
056 this.is = null;
057
058 if (baseUriStr != null && baseUriStr.startsWith("jar:")) {
059 tryJar(baseUriStr, uriStr);
060 } else if (uriStr.startsWith("jar:")) {
061 tryJar(uriStr);
062 } else {
063 tryFileSystem(baseUriStr, uriStr);
064 }
065 }
066
067 private void tryFileSystem(String baseUriStr, String uriStr) throws IOException {
068 try {
069 URI relative;
070 File uriFile = new File(uriStr);
071 uriFile = new File(uriFile.getAbsolutePath());
072
073 if (uriFile.exists()) {
074 relative = uriFile.toURI();
075 } else {
076 relative = new URI(uriStr.replaceAll(" ", "%20"));
077 }
078
079 if (relative.isAbsolute()) {
080 uri = relative;
081 url = relative.toURL();
082 is = url.openStream();
083 } else if (baseUriStr != null) {
084 URI base;
085 File baseFile = new File(baseUriStr);
086
087 if (!baseFile.exists() && baseUriStr.startsWith("file:/")) {
088 baseFile = new File(baseUriStr.substring(6));
089 }
090
091 if (baseFile.exists()) {
092 base = baseFile.toURI();
093 } else {
094 base = new URI(baseUriStr);
095 }
096
097 base = base.resolve(relative);
098 if (base.isAbsolute()) {
099 uri = base;
100 url = base.toURL();
101 is = url.openStream();
102 }
103 }
104 } catch (URISyntaxException e) {
105 // do nothing
106 }
107 }
108
109 private void tryJar(String baseStr, String uriStr) throws IOException {
110 int i = baseStr.indexOf('!');
111 if (i == -1) {
112 tryFileSystem(baseStr, uriStr);
113 }
114
115 String jarBase = baseStr.substring(0, i + 1);
116 String jarEntry = baseStr.substring(i + 1);
117 try {
118 URI u = new URI(jarEntry).resolve(uriStr);
119
120 tryJar(jarBase + u.toString());
121
122 if (is != null) {
123 if (u.isAbsolute()) {
124 url = u.toURL();
125 }
126 return;
127 }
128 } catch (URISyntaxException e) {
129 // do nothing
130 }
131
132 tryFileSystem("", uriStr);
133 }
134
135 private void tryJar(String uriStr) throws IOException {
136 int i = uriStr.indexOf('!');
137 if (i == -1) {
138 return;
139 }
140
141 url = new URL(uriStr);
142 try {
143 is = url.openStream();
144 try {
145 uri = url.toURI();
146 } catch (URISyntaxException ex) {
147 // ignore
148 }
149 } catch (IOException e) {
150 // do nothing
151 }
152 }
153
154 public URI getURI() {
155 return uri;
156 }
157
158 public URL getURL() {
159 return url;
160 }
161
162 public InputStream getInputStream() {
163 return is;
164 }
165
166 public boolean isResolved() {
167 return is != null;
168 }
169 }