Я получаю исключение, запускающее приложение UIMA на TOMCAT 7.0.Неверный дескриптор Исключение - UIMA с JSF и Tomcat 7
ШАГИ
1) Создан динамический веб-проект
2) Добавлена "ADD UIMA NATURE"
3) Создан примитивный механизм анализа (AE). Каждый примитив АЕ имеет тип аннотаций и аннотатор (взяли пример из here)
Сниппет по ссылке
ZipCode.xml
<?xml version="1.0" encoding="UTF-8"?>
<typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
<name>ZipCode</name>
<description>Defines the zipcode type</description>
<version>1.0</version>
<vendor>MyCompany, Inc.</vendor>
<types>
<typeDescription>
<name>com.mycompany.myapp.uima.annotators.zipcode.ZipCodeAnnotation</name>
<description>ZipCode</description>
<supertypeName>uima.tcas.Annotation</supertypeName>
</typeDescription>
</types>
</typeSystemDescription>
ZipCodeAE.xml
<?xml version="1.0" encoding="UTF-8" ?>
<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
<frameworkImplementation>org.apache.uima.java</frameworkImplementation>
<primitive>true</primitive>
<annotatorImplementationName>
com.mycompany.myapp.uima.annotators.zipcode.ZipCodeAnnotator
</annotatorImplementationName>
<analysisEngineMetaData>
<name>Zip Code Annotator</name>
<description>Recognize and annotate zip code in text</description>
<version>1.0</version>
<vendor>MyCompany, Inc.</vendor>
<configurationParameters></configurationParameters>
<configurationParameterSettings></configurationParameterSettings>
<typeSystemDescription>
<imports>
<import location="ZipCode.xml"/>
</imports>
</typeSystemDescription>
<typePriorities></typePriorities>
<fsIndexCollection></fsIndexCollection>
<capabilities>
<capability>
<inputs></inputs>
<outputs>
<type>com.mycompany.myapp.uima.annotators.zipcode.ZipCode</type>
</outputs>
<languagesSupported></languagesSupported>
</capability>
</capabilities>
<operationalProperties>
<modifiesCas>true</modifiesCas>
<multipleDeploymentAllowed>true</multipleDeploymentAllowed>
<outputsNewCASes>false</outputsNewCASes>
</operationalProperties>
</analysisEngineMetaData>
<externalResourceDependencies></externalResourceDependencies>
<resourceManagerConfiguration></resourceManagerConfiguration>
</analysisEngineDescription>
ZipCodeAnnotator.java
public class ZipCodeAnnotator extends JCasAnnotator_ImplBase {
private Pattern zipCodePattern = Pattern.compile("\\d{5}(-\\d{4})*");
@Override
public void process(JCas jCAS) throws AnalysisEngineProcessException {
String text = jCAS.getDocumentText();
Matcher matcher = zipCodePattern.matcher(text);
int pos = 0;
while (matcher.find(pos)) {
ZipCodeAnnotation annotation = new ZipCodeAnnotation(jCAS);
annotation.setBegin(matcher.start());
annotation.setEnd(matcher.end());
annotation.addToIndexes();
pos = matcher.end();
}
}
}
TestCase
public class AddressAnnotatorTest {
private final String[] TEST_STRINGS = new String[] {
"Dr Goldwater, University of Michigan, Ann Arbor, MI",
"Microsoft, 1 Microsoft Way, Redmond, WA",
"Apple, 1 Infinite Loop, Cupertino, CA 95014",
"IBM, 1 New Orchard Road, Armonk, NY 10504",
"Google, 1600 Amphitheater Parkway, Mountain View, CA 94043",
"Healthline, 600 3rd Street, San Francisco, CA 94107",
"Jane Doe, Lake Tahoe, California",
"Miss Liberty, Empire State Building, New York, NY"
};
@Test
public void testAddressAE() throws Exception {
AnalysisEngine ae = TestUtils.getAE(
"src/main/java/com/mycompany/myapp/uima/annotators/aggregates/AddressAE.xml",
null);
for (String text : TEST_STRINGS) {
JCas jcas = TestUtils.runAE(ae, text);
TestUtils.printResults(jcas);
}
}
}
Если я проверить это приложение через тест JUnit случае (как указано в приведенном выше коде), она успешно работает без каких-либо исключений, но когда я запускаю это приложение на Tomcat, создав простую страницу xhtml с помощью кнопки. и При щелчке на кнопке это исключение.
Вот фрагмент кода
XHTML
<p:commandButton id="create" value="Print Result"
actionListener="#{demoClass.testZipAE}" ajax="true">
</p:commandButton>
DemoClass.java
@ManagedBean(name = "demoClass")
@SessionScoped()
public class DemoClass implements Serializable {
public AnalysisEngine getAE(
String descriptor, Map<String,Object> params)
throws IOException, InvalidXMLException,
ResourceInitializationException {
AnalysisEngine ae = null;
try {
XMLInputSource in = new XMLInputSource(ClassLoader.getSystemResourceAsStream(descriptor), null);
AnalysisEngineDescription desc =
UIMAFramework.getXMLParser().
parseAnalysisEngineDescription(in);
if (params != null) {
for (String key : params.keySet()) {
desc.getAnalysisEngineMetaData().
getConfigurationParameterSettings().
setParameterValue(key, params.get(key));
}
}
ae = UIMAFramework.produceAnalysisEngine(desc);
} catch (Exception e) {
throw new ResourceInitializationException(e);
}
return ae;
}
public JCas runAE(AnalysisEngine ae, String text)
throws AnalysisEngineProcessException,
ResourceInitializationException {
JCas jcas = ae.newJCas();
jcas.setDocumentText(text);
ProcessTrace trace = ae.process(jcas);
for (ProcessTraceEvent evt : trace.getEvents()) {
if (evt != null && evt.getResultMessage() != null &&
evt.getResultMessage().contains("error")) {
throw new AnalysisEngineProcessException(
new Exception(evt.getResultMessage()));
}
}
return jcas;
}
public void printResults(JCas jcas) {
FSIndex index = jcas.getAnnotationIndex();
for (Iterator<Annotation> it = index.iterator(); it.hasNext();) {
Annotation annotation = it.next();
List<Feature> features = new ArrayList<Feature>();
if (annotation.getType().getName().contains("com.mycompany")) {
features = annotation.getType().getFeatures();
}
List<String> fasl = new ArrayList<String>();
for (Feature feature : features) {
if (feature.getName().contains("com.mycompany")) {
String name = feature.getShortName();
String value = annotation.getStringValue(feature);
fasl.add(name + "=\"" + value + "\"");
}
}
System.out.println(
annotation.getType().getShortName() + ": " +
annotation.getCoveredText() + " " +
(fasl.size() > 0 ? StringUtils.join(fasl.iterator(), ",") : "") + " " +
annotation.getBegin() + ":" + annotation.getEnd());
}
System.out.println("==");
}
public void testZipAE(ActionEvent event) throws AnalysisEngineProcessException, ResourceInitializationException {
AnalysisEngine ae;
try {
ae = getAE(
"TestAE.xml",
null);
for (String text : TEST_STRINGS) {
JCas jcas = runAE(ae, text);
printResults(jcas);
}
} catch (InvalidXMLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ResourceInitializationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
TestAE.xml
<?xml version="1.0" encoding="UTF-8"?>
<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
<frameworkImplementation>org.apache.uima.java</frameworkImplementation>
<primitive>false</primitive>
<delegateAnalysisEngineSpecifiers>
<delegateAnalysisEngine key="ZipCodeAE">
<import location="ZipCodeAE.xml"/>
</delegateAnalysisEngine>
</delegateAnalysisEngineSpecifiers>
<analysisEngineMetaData>
<name>TestAE</name>
<description>Runs the delegate AEs together</description>
<version>1.0</version>
<configurationParameters searchStrategy="language_fallback"/>
<configurationParameterSettings/>
<flowConstraints>
<fixedFlow>
<node>ZipCodeAE</node>
</fixedFlow>
</flowConstraints>
<typePriorities/>
<fsIndexCollection/>
<capabilities>
<capability>
<inputs/>
<outputs/>
<languagesSupported/>
</capability>
</capabilities>
<operationalProperties>
<modifiesCas>true</modifiesCas>
<multipleDeploymentAllowed>true</multipleDeploymentAllowed>
<outputsNewCASes>false</outputsNewCASes>
</operationalProperties>
</analysisEngineMetaData>
<resourceManagerConfiguration/>
</analysisEngineDescription>
Исключение
org.apache.uima.resource.ResourceInitializationException: Invalid descriptor at <unknown source>.
at com.acn.hps.alpes.gi.cip.jsf.AnalyzeFile.getAE(AnalyzeFile.java:208)
at com.acn.hps.alpes.gi.cip.jsf.AnalyzeFile.testAddressAE(AnalyzeFile.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.uima.util.InvalidXMLException: Invalid descriptor at <unknown source>.
at org.apache.uima.util.impl.XMLParser_impl.parse(XMLParser_impl.java:194)
at org.apache.uima.util.impl.XMLParser_impl.parseAnalysisEngineDescription(XMLParser_impl.java:492)
at org.apache.uima.util.impl.XMLParser_impl.parseAnalysisEngineDescription(XMLParser_impl.java:473)
at com.acn.hps.alpes.gi.cip.jsf.AnalyzeFile.getAE(AnalyzeFile.java:198)
... 36 more
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.uima.util.impl.XMLParser_impl.parse(XMLParser_impl.java:177)
... 39 more
Первоначально я думал, исключение выгоняет из-за любой недопустимый символ в XML, то, следуя эту ссылку (XML - Data At Root Level is Invalid) и убедился, что XML кодируются без Спецификация (байтовый заказ). К сожалению, это не помогло.
Любая идея, как избавиться от этого исключения.
Возможно, проблема с кодировкой? – Renaud