aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/trygvis/esper/testing/jenkins
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/jenkins')
-rwxr-xr-xsrc/main/java/io/trygvis/esper/testing/jenkins/JenkinsClient.java69
-rw-r--r--src/main/java/io/trygvis/esper/testing/jenkins/JenkinsDao.java63
-rwxr-xr-xsrc/main/java/io/trygvis/esper/testing/jenkins/JenkinsImporter.java62
-rw-r--r--src/main/java/io/trygvis/esper/testing/jenkins/JenkinsServer2.java36
4 files changed, 194 insertions, 36 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsClient.java b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsClient.java
index e31fcfe..8276eaf 100755
--- a/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsClient.java
+++ b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsClient.java
@@ -3,31 +3,66 @@ package io.trygvis.esper.testing.jenkins;
import fj.*;
import fj.data.*;
import io.trygvis.esper.testing.*;
-import static io.trygvis.esper.testing.Util.*;
import io.trygvis.esper.testing.jenkins.JenkinsJobXml.*;
import io.trygvis.esper.testing.util.*;
-import static org.apache.commons.lang.StringUtils.*;
+import org.apache.abdera.*;
+import org.apache.abdera.model.*;
+import org.apache.abdera.parser.*;
+import org.codehaus.httpcache4j.*;
import org.codehaus.httpcache4j.cache.*;
+import org.jdom2.Document;
+import org.jdom2.Element;
import org.jdom2.*;
+import org.joda.time.DateTime;
+import javax.xml.stream.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.List;
-import javax.xml.stream.*;
+
+import static fj.data.Option.*;
+import static io.trygvis.esper.testing.Util.*;
+import static org.apache.commons.lang.StringUtils.*;
public class JenkinsClient {
private final XmlHttpClient xmlHttpClient;
+ private final HttpClient<List<JenkinsEntryXml>> jenkinsEntryXmlClient;
+ private final Parser parser;
- public JenkinsClient(HTTPCache http) {
+ public JenkinsClient(HTTPCache http, Abdera abdera) {
this.xmlHttpClient = new XmlHttpClient(http);
+ this.parser = abdera.getParser();
+
+ jenkinsEntryXmlClient = new HttpClient<>(http, new F<HTTPResponse, Option<List<JenkinsEntryXml>>>() {
+ public Option<List<JenkinsEntryXml>> f(HTTPResponse response) {
+ Feed feed = (Feed) parser.parse(response.getPayload().getInputStream()).getRoot();
+
+ List<JenkinsEntryXml> list = new ArrayList<>();
+
+ for (Entry entry : feed.getEntries()) {
+ try {
+ list.add(new JenkinsEntryXml(entry.getIdElement().getText(), new DateTime(entry.getPublished().getTime()), entry.getAlternateLinkResolvedHref().toURI()));
+ } catch (URISyntaxException ignore) {
+ }
+ }
+
+ return some(list);
+ }
+ });
+ }
+
+ public Option<List<JenkinsEntryXml>> fetchRss(URI uri) throws IOException {
+ return jenkinsEntryXmlClient.fetch(uri);
}
public JenkinsXml fetchJobs(URI uri) throws XMLStreamException, JDOMException, IOException {
Option<Document> d = xmlHttpClient.fetch(uri);
- if(d.isNone()) {
- return new JenkinsXml(Option.<String>none(), Option.<String>none(), Option.<String>none(), Collections.<JenkinsJobEntryXml>emptyList());
+ if (d.isNone()) {
+ Option<String> n = Option.none();
+
+ return new JenkinsXml(n, n, n, Collections.<JenkinsJobEntryXml>emptyList());
}
Element root = d.some().getRootElement();
@@ -54,7 +89,7 @@ public class JenkinsClient {
public Option<JenkinsJobXml> fetchJob(URI uri) throws IOException, JDOMException, XMLStreamException {
Option<Document> d = xmlHttpClient.fetch(uri);
- if(d.isNone()) {
+ if (d.isNone()) {
return Option.none();
}
@@ -64,9 +99,9 @@ public class JenkinsClient {
switch (name) {
case "freeStyleProject":
- return Option.some(JenkinsJobXml.parse(uri, JenkinsJobType.FREE_STYLE, root));
+ return some(JenkinsJobXml.parse(uri, JenkinsJobType.FREE_STYLE, root));
case "mavenModuleSet":
- return Option.some(JenkinsJobXml.parse(uri, JenkinsJobType.MAVEN, root));
+ return some(JenkinsJobXml.parse(uri, JenkinsJobType.MAVEN, root));
default:
System.out.println("Unknown project type: " + name);
return Option.none();
@@ -74,6 +109,18 @@ public class JenkinsClient {
}
}
+class JenkinsEntryXml {
+ public final String id;
+ public final DateTime timestamp;
+ public final URI uri;
+
+ JenkinsEntryXml(String id, DateTime timestamp, URI uri) {
+ this.id = id;
+ this.timestamp = timestamp;
+ this.uri = uri;
+ }
+}
+
class JenkinsXml {
public final Option<String> nodeName;
public final Option<String> nodeDescription;
@@ -145,11 +192,11 @@ class JenkinsJobXml {
Option<Integer> number = childText(element, "number").bind(Util.parseInt);
Option<URI> url = childText(element, "url").bind(Util.parseUri);
- if(number.isNone() || url.isNone()) {
+ if (number.isNone() || url.isNone()) {
return Option.none();
}
- return Option.some(new BuildXml(number.some(), url.some()));
+ return some(new BuildXml(number.some(), url.some()));
}
};
diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsDao.java b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsDao.java
new file mode 100644
index 0000000..757902a
--- /dev/null
+++ b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsDao.java
@@ -0,0 +1,63 @@
+package io.trygvis.esper.testing.jenkins;
+
+import java.net.URI;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+public class JenkinsDao {
+
+ private final Connection c;
+ private static final String JENKINS_SERVER = "uuid, url";
+
+ public JenkinsDao(Connection c) {
+ this.c = c;
+ }
+
+ public List<JenkinsServerDto> selectServer() throws SQLException {
+ try (PreparedStatement s = c.prepareStatement("SELECT " + JENKINS_SERVER + " FROM jenkins_server")) {
+ ResultSet rs = s.executeQuery();
+
+ List<JenkinsServerDto> servers = new ArrayList<>();
+ while (rs.next()) {
+ servers.add(jenkinsServer(rs));
+ }
+ return servers;
+ }
+
+ }
+
+ private JenkinsServerDto jenkinsServer(ResultSet rs) throws SQLException {
+ int i = 1;
+ return new JenkinsServerDto(UUID.fromString(rs.getString(i++)), URI.create(rs.getString(i)));
+ }
+}
+
+class JenkinsServerDto {
+ public final UUID uuid;
+ public final URI uri;
+
+ JenkinsServerDto(UUID uuid, URI uri) {
+ this.uuid = uuid;
+ this.uri = uri;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ JenkinsServerDto that = (JenkinsServerDto) o;
+
+ return uuid.equals(that.uuid);
+ }
+
+ @Override
+ public int hashCode() {
+ return uuid.hashCode();
+ }
+}
diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsImporter.java b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsImporter.java
index 6be720f..6fec157 100755
--- a/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsImporter.java
+++ b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsImporter.java
@@ -1,35 +1,35 @@
package io.trygvis.esper.testing.jenkins;
-import fj.*;
-import fj.data.*;
+import com.jolbox.bonecp.*;
import io.trygvis.esper.testing.*;
import io.trygvis.esper.testing.object.*;
import io.trygvis.esper.testing.util.*;
-import static java.lang.Thread.currentThread;
+import org.apache.abdera.*;
import org.codehaus.httpcache4j.cache.*;
-import org.joda.time.*;
-import java.net.URI;
-import java.util.HashSet;
+import java.sql.*;
+import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
+import static io.trygvis.esper.testing.object.ObjectUtil.*;
+import static java.lang.Thread.*;
+
public class JenkinsImporter {
public static void main(String[] args) throws Exception {
- Config config = Config.loadFromDisk();
-
+ final Config config = Config.loadFromDisk();
+ final BoneCPDataSource boneCp = config.createBoneCp();
HTTPCache httpCache = HttpClient.createHttpCache(config);
-
- final JenkinsClient jenkinsClient = new JenkinsClient(httpCache);
-
- HashSet<URI> servers = new HashSet<>();
- servers.add(URI.create("https://builds.apache.org"));
-
+ Abdera abdera = config.createAbdera();
+ final JenkinsClient jenkinsClient = new JenkinsClient(httpCache, abdera);
final ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor(5);
- ObjectManager<URI, JenkinsServer> serverManager = new ObjectManager<>("JenkinsServer", servers, new ObjectFactory<URI, JenkinsServer>() {
- public JenkinsServer create(URI uri) {
- return new JenkinsServer(executorService, jenkinsClient, uri);
+ HashSet<JenkinsServerDto> servers = new HashSet<>();
+
+ ObjectManager<JenkinsServerDto, ActorRef<JenkinsServer2>> serverManager = new ObjectManager<>("JenkinsServer", servers, new ObjectFactory<JenkinsServerDto, ActorRef<JenkinsServer2>>() {
+ public ActorRef<JenkinsServer2> create(JenkinsServerDto server) {
+ String name = "Jenkins: " + server.uri;
+ return threadedActor(name, config.jenkinsUpdateInterval, boneCp, name, new JenkinsServer2(jenkinsClient, server.uri));
}
});
@@ -37,17 +37,29 @@ public class JenkinsImporter {
config.addShutdownHook(currentThread(), shouldRun);
while (shouldRun.get()) {
- for (JenkinsServer server : serverManager.getObjects()) {
- Option<P2<JenkinsXml, LocalDateTime>> o = server.getJenkins();
-
- if (o.isSome()) {
- P2<JenkinsXml, LocalDateTime> p = o.some();
- System.out.println("Last update: " + p._2() + ", jobs=" + p._1().jobs.size());
- } else {
- System.out.println("Never updated: url=" + server.uri);
+ try {
+ java.util.List<JenkinsServerDto> newKeys;
+
+ try (Connection c = boneCp.getConnection()) {
+ newKeys = new JenkinsDao(c).selectServer();
}
+
+ serverManager.update(newKeys);
+ } catch (SQLException e) {
+ e.printStackTrace(System.out);
}
+// for (ActorRef<JenkinsServer2> server : serverManager.getObjects()) {
+// Option<P2<JenkinsXml, LocalDateTime>> o = server.underlying().getJenkins();
+//
+// if (o.isSome()) {
+// P2<JenkinsXml, LocalDateTime> p = o.some();
+// System.out.println("Last update: " + p._2() + ", jobs=" + p._1().jobs.size());
+// } else {
+// System.out.println("Never updated: url=" + server.uri);
+// }
+// }
+
synchronized (shouldRun) {
shouldRun.wait(1000);
}
diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsServer2.java b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsServer2.java
new file mode 100644
index 0000000..bad040c
--- /dev/null
+++ b/src/main/java/io/trygvis/esper/testing/jenkins/JenkinsServer2.java
@@ -0,0 +1,36 @@
+package io.trygvis.esper.testing.jenkins;
+
+import fj.data.*;
+import io.trygvis.esper.testing.object.*;
+
+import java.net.*;
+import java.sql.*;
+import java.util.List;
+
+public class JenkinsServer2 implements TransactionalActor {
+ private final JenkinsClient client;
+ public final URI uri;
+
+ public JenkinsServer2(JenkinsClient client, URI uri) {
+ this.client = client;
+ this.uri = uri;
+ }
+
+ public void act(Connection c) throws Exception {
+ System.out.println("polling " + uri);
+
+ Option<List<JenkinsEntryXml>> option = client.fetchRss(URI.create(uri.toASCIIString() + "/rssAll"));
+
+ if(option.isNone()) {
+ return;
+ }
+
+ List<JenkinsEntryXml> list = option.some();
+
+ System.out.println("Got " + list.size() + " entries.");
+
+ for (JenkinsEntryXml entry : list) {
+ System.out.println("entry.uri = " + entry.uri);
+ }
+ }
+}