// OO jDREW - An Object Oriented extension of the Java Deductive Reasoning Engine for the Web // Copyright (C) 2008 Ben Craig // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA package org.ruleml.oojdrew.TopDown; import java.awt.EventQueue; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import javax.swing.JOptionPane; import javax.swing.UIManager; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import nu.xom.Elements; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger; import org.ruleml.oojdrew.Config; import org.ruleml.oojdrew.Configuration; import org.ruleml.oojdrew.SyntaxFormat; import org.ruleml.oojdrew.GUI.AbstractUIApp; import org.ruleml.oojdrew.GUI.DebugConsole; import org.ruleml.oojdrew.GUI.PreferenceDialogUI; import org.ruleml.oojdrew.GUI.PreferenceManager; import org.ruleml.oojdrew.GUI.TopDownUI; import org.ruleml.oojdrew.parsing.POSLParser; import org.ruleml.oojdrew.parsing.RDFSParser; import org.ruleml.oojdrew.parsing.RuleMLParser; import org.ruleml.oojdrew.parsing.SubsumesParser; import org.ruleml.oojdrew.parsing.TypeQueryParserPOSL; import org.ruleml.oojdrew.parsing.TypeQueryParserRuleML; import org.ruleml.oojdrew.util.DefiniteClause; import org.ruleml.oojdrew.util.LUBGLBStructure; import org.ruleml.oojdrew.util.QueryTypes; import org.ruleml.oojdrew.util.SubsumesStructure; import org.ruleml.oojdrew.util.SymbolTable; import org.ruleml.oojdrew.util.Term; public class TopDownApp extends AbstractUIApp { // TODO: Rewrite all code that uses the following variables // These variables were copied from the old UI private Iterator queryResultIterator; private Iterator typeQueryResultIterator; private boolean t1Var; private boolean t2Var; private String term1VarName; private String term2VarName; private SubsumesStructure subPlus; private SubsumesStructure sub; private LUBGLBStructure lub; private LUBGLBStructure glb; public static void main(String[] args) { // The look and feel must be set before any UI objects are constructed try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } // Create a TopDownApp using the factory method... TopDownApp app = TopDownApp.getTopDownApp(); // ... and start it's event loop app.run(); } public void run() { EventQueue.invokeLater(new Runnable() { public void run() { logger.debug("Entering event loop"); getUI().setFrameVisible(true); } }); } public static TopDownApp getTopDownApp() { // Construct dependencies Configuration config = new Config(TopDownApp.class); PreferenceManager preferenceManager = new PreferenceManager(config); TopDownUI topDownUI = new TopDownUI(); PreferenceDialogUI preferenceDialogUI = new PreferenceDialogUI(); // Create DebugConsole and logger DebugConsole debugConsole = new DebugConsole(); BasicConfigurator.configure(); Logger logger = Logger.getRootLogger(); // Create the parsers RDFSParser rdfsParser = new RDFSParser(); POSLParser poslParser = new POSLParser(); RuleMLParser rmlParser = new RuleMLParser(config); SubsumesParser subsumesParser = new SubsumesParser(); // Create the reasoning engine BackwardReasoner backwardReasoner = new BackwardReasoner(); // Create TopDownApp TopDownApp topDownApp = new TopDownApp(config, preferenceManager, preferenceDialogUI, topDownUI, logger, debugConsole, rdfsParser, poslParser, rmlParser, subsumesParser, backwardReasoner); return topDownApp; } private TopDownApp(Configuration config, PreferenceManager preferenceManager, PreferenceDialogUI preferenceDialogUI, TopDownUI topDownUI, Logger logger, DebugConsole debugConsole, RDFSParser rdfsParser, POSLParser poslParser, RuleMLParser rmlParser, SubsumesParser subsumesParser, BackwardReasoner backwardReasoner) { super(config, preferenceManager, preferenceDialogUI, topDownUI, logger, debugConsole, rdfsParser, poslParser, rmlParser, subsumesParser, backwardReasoner); } private TopDownUI getUI() { return (TopDownUI) super.ui; } private BackwardReasoner getReasoner() { return (BackwardReasoner) super.reasoner; } private void setReasoner(BackwardReasoner reasoner) { super.reasoner = reasoner; } @Override public void parseKnowledgeBase() { getUI().setBtnNextSolutionEnabled(false); SymbolTable.reset(); reasoner.clearClauses(); super.parseKnowledgeBase(); } public void issueQuery() { String query = getUI().getQueryTextAreaText(); SyntaxFormat format = getUI().getQueryInputFormat(); boolean typeQuery = getUI().getTypeQueryCheckboxSelected(); if (format == SyntaxFormat.RULEML) { if (typeQuery) { issueRuleMLTypeQuery(query); } else { issueRuleMLQuery(query); } } else { if (typeQuery) { issuePOSLTypeQuery(query); } else { issuePOSLQuery(query); } } } private void issueRuleMLQuery(String query) { rmlParser.clear(); try { DefiniteClause dc = rmlParser.parseRuleMLQuery(query); processQuery(dc); } catch (Exception e) { defaultExceptionHandler(e); } } private void issuePOSLQuery(String query) { DefiniteClause dc; try { dc = poslParser.parseQueryString(query); processQuery(dc); } catch (Exception e) { defaultExceptionHandler(e); } } // TODO: This method was copied from the old GUI and has been modified to // work with the current code base. This code should be rewritten in a much // cleaner fashion. private void processQuery(DefiniteClause dc) { // TODO: Find a way to use the existing backwardReasoner (for the sake // of dependency injection) setReasoner(new BackwardReasoner(getReasoner().clauses, getReasoner().oids)); queryResultIterator = getReasoner() .iterativeDepthFirstSolutionIterator(dc); getUI().setBtnNextSolutionEnabled(true); if (!queryResultIterator.hasNext()) { javax.swing.tree.DefaultMutableTreeNode root = new DefaultMutableTreeNode( "unknown"); javax.swing.tree.DefaultTreeModel dtm = new DefaultTreeModel(root); getUI().setSolutionTreeModel(dtm); getUI().setBtnNextSolutionEnabled(false); getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(new Object[][] { { null, null } }, new String[] { "Variable", "Binding" })); } else { BackwardReasoner.GoalList gl = (BackwardReasoner.GoalList) queryResultIterator .next(); Hashtable varbind = gl.varBindings; javax.swing.tree.DefaultMutableTreeNode root = getReasoner() .toTree(); root.setAllowsChildren(true); javax.swing.tree.DefaultTreeModel dtm = new DefaultTreeModel(root); getUI().setSolutionTreeModel(dtm); int i = 0; Object[][] rowdata = new Object[varbind.size()][2]; Enumeration e = varbind.keys(); while (e.hasMoreElements()) { Object k = e.nextElement(); Object val = varbind.get(k); String ks = (String) k; rowdata[i][0] = ks; rowdata[i][1] = val; i++; } String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } if (!queryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(false); } } // TODO: This method was copied from the old GUI and has been modified to // work with the current code base. This code should be rewritten in a much // cleaner fashion. public void nextSolution() { boolean typeQuery = getUI().getTypeQueryCheckboxSelected(); if (typeQuery) { nextSolutionForTypeQuery(); } else { nextSolutionForQuery(); } } public void nextSolutionForQuery() { BackwardReasoner.GoalList gl = (BackwardReasoner.GoalList) queryResultIterator .next(); // System.out.println(gl.toString()); Hashtable varbind = gl.varBindings; javax.swing.tree.DefaultMutableTreeNode root = getReasoner().toTree(); javax.swing.tree.DefaultTreeModel dtm = new DefaultTreeModel(root); // logger.debug("Getting next solution: "); getUI().setSolutionTreeModel(dtm); int i = 0; Object[][] rowdata = new Object[varbind.size()][2]; Enumeration e = varbind.keys(); while (e.hasMoreElements()) { Object k = e.nextElement(); Object val = varbind.get(k); String ks = (String) k; rowdata[i][0] = ks; rowdata[i][1] = val; i++; } String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); if (!queryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(false); } } // TODO: This method was copied from the old GUI and has been modified to // work with the current code base. This code should be rewritten in a much // cleaner fashion. public void nextSolutionForTypeQuery() { // Var Ind if (t1Var == true && t2Var == false) { Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + term1VarName; rowdata[0][1] = (String) typeQueryResultIterator.next(); String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } // Ind Var if (t1Var == false && t2Var == true) { Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + term2VarName; rowdata[0][1] = (String) typeQueryResultIterator.next(); String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } // Var Var if (t1Var == true && t2Var == true) { Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + term1VarName; rowdata[0][1] = (String) typeQueryResultIterator.next(); rowdata[1][0] = "?" + term2VarName; rowdata[1][1] = (String) typeQueryResultIterator.next(); String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } if (!typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(false); } } // TODO: This method was copied from the old GUI and has been modified to // work with the current code base. This code should be rewritten in a much // cleaner fashion. private void issueRuleMLTypeQuery(String query) { Object[][] resetRow = new Object[2][2]; String[] resetCol = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(resetRow, resetCol)); getUI().setBtnNextSolutionEnabled(false); // It is an iterator that is used to map all the solutions to bindings typeQueryResultIterator = null; // Creating a QueryTypes objects QueryTypes typeQuery = new QueryTypes(); if (query.equals("")) { return; } try { // need to get rid of this eventually t1Var = false; t2Var = false; term1VarName = ""; term2VarName = ""; getUI().setSolutionTextAreaText(""); TypeQueryParserRuleML rmlTParser = new TypeQueryParserRuleML(query); Elements elements = rmlTParser.parseForPredicate(); String predicate = rmlTParser.getPredicate(); if (predicate.equalsIgnoreCase(TypeQueryParserRuleML.SUBSUMESPLUS)) { subPlus = rmlTParser .parseElementsSubsumesAndSubsumesPlus(elements); // rel rel if (!subPlus.getSuperVar() && !subPlus.getSubVar()) { getUI().setSolutionTextAreaText( "" + typeQuery.isSuperClass( subPlus.getSuperName(), subPlus.getSubName())); // var rel get all super classes } else if (subPlus.getSuperVar() && !subPlus.getSubVar()) { t1Var = true; term1VarName = subPlus.getSuperName(); String[] superClasses = typeQuery .findAllSuperClasses(subPlus.getSubName()); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + subPlus.getSuperName(); rowdata[0][1] = superClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector<String> nextVector = new Vector<String>(); for (int i = 1; i < superClasses.length; i++) nextVector.add(superClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // rel var get all sub classes } else if (!subPlus.getSuperVar() && subPlus.getSubVar()) { t2Var = true; term2VarName = subPlus.getSubName(); String[] subClasses = typeQuery.findAllSubClasses(subPlus .getSuperName()); for (int i = 0; i < subClasses.length; i++) System.out.println(subClasses[i]); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + subPlus.getSubName(); rowdata[0][1] = subClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector nextVector = new Vector(); for (int i = 1; i < subClasses.length; i++) nextVector.add(subClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // var var get all relations } else if (subPlus.getSuperVar() && subPlus.getSubVar()) { t1Var = true; t2Var = true; term2VarName = subPlus.getSubName(); term1VarName = subPlus.getSuperName(); if (subPlus.getSuperName().equalsIgnoreCase( subPlus.getSubName())) { JOptionPane.showMessageDialog(getUI().getFrmOoJdrew(), "Duplicate variable names not allowed", "Error", JOptionPane.ERROR_MESSAGE); return; } Vector v1 = typeQuery.findAllSuperClassesOfEverything(); Vector v2 = typeQuery.findAllSubClassesOfEverything(); String sol = ""; Iterator vit1 = v1.iterator(); Iterator vit2 = v2.iterator(); int count = 0; // Debug -> Prints out all the solutions for easy Copy and // Paste sol = "% Taxonomy Facts: \n"; while (vit1.hasNext()) { count++; sol = sol + "subsumes(" + vit1.next().toString() + "," + vit1.next().toString() + ")." + "\n"; } getUI().setSolutionTextAreaText(sol); // Debug typeQueryResultIterator = v1.iterator(); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + subPlus.getSuperName(); rowdata[0][1] = (String) typeQueryResultIterator.next(); rowdata[1][0] = "?" + subPlus.getSubName(); rowdata[1][1] = (String) typeQueryResultIterator.next(); String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } } } else if (predicate .equalsIgnoreCase(TypeQueryParserRuleML.SUBSUMES)) { sub = rmlTParser.parseElementsSubsumesAndSubsumesPlus(elements); // rel rel if (!sub.getSuperVar() && !sub.getSubVar()) { getUI().setSolutionTextAreaText( "" + typeQuery.isDirectSuperClass( sub.getSuperName(), sub.getSubName())); // var rel } else if (sub.getSuperVar() && !sub.getSubVar()) { t1Var = true; term1VarName = sub.getSuperName(); String[] superClasses = typeQuery.getDirectSuperClasses(sub .getSubName()); for (int i = 0; i < superClasses.length; i++) System.out.println(superClasses[i]); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + sub.getSuperName(); rowdata[0][1] = superClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector nextVector = new Vector(); for (int i = 1; i < superClasses.length; i++) nextVector.add(superClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // rel var } else if (!sub.getSuperVar() && sub.getSubVar()) { t2Var = true; term2VarName = sub.getSubName(); String[] subClasses = typeQuery.getDirectSubClasses(sub .getSuperName()); for (int i = 0; i < subClasses.length; i++) System.out.println(subClasses[i]); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + sub.getSubName(); rowdata[0][1] = subClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector nextVector = new Vector(); for (int i = 1; i < subClasses.length; i++) nextVector.add(subClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // var var } else if (sub.getSuperVar() && sub.getSubVar()) { t1Var = true; t2Var = true; term2VarName = sub.getSubName(); term1VarName = sub.getSuperName(); if (sub.getSuperName().equalsIgnoreCase(sub.getSubName())) { JOptionPane.showMessageDialog(getUI().getFrmOoJdrew(), "Duplicate variable names not allowed", "Error", JOptionPane.ERROR_MESSAGE); return; } Vector v1 = typeQuery .findAllDirectSuperClassesOfEverything(); Vector v2 = typeQuery.findAllDirectSubClassesOfEverything(); String sol = ""; Iterator vit1 = v1.iterator(); Iterator vit2 = v2.iterator(); int count = 0; // Debug -> Prints out all the solutions for easy Copy and // Paste sol = "% Taxonomy Facts: \n"; while (vit1.hasNext()) { count++; sol = sol + "subsumes(" + vit1.next().toString() + "," + vit1.next().toString() + ")." + "\n"; } getUI().setSolutionTextAreaText(sol); // Debug typeQueryResultIterator = v1.iterator(); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + sub.getSuperName(); rowdata[0][1] = (String) typeQueryResultIterator.next(); rowdata[1][0] = "?" + sub.getSubName(); rowdata[1][1] = (String) typeQueryResultIterator.next(); String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } } } else if (predicate.equalsIgnoreCase(TypeQueryParserRuleML.LUB)) { lub = rmlTParser.parseElementsGLBandLUB(elements); if (lub.getResultVar()) { ArrayList<String> terms = lub.getTerms(); String[] lubArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) lubArray[i] = terms.get(i); String leastUpperBound = typeQuery .leastUpperBound(lubArray); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + lub.getResultVarName(); rowdata[0][1] = leastUpperBound; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } else if (!lub.getResultVar()) { Object[][] rowdata = new Object[2][2]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); getUI().setSolutionTextAreaText(""); ArrayList<String> terms = lub.getTerms(); String[] lubArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) lubArray[i] = terms.get(i); String leastUpperBound = typeQuery .leastUpperBound(lubArray); getUI().setSolutionTextAreaText(leastUpperBound); } } else if (predicate.equalsIgnoreCase(TypeQueryParserRuleML.GLB)) { glb = rmlTParser.parseElementsGLBandLUB(elements); if (glb.getResultVar()) { ArrayList<String> terms = glb.getTerms(); String[] glbArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) glbArray[i] = terms.get(i); String greatestLowerBound = typeQuery .greatestLowerBound(glbArray); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + glb.getResultVarName(); rowdata[0][1] = greatestLowerBound; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } else if (!glb.getResultVar()) { Object[][] rowdata = new Object[2][2]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); getUI().setSolutionTextAreaText(""); ArrayList<String> terms = glb.getTerms(); String[] glbArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) { glbArray[i] = terms.get(i); } String greatestLowerBound = typeQuery .greatestLowerBound(glbArray); getUI().setSolutionTextAreaText(greatestLowerBound); } } } catch (Exception ex) { JOptionPane.showMessageDialog(getUI().getFrmOoJdrew(), ex.getMessage(), "Type Query Parser Exeception", JOptionPane.ERROR_MESSAGE); } } // TODO: This method was copied from the old GUI and has been modified to // work with the current code base. This code should be rewritten in a much // cleaner fashion. private void issuePOSLTypeQuery(String query) { Object[][] resetRow = new Object[2][2]; String[] resetCol = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(resetRow, resetCol)); getUI().setBtnNextSolutionEnabled(false); // It is an iterator that is used to map all the solutions to bindings typeQueryResultIterator = null; // Creating a QueryTypes objects QueryTypes typeQuery = new QueryTypes(); if (query.equals("")) { return; } try { t1Var = false; t2Var = false; term1VarName = ""; term2VarName = ""; getUI().setSolutionTextAreaText(""); TypeQueryParserPOSL poslTParser = new TypeQueryParserPOSL(query); Term[] queryTerms = poslTParser.parseForPredicate(); String predicate = poslTParser.getPredicate(); if (predicate.equalsIgnoreCase(TypeQueryParserPOSL.SUBSUMESPLUS)) { subPlus = poslTParser .parseElementsSubsumesAndSubsumesPlus(queryTerms); // rel rel if (!subPlus.getSuperVar() && !subPlus.getSubVar()) { getUI().setSolutionTextAreaText( "" + typeQuery.isSuperClass( subPlus.getSuperName(), subPlus.getSubName())); // var rel get all super classes } else if (subPlus.getSuperVar() && !subPlus.getSubVar()) { t1Var = true; term1VarName = subPlus.getSuperName(); String[] superClasses = typeQuery .findAllSuperClasses(subPlus.getSubName()); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + subPlus.getSuperName(); rowdata[0][1] = superClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector<String> nextVector = new Vector<String>(); for (int i = 1; i < superClasses.length; i++) nextVector.add(superClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // rel var get all sub classes } else if (!subPlus.getSuperVar() && subPlus.getSubVar()) { t2Var = true; term2VarName = subPlus.getSubName(); String[] subClasses = typeQuery.findAllSubClasses(subPlus .getSuperName()); for (int i = 0; i < subClasses.length; i++) System.out.println(subClasses[i]); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + subPlus.getSubName(); rowdata[0][1] = subClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector nextVector = new Vector(); for (int i = 1; i < subClasses.length; i++) nextVector.add(subClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // var var get all relations } else if (subPlus.getSuperVar() && subPlus.getSubVar()) { t1Var = true; t2Var = true; term2VarName = subPlus.getSubName(); term1VarName = subPlus.getSuperName(); if (subPlus.getSuperName().equalsIgnoreCase( subPlus.getSubName())) { JOptionPane.showMessageDialog(getUI().getFrmOoJdrew(), "Duplicate variable names not allowed", "Error", JOptionPane.ERROR_MESSAGE); return; } Vector v1 = typeQuery.findAllSuperClassesOfEverything(); Vector v2 = typeQuery.findAllSubClassesOfEverything(); String sol = ""; Iterator vit1 = v1.iterator(); Iterator vit2 = v2.iterator(); int count = 0; // Debug -> Prints out all the solutions for easy Copy and // Paste sol = "% Taxonomy Facts: \n"; while (vit1.hasNext()) { count++; sol = sol + "subsumes(" + vit1.next().toString() + "," + vit1.next().toString() + ")." + "\n"; } getUI().setSolutionTextAreaText(sol); // Debug typeQueryResultIterator = v1.iterator(); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + subPlus.getSuperName(); rowdata[0][1] = (String) typeQueryResultIterator.next(); rowdata[1][0] = "?" + subPlus.getSubName(); rowdata[1][1] = (String) typeQueryResultIterator.next(); String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } } // subsumesPlus } else if (predicate.equalsIgnoreCase(TypeQueryParserPOSL.SUBSUMES)) { sub = poslTParser .parseElementsSubsumesAndSubsumesPlus(queryTerms); // rel rel if (!sub.getSuperVar() && !sub.getSubVar()) { getUI().setSolutionTextAreaText( "" + typeQuery.isDirectSuperClass( sub.getSuperName(), sub.getSubName())); // var rel } else if (sub.getSuperVar() && !sub.getSubVar()) { t1Var = true; term1VarName = sub.getSuperName(); String[] superClasses = typeQuery.getDirectSuperClasses(sub .getSubName()); for (int i = 0; i < superClasses.length; i++) System.out.println(superClasses[i]); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + sub.getSuperName(); rowdata[0][1] = superClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector nextVector = new Vector(); for (int i = 1; i < superClasses.length; i++) nextVector.add(superClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // rel var } else if (!sub.getSuperVar() && sub.getSubVar()) { t2Var = true; term2VarName = sub.getSubName(); String[] subClasses = typeQuery.getDirectSubClasses(sub .getSuperName()); for (int i = 0; i < subClasses.length; i++) System.out.println(subClasses[i]); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + sub.getSubName(); rowdata[0][1] = subClasses[0]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); Vector nextVector = new Vector(); for (int i = 1; i < subClasses.length; i++) nextVector.add(subClasses[i]); typeQueryResultIterator = nextVector.iterator(); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } // var var } else if (sub.getSuperVar() && sub.getSubVar()) { t1Var = true; t2Var = true; term2VarName = sub.getSubName(); term1VarName = sub.getSuperName(); if (sub.getSuperName().equalsIgnoreCase(sub.getSubName())) { JOptionPane.showMessageDialog(getUI().getFrmOoJdrew(), "Duplicate variable names not allowed", "Error", JOptionPane.ERROR_MESSAGE); return; } Vector v1 = typeQuery .findAllDirectSuperClassesOfEverything(); Vector v2 = typeQuery.findAllDirectSubClassesOfEverything(); String sol = ""; Iterator vit1 = v1.iterator(); Iterator vit2 = v2.iterator(); int count = 0; // Debug -> Prints out all the solutions for easy Copy and // Paste sol = "% Taxonomy Facts: \n"; while (vit1.hasNext()) { count++; sol = sol + "subsumes(" + vit1.next().toString() + "," + vit1.next().toString() + ")." + "\n"; } getUI().setSolutionTextAreaText(sol); // Debug typeQueryResultIterator = v1.iterator(); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + sub.getSuperName(); rowdata[0][1] = (String) typeQueryResultIterator.next(); rowdata[1][0] = "?" + sub.getSubName(); rowdata[1][1] = (String) typeQueryResultIterator.next(); String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); if (typeQueryResultIterator.hasNext()) { getUI().setBtnNextSolutionEnabled(true); } } }// subsumes else if (predicate.equalsIgnoreCase(TypeQueryParserPOSL.LUB)) { lub = poslTParser.parseElementsGLBandLUB(queryTerms); if (lub.getResultVar()) { ArrayList<String> terms = lub.getTerms(); String[] lubArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) lubArray[i] = terms.get(i); String leastUpperBound = typeQuery .leastUpperBound(lubArray); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + lub.getResultVarName(); rowdata[0][1] = leastUpperBound; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } else if (!lub.getResultVar()) { Object[][] rowdata = new Object[2][2]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); getUI().setSolutionTextAreaText(""); ArrayList<String> terms = lub.getTerms(); String[] lubArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) lubArray[i] = terms.get(i); String leastUpperBound = typeQuery .leastUpperBound(lubArray); getUI().setSolutionTextAreaText(leastUpperBound); } }// LUB else if (predicate.equalsIgnoreCase(TypeQueryParserRuleML.GLB)) { glb = poslTParser.parseElementsGLBandLUB(queryTerms); if (glb.getResultVar()) { ArrayList<String> terms = glb.getTerms(); String[] glbArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) glbArray[i] = terms.get(i); String greatestLowerBound = typeQuery .greatestLowerBound(glbArray); Object[][] rowdata = new Object[2][2]; rowdata[0][0] = "?" + glb.getResultVarName(); rowdata[0][1] = greatestLowerBound; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); } else if (!glb.getResultVar()) { Object[][] rowdata = new Object[2][2]; String[] colnames = new String[] { "Variable", "Binding" }; getUI().setVariableBindingsTableModel( new javax.swing.table.DefaultTableModel(rowdata, colnames)); getUI().setSolutionTextAreaText(""); ArrayList<String> terms = glb.getTerms(); String[] glbArray = new String[terms.size()]; for (int i = 0; i < terms.size(); i++) { glbArray[i] = terms.get(i); } String greatestLowerBound = typeQuery .greatestLowerBound(glbArray); getUI().setSolutionTextAreaText(greatestLowerBound); } }// GLB } catch (Exception ex) { JOptionPane.showMessageDialog(getUI().getFrmOoJdrew(), ex.getMessage(), "Type Query Parser Exeception", JOptionPane.ERROR_MESSAGE); } } }