瀏覽代碼

Fetch jME versions from Maven API

Toni Helenius 2 年之前
父節點
當前提交
17234e69ce

+ 104 - 7
jme3-templates/src/com/jme3/gde/templates/gradledesktop/CachedOptionsContainer.java

@@ -34,6 +34,7 @@ package com.jme3.gde.templates.gradledesktop;
 import com.jme3.gde.templates.gradledesktop.options.AdditionalLibrary;
 import com.jme3.gde.templates.gradledesktop.options.GUILibrary;
 import com.jme3.gde.templates.gradledesktop.options.JMEVersion;
+import com.jme3.gde.templates.gradledesktop.options.JMEVersionComparator;
 import com.jme3.gde.templates.gradledesktop.options.LibraryVersion;
 import com.jme3.gde.templates.gradledesktop.options.MavenArtifact;
 import com.jme3.gde.templates.gradledesktop.options.NetworkingLibrary;
@@ -42,10 +43,18 @@ import com.jme3.gde.templates.gradledesktop.options.TemplateLibrary;
 import com.jme3.gde.templates.utils.mavensearch.MavenApiVersionChecker;
 import com.jme3.gde.templates.utils.mavensearch.MavenVersionChecker;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Objects;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.function.Consumer;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * Singleton that contains all the options. Tries to go online to get all the
@@ -81,7 +90,9 @@ public class CachedOptionsContainer {
     private void initialize() {
         MavenVersionChecker mavenVersionChecker = new MavenApiVersionChecker();
 
-        jmeVersions = initVersions(mavenVersionChecker, MavenArtifact.JME_GROUP_ID, JMEVersion.JME_ARTIFACT_ID);
+        jmeVersions = initVersions(mavenVersionChecker, MavenArtifact.JME_GROUP_ID, JMEVersion.JME_ARTIFACT_ID, "-stable$", new JMEVersionComparator(), JMEVersion.values(), (result) -> {
+            jmeVersions = result;
+        });
         additionalLibraries = initLibaries(mavenVersionChecker, AdditionalLibrary.values());
         guiLibraries = initLibaries(mavenVersionChecker, GUILibrary.values());
         networkingLibraries = initLibaries(mavenVersionChecker, NetworkingLibrary.values());
@@ -102,10 +113,11 @@ public class CachedOptionsContainer {
 
                                     if (exception != null || result == null) {
                                         logger.log(Level.WARNING, exception,
-                                                () -> String.format("Failed to acquire version information for Maven artifact %s (%s:%s)", new Object[]{getLabel(), getGroupId(), getArtifactId()}));
-                                    } else {
-                                        version = result;
-                                    }
+                                        () -> String.format("Failed to acquire version information for Maven artifact %s (%s:%s)", new Object[]{getLabel(), getGroupId(), getArtifactId()}));
+
+                                return;
+                            }
+                            version = result;
                                 });
                     }
                 }
@@ -167,8 +179,93 @@ public class CachedOptionsContainer {
         return physicsLibraries;
     }
 
