2013-04-01 6 views
1

Я получаю исключение, запускающее приложение 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 кодируются без Спецификация (байтовый заказ). К сожалению, это не помогло.

Любая идея, как избавиться от этого исключения.

+0

Возможно, проблема с кодировкой? – Renaud

ответ

0

<xml version="1.0" encoding="UTF-8" ?> обычно должен быть первым в XML-файле. Нет пробелов, никаких дополнительных строк.Похоже, что ZipCodeAE.xml может не соответствовать этому требованию.

В противном случае, используя отладчик, чтобы обнаружить, в каком файле возникла проблема, безусловно, было бы полезно.

Смежные вопросы