From 52a18840c0754194644f021d882a9e8ed207f763 Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:29:58 -0700 Subject: [PATCH 1/9] =?UTF-8?q?Migrate=20DL=20Query=20to=20Prot=C3=A9g?= =?UTF-8?q?=C3=A9=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - target Protégé 6, OWL API 5 and Java 11 - update OSGi metadata and remove unnecessary Guava usage - use the Optional-based defined-class creation API - replace Travis with GitHub Actions and Maven Central publishing --- .github/workflows/build.yml | 28 +++++ .github/workflows/publish.yml | 47 ++++++++ .travis.yml | 15 --- README.md | 14 ++- pom.xml | 109 ++++++++++++------ .../coode/dlquery/DLQueryResultsSection.java | 4 +- ...OWLClassExpressionEditorViewComponent.java | 26 ++--- .../java/org/coode/dlquery/ResultsList.java | 21 ++-- .../org/coode/dlquery/ResultsSection.java | 4 +- src/main/resources/update.properties | 5 +- 10 files changed, 181 insertions(+), 92 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/publish.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..010219a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,28 @@ +name: Build + +on: + push: + branches: [protege-6] + pull_request: + +permissions: + contents: read + +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out the source + uses: actions/checkout@v5 + - name: Set up Java and Maven + uses: actions/setup-java@v5 + with: + java-version: '11' + distribution: 'temurin' + cache: maven + - name: Build and test + run: mvn --batch-mode clean verify diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..eb0b0e8 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,47 @@ +name: Publish packages to the Maven Central Repository + +on: + release: + types: [released] + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Check out the source + uses: actions/checkout@v5 + # Release versions must match the GitHub tag. Manual runs leave the + # version unchanged and are intended for publishing snapshots. + - if: github.event_name == 'release' + name: Validate release tag + env: + RELEASE_TAG: ${{ github.event.release.tag_name }} + run: | + if [[ ! "$RELEASE_TAG" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z]+([.-][0-9A-Za-z]+)*)?$ ]]; then + echo "::error::Release tag '$RELEASE_TAG' must be a Maven version such as '5.0.0' or '5.0.0-beta-1' (without a 'v' prefix)." + exit 1 + fi + - name: Set up Java and Maven + uses: actions/setup-java@v5 + with: + java-version: '11' + distribution: 'temurin' + server-id: ossrh + server-username: OSSRH_USERNAME + server-password: OSSRH_TOKEN + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-passphrase: GPG_PASSPHRASE + - if: github.event_name == 'release' + name: Set the release version + env: + RELEASE_VERSION: ${{ github.event.release.tag_name }} + run: mvn --batch-mode versions:set -DnewVersion="$RELEASE_VERSION" -DgenerateBackupPoms=false + # These OSSRH-named variables contain the Maven Central Portal token. + - name: Publish packages + run: mvn --batch-mode --activate-profiles release deploy + +env: + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b864def..0000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: java - -jdk: - - oraclejdk8 - -notifications: - email: - recipients: - - vendetti@stanford.edu - - matthew.horridge@stanford.edu - - tudorache@stanford.edu - - csnyulas@stanford.edu - on_success: never - on_failure: always - diff --git a/README.md b/README.md index cb1b742..d8989b5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ -dlquery -======= +# DL Query -A [Protege](http://protege.stanford.edu/products.php#desktop-protege) plugin that provides an interface for querying -OWL ontologies. +A [Protégé](https://protege.stanford.edu/) plugin that provides an interface for querying OWL ontologies using the active reasoner. -User's guide is [available](http://protegewiki.stanford.edu/wiki/DLQueryTab) on the Protege Wiki. +The `5.x` development line targets Protégé 6 and OWL API 5. Build and run the tests with Java 11 or later: + +```shell +mvn --batch-mode clean verify +``` + +The [user guide](https://protegewiki.stanford.edu/wiki/DLQueryTab) is available on the Protégé Wiki. diff --git a/pom.xml b/pom.xml index 0081815..bdea538 100644 --- a/pom.xml +++ b/pom.xml @@ -2,17 +2,9 @@ 4.0.0 - - - org.sonatype.oss - oss-parent - 7 - - - edu.stanford.protege org.coode.dlquery - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT bundle DL Query @@ -79,9 +71,9 @@ - scm:git:git@github.com:protegeproject/org.coode.dlquery.git - scm:git:git@github.com:protegeproject/org.coode.dlquery.git - https://github.com/protegeproject/org.coode.dlquery + scm:git:https://github.com/protegeproject/dlquery.git + scm:git:git@github.com:protegeproject/dlquery.git + https://github.com/protegeproject/dlquery HEAD @@ -91,10 +83,23 @@ UTF-8 - 5.0.0-beta-19 - 4.1.3 + UTF-8 + false + 6.0.0-alpha-1 + 5.5.1 + + + ossrh + https://central.sonatype.com/repository/maven-snapshots/ + + + ossrh + https://central.sonatype.com + + + @@ -124,8 +129,9 @@ org.slf4j slf4j-api - 1.7.12 + 1.7.36 + @@ -139,25 +145,57 @@ + + org.apache.maven.plugins + maven-clean-plugin + 3.4.1 + + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + UTF-8 + + + org.apache.maven.plugins maven-compiler-plugin - 3.0 + 3.14.0 - 1.8 - 1.8 + 11 + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.2 + + + + org.apache.maven.plugins + maven-install-plugin + 3.1.4 + + + + org.apache.maven.plugins + maven-deploy-plugin + 3.1.4 + + org.apache.maven.plugins maven-source-plugin - 2.2.1 + 3.3.1 attach-sources - jar + jar-no-fork @@ -166,7 +204,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9.1 + 3.11.2 attach-javadocs @@ -181,18 +219,16 @@ org.apache.felix maven-bundle-plugin - 3.0.0 + 5.1.9 true - org.protege.editor.owl.ProtegeOWL . ${project.artifactId};singleton:=true The Protege Development Team - org.protege.editor.core.*;version="5.0.0", - org.protege.editor.owl.*;version="5.0.0", - org.semanticweb.owlapi.*;version="[4.1.3,5.0.0)", + org.protege.editor.core.*;version="[6.0.0,7.0.0)", + org.protege.editor.owl.*;version="[6.0.0,7.0.0)", * {maven-resources} @@ -200,14 +236,6 @@ - - - maven-eclipse-plugin - 2.9 - - true - - @@ -222,7 +250,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.5 + 3.2.7 sign-artifacts @@ -233,6 +261,17 @@ + + org.sonatype.central + central-publishing-maven-plugin + 0.9.0 + true + + ossrh + true + published + + diff --git a/src/main/java/org/coode/dlquery/DLQueryResultsSection.java b/src/main/java/org/coode/dlquery/DLQueryResultsSection.java index 776ebc5..d0666a6 100644 --- a/src/main/java/org/coode/dlquery/DLQueryResultsSection.java +++ b/src/main/java/org/coode/dlquery/DLQueryResultsSection.java @@ -2,7 +2,7 @@ import org.protege.editor.core.ui.list.MListSectionHeader; -import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; /* * Copyright (C) 2007, University of Manchester * @@ -39,7 +39,7 @@ public class DLQueryResultsSection implements MListSectionHeader { public DLQueryResultsSection(String label) { - this.label = checkNotNull(label); + this.label = requireNonNull(label); } diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index 5cb3ad1..8177c62 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -1,9 +1,6 @@ package org.coode.dlquery; import java.awt.*; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; import java.util.function.Predicate; import javax.swing.*; @@ -15,7 +12,6 @@ import org.protege.editor.core.ui.util.ComponentFactory; import org.protege.editor.owl.model.cache.OWLExpressionUserCache; import org.protege.editor.owl.model.classexpression.OWLExpressionParserException; -import org.protege.editor.owl.model.entity.OWLEntityCreationSet; import org.protege.editor.owl.model.event.EventType; import org.protege.editor.owl.model.event.OWLModelManagerListener; import org.protege.editor.owl.model.inference.OWLReasonerManager; @@ -25,13 +21,9 @@ import org.protege.editor.owl.ui.clsdescriptioneditor.ExpressionEditor; import org.protege.editor.owl.ui.clsdescriptioneditor.OWLExpressionChecker; import org.protege.editor.owl.ui.view.AbstractOWLViewComponent; -import org.semanticweb.owlapi.model.AddAxiom; -import org.semanticweb.owlapi.model.OWLAxiom; import org.semanticweb.owlapi.model.OWLClass; import org.semanticweb.owlapi.model.OWLClassExpression; -import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLException; -import org.semanticweb.owlapi.model.OWLOntologyChange; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Marker; @@ -345,17 +337,13 @@ private void doQuery() { private void doAdd() { try { OWLClassExpression desc = owlDescriptionEditor.createObject(); - OWLEntityCreationSet creationSet = CreateDefinedClassPanel.showDialog(desc, getOWLEditorKit()); - if (creationSet != null) { - List changes = new ArrayList<>(creationSet.getOntologyChanges()); - OWLDataFactory factory = getOWLModelManager().getOWLDataFactory(); - OWLAxiom equiv = factory.getOWLEquivalentClassesAxiom(creationSet.getOWLEntity(), desc); - changes.add(new AddAxiom(getOWLModelManager().getActiveOntology(), equiv)); - getOWLModelManager().applyChanges(changes); - if (isSynchronizing()) { - getOWLEditorKit().getOWLWorkspace().getOWLSelectionModel().setSelectedEntity(creationSet.getOWLEntity()); - } - } + CreateDefinedClassPanel.showDialogForDefinedClass(desc, getOWLEditorKit()) + .ifPresent(creationSet -> { + getOWLModelManager().applyChanges(creationSet.getOntologyChanges()); + if (isSynchronizing()) { + getOWLEditorKit().getOWLWorkspace().getOWLSelectionModel().setSelectedEntity(creationSet.getOWLEntity()); + } + }); } catch (OWLException e) { logger.error(marker, "An error occurred whilst adding the class definition: {}", e.getMessage(), e); } diff --git a/src/main/java/org/coode/dlquery/ResultsList.java b/src/main/java/org/coode/dlquery/ResultsList.java index b1ca0c3..270e493 100644 --- a/src/main/java/org/coode/dlquery/ResultsList.java +++ b/src/main/java/org/coode/dlquery/ResultsList.java @@ -17,7 +17,6 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import com.google.common.base.Stopwatch; import org.protege.editor.core.log.LogBanner; import org.protege.editor.core.ui.list.MList; import org.protege.editor.core.ui.list.MListButton; @@ -36,7 +35,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toList; import static org.coode.dlquery.ResultsSection.*; @@ -90,23 +89,23 @@ public ResultsList(OWLEditorKit owlEditorKit) { } public void setSuperClassesResultFilter(Predicate superClassesResultFilter) { - this.superClassesResultFilter = checkNotNull(superClassesResultFilter); + this.superClassesResultFilter = requireNonNull(superClassesResultFilter); } public void setDirectSuperClassesResultFilter(Predicate directSuperClassesResultFilter) { - this.directSuperClassesResultFilter = checkNotNull(directSuperClassesResultFilter); + this.directSuperClassesResultFilter = requireNonNull(directSuperClassesResultFilter); } public void setDirectSubClassesResultFilter(Predicate directSubClassesResultFilter) { - this.directSubClassesResultFilter = checkNotNull(directSubClassesResultFilter); + this.directSubClassesResultFilter = requireNonNull(directSubClassesResultFilter); } public void setSubClassesResultFilter(Predicate subClassesResultFilter) { - this.subClassesResultFilter = checkNotNull(subClassesResultFilter); + this.subClassesResultFilter = requireNonNull(subClassesResultFilter); } public void setInstancesFilter(Predicate instancesResultFilter) { - this.instancesResultFilter = checkNotNull(instancesResultFilter); + this.instancesResultFilter = requireNonNull(instancesResultFilter); } public boolean isResultsSectionVisible(ResultsSection section) { @@ -185,10 +184,10 @@ private void addSectionIfVisible(ResultsSection section, S if(!isResultsSectionVisible(section)) { return; } - Stopwatch stopwatch = Stopwatch.createStarted(); + long start = System.nanoTime(); Collection results = reasoner.get(); - stopwatch.stop(); - logger.info("Computed results for {} in {} ms", section.getDisplayName(), stopwatch.elapsed(TimeUnit.MILLISECONDS)); + long elapsedMillis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); + logger.info("Computed results for {} in {} ms", section.getDisplayName(), elapsedMillis); List resultsList = results.stream() .filter(filter) .filter(nameResultFilter) @@ -275,6 +274,6 @@ public void removeChangeListener(ChangeListener changeListener) { } public void setNameFilter(String nameFilter) { - this.nameFilter = checkNotNull(nameFilter); + this.nameFilter = requireNonNull(nameFilter); } } diff --git a/src/main/java/org/coode/dlquery/ResultsSection.java b/src/main/java/org/coode/dlquery/ResultsSection.java index 3eb7b12..5402e57 100644 --- a/src/main/java/org/coode/dlquery/ResultsSection.java +++ b/src/main/java/org/coode/dlquery/ResultsSection.java @@ -1,6 +1,6 @@ package org.coode.dlquery; -import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; /** * Author: Matthew Horridge
@@ -26,7 +26,7 @@ public enum ResultsSection { private final String displayName; private ResultsSection(String displayName) { - this.displayName = checkNotNull(displayName); + this.displayName = requireNonNull(displayName); } public String getDisplayName() { diff --git a/src/main/resources/update.properties b/src/main/resources/update.properties index 0e82625..9a3597e 100644 --- a/src/main/resources/update.properties +++ b/src/main/resources/update.properties @@ -1,8 +1,7 @@ id=org.coode.dlquery version=${project.version} -download=https://github.com/protegeproject/dlquery/releases/download/org.coode.dlquery-${project.version}/org.coode.dlquery-${project.version}.jar +download=https://repo1.maven.org/maven2/edu/stanford/protege/org.coode.dlquery/${project.version}/org.coode.dlquery-${project.version}.jar name=DL Query -readme=https://raw.githubusercontent.com/protegeproject/dlquery/master/src/main/resources/readme.html +readme=https://github.com/protegeproject/dlquery/releases/tag/${project.version} license=http://www.gnu.org/licenses/lgpl.html author=Matthew Horridge - From baa160f9167737bbe20a81cf1d7a80b519db5aca Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:30:17 -0700 Subject: [PATCH 2/9] Disable Execute when the DL query is empty --- .../coode/dlquery/OWLClassExpressionEditorViewComponent.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index 8177c62..02a312f 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -133,8 +133,9 @@ private JComponent createQueryPanel() { final OWLExpressionChecker checker = getOWLModelManager().getOWLExpressionCheckerFactory().getOWLClassExpressionChecker(); owlDescriptionEditor = new ExpressionEditor<>(getOWLEditorKit(), checker); + executeButton.setEnabled(false); owlDescriptionEditor.addStatusChangedListener(newState -> { - executeButton.setEnabled(newState); + executeButton.setEnabled(newState && !owlDescriptionEditor.getText().trim().isEmpty()); addButton.setEnabled(newState); }); owlDescriptionEditor.setPreferredSize(new Dimension(100, 50)); From 4585ca3e977cebd66fdef20cdde79c8299e6444e Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:30:34 -0700 Subject: [PATCH 3/9] Add an ellipsis to the Add to ontology button --- .../coode/dlquery/OWLClassExpressionEditorViewComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index 02a312f..1c8343c 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -79,7 +79,7 @@ public class OWLClassExpressionEditorViewComponent extends AbstractOWLViewCompon private final JButton executeButton = new JButton("Execute"); - private final JButton addButton = new JButton("Add to ontology"); + private final JButton addButton = new JButton("Add to ontology…"); private final OWLModelManagerListener listener = event -> { if (event.isType(EventType.ONTOLOGY_CLASSIFIED)) { From d66ccfcd1133e175f37735e153a2d823d4b98c60 Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:34:23 -0700 Subject: [PATCH 4/9] Enable class creation only for anonymous expressions --- .../OWLClassExpressionEditorViewComponent.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index 1c8343c..1c140f8 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -134,9 +134,11 @@ private JComponent createQueryPanel() { final OWLExpressionChecker checker = getOWLModelManager().getOWLExpressionCheckerFactory().getOWLClassExpressionChecker(); owlDescriptionEditor = new ExpressionEditor<>(getOWLEditorKit(), checker); executeButton.setEnabled(false); + addButton.setEnabled(false); owlDescriptionEditor.addStatusChangedListener(newState -> { - executeButton.setEnabled(newState && !owlDescriptionEditor.getText().trim().isEmpty()); - addButton.setEnabled(newState); + boolean hasQuery = !owlDescriptionEditor.getText().trim().isEmpty(); + executeButton.setEnabled(newState && hasQuery); + addButton.setEnabled(newState && hasQuery && isAnonymousClassExpression()); }); owlDescriptionEditor.setPreferredSize(new Dimension(100, 50)); @@ -159,6 +161,16 @@ private JComponent createQueryPanel() { } + private boolean isAnonymousClassExpression() { + try { + return owlDescriptionEditor.createObject().isAnonymous(); + } + catch (OWLException e) { + return false; + } + } + + private JComponent createResultsPanel() { JComponent resultsPanel = new JPanel(new BorderLayout(10, 10)); resultsPanel.setBorder(BorderFactory.createCompoundBorder( From d7197f4820bc2d0a9eccb711c3027fedc61f2a46 Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:36:22 -0700 Subject: [PATCH 5/9] Add tooltips to the DL Query actions --- .../coode/dlquery/OWLClassExpressionEditorViewComponent.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index 1c140f8..fc34b90 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -144,8 +144,10 @@ private JComponent createQueryPanel() { editorPanel.add(ComponentFactory.createScrollPane(owlDescriptionEditor), BorderLayout.CENTER); JPanel buttonHolder = new JPanel(new FlowLayout(FlowLayout.LEFT)); + executeButton.setToolTipText("Run the query using the active reasoner"); executeButton.addActionListener(e -> doQuery()); + addButton.setToolTipText("Create a named class equivalent to this expression"); addButton.addActionListener(e -> doAdd()); buttonHolder.add(executeButton); From 93e6181c933bcc63eefe2c3d021e470311f7d749 Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:41:36 -0700 Subject: [PATCH 6/9] Refine the DL Query panel layout --- ...OWLClassExpressionEditorViewComponent.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index fc34b90..817c5b9 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -4,11 +4,13 @@ import java.util.function.Predicate; import javax.swing.*; +import javax.swing.border.TitledBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.protege.editor.core.prefs.Preferences; import org.protege.editor.core.prefs.PreferencesManager; +import org.protege.editor.core.ui.split.ViewSplitPane; import org.protege.editor.core.ui.util.ComponentFactory; import org.protege.editor.owl.model.cache.OWLExpressionUserCache; import org.protege.editor.owl.model.classexpression.OWLExpressionParserException; @@ -111,7 +113,9 @@ protected void initialiseOWLView() throws Exception { optionsBoxHolder.add(optionsBox, BorderLayout.NORTH); resultsPanel.add(optionsBoxHolder, BorderLayout.EAST); - JSplitPane splitter = new JSplitPane(JSplitPane.VERTICAL_SPLIT, editorPanel, resultsPanel); + JSplitPane splitter = new ViewSplitPane(JSplitPane.VERTICAL_SPLIT); + splitter.setTopComponent(editorPanel); + splitter.setBottomComponent(resultsPanel); splitter.setDividerLocation(0.3); add(splitter, BorderLayout.CENTER); @@ -129,7 +133,7 @@ protected void initialiseOWLView() throws Exception { private JComponent createQueryPanel() { - JPanel editorPanel = new JPanel(new BorderLayout()); + JPanel editorPanel = new JPanel(new BorderLayout(0, 10)); final OWLExpressionChecker checker = getOWLModelManager().getOWLExpressionCheckerFactory().getOWLClassExpressionChecker(); owlDescriptionEditor = new ExpressionEditor<>(getOWLEditorKit(), checker); @@ -143,7 +147,7 @@ private JComponent createQueryPanel() { owlDescriptionEditor.setPreferredSize(new Dimension(100, 50)); editorPanel.add(ComponentFactory.createScrollPane(owlDescriptionEditor), BorderLayout.CENTER); - JPanel buttonHolder = new JPanel(new FlowLayout(FlowLayout.LEFT)); + JPanel buttonHolder = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); executeButton.setToolTipText("Run the query using the active reasoner"); executeButton.addActionListener(e -> doQuery()); @@ -154,10 +158,12 @@ private JComponent createQueryPanel() { buttonHolder.add(addButton); editorPanel.add(buttonHolder, BorderLayout.SOUTH); + TitledBorder queryBorder = BorderFactory.createTitledBorder( + BorderFactory.createEmptyBorder(), + "Query (class expression)"); + queryBorder.setTitleFont(queryBorder.getTitleFont().deriveFont(Font.BOLD)); editorPanel.setBorder(BorderFactory.createCompoundBorder( - BorderFactory.createTitledBorder( - BorderFactory.createEmptyBorder(), - "Query (class expression)"), + queryBorder, BorderFactory.createEmptyBorder(3, 3, 3, 3))); return editorPanel; } @@ -175,9 +181,15 @@ private boolean isAnonymousClassExpression() { private JComponent createResultsPanel() { JComponent resultsPanel = new JPanel(new BorderLayout(10, 10)); + TitledBorder resultsBorder = BorderFactory.createTitledBorder( + BorderFactory.createEmptyBorder(), + "Query results"); + resultsBorder.setTitleFont(resultsBorder.getTitleFont().deriveFont(Font.BOLD)); resultsPanel.setBorder(BorderFactory.createCompoundBorder( - BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "Query results"), - BorderFactory.createEmptyBorder(3, 3, 3, 3))); + BorderFactory.createEmptyBorder(6, 0, 0, 0), + BorderFactory.createCompoundBorder( + resultsBorder, + BorderFactory.createEmptyBorder(3, 3, 3, 3)))); resultsList = new ResultsList(getOWLEditorKit()); resultsPanel.add(ComponentFactory.createScrollPane(resultsList)); return resultsPanel; From 83bd70d7eb4ffa82e4196f59aed043de353fd2e0 Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:47:48 -0700 Subject: [PATCH 7/9] Align the DL Query content panels --- .../OWLClassExpressionEditorViewComponent.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index 817c5b9..66ca389 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -146,7 +146,10 @@ private JComponent createQueryPanel() { }); owlDescriptionEditor.setPreferredSize(new Dimension(100, 50)); - editorPanel.add(ComponentFactory.createScrollPane(owlDescriptionEditor), BorderLayout.CENTER); + JPanel editorHolder = new JPanel(new BorderLayout()); + editorHolder.setBorder(BorderFactory.createEmptyBorder(7, 0, 0, 0)); + editorHolder.add(ComponentFactory.createScrollPane(owlDescriptionEditor)); + editorPanel.add(editorHolder, BorderLayout.CENTER); JPanel buttonHolder = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); executeButton.setToolTipText("Run the query using the active reasoner"); executeButton.addActionListener(e -> doQuery()); @@ -181,15 +184,10 @@ private boolean isAnonymousClassExpression() { private JComponent createResultsPanel() { JComponent resultsPanel = new JPanel(new BorderLayout(10, 10)); - TitledBorder resultsBorder = BorderFactory.createTitledBorder( - BorderFactory.createEmptyBorder(), - "Query results"); - resultsBorder.setTitleFont(resultsBorder.getTitleFont().deriveFont(Font.BOLD)); - resultsPanel.setBorder(BorderFactory.createCompoundBorder( - BorderFactory.createEmptyBorder(6, 0, 0, 0), - BorderFactory.createCompoundBorder( - resultsBorder, - BorderFactory.createEmptyBorder(3, 3, 3, 3)))); + resultsPanel.setBorder(BorderFactory.createEmptyBorder(6, 3, 0, 3)); + JLabel resultsLabel = new JLabel("Query results"); + resultsLabel.setFont(resultsLabel.getFont().deriveFont(Font.BOLD)); + resultsPanel.add(resultsLabel, BorderLayout.NORTH); resultsList = new ResultsList(getOWLEditorKit()); resultsPanel.add(ComponentFactory.createScrollPane(resultsList)); return resultsPanel; From b806ab5d871b9ec7f4b157e9800b3d142de4bfaf Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 08:55:55 -0700 Subject: [PATCH 8/9] Add a prompt to the DL Query editor --- ...OWLClassExpressionEditorViewComponent.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java index 66ca389..fbde657 100644 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java +++ b/src/main/java/org/coode/dlquery/OWLClassExpressionEditorViewComponent.java @@ -136,7 +136,7 @@ private JComponent createQueryPanel() { JPanel editorPanel = new JPanel(new BorderLayout(0, 10)); final OWLExpressionChecker checker = getOWLModelManager().getOWLExpressionCheckerFactory().getOWLClassExpressionChecker(); - owlDescriptionEditor = new ExpressionEditor<>(getOWLEditorKit(), checker); + owlDescriptionEditor = createQueryEditor(checker); executeButton.setEnabled(false); addButton.setEnabled(false); owlDescriptionEditor.addStatusChangedListener(newState -> { @@ -163,7 +163,7 @@ private JComponent createQueryPanel() { editorPanel.add(buttonHolder, BorderLayout.SOUTH); TitledBorder queryBorder = BorderFactory.createTitledBorder( BorderFactory.createEmptyBorder(), - "Query (class expression)"); + "Query"); queryBorder.setTitleFont(queryBorder.getTitleFont().deriveFont(Font.BOLD)); editorPanel.setBorder(BorderFactory.createCompoundBorder( queryBorder, @@ -172,6 +172,34 @@ private JComponent createQueryPanel() { } + private ExpressionEditor createQueryEditor( + OWLExpressionChecker checker) { + return new ExpressionEditor<>(getOWLEditorKit(), checker) { + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + if (getText().isEmpty()) { + Graphics placeholderGraphics = g.create(); + try { + placeholderGraphics.setColor(getDisabledTextColor()); + Font placeholderFont = getFont().deriveFont(getFont().getSize2D() + 2); + placeholderGraphics.setFont(placeholderFont); + FontMetrics fontMetrics = placeholderGraphics.getFontMetrics(placeholderFont); + Insets insets = getInsets(); + placeholderGraphics.drawString( + "Enter a class expression", + insets.left + 2, + insets.top + fontMetrics.getAscent()); + } + finally { + placeholderGraphics.dispose(); + } + } + } + }; + } + + private boolean isAnonymousClassExpression() { try { return owlDescriptionEditor.createObject().isAnonymous(); From c05f47b1e41551fa41b217600cdf2a9f54333a2e Mon Sep 17 00:00:00 2001 From: Matthew Horridge Date: Tue, 29 Sep 2026 09:04:38 -0700 Subject: [PATCH 9/9] Remove unused extended query support --- .../OWLClassExpressionNodeQueryVisitor.java | 96 ------------------- .../coode/dlquery/ReasonerQueryInvoker.java | 22 ----- 2 files changed, 118 deletions(-) delete mode 100644 src/main/java/org/coode/dlquery/OWLClassExpressionNodeQueryVisitor.java delete mode 100644 src/main/java/org/coode/dlquery/ReasonerQueryInvoker.java diff --git a/src/main/java/org/coode/dlquery/OWLClassExpressionNodeQueryVisitor.java b/src/main/java/org/coode/dlquery/OWLClassExpressionNodeQueryVisitor.java deleted file mode 100644 index 33bcb9b..0000000 --- a/src/main/java/org/coode/dlquery/OWLClassExpressionNodeQueryVisitor.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.coode.dlquery; - -import java.util.HashSet; -import java.util.Set; - -import org.protege.editor.owl.model.OWLModelManager; -import org.protege.editor.owl.model.classexpression.OWLClassExpressionLeafNode; -import org.protege.editor.owl.model.classexpression.OWLClassExpressionNodeDifference; -import org.protege.editor.owl.model.classexpression.OWLClassExpressionNodePossibly; -import org.protege.editor.owl.model.classexpression.OWLClassExpressionNodeUnion; -import org.protege.editor.owl.model.classexpression.OWLClassExpressionNodeVisitor; -import org.semanticweb.owlapi.model.OWLClassExpression; -import org.semanticweb.owlapi.model.OWLObject; -import org.semanticweb.owlapi.reasoner.OWLReasoner; - - -/** - * Author: Matthew Horridge
- * The University Of Manchester
- * Medical Informatics Group
- * Date: 11-Oct-2006

- * - * matthew.horridge@cs.man.ac.uk
- * www.cs.man.ac.uk/~horridgm

- */ -public class OWLClassExpressionNodeQueryVisitor implements OWLClassExpressionNodeVisitor { - - private final OWLModelManager owlModelManager; - - private final OWLReasoner reasoner; - - private final ReasonerQueryInvoker queryInvoker; - - private final Set results = new HashSet<>(); - - - public OWLClassExpressionNodeQueryVisitor(OWLModelManager manager, OWLReasoner reasoner, - ReasonerQueryInvoker queryInvoker) { - this.owlModelManager = manager; - this.reasoner = reasoner; - this.queryInvoker = queryInvoker; - } - - - public void reset() { - results.clear(); - } - - - public Set getResults() { - return new HashSet(results); - } - - - public void visit(OWLClassExpressionNodeDifference node) { - node.getLeftNode().accept(this); - Set leftResults = results; - node.getRightNode().accept(this); - Set rightResults = results; - results.clear(); - results.addAll(leftResults); - results.remove(node.getRightNode().getClassExpression()); - results.removeAll(rightResults); - } - - - public void visit(OWLClassExpressionNodeUnion node) { - node.getLeftNode().accept(this); - Set leftResults = results; - node.getRightNode().accept(this); - Set rightResults = results; - results.clear(); - results.addAll(leftResults); - results.addAll(rightResults); - } - - - public void visit(OWLClassExpressionNodePossibly node) { - // LEFTDESC minus not(RIGHTDESC) - OWLClassExpression leftDesc = node.getLeftNode().getClassExpression(); - OWLClassExpression rightDesc = node.getRightNode().getClassExpression(); - OWLClassExpression negRightDesc = owlModelManager.getOWLDataFactory().getOWLObjectComplementOf(rightDesc); - - Set leftResults = queryInvoker.getAnswer(reasoner, leftDesc); - Set rightResults = queryInvoker.getAnswer(reasoner, negRightDesc); - results.clear(); - results.addAll(leftResults); - results.removeAll(rightResults); - } - - - public void visit(OWLClassExpressionLeafNode node) { - results.clear(); - results.addAll(queryInvoker.getAnswer(reasoner, node.getClassExpression())); - } -} diff --git a/src/main/java/org/coode/dlquery/ReasonerQueryInvoker.java b/src/main/java/org/coode/dlquery/ReasonerQueryInvoker.java deleted file mode 100644 index cac6156..0000000 --- a/src/main/java/org/coode/dlquery/ReasonerQueryInvoker.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.coode.dlquery; - -import java.util.Set; - -import org.semanticweb.owlapi.model.OWLClassExpression; -import org.semanticweb.owlapi.model.OWLObject; -import org.semanticweb.owlapi.reasoner.OWLReasoner; - - -/** - * Author: Matthew Horridge
- * The University Of Manchester
- * Medical Informatics Group
- * Date: 11-Oct-2006

- * - * matthew.horridge@cs.man.ac.uk
- * www.cs.man.ac.uk/~horridgm

- */ -public interface ReasonerQueryInvoker { - - public Set getAnswer(OWLReasoner reasoner, OWLClassExpression description); -}