in uimaj-core/src/main/java/org/apache/uima/resource/Resource_ImplBase.java [75:245]
public boolean initialize(ResourceSpecifier aSpecifier, Map<String, Object> aAdditionalParams)
throws ResourceInitializationException {
// get name of resource, to be used in error messages
final ResourceMetaData metadata1 = getMetaData();
String name = (metadata1 == null) ? getClass().getName() : metadata1.getName();
// check for repeat initialization
if (mInitialized) {
throw new UIMA_IllegalStateException(UIMA_IllegalStateException.RESOURCE_ALREADY_INITIALIZED,
new Object[] { name });
}
// is there a UIMAContext provided in the aAdditionalParams map?
// if so, use it - it could be a shared context for scale-up of the same resource
if (aAdditionalParams != null) {
mUimaContextAdmin = (UimaContextAdmin) aAdditionalParams.get(PARAM_UIMA_CONTEXT);
}
if (mUimaContextAdmin == null) { // no, we have to create one
// skip this part if initializing an external resource
// https://issues.apache.org/jira/browse/UIMA-5153
if (!(aSpecifier instanceof ConfigurableDataResourceSpecifier)
&& !(aSpecifier instanceof FileLanguageResourceSpecifier)
&& !(aSpecifier instanceof FileResourceSpecifier)) {
// get or create ResourceManager
ResourceManager resMgr = null;
if (aAdditionalParams != null) {
resMgr = (ResourceManager) aAdditionalParams.get(PARAM_RESOURCE_MANAGER);
}
if (resMgr == null) {
resMgr = UIMAFramework.newDefaultResourceManager();
}
// get a Logger for this class and set its ResourceManager so that
// UIMA extension ClassLoader is used to locate message digests.
Logger logger = UIMAFramework.getLogger(this.getClass());
ConfigurationManager configMgr = null;
if (aAdditionalParams != null) {
configMgr = (ConfigurationManager) aAdditionalParams.get(PARAM_CONFIG_MANAGER);
}
if (configMgr == null) {
configMgr = UIMAFramework.newConfigurationManager();
}
// create and initialize UIMAContext
mUimaContextAdmin = UIMAFramework.newUimaContext(logger, resMgr, configMgr);
if (aAdditionalParams != null) {
Object limit = aAdditionalParams
.get(AnalysisEngine.PARAM_THROTTLE_EXCESSIVE_ANNOTATOR_LOGGING);
if (limit != null) {
((UimaContext_ImplBase) mUimaContextAdmin).setLoggingThrottleLimit((Integer) limit);
}
}
}
} else {
// configure logger of the UIMA context so that class-specific logging
// levels and UIMA extension classLoader will work
// get a Logger for this class and set its ResourceManager so that
// UIMA extension ClassLoader is used to locate message digests.
Logger logger = UIMAFramework.getLogger(this.getClass());
mUimaContextAdmin.setLogger(logger);
}
// if this is a local resource (instantiated from a ResourceCreationSpecifier),
// initialize the ResourceManager and UIMA Context.
if (aSpecifier instanceof ResourceCreationSpecifier) {
// resolve imports in the metadata
ResourceMetaData metadata = ((ResourceCreationSpecifier) aSpecifier).getMetaData();
name = metadata.getName();
try {
// the resolveImports method has synch block around updates to the metadata
metadata.resolveImports(getResourceManager());
} catch (InvalidXMLException e) {
throw new ResourceInitializationException(e);
}
// store Resource metadata so it can be retrieved via getMetaData() method
setMetaData(metadata);
// Check if a Settings object for the external overrides has been provided in the additional
// parameters map. If not and not already set from the parent UimaContext then create one
// (for the root context) from the system defaults
Settings externalOverrides = aAdditionalParams == null ? null
: (Settings) aAdditionalParams.get(Resource.PARAM_EXTERNAL_OVERRIDE_SETTINGS);
if (externalOverrides != null) {
mUimaContextAdmin.setExternalOverrides(externalOverrides);
} else {
// synch around test/set of the (possibly shared) uima-context info about external param
// overrides
synchronized (mUimaContextAdmin) {
if (mUimaContextAdmin.getExternalOverrides() == null) {
externalOverrides = UIMAFramework.getResourceSpecifierFactory().createSettings(); // i.e.
// new
// Settings_impl()
try {
externalOverrides.loadSystemDefaults();
} catch (ResourceConfigurationException e) {
throw new ResourceInitializationException(
ResourceInitializationException.ERROR_INITIALIZING_FROM_DESCRIPTOR,
new Object[] { name, metadata.getSourceUrlString() }, e);
}
mUimaContextAdmin.setExternalOverrides(externalOverrides);
}
}
}
// initialize configuration
try {
// createContext checks and skips repeated calls with same args (on different threads, for
// example)
mUimaContextAdmin.getConfigurationManager().createContext(
mUimaContextAdmin.getQualifiedContextName(), getMetaData(),
mUimaContextAdmin.getExternalOverrides());
} catch (ResourceConfigurationException e) {
throw new ResourceInitializationException(
ResourceInitializationException.ERROR_INITIALIZING_FROM_DESCRIPTOR,
new Object[] { name, metadata.getSourceUrlString() }, e);
}
// initialize any external resource declared in this descriptor
// UIMA-5274 Set & restore the UimaContextHolder so that resources created on this thread can
// use the Settings
ResourceManagerConfiguration resMgrCfg = ((ResourceCreationSpecifier) aSpecifier)
.getResourceManagerConfiguration();
if (resMgrCfg != null) {
UimaContext prevContext = UimaContextHolder.setContext(mUimaContextAdmin);
try {
try {
resMgrCfg.resolveImports(getResourceManager());
} catch (InvalidXMLException e) {
throw new ResourceInitializationException(e);
}
if (aAdditionalParams == null) {
aAdditionalParams = new HashMap<>();
aAdditionalParams.put(PARAM_RESOURCE_MANAGER, mUimaContextAdmin.getResourceManager());
} else {
if (!aAdditionalParams.containsKey(PARAM_RESOURCE_MANAGER)) {
// copy in case original is shared on multi-threads, or
// is unmodifiable
// and to avoid updating passed - in map
aAdditionalParams = new HashMap<>(aAdditionalParams);
aAdditionalParams.put(PARAM_RESOURCE_MANAGER, mUimaContextAdmin.getResourceManager());
}
}
// initializeExternalResources is synchronized
// https://issues.apache.org/jira/browse/UIMA-5153
final HashMap<String, Object> aAdditionalParmsForExtResources = new HashMap<>(
aAdditionalParams); // copy in case
aAdditionalParmsForExtResources.putIfAbsent(PARAM_UIMA_CONTEXT, mUimaContextAdmin);
mUimaContextAdmin.getResourceManager().initializeExternalResources(resMgrCfg,
mUimaContextAdmin.getQualifiedContextName(), aAdditionalParmsForExtResources);
} finally {
UimaContextHolder.setContext(prevContext);
}
}
// resolve and validate this component's external resource dependencies
ExternalResourceDependency[] resourceDependencies = ((ResourceCreationSpecifier) aSpecifier)
.getExternalResourceDependencies();
if (resourceDependencies != null) {
// resolveAndValidateResourceDependencies is synchronized
mUimaContextAdmin.getResourceManager().resolveAndValidateResourceDependencies(
resourceDependencies, mUimaContextAdmin.getQualifiedContextName());
}
}
mInitialized = true;
return true;
}