This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-launchpad-comparator.git

commit 7ebaba748f62bee7a6073b0492440e1347de1308
Author: Robert Munteanu <[email protected]>
AuthorDate: Wed Oct 14 09:23:50 2015 +0000

    SLING-5099 - Create 'New and Noteworthy' page for Sling 8
    
    Enhance the launchpad-comparator to list fixed Jira issues for Sling
    artifacts with version changes.
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1708567 
13f79535-47bb-0310-9956-ffa450edef68
---
 .gitignore                                         |  1 +
 pom.xml                                            | 26 +++++-
 .../lc/{Main.java => LaunchpadComparer.java}       | 85 +++++++++++++++-----
 .../java/org/apache/sling/tooling/lc/Main.java     | 92 +---------------------
 .../sling/tooling/lc/{ => aether}/AetherSetup.java |  4 +-
 .../sling/tooling/lc/{ => aether}/ArtifactKey.java |  4 +-
 .../sling/tooling/lc/{ => aether}/Artifacts.java   |  4 +-
 .../tooling/lc/{ => aether}/VersionChange.java     |  4 +-
 .../lc/{VersionChange.java => jira/Fields.java}    | 28 +++----
 .../org/apache/sling/tooling/lc/jira/Issue.java    | 79 +++++++++++++++++++
 .../apache/sling/tooling/lc/jira/IssueFinder.java  | 79 +++++++++++++++++++
 .../lc/{VersionChange.java => jira/Response.java}  | 33 +++-----
 .../sling/tooling/lc/svn/SvnChangeLogFinder.java   | 62 +++++++++++++++
 .../org/apache/sling/tooling/lc/ArtifactsTest.java | 18 ++++-
 14 files changed, 360 insertions(+), 159 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..89540d8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/dependency-reduced-pom.xml
diff --git a/pom.xml b/pom.xml
index 2cc217e..528f4d1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -106,6 +106,20 @@
             <version>3.0.15</version>
         </dependency>
 
+        <!-- Retrieve changelog data from SVN -->
+        <dependency>
+            <groupId>org.tmatesoft.svnkit</groupId>
+            <artifactId>svnkit</artifactId>
+            <version>1.8.11</version>
+        </dependency>
+
+        <!-- Parse Jira JSON responses -->
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.2.4</version>
+        </dependency>
+
     </dependencies>
 
     <build>
@@ -116,7 +130,8 @@
                 <version>2.4.1</version>
                 <configuration>
                     <transformers>
-                        <transformer 
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                        <transformer
+                            
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                             
<mainClass>org.apache.sling.tooling.lc.Main</mainClass>
                         </transformer>
                     </transformers>
@@ -130,6 +145,15 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>dependency-reduced-pom.xml</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/src/main/java/org/apache/sling/tooling/lc/Main.java 
b/src/main/java/org/apache/sling/tooling/lc/LaunchpadComparer.java
similarity index 63%
copy from src/main/java/org/apache/sling/tooling/lc/Main.java
copy to src/main/java/org/apache/sling/tooling/lc/LaunchpadComparer.java
index 7b7837b..df4c931 100644
--- a/src/main/java/org/apache/sling/tooling/lc/Main.java
+++ b/src/main/java/org/apache/sling/tooling/lc/LaunchpadComparer.java
@@ -18,11 +18,15 @@ package org.apache.sling.tooling.lc;
 
 import java.io.BufferedReader;
 import java.io.File;
+import java.io.IOException;
 import java.nio.file.Files;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
@@ -33,20 +37,29 @@ import org.apache.sling.provisioning.model.Artifact;
 import org.apache.sling.provisioning.model.Model;
 import org.apache.sling.provisioning.model.ModelUtility;
 import org.apache.sling.provisioning.model.io.ModelReader;
