/** * Copyright (C) 2007-2009, Jens Lehmann * * This file is part of DL-Learner. * * DL-Learner is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * DL-Learner is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.dllearner.tools.protege; import static org.semanticweb.owlapi.model.AxiomType.DATA_PROPERTY_DOMAIN; import static org.semanticweb.owlapi.model.AxiomType.OBJECT_PROPERTY_DOMAIN; import static org.semanticweb.owlapi.model.AxiomType.OBJECT_PROPERTY_RANGE; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import java.util.Timer; import java.util.TimerTask; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import org.dllearner.core.EvaluatedAxiom; import org.dllearner.core.EvaluatedDescription; import org.dllearner.learningproblems.EvaluatedDescriptionClass; import org.protege.editor.core.ProtegeApplication; import org.protege.editor.core.ui.error.ErrorLogPanel; import org.protege.editor.core.ui.progress.BackgroundTask; import org.semanticweb.owlapi.model.AxiomType; import org.semanticweb.owlapi.model.OWLAxiom; import org.semanticweb.owlapi.model.OWLDataPropertyDomainAxiom; import org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom; import org.semanticweb.owlapi.model.OWLObjectPropertyRangeAxiom; /** * This class processes input from the user. * * @author Christian Koetteritzsch * */ public class ActionHandler implements ActionListener { public enum Actions { LEARN, STOP } private boolean toggled; private Timer timer; private SuggestionRetriever retriever; private HelpTextPanel helpPanel; // private final Color colorRed = new Color(139, 0, 0); // private final Color colorGreen = new Color(0, 139, 0); private final DLLearnerView view; private static final String EQUIVALENT_CLASS_LEARNING_STRING = "<html>suggest equivalent class expressions</html>"; private static final String SUPER_CLASS_LEARNING_STRING = "<html>suggest super class expressions</html>"; private static JOptionPane optionPane; private BackgroundTask learningTask; /** * This is the constructor for the action handler. * * @param m * DLLearnerModel * @param view * DLlearner tab * */ public ActionHandler(DLLearnerView view) { this.view = view; toggled = false; helpPanel = new HelpTextPanel(view); optionPane = new JOptionPane(); } /** * When a Button is pressed this method select the right. * * @param z * ActionEvent */ public void actionPerformed(ActionEvent z) { if (z.getActionCommand().equals(Actions.LEARN.toString())) { onLearn(); } else if (z.getActionCommand().equals(DLLearnerView.ADD_BUTTON_STRING)) { onAddAxiom(); } else if (z.toString().contains(DLLearnerView.ADVANCED_BUTTON_STRING)) { onShowAdvancedOptions(); } else if (z.toString().contains(DLLearnerView.HELP_BUTTON_STRING)) { String currentClass = Manager.getInstance().getCurrentlySelectedClassRendered(); optionPane.setPreferredSize(new Dimension(300, 200)); JOptionPane.showMessageDialog(view.getLearnerView(), helpPanel.renderHelpTextMessage(currentClass), "Help", JOptionPane.INFORMATION_MESSAGE); } } private void onLearn() { setLearningOptions(); view.showGraphicalPanel(false); view.getSuggestClassPanel().getSuggestionsTable().clear(); // view.setBusyTaskStarted("Preparing ..."); // manager.initLearningProblem(); // manager.initLearningAlgorithm(); // view.setBusyTaskEnded(); learningTask = ProtegeApplication.getBackgroundTaskManager().startTask("Learning..."); // view.setLearningStarted(); // view.showHorizontalExpansionMessage(Manager.getInstance().getMinimumHorizontalExpansion(), // Manager.getInstance().getMaximumHorizontalExpansion()); // try { // Manager manager = Manager.getInstance(); // manager.initLearningProblem(); // manager.initLearningAlgorithm(); // Manager.getInstance().startLearning(); // } catch (Exception e) { // e.printStackTrace(); // } retriever = new SuggestionRetriever(); retriever.addPropertyChangeListener(view.getStatusBar()); retriever.execute(); } private void onAddAxiom() { EvaluatedDescription selectedSuggestion = view.getSuggestClassPanel().getSelectedSuggestion(); Manager.getInstance().addAxiom(selectedSuggestion); String message = "<html><font size=\"3\">class expression added</font></html>"; view.setHintMessage(message); view.setHelpButtonVisible(false); } private void onShowAdvancedOptions() { if (!toggled) { toggled = true; view.setIconToggled(toggled); view.showOptionsPanel(toggled); } else { toggled = false; view.setIconToggled(toggled); view.showOptionsPanel(toggled); } } /** * Resets the toggled Button after the plugin is closed. */ public void resetToggled() { toggled = false; } private void setLearningOptions(){ OptionPanel options = view.getOptionsPanel(); Manager manager = Manager.getInstance(); manager.setMaxExecutionTimeInSeconds(options.getMaxExecutionTimeInSeconds()); manager.setMaxNrOfResults(options.getMaxNumberOfResults()); manager.setNoisePercentage(options.getNoise()); manager.setUseAllConstructor(options.isUseAllQuantor()); manager.setUseNegation(options.isUseNegation()); manager.setUseCardinalityRestrictions(options.isUseCardinalityRestrictions()); manager.setUseExistsConstructor(options.isUseExistsQuantor()); manager.setUseHasValueConstructor(options.isUseHasValue()); } /** * Inner Class that retrieves the concepts learned by DL-Learner. * * @author Christian Koetteritzsch * */ class SuggestionRetriever extends SwingWorker<List<? extends EvaluatedDescription>, List<? extends EvaluatedDescription>> { @SuppressWarnings("unchecked") @Override protected List<EvaluatedDescription> doInBackground() throws Exception { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { view.setBusyTaskStarted("Preparing ..."); } }); try { Manager manager = Manager.getInstance(); timer = new Timer(); if(view.getAxiomType().equals(AxiomType.EQUIVALENT_CLASSES) || view.getAxiomType().equals(AxiomType.SUBCLASS_OF)) { manager.initLearningProblem(); manager.initLearningAlgorithm(); view.setBusyTaskEnded(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { view.setLearningStarted(); view.showHorizontalExpansionMessage(Manager.getInstance().getMinimumHorizontalExpansion(), Manager.getInstance().getMaximumHorizontalExpansion()); } }); // timer.schedule(new TimerTask(){ // int progress = 0; // List<EvaluatedDescriptionClass> result; // @Override // public void run() { // progress++; // setProgress(progress); // if(!isCancelled() && Manager.getInstance().isLearning()){ // result = Manager.getInstance().getCurrentlyLearnedDescriptions(); // publish(result); // } // } // // }, 1000, 500); Manager.getInstance().startLearning(); } else { List<EvaluatedAxiom<OWLAxiom>> axioms = manager.computeAxioms(view.getEntity(), view.getAxiomType()); view.showAxioms(axioms); } } catch (Exception e) { ErrorLogPanel.showErrorDialog(e); cancel(true); view.setBusyTaskEnded(); } return null; } @Override public void done() { if(!isCancelled()){ timer.cancel(); if(view.getAxiomType().equals(AxiomType.EQUIVALENT_CLASSES) || view.getAxiomType().equals(AxiomType.SUBCLASS_OF)) { List<EvaluatedDescriptionClass> result = Manager.getInstance().getCurrentlyLearnedDescriptions(); updateList(result); } view.setLearningFinished(); setProgress(0); } ProtegeApplication.getBackgroundTaskManager().endTask(learningTask); } @Override protected void process(List<List<? extends EvaluatedDescription>> resultLists) { for (List<? extends EvaluatedDescription> list : resultLists) { updateList(list); } } private void updateList(final List<? extends EvaluatedDescription> result) { view.setSuggestions(result); view.showHorizontalExpansionMessage(Manager.getInstance().getMinimumHorizontalExpansion(), Manager.getInstance().getMaximumHorizontalExpansion()); } } }