-    private List<LibraryVersion> initVersions(MavenVersionChecker mavenVersionChecker, String groupId, String artifactId) {
-        return Collections.emptyList();
+    public List<LibraryVersion> getJmeVersions() {
+        return jmeVersions;
+    }
+
+    private List<LibraryVersion> initVersions(MavenVersionChecker mavenVersionChecker, String groupId,
+            String artifactId, String pattern, Comparator<LibraryVersion> versionComparator,
+            LibraryVersion[] versions, Consumer<List<LibraryVersion>> completedVersionsConsumer) {
+        mavenVersionChecker.getAllVersions(groupId, artifactId).whenComplete((result, exception) -> {
+
+            if (exception != null || result == null) {
+                logger.log(Level.WARNING, exception,
+                        () -> String.format("Failed to acquire version information for Maven artifact %s:%s", new Object[]{groupId, artifactId}));
+
+                return;
+            }
+
+            initVersionList(result, pattern, versionComparator, versions, groupId, artifactId, completedVersionsConsumer);
+        });
+
+        return Collections.unmodifiableList(Arrays.asList(versions));
+    }
+
+    private static void initVersionList(List<String> result, String pattern, Comparator<LibraryVersion> versionComparator, LibraryVersion[] versions, String groupId, String artifactId, Consumer<List<LibraryVersion>> completedVersionsConsumer) {
+
+        // Filter the vesions list
+        List<String> vList = result;
+        if (pattern != null) {
+            Pattern p = Pattern.compile(pattern);
+            vList = vList.stream().filter(p.asPredicate()).collect(Collectors.toList());
+        }
+
+        // Compile the results
+        SortedSet<LibraryVersion> allVersions = new TreeSet<>(versionComparator);
+        allVersions.addAll(Arrays.asList(versions));
+        for (String v : vList) {
+            allVersions.add(new LibraryVersion() {
+
+                @Override
+                public String getGroupId() {
+                    return groupId;
+                }
+
+                @Override
+                public String getArtifactId() {
+                    return artifactId;
+                }
+
+                @Override
+                public String getVersion() {
+                    return v;
+                }
+
+                @Override
+                public String getPatchNotesPath() {
+                    return "lol";
+                }
+
+                @Override
+                public String toString() {
+                    return v;
+                }
+
+                @Override
+                public int hashCode() {
+                    return Objects.hashCode(v);
+                }
+
+                @Override
+                public boolean equals(Object obj) {
+                    if (this == obj) {
+                        return true;
+                    }
+                    if (obj == null) {
+                        return false;
+                    }
+                    if (!(obj instanceof LibraryVersion)) {
+                        return false;
+                    }
+                    final LibraryVersion other = (LibraryVersion) obj;
+
+                    return Objects.equals(getVersion(), other.getVersion());
+                }
+
+            });
+        }
+
+        completedVersionsConsumer.accept(Collections.unmodifiableList(new ArrayList<>(allVersions)));
     }
 
 }

+ 3 - 3
jme3-templates/src/com/jme3/gde/templates/gradledesktop/GradleDesktopGameGuiPanelVisual.form

@@ -95,7 +95,7 @@
     <Component class="javax.swing.JComboBox" name="guiComboBox">
       <Properties>
         <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
-          <Connection code="new DefaultComboBoxModel&lt;TemplateLibrary&gt;(CachedOptionsContainer.getInstance().getGuiLibraries().toArray(new TemplateLibrary[0]))" type="code"/>
+          <Connection code="new DefaultComboBoxModel&lt;TemplateLibrary&gt;(CachedOptionsContainer.getInstance().getGuiLibraries().toArray(TemplateLibrary[]::new))" type="code"/>
         </Property>
       </Properties>
       <Events>
@@ -138,7 +138,7 @@
     <Component class="javax.swing.JComboBox" name="physicsEngineComboBox">
       <Properties>
         <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
-          <Connection code="new DefaultComboBoxModel&lt;TemplateLibrary&gt;(CachedOptionsContainer.getInstance().getPhysicsLibraries().toArray(new TemplateLibrary[0]))" type="code"/>
+          <Connection code="new DefaultComboBoxModel&lt;TemplateLibrary&gt;(CachedOptionsContainer.getInstance().getPhysicsLibraries().toArray(TemplateLibrary[]::new))" type="code"/>
         </Property>
       </Properties>
       <Events>
@@ -181,7 +181,7 @@
     <Component class="javax.swing.JComboBox" name="networkingComboBox">
       <Properties>
         <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
-          <Connection code="new DefaultComboBoxModel&lt;TemplateLibrary&gt;(CachedOptionsContainer.getInstance().getNetworkingLibraries().toArray(new TemplateLibrary[0]))" type="code"/>
+          <Connection code="new DefaultComboBoxModel&lt;TemplateLibrary&gt;(CachedOptionsContainer.getInstance().getNetworkingLibraries().toArray(TemplateLibrary[]::new))" type="code"/>
         </Property>
       </Properties>
       <Events>