+import org.apache.sling.tooling.lc.aether.AetherSetup;
+import org.apache.sling.tooling.lc.aether.ArtifactKey;
+import org.apache.sling.tooling.lc.aether.Artifacts;
+import org.apache.sling.tooling.lc.aether.VersionChange;
+import org.apache.sling.tooling.lc.jira.IssueFinder;
+import org.apache.sling.tooling.lc.svn.SvnChangeLogFinder;
+import org.tmatesoft.svn.core.SVNException;
 
 import com.google.common.collect.Sets;
 
-public class Main {
+public class LaunchpadComparer {
+    
+    private static final Pattern JIRA_KEY_PATTERN = 
Pattern.compile("^(SLING-\\d+).*");
 
-    public static void main(String[] args) throws Exception {
-        
-        // 0. read CLI arguments
-        String firstVersion = "7";
-        String secondVersion = "8";
-        if ( args.length == 2) {
-            firstVersion = args[0];
-            secondVersion = args[1];
-        }
+    private final String firstVersion;
+    private final String secondVersion;
+
+    public LaunchpadComparer(String firstVersion, String secondVersion) {
+        this.firstVersion = firstVersion;
+        this.secondVersion = secondVersion;
+    }
+
+    public void run() throws Exception {
         
         System.out.format("Computing differences between Launchpad versions %s 
and %s...%n", 
                 firstVersion, secondVersion);
@@ -63,7 +76,6 @@ public class Main {
             model = ModelUtility.getEffectiveModel(ModelReader.read(reader, 
null));
         }
         
-        // TODO - versions are not interpolated
         Map<ArtifactKey, Artifact> to = model.getFeatures().stream()
             .flatMap( f -> f.getRunModes().stream())
             .flatMap( r -> r.getArtifactGroups().stream())
@@ -72,11 +84,11 @@ public class Main {
         
         BundleList readBundleList = BundleListUtils.readBundleList(fromFile);
         
-        // 3. generate added / removed / changed
         Map<ArtifactKey, Artifact> from = 
readBundleList.getStartLevels().stream()
             .flatMap( sl -> sl.getBundles().stream() )
-            .collect(Collectors.toMap( b -> new ArtifactKey(b), 
Main::newArtifact));
-        
+            .collect(Collectors.toMap( b -> new ArtifactKey(b), 
LaunchpadComparer::newArtifact));
+
+        // 3. generate added / removed / changed
         Set<Artifact> removed = Sets.difference(from.keySet(), 
to.keySet()).stream()
             .map( k -> from.get(k))
             .collect(Collectors.toSet());
@@ -94,17 +106,18 @@ public class Main {
         // 4. output changes
         
         System.out.println("Added ");
-        added.stream().sorted().forEach(Main::outputFormatted);
+        added.stream().sorted().forEach(LaunchpadComparer::outputFormatted);
         
         System.out.println("Removed ");
-        removed.stream().sorted().forEach(Main::outputFormatted);
+        removed.stream().sorted().forEach(LaunchpadComparer::outputFormatted);
         
         System.out.println("Changed");
         changed.entrySet().stream()
             .sorted( (a, b) -> a.getKey().compareTo(b.getKey()) )
-            .forEach(Main::outputFormatted);
+            .forEach(LaunchpadComparer::outputFormatted);        
+        
     }
-
+    
     private static Artifact newArtifact(Bundle bundle) {
         
         return new Artifact(bundle.getGroupId(), bundle.getArtifactId(), 
bundle.getVersion(), bundle.getClassifier(), bundle.getType());
@@ -118,7 +131,41 @@ public class Main {
 
     private static void outputFormatted(Map.Entry<ArtifactKey, VersionChange> 
e) {
         
-        System.out.format("    %-30s : %-55s : %s -> %s%n", 
e.getKey().getGroupId(), e.getKey().getArtifactId(), e.getValue().getFrom(), 
e.getValue().getTo());
+        ArtifactKey artifact = e.getKey();
+        VersionChange versionChange = e.getValue();
+        
+        System.out.format("    %-30s : %-55s : %s -> %s%n", 
artifact.getGroupId(), artifact.getArtifactId(), versionChange.getFrom(), 
versionChange.getTo());
+        
+        if ( !artifact.getGroupId().equals("org.apache.sling"))  {
+            return;
+        }
+        
+        SvnChangeLogFinder svn = new SvnChangeLogFinder();
         
+        String fromTag = artifact.getArtifactId()+"-"+versionChange.getFrom();
+        String toTag = artifact.getArtifactId()+"-"+ versionChange.getTo();
+        try {
+            List<String> issues = svn.getChanges(fromTag, toTag)
+                .stream()
+                .map(LaunchpadComparer::toJiraKey)
+                .filter( k -> k != null)
+                .collect(Collectors.toList());
+            
+            IssueFinder issueFinder = new IssueFinder();
+            issueFinder.findIssues(issues).
+                forEach( i -> System.out.format("        %-10s - %s%n", 
i.getKey(), i.getSummary()));
+            
+        } catch (SVNException | IOException e1) {
+            System.err.println("Failed retrieving changes : " + 
e1.getMessage());
+        }
     }
+    
+    private static String toJiraKey(String message) {
+        Matcher matcher = JIRA_KEY_PATTERN.matcher(message);
+        if ( !matcher.matches() ) {
+            return null;
+        }
+        
+        return matcher.group(1);
+    }    
 }
diff --git a/src/main/java/org/apache/sling/tooling/lc/Main.java 
b/src/main/java/org/apache/sling/tooling/lc/Main.java
index 7b7837b..91da961 100644
--- a/src/main/java/org/apache/sling/tooling/lc/Main.java
+++ b/src/main/java/org/apache/sling/tooling/lc/Main.java
@@ -16,26 +16,6 @@
  */
 package org.apache.sling.tooling.lc;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.nio.file.Files;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
-import org.apache.sling.maven.projectsupport.BundleListUtils;
-import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.Bundle;
-import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.BundleList;
-import org.apache.sling.provisioning.model.Artifact;
-import org.apache.sling.provisioning.model.Model;
-import org.apache.sling.provisioning.model.ModelUtility;
-import org.apache.sling.provisioning.model.io.ModelReader;
-
-import com.google.common.collect.Sets;
-
 public class Main {
 
     public static void main(String[] args) throws Exception {
@@ -48,77 +28,9 @@ public class Main {
             secondVersion = args[1];
         }
         
-        System.out.format("Computing differences between Launchpad versions %s 
and %s...%n", 
-                firstVersion, secondVersion);
+        LaunchpadComparer comparer = new LaunchpadComparer(firstVersion, 
secondVersion);
+        comparer.run();
         
-        // 1. download artifacts
-        AetherSetup aether = new AetherSetup();
-
-        File fromFile = 
aether.download(Artifacts.launchpadCoordinates(firstVersion));
-        File toFile = 
aether.download(Artifacts.launchpadCoordinates(secondVersion));
 
-        // 2. parse artifact definitions
-        Model model;
-        try (BufferedReader reader = Files.newBufferedReader(toFile.toPath())) 
{
-            model = ModelUtility.getEffectiveModel(ModelReader.read(reader, 
null));
-        }
-        
-        // TODO - versions are not interpolated
-        Map<ArtifactKey, Artifact> to = model.getFeatures().stream()
-            .flatMap( f -> f.getRunModes().stream())
-            .flatMap( r -> r.getArtifactGroups().stream())
-            .flatMap( g -> StreamSupport.stream(g.spliterator(), false))
-            .collect(Collectors.toMap( a -> new ArtifactKey(a), 
Function.identity()));
-        
-        BundleList readBundleList = BundleListUtils.readBundleList(fromFile);
-        
-        // 3. generate added / removed / changed
-        Map<ArtifactKey, Artifact> from = 
readBundleList.getStartLevels().stream()
-            .flatMap( sl -> sl.getBundles().stream() )
-            .collect(Collectors.toMap( b -> new ArtifactKey(b), 
Main::newArtifact));
-        
-        Set<Artifact> removed = Sets.difference(from.keySet(), 
to.keySet()).stream()
-            .map( k -> from.get(k))
-            .collect(Collectors.toSet());
-
-        Set<Artifact> added = Sets.difference(to.keySet(), 
from.keySet()).stream()
-                .map( k -> to.get(k))
-                .collect(Collectors.toSet());
-
-        Map<ArtifactKey, VersionChange> changed = to.values().stream()
-                .filter( k -> !added.contains(k) && !removed.contains(k))
-                .map( k -> new ArtifactKey(k))
-                .filter( k -> !Objects.equals(to.get(k).getVersion(), 
from.get(k).getVersion()))
-                .collect(Collectors.toMap( Function.identity(), k -> new 
VersionChange(from.get(k).getVersion(), to.get(k).getVersion())));
-
-        // 4. output changes
-        
-        System.out.println("Added ");
-        added.stream().sorted().forEach(Main::outputFormatted);
-        
-        System.out.println("Removed ");
-        removed.stream().sorted().forEach(Main::outputFormatted);
-        
-        System.out.println("Changed");
-        changed.entrySet().stream()
-            .sorted( (a, b) -> a.getKey().compareTo(b.getKey()) )
-            .forEach(Main::outputFormatted);
-    }
-
-    private static Artifact newArtifact(Bundle bundle) {
-        
-        return new Artifact(bundle.getGroupId(), bundle.getArtifactId(), 
bundle.getVersion(), bundle.getClassifier(), bundle.getType());
-    }
-    
-    private static void outputFormatted(Artifact a) {
-        
-        System.out.format("    %-30s : %-55s : %s%n", a.getGroupId(), 
a.getArtifactId(), a.getVersion());
-        
-    }
-
-    private static void outputFormatted(Map.Entry<ArtifactKey, VersionChange> 
e) {
-        
-        System.out.format("    %-30s : %-55s : %s -> %s%n", 
e.getKey().getGroupId(), e.getKey().getArtifactId(), e.getValue().getFrom(), 
e.getValue().getTo());
-        
     }
 }
diff --git a/src/main/java/org/apache/sling/tooling/lc/AetherSetup.java 
b/src/main/java/org/apache/sling/tooling/lc/aether/AetherSetup.java
similarity index 97%
rename from src/main/java/org/apache/sling/tooling/lc/AetherSetup.java
rename to src/main/java/org/apache/sling/tooling/lc/aether/AetherSetup.java
index d529f3e..8d4679b 100644
--- a/src/main/java/org/apache/sling/tooling/lc/AetherSetup.java
+++ b/src/main/java/org/apache/sling/tooling/lc/aether/AetherSetup.java
@@ -14,7 +14,7 @@
  * License for the specific language governing permissions and limitations 
under
  * the License.
  */
-package org.apache.sling.tooling.lc;
+package org.apache.sling.tooling.lc.aether;
 
 import java.io.File;
 import java.util.Arrays;
@@ -36,7 +36,7 @@ import 
org.eclipse.aether.spi.connector.transport.TransporterFactory;
 import org.eclipse.aether.transport.file.FileTransporterFactory;
 import org.eclipse.aether.transport.http.HttpTransporterFactory;
 
-class AetherSetup {
+public class AetherSetup {
     
     private final List<RemoteRepository> repos = Arrays.asList(
         new RemoteRepository.Builder("central", "default", 
"http://central.maven.org/maven2/";).build(),
diff --git a/src/main/java/org/apache/sling/tooling/lc/ArtifactKey.java 
b/src/main/java/org/apache/sling/tooling/lc/aether/ArtifactKey.java
similarity index 96%
rename from src/main/java/org/apache/sling/tooling/lc/ArtifactKey.java
rename to src/main/java/org/apache/sling/tooling/lc/aether/ArtifactKey.java
index 047a1d2..112e10a 100644
--- a/src/main/java/org/apache/sling/tooling/lc/ArtifactKey.java
+++ b/src/main/java/org/apache/sling/tooling/lc/aether/ArtifactKey.java
@@ -14,14 +14,14 @@
  * License for the specific language governing permissions and limitations 
under
  * the License.
  */
-package org.apache.sling.tooling.lc;
+package org.apache.sling.tooling.lc.aether;
 
 import java.util.Objects;
 
 import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.Bundle;
 import org.apache.sling.provisioning.model.Artifact;
 
-class ArtifactKey implements Comparable<ArtifactKey> {
+public class ArtifactKey implements Comparable<ArtifactKey> {
     
     private String groupId;
     private String artifactId;
diff --git a/src/main/java/org/apache/sling/tooling/lc/Artifacts.java 
b/src/main/java/org/apache/sling/tooling/lc/aether/Artifacts.java
similarity index 96%
rename from src/main/java/org/apache/sling/tooling/lc/Artifacts.java
rename to src/main/java/org/apache/sling/tooling/lc/aether/Artifacts.java
index 0ffc42a..8bbed53 100644
--- a/src/main/java/org/apache/sling/tooling/lc/Artifacts.java
+++ b/src/main/java/org/apache/sling/tooling/lc/aether/Artifacts.java
@@ -14,12 +14,12 @@
  * License for the specific language governing permissions and limitations 
under
  * the License.
  */
-package org.apache.sling.tooling.lc;
+package org.apache.sling.tooling.lc.aether;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-class Artifacts {
+public class Artifacts {
 
     private static final Pattern VERSION_NUMBER = 
Pattern.compile("^(\\d+)(-SNAPSHOT)?");
     
diff --git a/src/main/java/org/apache/sling/tooling/lc/VersionChange.java 
b/src/main/java/org/apache/sling/tooling/lc/aether/VersionChange.java
similarity index 94%
copy from src/main/java/org/apache/sling/tooling/lc/VersionChange.java
copy to src/main/java/org/apache/sling/tooling/lc/aether/VersionChange.java
index 7c69d0b..671ff2e 100644
--- a/src/main/java/org/apache/sling/tooling/lc/VersionChange.java
+++ b/src/main/java/org/apache/sling/tooling/lc/aether/VersionChange.java
@@ -14,9 +14,9 @@
  * License for the specific language governing permissions and limitations 
under
  * the License.
  */
-package org.apache.sling.tooling.lc;
+package org.apache.sling.tooling.lc.aether;
 
-class VersionChange {
+public class VersionChange {
     
     private String from;
     private String to;
diff --git a/src/main/java/org/apache/sling/tooling/lc/VersionChange.java 
b/src/main/java/org/apache/sling/tooling/lc/jira/Fields.java
similarity index 66%
copy from src/main/java/org/apache/sling/tooling/lc/VersionChange.java
copy to src/main/java/org/apache/sling/tooling/lc/jira/Fields.java
index 7c69d0b..2215d06 100644
--- a/src/main/java/org/apache/sling/tooling/lc/VersionChange.java
+++ b/src/main/java/org/apache/sling/tooling/lc/jira/Fields.java
@@ -14,28 +14,18 @@
  * License for the specific language governing permissions and limitations 
under
  * the License.
  */
-package org.apache.sling.tooling.lc;
+package org.apache.sling.tooling.lc.jira;
 
-class VersionChange {
+public class Fields {
     
-    private String from;
-    private String to;
-
-    public VersionChange(String from, String to) {
-        this.from = from;
-        this.to = to;
-    }
+    private final String summary;
     
-    public String getFrom() {
-        return from;
+    public Fields(String summary) {
+        this.summary = summary;
     }
-    
-    public String getTo() {
-        return to;
+
+    public String getSummary() {
+        return summary;
     }
     
-    @Override
-    public String toString() {
-        return "VersionChange [" +from + " -> " + to +"]";
-    }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/apache/sling/tooling/lc/jira/Issue.java 
b/src/main/java/org/apache/sling/tooling/lc/jira/Issue.java
new file mode 100644
index 0000000..12e54b1
--- /dev/null
+++ b/src/main/java/org/apache/sling/tooling/lc/jira/Issue.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+package org.apache.sling.tooling.lc.jira;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.inject.internal.util.Objects;
+
+public class Issue implements Comparable<Issue> {
+    
+    private static final Pattern KEY_PATTERN = 
Pattern.compile("^([A-Z]+)-(\\d+)$"); 
+
+    private final String key;
+    private final Fields fields;
+
+    public Issue(String key, Fields fields) {
+        this.key = key;
+        this.fields = fields;
+    }
+
+    public String getKey() {
+        return key;
+    }
+    
+    public Fields getFields() {
+        return fields;
+    }
+    
+    public String getSummary() {
+        return fields.getSummary();
+    }
+    
+    @Override
+    public String toString() {
+        return key + " - " + getSummary();
+    }
+
+    @Override
+    public int compareTo(Issue o) {
+        
+        Matcher ourMatcher = KEY_PATTERN.matcher(key);
+        Matcher theirMatcher = KEY_PATTERN.matcher(o.key);
+        
+        if ( !ourMatcher.matches()) {
+            throw new IllegalArgumentException("No match found for " + key);
+        }
+
+        if ( !theirMatcher.matches()) {
+            throw new IllegalArgumentException("No match found for " + o.key);
+        }
+        
+        String ourProject = ourMatcher.group(1);
+        String theirProject = theirMatcher.group(1);
+        
+        if ( !Objects.equal(ourProject, theirProject)) {
+            return ourProject.compareTo(theirProject);
+        }
+        
+        int ourId = Integer.parseInt(ourMatcher.group(2));
+        int theirId = Integer.parseInt(theirMatcher.group(2));
+
+        return Integer.valueOf(ourId).compareTo(theirId);
+    }
+}
diff --git a/src/main/java/org/apache/sling/tooling/lc/jira/IssueFinder.java 
b/src/main/java/org/apache/sling/tooling/lc/jira/IssueFinder.java
new file mode 100644
index 0000000..69005b9
--- /dev/null
+++ b/src/main/java/org/apache/sling/tooling/lc/jira/IssueFinder.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+package org.apache.sling.tooling.lc.jira;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.utils.HttpClientUtils;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.DefaultHttpClient;
+
+import com.google.gson.Gson;
+
+public class IssueFinder {
+    
+    public static void main(String[] args) throws IOException {
+        
+        new IssueFinder().findIssues(Arrays.asList("SLING-1", "SLING-2"))
+            .stream()
+            .forEach(System.out::println);
+    }
+    
+    public List<Issue> findIssues(List<String> issueKeys) throws IOException{
+        
+        HttpClient client = new DefaultHttpClient();
+        
+        HttpGet get;
+        try {
+            URIBuilder builder = new 
URIBuilder("https://issues.apache.org/jira/rest/api/2/search";)
+                    .addParameter("jql", "key in (" + String.join(",", 
issueKeys) + ")")
+                    .addParameter("fields", "key,summary");
+            
+            get = new HttpGet(builder.build());
+        } catch (URISyntaxException e) {
+            // never happens
+            throw new RuntimeException(e);
+        }
+        
+        HttpResponse response = client.execute(get);
+        try {
+            if ( response.getStatusLine().getStatusCode() != 200 ) { 
+                throw new IOException("Search call returned status " + 
response.getStatusLine().getStatusCode());
+            }
+            
+            try ( Reader reader = new 
InputStreamReader(response.getEntity().getContent(), "UTF-8") ) {
+                Response apiResponse = new Gson().fromJson(reader, 
Response.class);
+                List<Issue> issues = apiResponse.getIssues();
+                Collections.sort(issues);
+                return issues;
+                
+            }
+        } finally {
+            HttpClientUtils.closeQuietly(client);
+        }
+        
+    }
+}
diff --git a/src/main/java/org/apache/sling/tooling/lc/VersionChange.java 
b/src/main/java/org/apache/sling/tooling/lc/jira/Response.java
similarity index 64%
rename from src/main/java/org/apache/sling/tooling/lc/VersionChange.java
rename to src/main/java/org/apache/sling/tooling/lc/jira/Response.java
index 7c69d0b..e77407f 100644
--- a/src/main/java/org/apache/sling/tooling/lc/VersionChange.java
+++ b/src/main/java/org/apache/sling/tooling/lc/jira/Response.java
@@ -14,28 +14,19 @@
  * License for the specific language governing permissions and limitations 
under
  * the License.
  */
-package org.apache.sling.tooling.lc;
+package org.apache.sling.tooling.lc.jira;
 
-class VersionChange {
-    
-    private String from;
-    private String to;
+import java.util.List;
 
-    public VersionChange(String from, String to) {
-        this.from = from;
-        this.to = to;
-    }
-    
-    public String getFrom() {
-        return from;
-    }
-    
-    public String getTo() {
-        return to;
+public class Response {
+
+    private final List<Issue> issues;
+
+    public Response(List<Issue> issues) {
+        this.issues = issues;
     }
-    
-    @Override
-    public String toString() {
-        return "VersionChange [" +from + " -> " + to +"]";
+
+    public List<Issue> getIssues() {
+        return issues;
     }
-}
\ No newline at end of file
+}
diff --git 
a/src/main/java/org/apache/sling/tooling/lc/svn/SvnChangeLogFinder.java 
b/src/main/java/org/apache/sling/tooling/lc/svn/SvnChangeLogFinder.java
new file mode 100644
index 0000000..dd1fc9c
--- /dev/null
+++ b/src/main/java/org/apache/sling/tooling/lc/svn/SvnChangeLogFinder.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+package org.apache.sling.tooling.lc.svn;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.wc.SVNClientManager;
+import org.tmatesoft.svn.core.wc.SVNRevision;
+
+public class SvnChangeLogFinder {
+    
+    private static final String SLING_SVN_REPO_BASE = 
"https://svn.apache.org/repos/asf/sling";;
+    
+    public static void main(String[] args) throws SVNException {
+        
+        new SvnChangeLogFinder().getChanges("org.apache.sling.adapter-2.1.2", 
"org.apache.sling.adapter-2.1.6")
+            .stream().forEach(System.out::println);
+    }
+    
+    public List<String> getChanges(String first, String second) throws 
SVNException {
+        
+        SVNURL svnUrl = SVNURL.parseURIEncoded(SLING_SVN_REPO_BASE);
+        
+        List<String> changes = new ArrayList<>();
+        
+        SVNClientManager manager  = SVNClientManager.newInstance();
+        
+        SVNRepository repo = 
manager.getRepositoryPool().createRepository(svnUrl, true);
+        
+        SVNRevision from = SVNRevision.create(getRevision(first, repo));
+        SVNRevision to = SVNRevision.create(getRevision(second, repo));
+        
+        repo.log(new String[] { "tags/" + second } ,from.getNumber(), 
to.getNumber(), false, false, (e) -> changes.add(e.getMessage()));
+        
+        return changes;
+    }
+
+
+    private long getRevision(String tagName, SVNRepository repo) throws 
SVNException {
+        
+        return repo.info("tags/" + tagName, -1).getRevision();
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/tooling/lc/ArtifactsTest.java 
b/src/test/java/org/apache/sling/tooling/lc/ArtifactsTest.java
index 9d41298..8b3b396 100644
--- a/src/test/java/org/apache/sling/tooling/lc/ArtifactsTest.java
+++ b/src/test/java/org/apache/sling/tooling/lc/ArtifactsTest.java
@@ -1,6 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
 package org.apache.sling.tooling.lc;
 
-import static org.apache.sling.tooling.lc.Artifacts.launchpadCoordinates;
+import static 
org.apache.sling.tooling.lc.aether.Artifacts.launchpadCoordinates;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertThat;
 

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to