blob: e59ed195f5c488436194a8e20865788e2a85cf7d [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.resource;
import java.io.File;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Map;
import org.apache.uima.resource.impl.ResourceManager_impl;
import org.apache.uima.resource.metadata.ResourceManagerConfiguration;
import org.apache.uima.util.XMLizable;
/**
* A <code>ResourceManager</code> holds a collection of {@link org.apache.uima.resource.Resource}
* objects, each registered under a specified key.
*
*
*/
public interface ResourceManager {
/**
* Gets the data path used to resolve relative paths. More than one directory may be specified by
* separating them with the System <code>path.separator</code> character (; on windows, : on
* UNIX).
*
* @return the data path
*
* @deprecated Use {@link #getDataPathElements()} instead.
*/
@Deprecated
String getDataPath();
/**
* Gets the data path elements used to resolve relative paths.
*
* @return the data path elements
*/
List<String> getDataPathElements();
/**
* Sets the data path used to resolve relative paths. More than one directory may be specified by
* separating them with the System <code>path.separator</code> character (; on windows, : on
* UNIX). Elements of this path may be absolute or relative file paths.
*
* @param aPath
* the data path
*
* @throws MalformedURLException
* if an element of the path is neither a valid URL or a valid file path
* @deprecated Use {@link #setDataPathElements} instead.
*/
@Deprecated
void setDataPath(String aPath) throws MalformedURLException;
/**
* Sets the data path elements used to resolve relative paths. Elements of this path may be
* absolute or relative file paths.
*
* @param aElements
* the data path
*
* @throws MalformedURLException
* if an element of the path is neither a valid URL or a valid file path
*/
void setDataPathElements(String... aElements) throws MalformedURLException;
/**
* Sets the data path elements used to resolve relative paths. Elements of this path may be
* absolute or relative file paths.
*
* @param aElements
* the data path
*
* @throws MalformedURLException
* if an element of the path is neither a valid URL or a valid file path
*/
void setDataPathElements(File... aElements) throws MalformedURLException;
/**
* Attempts to resolve a relative path to an absolute path using the same mechanism that the
* ResourceManager uses to find resources -- a lookup in the datapath followed by a lookup in the
* classpath.
*
* @param aRelativePath
* a relative URL or file path
*
* @return the absolute URL of an actual file in the datapath or classpath, null if no file
* matching <code>aRelativePath</code> is found.
* @throws MalformedURLException
* if the path cannot be converted to a URL
*/
URL resolveRelativePath(String aRelativePath) throws MalformedURLException;
/**
* Gets the instance of the implementation object for a resource that has been registered under
* the specified name.
*
* @param aName
* the name of the resource to retrieve
*
* @return the instance of the implementation object for the resource, registered under
* <code>aName</code>, <code>null</code> if none exists.
*
* @throws ResourceAccessException
* if the requested resource could not be initialized. A common cause is that it
* requires parameters and the {@link #getResource(String,String[])} method should have
* been called instead of this method.
* @throws ResourceAccessException
* tbd
*/
Object getResource(String aName) throws ResourceAccessException;
//@formatter:off
/**
* Returns one of two kinds of objects (or null):
* - an instance of the implementation object for a resource, that has
* been loaded with a DataResource resource produced by the resource given the aParms
*
* - (if there is no implementation defined for this resource)
* returns an instance of the DataResource, itself, produced by the resource given the aParms
*
* An example of a parameterized Resource is a
* dictionary whose data depend on a specified language identifier.
*
* If the implementation object class exists, but no instance has been
* created (yet) for the particular data resource corresponding to the parameters,
* then this method will create and register a new instance and call its
* load() api using the data resource corresponding to the parameters, and
* return that.
*
* @param aName
* the name of the parameterized resource to retrieve
* @param aParams
* the parameters determining which particular instance is returned and specifying a
* particular DataResource instance to use in initializing the implementation of the
* resource (if there is an implementation).
*
* If there is no implementation, the DataResource instance produced from the named
* Resource given these parameters is returned instead.
*
* @return one of two kinds of objects (or null): an instance of the requested implementation of
* the named resource where that instance has been initialized by calling its load method
* with the DataResource instance produced from the Resource given aParams,
*
* or, (if the named resource has no implementation) the DataResource instance
* corresponding to the named Resource, given aParams,
*
* or if no resource with this name exists, <code>null</code>.
*
* @throws ResourceAccessException
* if there is a resource registered under <code>aName</code> but it could not be
* instantiated for the specified parameters.
*/
//@formatter:on
Object getResource(String aName, String[] aParams) throws ResourceAccessException;
/**
* Gets the Class of the Resource that will be returned by a call to {@link #getResource(String)}
* or {@link #getResource(String,String[])}.
*
* For those resource specifications which include an implementation class, this call returns that
* class.
*
* @param aName
* the name of a resource
* @param <N>
* The generic type for the returned class
*
* @return the Class for the resource named <code>aName</code>, <code>null</code> if there is no
* resource registered under that name.
*/
<N> Class<N> getResourceClass(String aName);
/**
* Retrieves the URL to the named resource. This can be used, for example, to locate configuration
* or authority files.
*
* @param aKey
* the key by which the resource is identified. If this key was declared in the
* &lt;externalResourceDependencies&gt; section of the descriptor, then the resource
* manager is used to locate the resource. If not, the key is assumed to be the resource
* name and is looked up in the {@link #getDataPath() data path} or in the class path
* using {@link java.lang.ClassLoader#getResource(String)}.
*
* @return the <code>URL</code> at which the named resource is located, <code>null</code> if the
* named resource could not be found.
*
* @throws ResourceAccessException
* if a failure occurs in accessing the resource
*/
URL getResourceURL(String aKey) throws ResourceAccessException;
/**
* Retrieves an InputStream for reading from the named resource. This can be used, for example, to
* read configuration or authority files.
*
* @param aKey
* the key by which the resource is identified. If this key was declared in the
* &lt;externalResourceDependencies&gt; section of the annotator's descriptor, then the
* resource manager is used to locate the resource. If not, the key is assumed to be the
* resource name and is looked up in the {@link #getDataPath() data path} or in the class
* path using {@link java.lang.ClassLoader#getResource(String)}.
*
* @return an <code>InputStream</code> for reading from the named resource, <code>null</code> if
* the named resource could not be found. It is the caller's responsibility to close this
* stream once it is no longer needed.
*
* @throws ResourceAccessException
* if a failure occurs in accessing the resource
*/
InputStream getResourceAsStream(String aKey) throws ResourceAccessException;
/**
* Retrieves the URL to the named resource. This can be used, for example, to locate configuration
* or authority files. This version of this method takes an array of parameters used to further
* identify the resource. This can be used, for example, with resources that vary depending on the
* language of the document being analyzed.
*
* @param aKey
* the key by which the resource is identified. If this key was declared in the
* &lt;externalResourceDependencies&gt; section of the annotator's descriptor, then the
* resource manager is used to locate the resource. If not, the key is assumed to be the
* resource name and is looked up in the {@link #getDataPath() data path} or in the class
* path using {@link java.lang.ClassLoader#getResource(String)}.
* @param aParams
* parameters used to further identify the resource
*
* @return the <code>URL</code> at which the named resource is located, <code>null</code> if the
* named resource could not be found.
*
* @throws ResourceAccessException
* if a failure occurs in accessing the resource
*/
URL getResourceURL(String aKey, String[] aParams) throws ResourceAccessException;
/**
* Retrieves an InputStream for reading from the named resource. This can be used, for example, to
* read configuration or authority files. This version of this method takes an array of parameters
* used to further identify the resource. This can be used, for example, with resources that vary
* depending on the language of the document being analyzed.
*
* @param aKey
* the key by which the resource is identified. If this key was declared in the
* &lt;externalResourceDependencies&gt; section of the annotator's descriptor, then the
* resource manager is used to locate the resource. If not, the key is assumed to be the
* resource name and is looked up in the {@link #getDataPath() data path} or in the class
* path using {@link java.lang.ClassLoader#getResource(String)}.
* @param aParams
* parameters used to further identify the resource
*
* @return an <code>InputStream</code> for reading from the named resource, <code>null</code> if
* the named resource could not be found. It is the caller's responsibility to close this
* stream once it is no longer needed.
*
* @throws ResourceAccessException
* if a failure occurs in accessing the resource
*/
InputStream getResourceAsStream(String aKey, String[] aParams) throws ResourceAccessException;
/**
* Initializes all external resources declared in a ResourceCreationSpecifier. Multi-threading:
* may be called on multiple threads.
*
* Initialization should be done once, on the first call
*
* External resources have a Container class representing the resource, which are instances of
* Resource.
*
* This may act as the implementation class, or they may also have a separately specified
* implementation class, which may or may not implement Resource.
*
* As part of the initialization of the Container class, by default, External Resource Bindings
* are processed to hook them up with defined External Resources, using the default implementation
* of resolveAndValidateResourceDependencies.
*
* @param aConfiguration
* the ResourceManagerConfiguration containing resource declarations and bindings
* @param aQualifiedContextName
* qualified name of UimaContext for the component (e.g. analysis engine) that is
* declaring these external resources
* @param aAdditionalParams
* additional parameters to be passed to resource initialize methods
*
* @throws ResourceInitializationException
* if an initialization failure occurs
*/
void initializeExternalResources(ResourceManagerConfiguration aConfiguration,
String aQualifiedContextName, Map<String, Object> aAdditionalParams)
throws ResourceInitializationException;
//@formatter:off
/**
* Resolves a component's external resource dependencies (bindings) using this resource manager.
*
* The default implementation has special defaulting logic:
*
* If a binding specifies a non-existing resource,
* an attempt is made to interpret the key as a file name, looked up
* using the current context for relative path resolution.
* - If successfully found, a FileResourceSpecifier is created using the file
* and used as the implementing class.
*
* If no resource can be found at all, then unless the dependency is marked "optional", an
* ResourceInitializationException is thrown.
*
* Multi-threading: may be called on multiple threads, repeatedly for the same set of resources.
* Implementations should recognize this and skip repeated resolutions.
*
* @param aDependencies
* declarations of a component's dependencies on external resources
* @param aQualifiedContextName
* qualified name of UimaContext for the component (e.g. analysis engine) that is
* declaring these dependencies
*
* @throws ResourceInitializationException
* if a required dependency is not satisfied
*/
//@formatter:on
void resolveAndValidateResourceDependencies(ExternalResourceDependency[] aDependencies,
String aQualifiedContextName) throws ResourceInitializationException;
/**
* Sets the classpath for the UIMA extension ClassLoader and specifies if the extension
* ClassLoader should also be used to resolve resources.
*
* @param classpath
* extension ClassLoader classpath
* @param resolveResource
* if true ClassLoad resolves resources
*
* @throws MalformedURLException
* if a malformed URL has occurred in the classpath string.
*/
void setExtensionClassPath(String classpath, boolean resolveResource)
throws MalformedURLException;
/**
* Sets the classpath for the UIMA extension ClassLoader and specifies if the extension
* ClassLoader should also be used to resolve resources. Also allows a parent ClassLoader to be
* specified.
*
* @param parent
* parent ClassLoader for the extension ClassLoader
* @param classpath
* extension ClassLoader classpath
* @param resolveResource
* if true ClassLoad resolves resources
*
* @throws MalformedURLException
* if a malformed URL has occurred in the classpath string.
*/
void setExtensionClassPath(ClassLoader parent, String classpath, boolean resolveResource)
throws MalformedURLException;
/**
* Set an extension class loader into the Resource Manager
*
* @param classLoader
* the loader to use. If this is an instance of UIMAClassLoader, it is used directly;
* otherwise, a new UIMAClassLoader with no classpath, having the classLoader as a parent
* is created and used.
* @param resolveResources
* true to also use this to resolve resources
*/
default void setExtensionClassLoader(ClassLoader classLoader, boolean resolveResources) {
((ResourceManager_impl) this).setExtensionClassLoaderImpl(classLoader, resolveResources);
}
/**
* Returns the UIMA extension class loader.
*
* @return ClassLoader - returns the UIMA extension class loader of null if it is not available.
*/
ClassLoader getExtensionClassLoader();
/**
* Gets the CasManager, which manages the creation and pooling of CASes.
*
* @return the CasManager
*/
CasManager getCasManager();
/**
* Sets the CasManager, which manages the creation and pooling of CASes. This method does not
* normally need to be called by an application. It allows a custom CAS Manager implementation to
* be substituted for the default one, which may be useful when embedding UIMA in other middleware
* where a different CAS Manager implementation may be desired.
* <p>
* This method can only be called once, and must be called before creating any AnalysisEngines
* that use this ResourceManager. An Exception will be thrown if this method is called twice or is
* called after {@link #getCasManager()} has already been called (which happens during AE
* initialization).
*
* @param aCasManager
* CAS Manager instance to plug in
*/
void setCasManager(CasManager aCasManager);
/**
* Gets a cache of imported descriptors, so that the parsed objects can be reused if the same URL
* is imported more than once.
*
* @return A map from absolute URL to the XMLizable object that was parsed from that URL
* @deprecated Intended just for internal use.
*/
@Deprecated
Map<String, XMLizable> getImportCache();
/**
* Loads a user class using either the UIMA extension class loader (if specified) or the
* ThreadLocal Context Class Loader (if available) or the loader the UIMA framework is running in.
*
* If the class is not found in the ThreadLocal COntext Class Loader, then the loader the UIMA
* framework is running in will be searched.
*
* @param name
* the class to load
* @param <N>
* generic class of class
* @return the class
* @throws ClassNotFoundException
* -
*/
<N> Class<N> loadUserClass(String name) throws ClassNotFoundException;
/**
* Frees all resources held by this ResourceManager, and marks the ResourceManager as having been
* destroyed. A destroyed ResourceManager will throw an exception if an attempt is made to
* continue using it.
*
* Resources managed by a ResourceManager include all of the external shared Resources. If there
* is an extension class loader in use, it will be closed. Any class loaders (including PEAR class
* loaders) that might use this as a parent will be affected by this closure.
*
* Any streams opened using getResourceAsStream will also be closed.
*
* The Resources managed by this manager will have their destroy() methods called, as part of the
* execution of this API.
*
* The framework does not call this method; it is up to the containing application to decide if
* and when a ResourceManager instance should be destroyed. This is because the containing
* application is the only knowledgeable source; for example a single ResourceManager might be
* used for multiple UIMA Pipelines.
*/
void destroy();
/**
*
* @return a List of External Shared Resource instances instantiated by this Resource Manager. For
* parameterized resources, those which have been asked for (having unique parameter sets)
* are included.
*/
List<Object> getExternalResources();
}