blob: 9f5b7530e544e6b98aaef1c7423fa62ca34c7f1e [file] [log] [blame]
/*
* 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.impl;
import org.apache.uima.UimaContext;
import org.apache.uima.UimaContextHolder;
import org.apache.uima.cas.AbstractCas;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.ComponentInfo;
import org.apache.uima.cas.impl.CASImpl;
import org.apache.uima.internal.util.function.Runnable_withException;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.resource.impl.CasManager_impl;
/**
* Shared code refactored from other spots to reduce duplication
* and improve maintainability
*
*/
public class Util {
public static CASImpl getStartingView(CAS cas, boolean sofaAware, ComponentInfo componentInfo) {
// OLD behavior:
// if this is a sofa-aware component, give it the Base CAS
// if it is a sofa-unaware component, give it whatever view maps to the _InitialView
// NEW behavior:
// always return whatever view maps to the _InitialView
CASImpl ci;
// need to set the componentInfo for the getView to find the sofa mappings
// Do this *before* the getView call below
// note: this is in a shared view part of the CAS
cas.setCurrentComponentInfo(componentInfo);
// if (sofaAware) {
// ci = ((CASImpl) cas).getBaseCAS();
// } else {
// ci = (CASImpl) cas.getView(CAS.NAME_DEFAULT_SOFA);
// }
ci = (CASImpl) cas.getView(CAS.NAME_DEFAULT_SOFA);
return ci;
}
public static AbstractCas setupViewSwitchClassLoadersLockCas(
CAS cas,
boolean sofaAware,
ComponentInfo componentInfo,
ResourceManager resourceManager,
Class<? extends AbstractCas> casInterface) {
CASImpl ci = getStartingView(cas, sofaAware, componentInfo);
// get requested interface to CAS (CAS or JCas)
// next will create JCas if needed, but not already created
// must precede the switchClassLoader call - that one needs the JCas link, if it is being used
AbstractCas r = CasManager_impl.getCasInterfaceStatic(ci, casInterface);
// This cas will be unlocked and its class loader restored when the
// next() method returns it
// Insure the same view is passed for switching/restoring https://issues.apache.org/jira/browse/UIMA-2211
ci.switchClassLoaderLockCasCL(resourceManager.getExtensionClassLoader());
return r;
}
public static <T extends AbstractCas> T setupViewSwitchClassLoaders(
CAS cas,
boolean sofaAware,
ComponentInfo componentInfo,
ResourceManager resourceManager,
Class<T> casInterface) {
CASImpl ci = getStartingView(cas, sofaAware, componentInfo);
// get requested interface to CAS (CAS or JCas)
// next will create JCas if needed, but not already created
// must precede the switchClassLoader call - that one needs the JCas link, if it is being used
T r = CasManager_impl.<T>getCasInterfaceStatic(ci, casInterface);
// This cas will be unlocked and its class loader restored when the
// next() method returns it
// Insure the same view is passed for switching/restoring https://issues.apache.org/jira/browse/UIMA-2211
// ci.switchClassLoader(resourceManager.getExtensionClassLoader());
return r;
}
/**
* Calls userCode and then restores the context holder
* @param userCode run this code within the current context
*/
public static void preserveContextHolder(Runnable userCode) {
UimaContext prevContext = UimaContextHolder.getContext();
try {
userCode.run();
} finally {
UimaContextHolder.setContext(prevContext);
}
}
/**
* Calls userCode with specified context, then restores the context holder
* @param context to use while running the userCode
* @param userCode the code to run.
*/
public static void withContextHolder(UimaContext context, Runnable userCode) {
UimaContext prevContext = UimaContextHolder.setContext(context);
try {
userCode.run();
} finally {
UimaContextHolder.setContext(prevContext);
}
}
/**
* Calls userCode with specified context, then restores the context holder
* @param context to use while running the userCode
* @param userCode the code to run.
* @throws Exception -
*/
public static void withContextHolderX(UimaContext context, Runnable_withException userCode) throws Exception {
UimaContext prevContext = UimaContextHolder.setContext(context);
try {
userCode.run();
} finally {
UimaContextHolder.setContext(prevContext);
}
}
}