blob: d03b4211c64ebadb74093cbfa6b16cca4c21b3df [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.util;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.apache.uima.UIMARuntimeException;
/**
* An input source used by the {@link XMLParser} to read XML documents for parsing.
* <p>
* The application uses the {@link #XMLInputSource(File)} constructor to create an
* <code>XMLInputSource</code> from a descriptor <code>File</code>. Alternatively, if the
* source of the XML is not a file, the {@link #XMLInputSource(InputStream,File)} constructor may be
* used to read the XML from an input stream. The second argument to this constructor is the
* relative path base, to be used if the descriptor contains imports with relative paths. It is
* acceptable to set this to null if it is known that the descriptor does not contain any such
* imports.
*/
public class XMLInputSource {
/**
* InputStream from which the XML document is read.
*/
private InputStream mInputStream;
/**
* URL that we're parsing from
*/
private URL mURL;
/**
* Creates an <code>XMLInputSource</code> from a descriptor file.
*
* @param aFile
* file to read from
*
* @throws IOException
* if an I/O error occurs
*/
public XMLInputSource(File aFile) throws IOException {
this(aFile.toURL());
}
/**
* Creates an <code>XMLInputSource</code> from a descriptor file.
*
* @param aUrlOrFileName
* a URL or a file name to read from
*
* @throws IOException
* if an I/O error occurs
*/
public XMLInputSource(String aUrlOrFileName) throws IOException {
//try as URL first, then as file name
try {
mURL = new URL(aUrlOrFileName);
}
catch (MalformedURLException e) {
mURL = new File(aUrlOrFileName).toURL();
}
mInputStream = mURL.openStream();
}
/**
* Creates an XMLInputSource from an existing InputStream.
*
* @param aInputStream
* input stream from which to read
* @param aRelativePathBase
* base for resolving relative paths. This must be a directory.
*/
public XMLInputSource(InputStream aInputStream, File aRelativePathBase) {
mInputStream = aInputStream;
try {
mURL = aRelativePathBase == null ? null : aRelativePathBase.toURL();
} catch (MalformedURLException e) {
throw new UIMARuntimeException(e);
}
}
/**
* Creates an <code>XMLInputSource</code> from a URL.
*
* @param aURL
* URL to read from
*
* @throws IOException
* if an I/O error occurs
*/
public XMLInputSource(URL aURL) throws IOException {
mURL = aURL;
// replace openStream which is openConnection().getInputStream() with
// version that allows setting caching(false)
// See https://issues.apache.org/jira/browse/UIMA-1746
URLConnection urlConnection= aURL.openConnection();
urlConnection.setUseCaches(false);
mInputStream = urlConnection.getInputStream();
// mInputStream = aURL.openStream();
}
/**
* Gets the InputStream from which to read an XML document.
*
* @return an InputStream from which an XML document may be read
*/
public InputStream getInputStream() {
return mInputStream;
}
/**
* Gets the base for resolving relative paths. This must be a directory.
*
* @return the base for resolving relative paths, <code>null</code> if none has been specified.
*
* @deprecated Use {@link #getURL()} instead.
*/
@Deprecated
public File getRelativePathBase() {
// use the parent directory as the base for relative path resolution
String path = mURL.getPath();
return new File(path).getParentFile();
}
/**
* Gets the base for resolving relative paths. This must be a directory.
*
* @return the base for resolving relative paths, <code>null</code> if none has been specified.
*/
public URL getURL() {
return mURL;
}
/**
* Closes the underlying <code>InputStream</code>.
*
* @throws IOException if an I/O error occurs.
*/
public void close()
throws IOException
{
if (mInputStream != null)
{
mInputStream.close();
}
mURL = null;
}
}