Author: schor Date: Mon Jul 23 20:35:45 2018 New Revision: 1836512 URL: http://svn.apache.org/viewvc?rev=1836512&view=rev Log: [UIMA-5763] added support, test case
Added: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasState.java Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UIMARuntimeException.java uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CasManager_impl.java uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasPoolTest.java Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UIMARuntimeException.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UIMARuntimeException.java?rev=1836512&r1=1836511&r2=1836512&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UIMARuntimeException.java (original) +++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UIMARuntimeException.java Mon Jul 23 20:35:45 2018 @@ -52,6 +52,12 @@ public class UIMARuntimeException extend * CAS that does not belong to this CasManager. */ public static final String CAS_RELEASED_TO_WRONG_CAS_MANAGER = "cas_released_to_wrong_cas_manager"; + + /** + * Illegal invocation of casRelease() while awaiting response from a UIMA-AS Service. + */ + public static final String CAS_RELEASE_NOT_ALLOWED_WHILE_WAITING_FOR_UIMA_AS = "CAS_RELEASE_NOT_ALLOWED_WHILE_WAITING_FOR_UIMA_AS"; + /** * Message key for a standard UIMA exception message: "The Ecore model for the UIMA built-in types Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java?rev=1836512&r1=1836511&r2=1836512&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java (original) +++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java Mon Jul 23 20:35:45 2018 @@ -39,6 +39,7 @@ import java.nio.LongBuffer; import java.nio.ShortBuffer; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -364,7 +365,10 @@ public class CASImpl extends AbstractCas private final StringBuilder traceFScreationSb = traceFSs ? new StringBuilder() : null; private int traceFSid = 0; - private boolean traceFSisCreate; + private boolean traceFSisCreate; + + + private final EnumSet<CasState> casState = EnumSet.noneOf(CasState.class); private SharedViewData(boolean useFSCache, Heap heap, CASImpl baseCAS, CASMetadata casMetadata) { this.useFSCache = useFSCache; @@ -422,7 +426,31 @@ public class CASImpl extends AbstractCas public void setCacheNotInIndex(int fsAddr) { svd.cache_not_in_index = fsAddr; } + + /** + * @param state to add to the set + * @return true if the set changed as a result of this operation + */ + public boolean setCasState(CasState state) { + return svd.casState.add(state); + } + + /** + * @param state to see if it is among the items in this set + * @return true if the set contains that state + */ + public boolean containsCasState(CasState state) { + return svd.casState.contains(state); + } + /** + * @param state to be removed + * @return true if it was present, and is now removed + */ + public boolean clearCasState(CasState state) { + return svd.casState.remove(state); + } + // The index repository. Referenced by XmiCasSerializer FSIndexRepositoryImpl indexRepository; Added: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasState.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasState.java?rev=1836512&view=auto ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasState.java (added) +++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasState.java Mon Jul 23 20:35:45 2018 @@ -0,0 +1,29 @@ +/* + * 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.cas.impl; + +/** + * states the CAS can be in + */ +public enum CasState { + UIMA_AS_WAIT_4_RESPONSE, // when in this state, uima-as is awaiting response from a remote, + // any attempt "release" this cas will throw an exception + // READ_ONLY, // multi-threaded access for reading allowed, no updating + // NO_ACCESS, // no reading or writing (except by privileged internal operations) +} Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CasManager_impl.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CasManager_impl.java?rev=1836512&r1=1836511&r2=1836512&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CasManager_impl.java (original) +++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CasManager_impl.java Mon Jul 23 20:35:45 2018 @@ -34,6 +34,7 @@ import org.apache.uima.cas.CAS; import org.apache.uima.cas.CASException; import org.apache.uima.cas.TypeSystem; import org.apache.uima.cas.impl.CASImpl; +import org.apache.uima.cas.impl.CasState; import org.apache.uima.internal.util.JmxMBeanAgent; import org.apache.uima.jcas.JCas; import org.apache.uima.resource.CasDefinition; @@ -188,6 +189,9 @@ public class CasManager_impl implements CASImpl baseCas = (aCAS instanceof JCas) ? ((JCas)aCAS).getCasImpl().getBaseCAS() : ((CASImpl)aCAS).getBaseCAS(); + if (baseCas.containsCasState(CasState.UIMA_AS_WAIT_4_RESPONSE)) { + throw new UIMARuntimeException(UIMARuntimeException.CAS_RELEASE_NOT_ALLOWED_WHILE_WAITING_FOR_UIMA_AS, new Object[0]); + } CasPool pool = mCasToCasPoolMap.get(baseCas); if (pool == null) { // CAS doesn't belong to this CasManager! Modified: uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties?rev=1836512&r1=1836511&r2=1836512&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties (original) +++ uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties Mon Jul 23 20:35:45 2018 @@ -26,6 +26,8 @@ #----------------------------- cas_released_to_wrong_cas_manager = CasManager.releaseCas(CAS) was called with a CAS that does not belong \ to this CasManager. + +CAS_RELEASE_NOT_ALLOWED_WHILE_WAITING_FOR_UIMA_AS = Illegal invocation of casRelease() while awaiting response from a UIMA-AS Service. uima_ecore_not_found = The Ecore model for the UIMA built-in types (uima.ecore) was not found in the classpath. Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasPoolTest.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasPoolTest.java?rev=1836512&r1=1836511&r2=1836512&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasPoolTest.java (original) +++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasPoolTest.java Mon Jul 23 20:35:45 2018 @@ -29,6 +29,7 @@ import org.junit.Assert; import junit.framework.TestCase; import org.apache.uima.UIMAFramework; +import org.apache.uima.UIMARuntimeException; import org.apache.uima.analysis_engine.AnalysisEngine; import org.apache.uima.analysis_engine.AnalysisEngineDescription; import org.apache.uima.cas.CAS; @@ -75,8 +76,34 @@ public class CasPoolTest extends TestCas public void tearDown() { + } + public void testCasReleaseNotAllowed() throws Exception { + final Properties p = new Properties(); + p.put(UIMAFramework.CAS_INITIAL_HEAP_SIZE, 200); + casManager.defineCasPool("id", 2, p); + CASImpl c = (CASImpl) casManager.getCas("id"); + c.setCasState(CasState.UIMA_AS_WAIT_4_RESPONSE); + Exception ex = null; + try { + c.release(); + } catch (UIMARuntimeException e) { + ex = e; + } + assertTrue(ex != null && + ex.getMessage().equals("Illegal invocation of casRelease() while awaiting response from a UIMA-AS Service.")); + c.clearCasState(CasState.UIMA_AS_WAIT_4_RESPONSE); + ex = null; + try { + c.release(); + } catch (UIMARuntimeException e) { + ex = e; + } + assertTrue(ex == null); + + } + public void testMultiThread() throws Exception { final Properties p = new Properties(); p.put(UIMAFramework.CAS_INITIAL_HEAP_SIZE, 200); @@ -136,6 +163,7 @@ public class CasPoolTest extends TestCas sb.append(" " + nc.decrementAndGet()); } + // verify that several CASes in a pool in different views share the same type system public void testPool() throws Exception {