diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2012-12-03 09:47:23 +0100 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2012-12-07 20:06:50 +0100 |
commit | 6d1dc3b1ca077312674ef05cd88ca5a7858bffd2 (patch) | |
tree | 921502006262163710391594c4e3843f4516d583 /src/main/java/io/trygvis/esper/testing/nexus/SearchNGResponseParser.java | |
parent | 041bab815c5c554169835993735b8e5c35d436ed (diff) | |
download | esper-testing-6d1dc3b1ca077312674ef05cd88ca5a7858bffd2.tar.gz esper-testing-6d1dc3b1ca077312674ef05cd88ca5a7858bffd2.tar.bz2 esper-testing-6d1dc3b1ca077312674ef05cd88ca5a7858bffd2.tar.xz esper-testing-6d1dc3b1ca077312674ef05cd88ca5a7858bffd2.zip |
o Renaming NexusParser to SearchNGResponseParser.
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/nexus/SearchNGResponseParser.java')
-rwxr-xr-x | src/main/java/io/trygvis/esper/testing/nexus/SearchNGResponseParser.java | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/nexus/SearchNGResponseParser.java b/src/main/java/io/trygvis/esper/testing/nexus/SearchNGResponseParser.java new file mode 100755 index 0000000..2a5515c --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/nexus/SearchNGResponseParser.java @@ -0,0 +1,162 @@ +package io.trygvis.esper.testing.nexus; + +import com.google.common.base.*; +import com.google.common.collect.*; +import fj.data.*; +import static fj.data.Option.*; +import static org.apache.commons.lang.StringUtils.*; +import org.dom4j.*; +import org.dom4j.io.*; + +import javax.xml.stream.*; +import java.io.*; +import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class SearchNGResponseParser { + public static final STAXEventReader xmlReader = new STAXEventReader(); + + public static ArtifactSearchResult parseDocument(InputStream is) throws XMLStreamException { + Document doc = xmlReader.readDocument(is); + + Option<Integer> totalCount = fromNull(trimToNull(doc.getRootElement().elementText("totalCount"))). + bind(Option.parseInt); + if (totalCount.isNone()) { + throw new RuntimeException("Could not find required element <totalCount>"); + } + + boolean tooManyResults = "true".equals(trimToNull(doc.getRootElement().elementText("tooManyResults"))); + + List<ArtifactXml> list = new ArrayList<>(); + for (Object o : doc.selectNodes("/searchNGResponse/data/artifact")) { + if (!(o instanceof Element)) { + continue; + } + + Element artifact = (Element) o; + + String groupId = trimToNull(artifact.elementText("groupId")); + String artifactId = trimToNull(artifact.elementText("artifactId")); + String version = trimToNull(artifact.elementText("version")); + + if (groupId == null || artifactId == null || version == null) { + continue; + } + + List<ArtifactHits> artifactHitsList = new ArrayList<>(); + + @SuppressWarnings("unchecked") List<Element> artifactHits = (List<Element>) artifact.selectNodes("artifactHits/artifactHit"); + for (Element artifactHit : artifactHits) { + String repositoryId = trimToNull(artifactHit.elementText("repositoryId")); + if (repositoryId == null) { + continue; + } + List<ArtifactFile> files = new ArrayList<>(); + + @SuppressWarnings("unchecked") List<Element> artifactLinks = artifactHit.selectNodes("artifactLinks/artifactLink"); + for (Element artifactLink : artifactLinks) { + Option<String> classifier = Option.fromString(trimToEmpty(artifactLink.elementText("classifier"))); + String extension = trimToNull(artifactLink.elementText("extension")); + + if (extension == null) { + continue; + } + + files.add(new ArtifactFile(classifier, extension)); + } + + artifactHitsList.add(new ArtifactHits(repositoryId, files)); + } + + list.add(new ArtifactXml(new ArtifactId(groupId, artifactId, version), artifactHitsList)); + } + + return new ArtifactSearchResult(totalCount.some(), tooManyResults, list); + } +} + +class ArtifactSearchResult { + public final int totalCount; + public final boolean tooManyResults; + public final List<ArtifactXml> artifacts; + + ArtifactSearchResult(int totalCount, boolean tooManyResults, List<ArtifactXml> artifacts) { + this.totalCount = totalCount; + this.tooManyResults = tooManyResults; + this.artifacts = artifacts; + } + + public ArtifactSearchResult append(ArtifactSearchResult result) { + List<ArtifactXml> list = Lists.newArrayList(artifacts); + list.addAll(result.artifacts); + return new ArtifactSearchResult(result.totalCount, result.tooManyResults, list); + } +} + +class ArtifactXml implements Comparable<ArtifactXml> { + public final ArtifactId id; + public final List<ArtifactHits> hits; + + ArtifactXml(ArtifactId id, List<ArtifactHits> hits) { + this.id = id; + this.hits = hits; + } + + public static Predicate<ArtifactXml> repositoryFilter(final String repositoryId) { + return new Predicate<ArtifactXml>() { + public boolean apply(ArtifactXml artifact) { + return Iterables.any(artifact.hits, new Predicate<ArtifactHits>() { + public boolean apply(ArtifactHits hits) { + return hits.repositoryId.equals(repositoryId); + } + }); + } + }; + } + + public Option<FlatArtifact> flatten(String repositoryId) { + for (ArtifactHits hit : hits) { + if (hit.repositoryId.equals(repositoryId)) { + return some(new FlatArtifact(id, hit.files)); + } + } + + return none(); + } + + public int compareTo(ArtifactXml o) { + return id.compareTo(o.id); + } + + public Set<String> repositories() { + Set<String> repositories = new HashSet<>(10); + + for (ArtifactHits hit : hits) { + repositories.add(hit.repositoryId); + } + + return repositories; + } +} + +class FlatArtifact { + public final ArtifactId id; + public final List<ArtifactFile> files; + + FlatArtifact(ArtifactId id, List<ArtifactFile> files) { + this.id = id; + this.files = files; + } +} + +class ArtifactHits { + public final String repositoryId; + public final List<ArtifactFile> files; + + ArtifactHits(String repositoryId, List<ArtifactFile> files) { + this.repositoryId = repositoryId; + this.files = files; + } +} |