blob: ae2579231dea24707734b2e6a1ae4d49cc38c2b4 [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.taeconfigurator.editors.ui.dialogs;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.swt.widgets.Display;
import org.apache.uima.analysis_engine.TypeOrFeature;
import org.apache.uima.resource.ResourceCreationSpecifier;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.resource.metadata.Capability;
import org.apache.uima.taeconfigurator.TAEConfiguratorPlugin;
import org.apache.uima.taeconfigurator.editors.MultiPageEditor;
import org.apache.uima.taeconfigurator.editors.ui.AbstractSection;
public class SearchThread implements Runnable /* extends Thread */{
private Pattern m_fileNameSearch;
private Pattern m_inputTypeSearch;
private Pattern m_outputTypeSearch;
private String m_projectToSearch;
FindComponentDialog m_dialog;
private AbstractSection m_aggregateSection;
private List m_matchingDelegateComponentDescriptors;
private List m_matchingDelegateComponentDescriptions;
int m_nWhichStatusMsg;
String m_statusMsg;
private String[] m_componentHeaders;
public SearchThread(FindComponentDialog dialog, AbstractSection aggregateSection,
String fileNameSearch, String inputTypeSearch, String outputTypeSearch,
String projectToSearch, String[] componentHeaders) {
m_dialog = dialog;
m_aggregateSection = aggregateSection;
m_fileNameSearch = (null == fileNameSearch)? null : Pattern.compile(fileNameSearch);
m_inputTypeSearch = (null == inputTypeSearch)? null : Pattern.compile(inputTypeSearch);
m_outputTypeSearch = (null == outputTypeSearch)? null : Pattern.compile(outputTypeSearch);
m_projectToSearch = projectToSearch;
m_componentHeaders = componentHeaders;
}
private boolean m_bDieNow = false;
private boolean m_bDone = false;
public void setDieNow() {
m_bDieNow = true;
}
public boolean getDieNow() {
return m_bDieNow;
}
public boolean isDone() {
return m_bDone;
}
public void run() {
m_matchingDelegateComponentDescriptors = new ArrayList();
m_matchingDelegateComponentDescriptions = new ArrayList();
getDelegateComponentsByInputOutputTypes(m_projectToSearch);
m_bDone = true;
}
private void testOneResource(IResource resource) {
switch (resource.getType()) {
case IResource.FILE:
if (resource.getName().toLowerCase().endsWith(".xml")
// exclude potentially many data files, not descriptors
&& !resource.getName().toLowerCase().endsWith(".txt.xml")
&& (m_fileNameSearch == null || m_fileNameSearch.matcher(resource.getName()).find())) {
String fileDescriptorRelPath = m_aggregateSection.editor
.getDescriptorRelativePath(resource.getLocation().toString());
setStatusMsg(2, "Examining " + getBriefDisplayVersion(fileDescriptorRelPath));
ResourceSpecifier rs = MultiPageEditor.getDelegateResourceSpecifier((IFile) resource,
m_componentHeaders);
// rs == null if wrong kind of descriptor
if (null == rs)
return;
if (!(rs instanceof ResourceCreationSpecifier)) // is a remote descriptor
if (m_inputTypeSearch != null || m_outputTypeSearch != null)
return; // don't find remote descriptors when types are wanted
if (!(rs instanceof ResourceCreationSpecifier) || // is a remote descriptor
delegateComponentMatchesCapabilityReqs((ResourceCreationSpecifier) rs,
m_inputTypeSearch, m_outputTypeSearch)) {
m_matchingDelegateComponentDescriptors.add(fileDescriptorRelPath);
m_matchingDelegateComponentDescriptions.add(rs);
}
}
break;
case IResource.FOLDER:
getDelegateComponentsByIOTypesBeginningAt((IFolder) resource);
break;
}
}
// populates the Vector of matchingAnalysisEngineDescriptors and
// matchingAnalysisEngineDescriptions
private void getDelegateComponentsByInputOutputTypes(String projectToSearch) {
IWorkspace workspace = TAEConfiguratorPlugin.getWorkspace();
IProject[] projects = workspace.getRoot().getProjects();
if (projectToSearch.equals(FindComponentDialog.ALL_PROJECTS)) {
setStatusMsg(1, "0 of " + projects.length + " projects processed.");
}
for (int i = 0; i < projects.length; i++) {
try {
if (projectToSearch.equals(FindComponentDialog.ALL_PROJECTS)
|| projects[i].getName().equals(projectToSearch)) {
if (projectToSearch.equals(FindComponentDialog.ALL_PROJECTS)) {
setStatusMsg(2, "Looking in " + projects[i].getName() + "....");
} else {
setStatusMsg(2, "Searching " + projects[i].getName() + " for matching TAEs...");
}
IResource[] projectContents = projects[i].members();
for (int j = 0; j < projectContents.length; j++) {
testOneResource(projectContents[j]);
}
if (projectToSearch.equals(FindComponentDialog.ALL_PROJECTS)) {
setStatusMsg(1, (i + 1) + " of " + projects.length + " projects processed.");
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
// populates the Vector of matchingAnalysisEngineDescriptors and
// matchingAnalysisEngineDescriptions
private void getDelegateComponentsByIOTypesBeginningAt(IFolder beginFolder) {
if (m_bDieNow) {
return;
}
try {
for (int i = 0; i < beginFolder.members().length; i++) {
testOneResource(beginFolder.members()[i]);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private boolean delegateComponentMatchesCapabilityReqs(ResourceCreationSpecifier rs,
Pattern inputTypeSearch, Pattern outputTypeSearch) {
if (inputTypeSearch == null && outputTypeSearch == null) {
return true;
}
Capability[] capabilities = AbstractSection.getCapabilities(rs);
if (capabilities == null || capabilities.length == 0) {
return false;
}
boolean inputSatisfied = matchCapabilitiesTo(capabilities, inputTypeSearch, INPUT);
boolean outputSatisfied = matchCapabilitiesTo(capabilities, outputTypeSearch, OUTPUT);
return inputSatisfied && outputSatisfied;
}
private static final boolean INPUT = true;
private static final boolean OUTPUT = false;
private boolean matchCapabilitiesTo(Capability[] capabilities, Pattern search, boolean isInput) {
if (null == search)
return true;
for (int i = 0; i < capabilities.length; i++) {
TypeOrFeature[] typeOrFeatures = isInput ? capabilities[i].getInputs() : capabilities[i]
.getOutputs();
if (null != typeOrFeatures) {
for (int j = 0; j < typeOrFeatures.length; j++) {
if (search.matcher(typeOrFeatures[j].getName()).find()) {
return true;
}
}
}
}
return false;
}
public List getMatchingDelegateComponentDescriptors() {
return m_matchingDelegateComponentDescriptors;
}
public List getMatchingDelegateComponentDescriptions() {
return m_matchingDelegateComponentDescriptions;
}
private void setStatusMsg(int nWhich, String msg) {
m_nWhichStatusMsg = nWhich;
m_statusMsg = msg;
if (m_dialog.getStatusLabel1().isDisposed())
return;
Display display = m_dialog.getStatusLabel1().getDisplay();
display.syncExec(new Runnable() {
public void run() {
if (m_nWhichStatusMsg == 1) {
m_dialog.getStatusLabel1().setText(m_statusMsg);
} else {
m_dialog.getStatusLabel2().setText(m_statusMsg);
}
}
});
}
private String getBriefDisplayVersion(String filePathName) {
if (filePathName == null) {
return null;
}
filePathName = AbstractSection.maybeShortenFileName(filePathName);
return filePathName;
}
}