blob: bdce51bd9126e33dbc969673ca6242eafb62a9e3 [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.ruta.textruler.ui;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import org.apache.uima.ruta.textruler.TextRulerPlugin;
import org.apache.uima.ruta.textruler.core.GlobalCASSource;
import org.apache.uima.ruta.textruler.extension.TextRulerController;
import org.apache.uima.ruta.textruler.extension.TextRulerControllerDelegate;
import org.apache.uima.ruta.textruler.extension.TextRulerLearner.TextRulerLearnerState;
import org.apache.uima.ruta.textruler.extension.TextRulerLearnerController;
import org.apache.uima.ruta.textruler.extension.TextRulerPreprocessor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
public class TextRulerView extends ViewPart implements TextRulerControllerDelegate {
public static final String ID = "org.apache.uima.ruta.ml.MainView";
private TextRulerViewComposite viewContent;
private IMemento memento;
public TextRulerView() {
super();
}
public void errorAlert(String message) {
MessageBox alert = new MessageBox(getSite().getShell(), SWT.OK | SWT.ICON_ERROR);
alert.setMessage(message);
alert.open();
}
public boolean yesNoAlert(String message) {
MessageBox alert = new MessageBox(getSite().getShell(), SWT.OK | SWT.CANCEL | SWT.ICON_QUESTION);
alert.setMessage(message);
int result = alert.open();
return result == SWT.OK; // THIS DOES NOT WORK IN OS X !!??
}
public void onStartStopPressed() {
if (TextRulerController.isRunning()) {
// if
// (yesNoAlert("Do you really want to abort the current learning processes?"))
// TODO does not work in OS X since alert.open always returns 256
// (=cancel) no matter which button was pressed...
TextRulerController.abort();
} else {
startPressed();
}
updateEnabledStatus();
}
public void startPressed() {
if (!TextRulerController.isRunning()) {
String inputDir = viewContent.getInputDirectoryPath().trim();
String additionalDir = viewContent.getAdditionalDirectoryPath().trim();
String preProcTMFile = viewContent.getPreprocessorTMFile().trim();
File inputFile = new File(inputDir);
if (!inputFile.exists()) {
AddRemoveList.printErrorDialog("The training data directory was not found!");
return;
}
File additionalFile = new File(additionalDir);
// if (!additionalFile .exists()) {
// AddRemoveList.printErrorDialog("The additional data directory was not found!");
// return;
// }
File preFile = new File(preProcTMFile);
if (!preFile.exists()) {
AddRemoveList.printErrorDialog("The preprocessing script was not found!");
return;
}
String[] slotNames = viewContent.getSlotNames();
for (String string : slotNames) {
System.out.println(string);
}
String[] filterArray = viewContent.getFilters();
Set<String> filters = new HashSet<String>();
for (String s : filterArray)
filters.add(s);
if (slotNames.length == 0 || inputDir.length() == 0 || preProcTMFile.length() == 0) {
errorAlert("Please specify at least one slot type, the input directory and the preprocessing file (this is needed even if preprocessing is skipped)!");
return;
}
File dir = new File(inputDir);
if (!dir.exists() || !dir.isDirectory()) {
errorAlert("The specified input directory could not be found!");
return;
}
Object[] algs = viewContent.getAlgListViewer().getCheckedElements();
// reset all:
for (TextRulerLearnerController controller : TextRulerController.getAvailableControllers())
controller.setEnabled(false);
// enable the checked ones...
for (Object i : algs) {
TextRulerLearnerController c = ((TextRulerLearnerController) i);
c.setEnabled(true);
IViewPart resultView;
if ((resultView = getView(TextRulerResultsView.ID, c.getID())) == null) {
try {
IViewPart view = PlatformUI
.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage()
.showView(TextRulerResultsView.ID, ((TextRulerLearnerController) i).getID(),
IWorkbenchPage.VIEW_CREATE);
((TextRulerResultsView) view).setViewTitle(c.getName() + " - Results");
} catch (PartInitException e) {
TextRulerPlugin.error(e);
}
} else {
((TextRulerResultsView) resultView).setViewTitle(c.getName() + " - Results");
}
}
if (TextRulerController.enabledAlgorithmsCount() > 0) {
// GlobalCASSource.releaseAll();
TextRulerController.start(inputDir, additionalDir, preProcTMFile, slotNames, filters, this,
viewContent.getCurrentAlgorithmParameters(), viewContent.getSkipPreprocessing());
} else
errorAlert("No algorithm has been activated for learning!");
}
}
public void updateEnabledStatus() {
boolean isRunning = TextRulerController.isRunning();
viewContent.setEnabled(!isRunning);
}
public void asyncUpdateGlobalStatus(final String str) {
viewContent.getDisplay().asyncExec(new Runnable() {
public void run() {
viewContent.setGlobalStatusString(str);
updateEnabledStatus();
}
});
}
public void asyncUpdateList(final TextRulerLearnerController algController,
final boolean ruleBaseChanged) {
viewContent.getDisplay().asyncExec(new Runnable() {
public void run() {
updateList(algController, ruleBaseChanged);
}
});
}
public void updateList(TextRulerLearnerController algController, boolean ruleBaseChanged) {
viewContent.getAlgListViewer().refresh(true, true);
if (algController != null && ruleBaseChanged) {
TextRulerResultsView textRulerResultsView = (TextRulerResultsView) getView(
TextRulerResultsView.ID, algController.getID());
if (textRulerResultsView != null) {
textRulerResultsView.setResultContents(algController.getCurrentResultString());
}
}
}
public synchronized void algorithmDidEnd(TextRulerLearnerController algController) {
asyncUpdateList(algController, true);
// // BATCH_STUFF
// if (!TextRulerController.isRunning() &&
// !TextRulerController.shouldAbort())
// {
// viewContent.getDisplay().asyncExec(new Runnable(){
// public void run() {
// batchNext();
// }
// });
// }
}
public static IViewPart getView(String id, String id2) {
IViewReference viewReferences[] = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getViewReferences();
for (int i = 0; i < viewReferences.length; i++) {
if (id.equals(viewReferences[i].getId()) && id2.equals(viewReferences[i].getSecondaryId())) {
return viewReferences[i].getView(false);
}
}
return null;
}
public synchronized void algorithmStatusUpdate(TextRulerLearnerController algController,
String statusString, TextRulerLearnerState state, boolean ruleBaseChanged) {
asyncUpdateList(algController, ruleBaseChanged);
}
public void preprocessorStatusUpdate(TextRulerPreprocessor p, String statusString) {
asyncUpdateGlobalStatus("Preprocessing... " + statusString);
}
public void globalStatusUpdate(String str) {
asyncUpdateGlobalStatus(str);
}
@Override
public void createPartControl(Composite parent) {
viewContent = new TextRulerViewComposite(parent, SWT.NULL, this);
if (memento != null) {
viewContent.restoreState(memento);
memento = null;
}
}
@Override
public void setFocus() {
viewContent.setFocus();
}
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
this.memento = memento;
super.init(site, memento);
}
@Override
public void saveState(IMemento memento) {
viewContent.saveState(memento);
}
}