Author: cwiklik
Date: Wed May 22 15:51:17 2019
New Revision: 1859733

URL: http://svn.apache.org/viewvc?rev=1859733&view=rev
Log:
UIMA-6040 modified uima JP to use classpath separation. User code runs in 
System classloader whereas ducc runs fenced in a custom classloader

Added:
    
uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/processor/uima/UimaDelegator.java
   (with props)
    
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/BasicUimaMetricsGenerator.java
   (with props)
    
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/UimaWrapper.java
   (with props)

Added: 
uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/processor/uima/UimaDelegator.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/processor/uima/UimaDelegator.java?rev=1859733&view=auto
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/processor/uima/UimaDelegator.java
 (added)
+++ 
uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/processor/uima/UimaDelegator.java
 Wed May 22 15:51:17 2019
@@ -0,0 +1,139 @@
+/*
+ * 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.ducc.ps.service.processor.uima;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+import javax.xml.parsers.FactoryConfigurationError;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.impl.XmiCasDeserializer;
+import org.apache.uima.ducc.ps.service.processor.uima.utils.PerformanceMetrics;
+import 
org.apache.uima.ducc.ps.service.processor.uima.utils.UimaMetricsGenerator;
+import org.apache.uima.internal.util.XMLUtils;
+import org.apache.uima.resource.Resource;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.apache.uima.util.CasPool;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+public class UimaDelegator {
+       private CasPool casPool = null;
+       private ResourceManager rm = UIMAFramework.newDefaultResourceManager();
+       private static Object platformMBeanServer;
+       private boolean deserializeFromXMI;
+
+       static {
+               // try to get platform MBean Server (Java 1.5 only)
+               try {
+                       Class<?> managementFactory = 
Class.forName("java.lang.management.ManagementFactory");
+                       Method getPlatformMBeanServer = 
managementFactory.getMethod("getPlatformMBeanServer", new Class[0]);
+                       platformMBeanServer = 
getPlatformMBeanServer.invoke(null, (Object[]) null);
+               } catch (Exception e) {
+                       platformMBeanServer = null;
+               }
+       }
+
+       public void initialize(ResourceSpecifier rSpecifier, int scaleout, 
boolean deserialize,
+                       ThreadLocal<AnalysisEngine> threadLocal) throws 
Exception {
+
+               HashMap<String, Object> paramsMap = new HashMap<>();
+               paramsMap.put(Resource.PARAM_RESOURCE_MANAGER, rm);
+               paramsMap.put(AnalysisEngine.PARAM_MBEAN_SERVER, 
platformMBeanServer);
+               deserializeFromXMI = deserialize;
+
+               AnalysisEngine ae = 
UIMAFramework.produceAnalysisEngine(rSpecifier, paramsMap);
+               // pin AE instance to this thread
+               threadLocal.set(ae);
+
+               synchronized (UimaDelegator.class) {
+                       if (casPool == null) {
+                               
initializeCasPool(ae.getAnalysisEngineMetaData(), scaleout);
+                       }
+               }
+       }
+
+       public List<PerformanceMetrics> process(String serializedTask, 
ThreadLocal<AnalysisEngine> threadLocal)
+                       throws Exception {
+               List<PerformanceMetrics> delta = null;
+               CAS cas = casPool.getCas();
+               try {
+                       if (deserializeFromXMI) {
+                               deserializeCasFromXmi(serializedTask, cas);
+                       } else {
+                               cas.setDocumentText(serializedTask);
+                               cas.setDocumentLanguage("en");
+
+                       }
+
+                       // check out AE instance pinned to this thread
+                       AnalysisEngine ae = threadLocal.get();
+
+                       List<PerformanceMetrics> preProcessMetrics = 
UimaMetricsGenerator.get(ae);
+                       ae.process(cas);
+                       List<PerformanceMetrics> postProcessMetrics = 
UimaMetricsGenerator.get(ae);
+                       delta = 
UimaMetricsGenerator.getDelta(postProcessMetrics, preProcessMetrics);
+               } finally {
+                       if (cas != null) {
+                               casPool.releaseCas(cas);
+                       }
+               }
+               return delta;
+
+       }
+
+       public void deserializeCasFromXmi(String anXmlStr, CAS aCAS)
+                       throws FactoryConfigurationError, SAXException, 
IOException {
+
+               XMLReader xmlReader = XMLUtils.createXMLReader();
+               Reader reader = new StringReader(anXmlStr);
+               XmiCasDeserializer deser = new 
XmiCasDeserializer(aCAS.getTypeSystem());
+               ContentHandler handler = deser.getXmiCasHandler(aCAS);
+               xmlReader.setContentHandler(handler);
+               xmlReader.parse(new InputSource(reader));
+       }
+
+       public void stop(ThreadLocal<AnalysisEngine> threadLocal) {
+               AnalysisEngine ae = threadLocal.get();
+               if (ae != null) {
+                       ae.destroy();
+               }
+       }
+
+       private void initializeCasPool(AnalysisEngineMetaData 
analysisEngineMetadata, int scaleout)
+                       throws ResourceInitializationException {
+               Properties props = new Properties();
+               props.setProperty(UIMAFramework.CAS_INITIAL_HEAP_SIZE, "1000");
+               casPool = new CasPool(scaleout, analysisEngineMetadata, rm);
+       }
+}

Propchange: 
uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/processor/uima/UimaDelegator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/BasicUimaMetricsGenerator.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/BasicUimaMetricsGenerator.java?rev=1859733&view=auto
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/BasicUimaMetricsGenerator.java
 (added)
+++ 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/BasicUimaMetricsGenerator.java
 Wed May 22 15:51:17 2019
@@ -0,0 +1,262 @@
+/*
+ * 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.ducc.user.common;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.analysis_engine.AnalysisEngineManagement;
+import org.apache.uima.util.Level;
+import org.apache.uima.util.Logger;
+
+public class BasicUimaMetricsGenerator {
+       public static final String AE_NAME = "AeName";
+       public static final String AE_CONTEXT = "AeContext";
+       public static final String AE_ANALYSIS_TIME = "AeAnalysisTime";
+       public static final String AE_CAS_PROCESSED = "AeProcessedCasCount";
+
+       private BasicUimaMetricsGenerator() {
+               
+       }
+       public static void getLeafManagementObjects(AnalysisEngineManagement 
aem, List<Properties> result) {
+               getLeafManagementObjects(aem, result, "");
+       }
+
+       public static List<Properties> get(AnalysisEngine ae) throws Exception {
+               List<Properties> analysisManagementObjects = new ArrayList<>();
+               synchronized (BasicUimaMetricsGenerator.class) {
+                       // Fetch AE's management information that includes per 
component
+                       // performance stats
+                       // These stats are internally maintained in a Map. If 
the AE is an
+                       // aggregate
+                       // the Map will contain AnalysisEngineManagement 
instance for each AE.
+                       AnalysisEngineManagement aem = 
ae.getManagementInterface();
+                       if (aem.getComponents().size() > 0) {
+                               // Flatten the hierarchy by recursively (if 
this AE is an aggregate)
+                               // extracting
+                               // primitive AE's AnalysisEngineManagement 
instance and placing it
+                               // in
+                               // afterAnalysisManagementObjects List.
+                               getLeafManagementObjects(aem, 
analysisManagementObjects);
+                       } else {
+                               String path = produceUniqueName(aem);
+                               
analysisManagementObjects.add(deepCopyMetrics(aem, path));
+
+                       }
+
+               }
+               return analysisManagementObjects;
+       }
+
+       public static List<Properties> get(AnalysisEngineManagement aem) throws 
Exception {
+               List<Properties> analysisManagementObjects = new ArrayList<>();
+               synchronized (BasicUimaMetricsGenerator.class) {
+                       // Fetch AE's management information that includes per 
component
+                       // performance stats
+                       // These stats are internally maintained in a Map. If 
the AE is an
+                       // aggregate
+                       // the Map will contain AnalysisEngineManagement 
instance for each AE.
+                       // AnalysisEngineManagement aem = 
ae.getManagementInterface();
+                       if (aem.getComponents().size() > 0) {
+                               // Flatten the hierarchy by recursively (if 
this AE is an aggregate)
+                               // extracting
+                               // primitive AE's AnalysisEngineManagement 
instance and placing it
+                               // in
+                               // afterAnalysisManagementObjects List.
+                               getLeafManagementObjects(aem, 
analysisManagementObjects);
+                       } else {
+                               String path = produceUniqueName(aem);
+                               
analysisManagementObjects.add(deepCopyMetrics(aem, path));
+
+                       }
+
+               }
+               return analysisManagementObjects;
+       }
+
+       /**
+        * Recursively
+        * 
+        * @param aem
+        * @param result
+        * @param uimaFullyQualifiedAEContext
+        */
+       private static void getLeafManagementObjects(AnalysisEngineManagement 
aem, List<Properties> result,
+                       String uimaFullyQualifiedAEContext) {
+               if (aem.getComponents().isEmpty()) {
+                       // skip Flow Controller
+                       if (!aem.getName().equals("Fixed Flow Controller")) {
+                               // is this primitive AE delegate in an 
aggregate. If so the
+                               // mbean unique name will have "p0=" string. An 
examples mbean
+                               // name looks like this:
+                               // org.apache.uima:type=ee.jms.services,s=Top 
Level Aggregate
+                               // TAE Uima EE Service,p0=Top Level Aggregate 
TAE
+                               // Components,p1=SecondLevelAggregateCM
+                               // Components,p2=ThirdLevelAggregateCM
+                               // Components,name=Multiplier1
+                               if (aem.getUniqueMBeanName().indexOf("p0=") > 
-1) {
+                                       int p1indx = 
aem.getUniqueMBeanName().indexOf("p1=");
+                                       if (p1indx > -1) {
+                                               String tmp = 
aem.getUniqueMBeanName().substring(p1indx);
+                                               String[] parts = tmp.split(",");
+                                               for (String part : parts) {
+                                                       if 
(part.startsWith("name=")) {
+                                                               
uimaFullyQualifiedAEContext += "/" + part.substring(5);
+                                                               break;
+                                                       }
+                                               }
+                                       } else {
+                                               uimaFullyQualifiedAEContext = 
"";
+                                       }
+
+                               }
+                               result.add(deepCopyMetrics(aem, 
uimaFullyQualifiedAEContext));
+                       }
+               } else {
+                       for (AnalysisEngineManagement child : 
(Iterable<AnalysisEngineManagement>) aem.getComponents().values()) {
+                               getLeafManagementObjects(child, result, 
produceUniqueName(aem));
+                       }
+               }
+       }
+
+       private static String produceUniqueName(AnalysisEngineManagement aem) {
+               String[] parts = aem.getUniqueMBeanName().split(",");
+               StringBuffer sb = new StringBuffer();
+               for (String part : parts) {
+                       int pos;
+                       if ((pos = part.indexOf("=")) > -1 && 
part.startsWith("p")) {
+                               String n = part.substring(pos + 1, 
part.indexOf(" Components"));
+                               if (part.startsWith("p0=") && n.indexOf(" ") > 
-1) {
+                                       String indx = 
n.substring(n.lastIndexOf(" "));
+                                       if (indx != null) {
+                                               int instanceNumber = -1;
+                                               try {
+                                                       instanceNumber = 
Integer.parseInt(indx.trim());
+                                                       
sb.append(instanceNumber).append(" Components ");
+                                                       n = n.substring(0, 
n.lastIndexOf(" "));
+                                               } catch (NumberFormatException 
nfe) {
+                                               }
+                                       }
+                               }
+                               sb.append("/").append(n.trim());
+                       } else if (part.trim().startsWith("name=") || 
part.trim().startsWith("org.apache.uima:name=")) {
+                               
sb.append("/").append(part.substring(part.trim().indexOf("=") + 1));
+                       }
+               }
+               return sb.toString();
+       }
+
+       private static Properties deepCopyMetrics(AnalysisEngineManagement aem, 
String uimaFullyQualifiedAEContext) {
+               String index = "";
+
+               // Create a unique name with each AE name is separated with 
"/". Prepend
+               // "X Components" where
+               // X is a instance number of a scaled AE. Also, strip the X 
from the AE
+               // name. The instance number
+               // is added to each scaled up component during initialization 
of the
+               // uima-as. We need to prepend
+               // "X Components" to allow DUCC JD to parse the unique name 
correctly (
+               // basically for backwards
+               // compatibility.
+               int pos = aem.getUniqueMBeanName().lastIndexOf("name=");
+               if (pos > -1) {
+                       // get the name of the component. In case of nested 
component this
+                       // will be the KEY from AE descriptor
+                       String tmp = aem.getUniqueMBeanName().substring(pos + 
5);
+                       // in case this is the top level AE, check if it has 
been scaled up
+                       // by extracting its instance number.For example,
+                       // NoOpAnnotator 2.
+                       int last = tmp.lastIndexOf(" ");
+                       if (last == -1) {
+                               index = "1";
+                       } else {
+                               index = tmp.substring(last).trim();
+                       }
+                       if (uimaFullyQualifiedAEContext.trim().length() > 0 && 
last > -1) {
+                               // extract instance number
+
+                               try {
+                                       // check if the instance number is a 
number. If not silently
+                                       // handle the exception.
+                                       Integer.parseInt(index);
+                                       // strip the instance number from the 
AE name
+                                       uimaFullyQualifiedAEContext = 
uimaFullyQualifiedAEContext.substring(0, last + 1);
+                               } catch (NumberFormatException nfe) {
+
+                               } catch (Exception e) {
+                               }
+                       } else {
+
+                               if (!uimaFullyQualifiedAEContext.endsWith(tmp)) 
{
+                                       uimaFullyQualifiedAEContext += "/" + 
tmp;
+                               }
+                       }
+               }
+               Properties p = new Properties();
+               p.setProperty(AE_NAME, aem.getName());
+               p.setProperty(AE_CONTEXT, uimaFullyQualifiedAEContext);
+               p.setProperty(AE_ANALYSIS_TIME, 
String.valueOf(aem.getAnalysisTime()));
+               p.setProperty(AE_CAS_PROCESSED, 
String.valueOf(aem.getNumberOfCASesProcessed()));
+
+               return p;
+       }
+
+       public static List<Properties> getDelta(List<Properties> 
afterAnalysisManagementObjects,
+                       List<Properties> beforeAnalysisManagementObjects) 
throws Exception {
+
+               List<Properties> deltaMetrics = new ArrayList<>();
+               // Diff the before process() performance metrics with post 
process performance
+               // metrics
+               for (Properties after : afterAnalysisManagementObjects) {
+                       for (Properties before : 
beforeAnalysisManagementObjects) {
+                               String uniqueName = (String) 
after.get(AE_CONTEXT);
+                               if (((String) 
before.get(AE_CONTEXT)).equals(uniqueName)) {
+                                       long postProcessCasCount = 
Long.valueOf(after.getProperty(AE_CAS_PROCESSED));
+                                       long preProcessCasCount = 
Long.valueOf(before.getProperty(AE_CAS_PROCESSED));
+
+                                       long deltaProcessCasCount = 
postProcessCasCount - preProcessCasCount;
+
+                                       long afterAnalysisTime = 
Long.valueOf(after.getProperty(AE_ANALYSIS_TIME)).longValue();
+                                       long beforeAnalysisTime = 
Long.valueOf(before.getProperty(AE_ANALYSIS_TIME)).longValue();
+
+                                       long deltaAnalysisTime = 
afterAnalysisTime - beforeAnalysisTime;
+                                       if (deltaAnalysisTime < 0) {
+                                               Logger logger = 
UIMAFramework.getLogger();
+                                               logger.log(Level.WARNING, 
"Thread:" + Thread.currentThread()
+                                                               + " 
UimaProcessContainer.getAEMetricsForCAS() - Unexpected negative result for 
analysis time:"
+                                                               + 
(afterAnalysisTime - beforeAnalysisTime) + " Component:" + uniqueName + " 
before="
+                                                               + 
beforeAnalysisTime + " after=" + afterAnalysisTime);
+                                       }
+                                       Properties metrics = new Properties();
+                                       metrics.setProperty(AE_NAME, 
after.getProperty(AE_NAME));
+                                       metrics.setProperty(AE_CONTEXT, 
uniqueName);
+                                       metrics.setProperty(AE_ANALYSIS_TIME, 
String.valueOf(deltaAnalysisTime));
+                                       metrics.setProperty(AE_CAS_PROCESSED, 
String.valueOf(deltaProcessCasCount));
+                                       deltaMetrics.add(metrics);
+                                       break;
+                               }
+                       }
+               }
+               return deltaMetrics;
+
+       }
+}

