blob: 5dea01fd4848aafe8cec019b6e0d2ac625e5b93b [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.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.uima.UIMAFramework;
import org.apache.uima.resource.ExternalResourceDependency;
import org.apache.uima.resource.Resource;
import org.apache.uima.resource.ResourceConfigurationException;
import org.apache.uima.resource.ResourceCreationSpecifier;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.resource.Resource_ImplBase;
import org.apache.uima.resource.metadata.ConfigurationGroup;
import org.apache.uima.resource.metadata.ConfigurationParameter;
import org.apache.uima.resource.metadata.ConfigurationParameterDeclarations;
import org.apache.uima.resource.metadata.ResourceManagerConfiguration;
import org.apache.uima.resource.metadata.ResourceMetaData;
import org.apache.uima.resource.metadata.impl.MetaDataObject_impl;
import org.apache.uima.resource.metadata.impl.PropertyXmlInfo;
import org.apache.uima.resource.metadata.impl.XmlizationInfo;
/**
* Reference implementation of {@link ResourceCreationSpecifier}.
*
*/
public class ResourceCreationSpecifier_impl extends MetaDataObject_impl
implements ResourceCreationSpecifier {
private String mImplementationName;
private String mFrameworkImplementation;
private ResourceMetaData mMetaData;
private List<ExternalResourceDependency> mExternalResourceDependencies = new ArrayList<>();
private ResourceManagerConfiguration mResourceManagerConfiguration;
static final long serialVersionUID = 7946890459654653436L;
/**
* @see ResourceCreationSpecifier#getFrameworkImplementation()
*/
@Override
public String getFrameworkImplementation() {
return mFrameworkImplementation;
}
/**
* @see ResourceCreationSpecifier#setFrameworkImplementation(java.lang.String)
*/
@Override
public void setFrameworkImplementation(String aFrameworkImplementation) {
mFrameworkImplementation = aFrameworkImplementation;
}
/**
* @see ResourceCreationSpecifier#getImplementationName()
*/
@Override
public String getImplementationName() {
return mImplementationName;
}
/**
* @see ResourceCreationSpecifier#setImplementationName(java.lang.String)
*/
@Override
public void setImplementationName(String aImplementationName) {
mImplementationName = aImplementationName;
}
/**
* @see ResourceCreationSpecifier#getMetaData()
*/
@Override
public ResourceMetaData getMetaData() {
return mMetaData;
}
/**
* Sets the MetaData for this <code>ResourceCreationSpecifier_impl</code>. Users should not do
* this, so this method is not published through the <code>ResourceCreationSpecifier</code>
* interface.
*
* @param aMetaData
* metadata to assign
*/
@Override
public void setMetaData(ResourceMetaData aMetaData) {
mMetaData = aMetaData;
}
/**
* @see org.apache.uima.analysis_engine.AnalysisEngineDescription#getExternalResourceDependencies()
*/
@Override
public ExternalResourceDependency[] getExternalResourceDependencies() {
ExternalResourceDependency[] result = new ExternalResourceDependency[mExternalResourceDependencies
.size()];
mExternalResourceDependencies.toArray(result);
return result;
}
/**
* @see org.apache.uima.analysis_engine.AnalysisEngineDescription#setExternalResourceDependencies(ExternalResourceDependency[])
*/
@Override
public void setExternalResourceDependencies(ExternalResourceDependency... aDependencies) {
// can't just clear the ArrayList since that breaks clone(). Create a new list.
mExternalResourceDependencies = new ArrayList<>();
if (aDependencies != null) {
for (int i = 0; i < aDependencies.length; i++) {
mExternalResourceDependencies.add(aDependencies[i]);
}
}
}
/**
* @see org.apache.uima.analysis_engine.AnalysisEngineDescription#getExternalResourceDependency(java.lang.String)
*/
@Override
public ExternalResourceDependency getExternalResourceDependency(String aKey) {
for (ExternalResourceDependency dep : mExternalResourceDependencies) {
if (aKey.equals(dep.getKey())) {
return dep;
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.resource.ResourceCreationSpecifier#getResourceManagerConfiguration()
*/
@Override
public ResourceManagerConfiguration getResourceManagerConfiguration() {
return mResourceManagerConfiguration;
}
/*
* (non-Javadoc)
*
* @see
* org.apache.uima.resource.ResourceCreationSpecifier#setResourceManagerConfiguration(org.apache.
* uima.resource.metadata.ResourceManagerConfiguration)
*/
@Override
public void setResourceManagerConfiguration(
ResourceManagerConfiguration aResourceManagerConfiguration) {
mResourceManagerConfiguration = aResourceManagerConfiguration;
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.resource.ResourceCreationSpecifier#doFullValidation()
*/
@Override
public void doFullValidation() throws ResourceInitializationException {
doFullValidation(UIMAFramework.newDefaultResourceManager());
}
/*
* (non-Javadoc)
*
* @see
* org.apache.uima.resource.ResourceCreationSpecifier#doFullValidation(org.apache.uima.resource.
* ResourceManager)
*/
@Override
public void doFullValidation(ResourceManager aResourceManager)
throws ResourceInitializationException {
// try to instantiate dummy resource - this checks config params
// and resources
DummyResource dummy = new DummyResource();
Map<String, Object> params = new HashMap<>();
params.put(Resource.PARAM_RESOURCE_MANAGER, aResourceManager);
dummy.initialize(this, params);
// subclasses should override to check CAS creation and
// loading of the user-supplied CAS as appropriate
}
/**
* Determines if the AnalysisEngineDescription is valid. An exception is thrown if it is not
* valid. This should be called from this Analysis Engine's initialize method. Note this does not
* check configuration parameter settings - that must be done by an explicit call to
* validateConfigurationParameterSettings.
*
* @throws ResourceInitializationException
* if <code>aDesc</code> is invalid
* @throws ResourceConfigurationException
* if the configuration parameter settings in <code>aDesc</code> are invalid
*/
@Override
public final void validate()
throws ResourceInitializationException, ResourceConfigurationException {
validate(UIMAFramework.newDefaultResourceManager());
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.resource.ResourceCreationSpecifier#validate(org.apache.uima.resource.
* ResourceManager)
*/
@Override
public void validate(ResourceManager aResourceManager)
throws ResourceInitializationException, ResourceConfigurationException {
// Validate configuration parameter declarations (but not settings)
validateConfigurationParameters(aResourceManager);
}
/**
* Validates configuration parameters within this Resource, and throws an exception if they are
* not valid.
* <p>
* This method checks to make sure that there are no duplicate configuration group names or
* duplicate parameter names within groups. For aggregates, it also checks that parameter
* overrides are valid, and logs a warning for parameters with no overrides. (For primitives,
* there should be no overrides.)
*
* @param aResourceManager
* used to resolve import by name. This is necessary to validate configuration parameter
* overrides.
*
* @throws ResourceInitializationException
* if the configuration parameters are invalid
*/
protected void validateConfigurationParameters(ResourceManager aResourceManager)
throws ResourceInitializationException {
ConfigurationParameterDeclarations cfgParamDecls = getMetaData()
.getConfigurationParameterDeclarations();
ConfigurationParameter[] params = cfgParamDecls.getConfigurationParameters();
if (params.length > 0) {
// check for duplicate names
checkForDuplicateParameterNames(params);
checkForInvalidParameterOverrides(params, null, aResourceManager);
} else {
ConfigurationParameter[] commonParams = cfgParamDecls.getCommonParameters();
// check for duplicates in common params
Set<String> commonParamNames = new HashSet<>();
if (commonParams != null) {
for (int i = 0; i < commonParams.length; i++) {
if (!commonParamNames.add(commonParams[i].getName())) {
throw new ResourceInitializationException(
ResourceInitializationException.DUPLICATE_CONFIGURATION_PARAMETER_NAME,
new Object[] { commonParams[i].getName(), getMetaData().getName(),
commonParams[i].getSourceUrlString() });
}
}
}
// check for duplicates in groups
ConfigurationGroup[] groups = cfgParamDecls.getConfigurationGroups();
if (groups != null) {
Map<String, Set<String>> groupToParamSetMap = new HashMap<>(); // map from group name to
// HashSet of param names
// in that group
for (int i = 0; i < groups.length; i++) {
String[] names = groups[i].getNames();
for (int j = 0; j < names.length; j++) {
Set<String> paramNamesInGroup = groupToParamSetMap.get(names[j]);
if (paramNamesInGroup == null) {
// first time we've seen this group. create an entry and add common params
paramNamesInGroup = new HashSet<>(commonParamNames);
}
// check for duplicate parameter names
ConfigurationParameter[] paramsInGroup = groups[i].getConfigurationParameters();
if (paramsInGroup != null) {
for (int k = 0; k < paramsInGroup.length; k++) {
if (!paramNamesInGroup.add(paramsInGroup[k].getName())) {
throw new ResourceInitializationException(
ResourceInitializationException.DUPLICATE_CONFIGURATION_PARAMETER_NAME,
new Object[] { paramsInGroup[k].getName(), getMetaData().getName(),
paramsInGroup[k].getSourceUrlString() });
}
}
}
checkForInvalidParameterOverrides(paramsInGroup, names[j], aResourceManager);
if (commonParams != null) {
checkForInvalidParameterOverrides(commonParams, names[j], aResourceManager);
}
}
}
}
}
}
/**
* Checks for duplicate parameter names and throws an exception if any are found.
*
* @param aParams
* an array of ConfigurationParameters
*
* @throws ResourceInitializationException
* if there is a duplicate parameter name in the arrays
*/
protected void checkForDuplicateParameterNames(ConfigurationParameter[] aParams)
throws ResourceInitializationException {
Set<String> paramNames = new HashSet<>();
for (int i = 0; i < aParams.length; i++) {
if (!paramNames.add(aParams[i].getName())) {
throw new ResourceInitializationException(
ResourceInitializationException.DUPLICATE_CONFIGURATION_PARAMETER_NAME,
new Object[] { aParams[i].getName(), getMetaData().getName(),
aParams[i].getSourceUrlString() });
}
}
}
/**
* Checks parameter overrides and throws a ResourceInitializationException if they are invalid.
* Note that since overrides are invalid in primitive components, this default implementation
* throws an exception for ANY parameter override it finds. AnalysisEngineDescription_impl
* overrides this method to correctly handle parameter overrides in aggregates.
*
* @param aParams
* an array of ConfigurationParameters
* @param aGroupName
* name of groups in which these parameters are contained. Null if no group
* @param aResourceManager
* used to resolve imports by name.
*
* @throws ResourceInitializationException
* if there is an invalid parameter override declaration
*/
protected void checkForInvalidParameterOverrides(ConfigurationParameter[] aParams,
String aGroupName, ResourceManager aResourceManager)
throws ResourceInitializationException {
for (int i = 0; i < aParams.length; i++) {
String[] overrides = aParams[i].getOverrides();
if (overrides.length > 0) {
throw new ResourceInitializationException(
ResourceInitializationException.PARAM_OVERRIDE_IN_PRIMITIVE,
new Object[] { aParams[i].getName(), getMetaData().getName(),
aParams[i].getSourceUrlString() });
}
}
}
@Override
protected XmlizationInfo getXmlizationInfo() {
return XMLIZATION_INFO;
}
static final private XmlizationInfo XMLIZATION_INFO = new XmlizationInfo(
"resourceCreationSpecifier",
new PropertyXmlInfo[] { new PropertyXmlInfo("frameworkImplementation"),
new PropertyXmlInfo("implementationName"), new PropertyXmlInfo("metaData", null),
new PropertyXmlInfo("externalResourceDependencies"),
new PropertyXmlInfo("externalResources"),
new PropertyXmlInfo("resourceManagerConfiguration", null), });
// used by doFullValidation
private static class DummyResource extends Resource_ImplBase {
}
}