Author: schor Date: Tue Dec 1 16:59:32 2015 New Revision: 1717465 URL: http://svn.apache.org/viewvc?rev=1717465&view=rev Log: [UIMA-4701] save type system impl associated with a cas definition for reuse
Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/resource/CasDefinition.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/util/CasCreationUtils.java Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/resource/CasDefinition.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/resource/CasDefinition.java?rev=1717465&r1=1717464&r2=1717465&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/resource/CasDefinition.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/resource/CasDefinition.java Tue Dec 1 16:59:32 2015 @@ -26,6 +26,7 @@ import java.util.List; import java.util.Properties; import org.apache.uima.UIMAFramework; +import org.apache.uima.cas.impl.TypeSystemImpl; import org.apache.uima.resource.metadata.FsIndexCollection; import org.apache.uima.resource.metadata.FsIndexDescription; import org.apache.uima.resource.metadata.ProcessingResourceMetaData; @@ -38,6 +39,8 @@ import org.apache.uima.util.CasCreationU */ public class CasDefinition { private TypeSystemDescription typeSystemDescription; + + private TypeSystemImpl typeSystemImpl; private TypePriorities typePriorities; @@ -174,4 +177,18 @@ public class CasDefinition { md.setFsIndexCollection(indColl); return md; } + + /** + * @return the typeSystemImpl + */ + public TypeSystemImpl getTypeSystemImpl() { + return typeSystemImpl; + } + + /** + * @param typeSystemImpl the typeSystemImpl to set + */ + public void setTypeSystemImpl(TypeSystemImpl typeSystemImpl) { + this.typeSystemImpl = typeSystemImpl; + } } Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/util/CasCreationUtils.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/util/CasCreationUtils.java?rev=1717465&r1=1717464&r2=1717465&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/util/CasCreationUtils.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/util/CasCreationUtils.java Tue Dec 1 16:59:32 2015 @@ -53,6 +53,7 @@ import org.apache.uima.cas.admin.FSIndex import org.apache.uima.cas.admin.LinearTypeOrderBuilder; import org.apache.uima.cas.admin.TypeSystemMgr; import org.apache.uima.cas.impl.CASImpl; +import org.apache.uima.cas.impl.TypeSystemImpl; import org.apache.uima.cas_data.CasData; import org.apache.uima.cas_data.FeatureStructure; import org.apache.uima.cas_data.PrimitiveValue; @@ -576,10 +577,20 @@ public class CasCreationUtils { CASMgr casMgr; if (aTypeSystem != null) { casMgr = CASFactory.createCAS(aTypeSystem, useJcasCache); + + // Set JCas ClassLoader - before setupTypeSystem + if (aResourceManager.getExtensionClassLoader() != null) { + casMgr.setJCasClassLoader(aResourceManager.getExtensionClassLoader()); + } + } else // no TypeSystem to reuse - create a new one { casMgr = CASFactory.createCAS(); + if (aResourceManager.getExtensionClassLoader() != null) { + casMgr.setJCasClassLoader(aResourceManager.getExtensionClassLoader()); + } + // install type system setupTypeSystem(casMgr, aTypeSystemDesc); // Commit the type system @@ -602,10 +613,6 @@ public class CasCreationUtils { // Commit the index repository casMgr.getIndexRepositoryMgr().commit(); - // Set JCas ClassLoader - if (aResourceManager.getExtensionClassLoader() != null) { - casMgr.setJCasClassLoader(aResourceManager.getExtensionClassLoader()); - } return casMgr.getCAS().getView(CAS.NAME_DEFAULT_SOFA); } @@ -613,6 +620,9 @@ public class CasCreationUtils { /** * Create a CAS from a CAS Definition. * + * In V3, creating the type system is expensive (due to loading and setting up of JCas classes), so + * we do the type system creation once per CasDefinition and store it with the CAS definition + * * @param casDef * completely describes the CAS to be created * @param performanceTuningSettings @@ -626,8 +636,21 @@ public class CasCreationUtils { */ public static CAS createCas(CasDefinition casDef, Properties performanceTuningSettings) throws ResourceInitializationException { - return createCas(casDef.getTypeSystemDescription(), casDef.getTypePriorities(), casDef - .getFsIndexDescriptions(), performanceTuningSettings, casDef.getResourceManager()); + TypeSystemImpl tsi = casDef.getTypeSystemImpl(); + CAS cas; + if (null == tsi) { + synchronized (casDef) { + if (null == tsi) { // retest under sync lock + cas = createCas(casDef.getTypeSystemDescription(), casDef.getTypePriorities(), + casDef.getFsIndexDescriptions(), performanceTuningSettings, casDef.getResourceManager()); + casDef.setTypeSystemImpl((TypeSystemImpl) cas.getTypeSystem()); + return cas; + } + } + } + + return doCreateCas(tsi, casDef.getTypeSystemDescription(), casDef.getTypePriorities(), + casDef.getFsIndexDescriptions(), performanceTuningSettings, casDef.getResourceManager()); } /**