diff options
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/jenkins')
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); + } + } +} |