blob: 0d09e9552427faf10c2e1c74182c4991c3b20318 [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.pear.util;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Hashtable;
import org.apache.uima.UIMAException;
import org.apache.uima.UIMAFramework;
import org.apache.uima.UIMARuntimeException;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.collection.CasConsumerDescription;
import org.apache.uima.collection.CasInitializerDescription;
import org.apache.uima.collection.CollectionReaderDescription;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.util.XMLInputSource;
import org.apache.uima.util.XMLParser;
/**
* The <code>UIMAUtil</code> class provides convenient methods for handling UIMA specific objects.
*
*/
public class UIMAUtil {
// UIMA component categories
/**
* Analysis Engine
*/
public static final String ANALYSIS_ENGINE_CTG = "AE";
/**
* CAS Consumer
*/
public static final String CAS_CONSUMER_CTG = "CC";
/**
* CAS Initializer
*/
public static final String CAS_INITIALIZER_CTG = "CI";
/**
* Collection Reader
*/
public static final String COLLECTION_READER_CTG = "CR";
/**
* CPE Configuration
*/
public static final String CPE_CONFIGURATION_CTG = "CPE";
/**
* Type System
*/
public static final String TYPE_SYSTEM_CTG = "TS";
/**
* Reusable Resource
*/
public static final String REUSABLE_RESOURCE_CTG = "RR";
// static attributes
private static Hashtable __errTableByUri = new Hashtable();
/**
* Returns the last logged <code>Exception</code> object associated with a given XML descriptor
* file.
*
* @param xmlDescFile
* The given XML descriptor file.
* @return The last logged <code>Exception</code> object associated with the given XML
* descriptor file.
*/
public static Exception getLastErrorForXmlDesc(File xmlDescFile) {
return (Exception) __errTableByUri.get(xmlDescFile.getAbsolutePath());
}
/**
* Returns the last logged <code>Exception</code> object associated with a given XML descriptor
* URL.
*
* @param xmlDescUrl
* The given XML descriptor URL.
* @return The last logged <code>Exception</code> object associated with the given XML
* descriptor URL.
*/
public static Exception getLastErrorForXmlDesc(URL xmlDescUrl) {
return (Exception) __errTableByUri.get(xmlDescUrl.toString());
}
/**
* Identifies a given UIMA component/resource category based on its XML descriptor. If succeeded,
* returns appropriate UIMA component category ID, otherwise returns <code>null</code>. If the
* UIMA component category cannot be identified based on the given XML descriptor file, the
* associated UIMA exception is logged and can be retrieved later by using the
* <code>getLastErrorForXmlDesc()</code> method.
*
* @param xmlDescFile
* The given component XML descriptor file.
* @return UIMA component category ID or <code>null</code>, if the category cannot be idetified
* based on the given XML descriptor file.
* @throws IOException
* If any I/O exception occurred.
*/
public static synchronized String identifyUimaComponentCategory(File xmlDescFile)
throws IOException {
return identifyUimaComponentCategory(xmlDescFile, null);
}
/**
* Identifies a given UIMA component/resource category based on its XML descriptor. If succeeded,
* returns appropriate UIMA component category ID, otherwise returns <code>null</code>. If the
* UIMA component category cannot be identified based on the given XML descriptor file, the
* associated UIMA exception is logged and can be retrieved later by using the
* <code>getLastErrorForXmlDesc()</code> method.
*
* @param xmlDescUrl
* The given component XML descriptor URL.
* @return UIMA component category ID or <code>null</code>, if the category cannot be idetified
* based on the given XML descriptor file.
* @throws IOException
* If any I/O exception occurred.
*/
public static synchronized String identifyUimaComponentCategory(URL xmlDescUrl)
throws IOException {
return identifyUimaComponentCategory(null, xmlDescUrl);
}
/**
* Internal method that identifies a given UIMA component/resource category based on its XML
* descriptor, passed as File or URL. If succeeded, returns appropriate UIMA component category
* ID, otherwise returns <code>null</code>. If the UIMA component category cannot be identified
* based on the given XML descriptor file, the associated UIMA exception is logged and can be
* retrieved later by using the <code>getLastErrorForXmlDesc()</code> method.
*
* @param xmlDescFile
* The given component XML descriptor file.
* @param xmlDescUrl
* The given component XML descriptor URL.
* @return UIMA component category ID or <code>null</code>, if the category cannot be idetified
* based on the given XML descriptor file.
* @throws IOException
* If any I/O exception occurred.
*/
private static synchronized String identifyUimaComponentCategory(File xmlDescFile, URL xmlDescUrl)
throws IOException {
String uimaCompCtg = null;
XMLInputSource xmlSource = null;
String xmlDescUri = (xmlDescFile != null) ? xmlDescFile.getAbsolutePath() : xmlDescUrl.toString();
try {
// clean error message
__errTableByUri.remove(xmlDescUri);
// get XMLParser
XMLParser xmlParser = UIMAFramework.getXMLParser();
// create XML source
xmlSource = (xmlDescFile != null) ? new XMLInputSource(xmlDescFile) : new XMLInputSource(
xmlDescUrl);
// parse XML source and create resource specifier
ResourceSpecifier resourceSpec = null;
try {
resourceSpec = xmlParser.parseResourceSpecifier(xmlSource);
} catch (UIMAException err) {
__errTableByUri.put( xmlDescUri, err );
} catch (UIMARuntimeException exc) {
__errTableByUri.put( xmlDescUri, exc );
}
if (resourceSpec != null) { // AE | CR | CI | CC ?
// identify UIMA resource category
if (resourceSpec instanceof AnalysisEngineDescription) {
uimaCompCtg = ANALYSIS_ENGINE_CTG;
} else if (resourceSpec instanceof CollectionReaderDescription) {
uimaCompCtg = COLLECTION_READER_CTG;
} else if (resourceSpec instanceof CasInitializerDescription) {
uimaCompCtg = CAS_INITIALIZER_CTG;
} else if (resourceSpec instanceof CasConsumerDescription) {
uimaCompCtg = CAS_CONSUMER_CTG;
}
}
if (uimaCompCtg == null) { // CPE ?
// refresh XML source object
try {
xmlSource.getInputStream().close();
} catch (Exception e) {
}
xmlSource = (xmlDescFile != null) ? new XMLInputSource(xmlDescFile) : new XMLInputSource(xmlDescUrl);
try {
// try parsing CPE configuration
xmlParser.parseCpeDescription(xmlSource);
uimaCompCtg = CPE_CONFIGURATION_CTG;
__errTableByUri.remove( xmlDescUri );
} catch (UIMAException err) {
__errTableByUri.put( xmlDescUri, err );
} catch (UIMARuntimeException exc) {
__errTableByUri.put( xmlDescUri, exc );
}
}
if (uimaCompCtg == null) { // TS ?
// refresh XML source object
try {
xmlSource.getInputStream().close();
} catch (Exception e) {
}
xmlSource = (xmlDescFile != null) ? new XMLInputSource(xmlDescFile) : new XMLInputSource(xmlDescUrl);
try {
// try parsing TS description
xmlParser.parseTypeSystemDescription(xmlSource);
uimaCompCtg = TYPE_SYSTEM_CTG;
__errTableByUri.remove( xmlDescUri );
} catch (UIMAException err) {
__errTableByUri.put( xmlDescUri, err );
} catch (UIMARuntimeException exc) {
__errTableByUri.put( xmlDescUri, exc );
}
}
if (uimaCompCtg == null) { // RR ?
// refresh XML source object
try {
xmlSource.getInputStream().close();
} catch (Exception e) {
}
xmlSource = (xmlDescFile != null) ? new XMLInputSource(xmlDescFile) : new XMLInputSource(xmlDescUrl);
try {
// try parsing RES manager configuration
xmlParser.parseResourceManagerConfiguration(xmlSource);
uimaCompCtg = REUSABLE_RESOURCE_CTG;
__errTableByUri.remove( xmlDescUri );
} catch (UIMAException err) {
__errTableByUri.put( xmlDescUri, err );
} catch (UIMARuntimeException exc) {
__errTableByUri.put( xmlDescUri, exc );
}
}
} catch (IOException exc) {
throw exc;
} catch (Exception err) {
__errTableByUri.put( xmlDescUri, err );
} finally {
if (xmlSource != null && xmlSource.getInputStream() != null)
try {
xmlSource.getInputStream().close();
} catch (Exception e) {
}
}
return uimaCompCtg;
}
}