in ruta-ep-addons/src/main/java/org/apache/uima/ruta/query/ui/QueryActionHandler.java [138:372]
public IStatus run(IProgressMonitor monitor) {
final QueryView queryView = (QueryView) HandlerUtil.getActivePart(event);
final QueryComposite queryComposite = queryView.getComposite();
// queryView.saveState();
queryView.showBusy(true);
monitor.beginTask("Initializing analysis engine...", 1);
queryComposite.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
queryComposite.setResult(null);
}
});
int files = 0;
int found = 0;
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
if (StringUtils.isBlank(dataLocation)) {
return Status.error("No data location specified.");
}
if (StringUtils.isBlank(typeSystemLocation)) {
return Status.error("No type system specified.");
}
File dir = new File(dataLocation);
if (!dir.exists() || !dir.isDirectory() || !dir.canRead()) {
return Status.error("Data location does not exist, is not a directory or cannot be read.");
}
final List<QueryResult> result = new ArrayList<QueryResult>();
String script = "PACKAGE query;\n\n";
// script += "TYPESYSTEM " + typeSystemFileText.getText();
script += rules;
try {
URL aedesc = RutaEngine.class.getResource("BasicEngine.xml");
XMLInputSource inae = new XMLInputSource(aedesc);
IFile typeSystemFile = QueryComposite.getIFile(typeSystemLocation);
IProject project = typeSystemFile.getProject();
ClassLoader classLoader = RutaProjectUtils.getClassLoader(project);
ResourceManager resMgr = new ResourceManager_impl(classLoader);
ResourceSpecifier specifier = UIMAFramework.getXMLParser().parseResourceSpecifier(inae);
AnalysisEngineDescription aed = (AnalysisEngineDescription) specifier;
TypeSystemDescription basicTypeSystem = aed.getAnalysisEngineMetaData().getTypeSystem();
if (!StringUtils.isEmpty(typeSystemLocation)) {
// TODO check on valid input and extend for scr
String tsLocation = typeSystemLocation;
Collection<TypeSystemDescription> tsds = new ArrayList<TypeSystemDescription>();
tsds.add(basicTypeSystem);
if (typeSystemLocation.endsWith(RutaEngine.SCRIPT_FILE_EXTENSION)) {
IPath scriptPath = typeSystemFile.getLocation();
IPath descriptorRootPath = RutaProjectUtils.getDescriptorRootPath(project);
resMgr.setDataPath(descriptorRootPath.toPortableString());
IPath path = RutaProjectUtils.getTypeSystemDescriptorPath(scriptPath, project,
classLoader);
tsLocation = path.toPortableString();
}
File tsFile = new File(tsLocation);
XMLInputSource ints = new XMLInputSource(tsFile);
TypeSystemDescription importTSD = UIMAFramework.getXMLParser()
.parseTypeSystemDescription(ints);
importTSD.resolveImports(resMgr);
tsds.add(importTSD);
TypeSystemDescription mergeTypeSystems = CasCreationUtils.mergeTypeSystems(tsds);
aed.getAnalysisEngineMetaData().setTypeSystem(mergeTypeSystems);
}
aed.resolveImports(resMgr);
AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(aed, resMgr, null);
File tempFile = File.createTempFile("RutaQuery", RutaEngine.SCRIPT_FILE_EXTENSION);
tempFile.deleteOnExit();
FileUtils.saveString2File(script, tempFile, "UTF-8");
String portableString = Path.fromOSString(tempFile.getParentFile().getPath())
.toPortableString();
ae.setConfigParameterValue(RutaEngine.PARAM_SCRIPT_PATHS, new String[] { portableString });
String name = tempFile.getName().substring(0, tempFile.getName().length() - 5);
ae.setConfigParameterValue(RutaEngine.PARAM_MAIN_SCRIPT, name);
ae.setConfigParameterValue(RutaEngine.PARAM_DEBUG, true);
ae.setConfigParameterValue(RutaEngine.PARAM_DEBUG_WITH_MATCHES, true);
ae.setConfigParameterValue(RutaEngine.PARAM_PROFILE, false);
ae.setConfigParameterValue(RutaEngine.PARAM_STATISTICS, false);
IRutaConditionExtension[] conditionExtensions = RutaExtensionManager.getDefault()
.getRutaConditionExtensions();
IRutaActionExtension[] actionExtensions = RutaExtensionManager.getDefault()
.getRutaActionExtensions();
IRutaBooleanFunctionExtension[] booleanFunctionExtensions = RutaExtensionManager
.getDefault().getRutaBooleanFunctionExtensions();
IRutaNumberFunctionExtension[] numberFunctionExtensions = RutaExtensionManager.getDefault()
.getRutaNumberFunctionExtensions();
IRutaStringFunctionExtension[] stringFunctionExtensions = RutaExtensionManager.getDefault()
.getRutaStringFunctionExtensions();
IRutaTypeFunctionExtension[] typeFunctionExtensions = RutaExtensionManager.getDefault()
.getRutaTypeFunctionExtensions();
IRutaBlockExtension[] blockExtensions = RutaExtensionManager.getDefault()
.getRutaBlockExtensions();
List<String> languageExtensions = new ArrayList<String>();
for (IRutaConditionExtension each : conditionExtensions) {
languageExtensions.add(each.getClass().getName());
}
for (IRutaActionExtension each : actionExtensions) {
languageExtensions.add(each.getClass().getName());
}
for (IRutaBooleanFunctionExtension each : booleanFunctionExtensions) {
languageExtensions.add(each.getClass().getName());
}
for (IRutaNumberFunctionExtension each : numberFunctionExtensions) {
languageExtensions.add(each.getClass().getName());
}
for (IRutaStringFunctionExtension each : stringFunctionExtensions) {
languageExtensions.add(each.getClass().getName());
}
for (IRutaTypeFunctionExtension each : typeFunctionExtensions) {
languageExtensions.add(each.getClass().getName());
}
for (IRutaBlockExtension each : blockExtensions) {
languageExtensions.add(each.getClass().getName());
}
ae.setConfigParameterValue(RutaEngine.PARAM_ADDITIONAL_EXTENSIONS,
languageExtensions.toArray(new String[0]));
ae.reconfigure();
CAS cas = ae.newCAS();
monitor.worked(1);
if (monitor.isCanceled()) {
if (ae != null) {
ae.destroy();
}
if (cas != null) {
cas.release();
}
return Status.CANCEL_STATUS;
}
List<File> inputFiles = getFiles(dir, recursive);
monitor.beginTask("Query in " + dir.getName() + "...", inputFiles.size());
for (File each : inputFiles) {
monitor.setTaskName("Query in " + each.getName() + "...");
if (monitor.isCanceled()) {
if (ae != null) {
ae.destroy();
}
if (cas != null) {
cas.release();
}
return Status.CANCEL_STATUS;
}
cas.reset();
if (FilenameUtils.getExtension(each.getName()).equalsIgnoreCase("xmi")
|| FilenameUtils.getExtension(each.getName()).equalsIgnoreCase("bcas")
|| FilenameUtils.getExtension(each.getName()).equalsIgnoreCase("scas")
|| FilenameUtils.getExtension(each.getName()).equalsIgnoreCase("xcas")) {
CasIOUtils.load(each.toURI().toURL(), cas);
} else {
cas.setDocumentText(getText(each));
}
Type matchedType = cas.getTypeSystem()
.getType("org.apache.uima.ruta.type.DebugMatchedRuleMatch");
Type ruleApplyType = cas.getTypeSystem()
.getType("org.apache.uima.ruta.type.DebugRuleApply");
Type blockApplyType = cas.getTypeSystem()
.getType("org.apache.uima.ruta.type.DebugBlockApply");
removeDebugAnnotations(cas, matchedType, ruleApplyType, blockApplyType);
ae.process(cas);
Feature innerApplyFeature = blockApplyType.getFeatureByBaseName("innerApply");
Feature ruleApplyFeature = blockApplyType.getFeatureByBaseName("rules");
FSIterator<AnnotationFS> iterator = cas.getAnnotationIndex(blockApplyType).iterator();
boolean foundOne = false;
while (iterator.isValid()) {
if (monitor.isCanceled()) {
if (ae != null) {
ae.destroy();
}
if (cas != null) {
cas.release();
}
return Status.CANCEL_STATUS;
}
AnnotationFS fs = iterator.get();
int find = findRuleMatches(result, fs, each, queryComposite, matchedType, ruleApplyType,
blockApplyType, innerApplyFeature, ruleApplyFeature);
iterator.moveToNext();
found += find;
if (!foundOne && find > 0) {
foundOne = true;
files++;
}
final int constFound = found;
final int constFiles = files;
queryComposite.getDisplay().syncExec(new Runnable() {
@Override
public void run() {
queryComposite.setResult(result);
queryComposite.setResultInfo(constFound, constFiles);
}
});
}
monitor.worked(1);
}
cas.release();
ae.destroy();
monitor.done();
} catch (Exception e) {
// report error in query view:
queryComposite.getDisplay().syncExec(new Runnable() {
@Override
public void run() {
queryComposite.setRutaQuerySyntaxError(true);
}
});
RutaAddonsPlugin.error(e);
}
return Status.OK_STATUS;
}