+ 3 - 3
jme3-templates/src/com/jme3/gde/templates/gradledesktop/GradleDesktopGameGuiPanelVisual.java

@@ -117,7 +117,7 @@ public class GradleDesktopGameGuiPanelVisual extends JPanel {
         guiLabel.setLabelFor(guiComboBox);
         Mnemonics.setLocalizedText(guiLabel, NbBundle.getMessage(GradleDesktopGameGuiPanelVisual.class, "GradleDesktopGameGuiPanelVisual.guiLabel.text")); // NOI18N
 
-        guiComboBox.setModel(new DefaultComboBoxModel<TemplateLibrary>(CachedOptionsContainer.getInstance().getGuiLibraries().toArray(new TemplateLibrary[0])));
+        guiComboBox.setModel(new DefaultComboBoxModel<TemplateLibrary>(CachedOptionsContainer.getInstance().getGuiLibraries().toArray(TemplateLibrary[]::new)));
         guiComboBox.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent evt) {
                 guiComboBoxActionPerformed(evt);
@@ -134,7 +134,7 @@ public class GradleDesktopGameGuiPanelVisual extends JPanel {
         physicsEngineLabel.setLabelFor(physicsEngineComboBox);
         Mnemonics.setLocalizedText(physicsEngineLabel, NbBundle.getMessage(GradleDesktopGameGuiPanelVisual.class, "GradleDesktopGameGuiPanelVisual.physicsEngineLabel.text")); // NOI18N
 
-        physicsEngineComboBox.setModel(new DefaultComboBoxModel<TemplateLibrary>(CachedOptionsContainer.getInstance().getPhysicsLibraries().toArray(new TemplateLibrary[0])));
+        physicsEngineComboBox.setModel(new DefaultComboBoxModel<TemplateLibrary>(CachedOptionsContainer.getInstance().getPhysicsLibraries().toArray(TemplateLibrary[]::new)));
         physicsEngineComboBox.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent evt) {
                 physicsEngineComboBoxActionPerformed(evt);
@@ -151,7 +151,7 @@ public class GradleDesktopGameGuiPanelVisual extends JPanel {
         networkingLabel.setLabelFor(networkingComboBox);
         Mnemonics.setLocalizedText(networkingLabel, NbBundle.getMessage(GradleDesktopGameGuiPanelVisual.class, "GradleDesktopGameGuiPanelVisual.networkingLabel.text")); // NOI18N
 
-        networkingComboBox.setModel(new DefaultComboBoxModel<TemplateLibrary>(CachedOptionsContainer.getInstance().getNetworkingLibraries().toArray(new TemplateLibrary[0])));
+        networkingComboBox.setModel(new DefaultComboBoxModel<TemplateLibrary>(CachedOptionsContainer.getInstance().getNetworkingLibraries().toArray(TemplateLibrary[]::new)));
         networkingComboBox.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent evt) {
                 networkingComboBoxActionPerformed(evt);

+ 2 - 2
jme3-templates/src/com/jme3/gde/templates/gradledesktop/GradleDesktopGameJMEVersionPanelVisual.form

@@ -91,7 +91,7 @@
     <Component class="javax.swing.JComboBox" name="jmeVersionComboBox">
       <Properties>
         <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
-          <Connection code="new DefaultComboBoxModel(JMEVersion.values())" type="code"/>
+          <Connection code="new DefaultComboBoxModel&lt;LibraryVersion&gt;(com.jme3.gde.templates.gradledesktop.options.JMEVersion.values())" type="code"/>
         </Property>
         <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
           <Dimension value="[100, 25]"/>
@@ -101,7 +101,7 @@
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jmeVersionComboBoxActionPerformed"/>
       </Events>
       <AuxValues>
-        <AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;String&gt;"/>
+        <AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;LibraryVersion&gt;"/>
       </AuxValues>
     </Component>
     <Container class="javax.swing.JScrollPane" name="jmeVersionDescriptionScrollPane">

+ 35 - 4
jme3-templates/src/com/jme3/gde/templates/gradledesktop/GradleDesktopGameJMEVersionPanelVisual.java

@@ -34,6 +34,7 @@ package com.jme3.gde.templates.gradledesktop;
 
 import com.jme3.gde.templates.gradledesktop.options.JMEVersion;
 import com.jme3.gde.templates.gradledesktop.options.LWJGLLibrary;
+import com.jme3.gde.templates.gradledesktop.options.LibraryVersion;
 import com.jme3.gde.templates.gradledesktop.options.TemplateLibrary;
 import java.awt.Desktop;
 import java.awt.Dimension;
@@ -55,6 +56,8 @@ import javax.swing.JSeparator;
 import javax.swing.JTextArea;
 import javax.swing.JTextPane;
 import javax.swing.LayoutStyle;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
 import javax.swing.event.HyperlinkEvent;
 import org.openide.WizardDescriptor;
 import org.openide.awt.Mnemonics;
@@ -71,6 +74,8 @@ public class GradleDesktopGameJMEVersionPanelVisual extends JPanel {
     private static final Logger LOGGER = Logger.getLogger(
             GradleDesktopGameJMEVersionPanel.class.getName());
 
+    private boolean jmeVersionsInitialized = false;
+
     /**
      * Creates new form GradleDesktopGameJMEVersion
      */
@@ -79,6 +84,33 @@ public class GradleDesktopGameJMEVersionPanelVisual extends JPanel {
         initComponents();
         additionalComponentConfiguration();
 
+        addAncestorListener(new AncestorListener() {
+
+            @Override
+            public void ancestorAdded(AncestorEvent event) {
+
+                // Refresh the jME version selection
+                Object selection = jmeVersionComboBox.getSelectedItem();
+                jmeVersionComboBox.setModel(new DefaultComboBoxModel<>(CachedOptionsContainer.getInstance().getJmeVersions().toArray(LibraryVersion[]::new)));
+                if (selection != null && jmeVersionsInitialized) {
+                    jmeVersionComboBox.setSelectedItem(selection);
+                }
+
+                jmeVersionsInitialized = true;
+            }
+
+            @Override
+            public void ancestorRemoved(AncestorEvent event) {
+
+            }
+
+            @Override
+            public void ancestorMoved(AncestorEvent event) {
+
+            }
+
+        });
+
         loadPatchNotes();
         updateLWJGLdescription();
     }
@@ -110,8 +142,7 @@ public class GradleDesktopGameJMEVersionPanelVisual extends JPanel {
     }
 
     private void loadPatchNotes() {
-        JMEVersion jmeVersionSelected = (JMEVersion) jmeVersionComboBox
-                .getSelectedItem();
+        LibraryVersion jmeVersionSelected = jmeVersionComboBox.getItemAt(jmeVersionComboBox.getSelectedIndex());
         try {
             URL patchNotesURL = GradleDesktopGameJMEVersionPanelVisual.class
                     .getResource(jmeVersionSelected.getPatchNotesPath());
@@ -161,7 +192,7 @@ public class GradleDesktopGameJMEVersionPanelVisual extends JPanel {
         jmeVersionLabel.setLabelFor(jmeVersionComboBox);
         Mnemonics.setLocalizedText(jmeVersionLabel, NbBundle.getMessage(GradleDesktopGameJMEVersionPanelVisual.class, "GradleDesktopGameJMEVersionPanelVisual.jmeVersionLabel.text")); // NOI18N
 
-        jmeVersionComboBox.setModel(new DefaultComboBoxModel(JMEVersion.values()));
+        jmeVersionComboBox.setModel(new DefaultComboBoxModel<LibraryVersion>(JMEVersion.values()));
         jmeVersionComboBox.setMaximumSize(new Dimension(100, 25));
         jmeVersionComboBox.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent evt) {
@@ -251,7 +282,7 @@ public class GradleDesktopGameJMEVersionPanelVisual extends JPanel {
 
     // Variables declaration - do not modify//GEN-BEGIN:variables
     JSeparator jSeparator1;
-    JComboBox<String> jmeVersionComboBox;
+    JComboBox<LibraryVersion> jmeVersionComboBox;
     JScrollPane jmeVersionDescriptionScrollPane;
     JTextPane jmeVersionDescriptionTextPane;
     JLabel jmeVersionLabel;

+ 2 - 12
jme3-templates/src/com/jme3/gde/templates/gradledesktop/options/JMEVersion.java

@@ -74,7 +74,7 @@ public enum JMEVersion implements LibraryVersion {
     /**
      * Default artifact ID for jME that we use to check i.e. versions from
      */
-    public static final String JME_ARTIFACT_ID = "core";
+    public static final String JME_ARTIFACT_ID = "jme3-core";
 
     /**
      * Name of the jMonkeyEngine version. This should match the Maven/Gradle
@@ -108,12 +108,7 @@ public enum JMEVersion implements LibraryVersion {
         return label;
     }
 
-    /**
-     * Get the path to the .html file containing the Patch Notes for this
-     * jMonkeyEngine version.
-     *
-     * @return the path to the .html file containing the Patch Notes
-     */
+    @Override
     public String getPatchNotesPath() {
         return patchNotesPath;
     }
@@ -129,11 +124,6 @@ public enum JMEVersion implements LibraryVersion {
         return label;
     }
 
-    @Override
-    public String getPatchNotes() {
-        return patchNotesPath;
-    }
-
     @Override
     public String getGroupId() {
         return MavenArtifact.JME_GROUP_ID;

+ 99 - 0
jme3-templates/src/com/jme3/gde/templates/gradledesktop/options/JMEVersionComparator.java

@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2009-2023 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.templates.gradledesktop.options;
+
+import java.text.Collator;
+import java.util.Comparator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Compares jME versions, sorts them in descending order (newest first)
+ */
+public class JMEVersionComparator implements Comparator<LibraryVersion> {
+
+    private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)-(.*)");
+
+    @Override
+    public int compare(LibraryVersion o1, LibraryVersion o2) {
+        return -(new JMEVersionInfo(o1.getVersion()).compareTo(new JMEVersionInfo(o2.getVersion())));
+    }
+
+    private static final class JMEVersionInfo implements Comparable<JMEVersionInfo> {
+
+        private final int major;
+
+        private final int minor;
+
+        private final int release;
+
+        private final String type;
+
+        public JMEVersionInfo(String versionString) {
+            Matcher m = VERSION_PATTERN.matcher(versionString);
+
+            if (m.find()) {
+                this.major = Integer.parseInt(m.group(1));
+                this.minor = Integer.parseInt(m.group(2));
+                this.release = Integer.parseInt(m.group(3));
+                this.type = m.group(4);
+            } else {
+                this.major = 0;
+                this.minor = 0;
+                this.release = 0;
+                this.type = "";
+            }
+        }
+
+        @Override
+        public int compareTo(JMEVersionInfo o) {
+            int result = Integer.compare(major, o.major);
+            if (result != 0) {
+                return result;
+            }
+
+            result = Integer.compare(minor, o.minor);
+            if (result != 0) {
+                return result;
+            }
+
+            result = Integer.compare(release, o.release);
+            if (result != 0) {
+                return result;
+            }
+
+            return Collator.getInstance().compare(type, o.type);
+        }
+
+    }
+
+}

+ 37 - 5
jme3-templates/src/com/jme3/gde/templates/gradledesktop/options/LibraryVersion.java

@@ -1,15 +1,47 @@
 /*
- * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
- * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template
+ * Copyright (c) 2009-2023 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 package com.jme3.gde.templates.gradledesktop.options;
 
 /**
- *
- * @author Toni
+ * Represents a Maven library version info (with patch notes)
  */
 public interface LibraryVersion extends MavenArtifact {
 
-    String getPatchNotes();
+    /**
+     * Get the path to the .html file containing the Patch Notes for this
+     * jMonkeyEngine version.
+     *
+     * @return the path to the .html file containing the Patch Notes
+     */
+    String getPatchNotesPath();
 
 }