Propchange: 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/BasicUimaMetricsGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/UimaWrapper.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/UimaWrapper.java?rev=1859733&view=auto
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/UimaWrapper.java
 (added)
+++ 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/UimaWrapper.java
 Wed May 22 15:51:17 2019
@@ -0,0 +1,140 @@
+/*
+ * 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.ducc.user.common.main;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+import javax.xml.parsers.FactoryConfigurationError;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.impl.XmiCasDeserializer;
+import org.apache.uima.ducc.user.common.BasicUimaMetricsGenerator;
+import org.apache.uima.ducc.user.common.UimaUtils;
+import org.apache.uima.internal.util.XMLUtils;
+import org.apache.uima.resource.Resource;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.apache.uima.util.CasPool;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+public class UimaWrapper {
+       private CasPool casPool = null;
+       private ResourceManager rm = UIMAFramework.newDefaultResourceManager();
+       // Platform MBean server if one is available (Java 1.5 only)
+       private static Object platformMBeanServer;
+       private boolean deserializeFromXMI;
+
+       static {
+               // try to get platform MBean Server (Java 1.5 only)
+               try {
+                       Class<?> managementFactory = 
Class.forName("java.lang.management.ManagementFactory");
+                       Method getPlatformMBeanServer = 
managementFactory.getMethod("getPlatformMBeanServer", new Class[0]);
+                       platformMBeanServer = 
getPlatformMBeanServer.invoke(null, (Object[]) null);
+               } catch (Exception e) {
+                       platformMBeanServer = null;
+               }
+       }
+
+       public void initialize(String analysisEngineDescriptor, int scaleout, 
boolean deserialize,
+                       ThreadLocal<AnalysisEngine> threadLocal) throws 
Exception {
+
+               ResourceSpecifier rSpecifier = 
UimaUtils.getResourceSpecifier(analysisEngineDescriptor);
+               HashMap<String, Object> paramsMap = new HashMap<>();
+               paramsMap.put(Resource.PARAM_RESOURCE_MANAGER, rm);
+               paramsMap.put(AnalysisEngine.PARAM_MBEAN_SERVER, 
platformMBeanServer);
+               deserializeFromXMI = deserialize;
+
+               AnalysisEngine ae = 
UIMAFramework.produceAnalysisEngine(rSpecifier, paramsMap);
+               // pin AE instance to this thread
+               threadLocal.set(ae);
+
+               // check out AE instance pinned to this thread
+
+               synchronized (UimaWrapper.class) {
+                       if (casPool == null) {
+                               
initializeCasPool(ae.getAnalysisEngineMetaData(), scaleout);
+                       }
+               }
+       }
+
+       public List<Properties> process(String serializedTask, 
ThreadLocal<AnalysisEngine> threadLocal) throws Exception {
+
+               CAS cas = casPool.getCas();
+               try {
+                       if (deserializeFromXMI) {
+                               deserializeCasFromXmi(serializedTask, cas);
+                       } else {
+                               cas.setDocumentText(serializedTask);
+                               cas.setDocumentLanguage("en");
+
+                       }
+                       // check out AE instance pinned to this thread
+                       AnalysisEngine ae = threadLocal.get();
+                       List<Properties> preProcessMetrics = 
BasicUimaMetricsGenerator.get(ae);
+                       ae.process(cas);
+                       List<Properties> postProcessMetrics = 
BasicUimaMetricsGenerator.get(ae);
+                       return 
BasicUimaMetricsGenerator.getDelta(postProcessMetrics, preProcessMetrics);
+
+               } finally {
+                       if (cas != null) {
+                               casPool.releaseCas(cas);
+                       }
+               }
+
+       }
+
+       public void deserializeCasFromXmi(String anXmlStr, CAS aCAS)
+                       throws FactoryConfigurationError, SAXException, 
IOException {
+
+               XMLReader xmlReader = XMLUtils.createXMLReader();
+               Reader reader = new StringReader(anXmlStr);
+               XmiCasDeserializer deser = new 
XmiCasDeserializer(aCAS.getTypeSystem());
+               ContentHandler handler = deser.getXmiCasHandler(aCAS);
+               xmlReader.setContentHandler(handler);
+               xmlReader.parse(new InputSource(reader));
+       }
+
+       public void stop(ThreadLocal<AnalysisEngine> threadLocal) {
+               AnalysisEngine ae = threadLocal.get();
+               if (ae != null) {
+                       ae.destroy();
+               }
+       }
+
+       private void initializeCasPool(AnalysisEngineMetaData 
analysisEngineMetadata, int scaleout)
+                       throws ResourceInitializationException {
+               Properties props = new Properties();
+               props.setProperty(UIMAFramework.CAS_INITIAL_HEAP_SIZE, "1000");
+               casPool = new CasPool(scaleout, analysisEngineMetadata, rm);
+       }
+
+}

Propchange: 
uima/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/UimaWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to