From 1ed4ab57be1800b609f92a394fe4a0382636c780 Mon Sep 17 00:00:00 2001 From: Mateusz Warowny Date: Mon, 11 Apr 2022 18:12:42 +0200 Subject: [PATCH] JAL-3878 Create SlivkaAnnotationWSClient --- src/jalview/ws2/client/slivka/SlivkaWSClient.java | 66 ++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/src/jalview/ws2/client/slivka/SlivkaWSClient.java b/src/jalview/ws2/client/slivka/SlivkaWSClient.java index 16c9d3a..b32c188 100644 --- a/src/jalview/ws2/client/slivka/SlivkaWSClient.java +++ b/src/jalview/ws2/client/slivka/SlivkaWSClient.java @@ -6,14 +6,23 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; import java.util.EnumMap; import java.util.List; +import java.util.Map; import java.util.regex.Pattern; +import jalview.api.FeatureColourI; import jalview.bin.Cache; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; +import jalview.datamodel.features.FeatureMatcherSetI; +import jalview.io.AnnotationFile; import jalview.io.DataSourceType; +import jalview.io.FeaturesFile; import jalview.io.FileFormat; import jalview.io.FormatAdapter; import jalview.ws.params.ArgumentI; @@ -21,12 +30,15 @@ import jalview.ws2.api.Credentials; import jalview.ws2.api.JobStatus; import jalview.ws2.api.WebServiceJobHandle; import jalview.ws2.client.api.AlignmentWebServiceClientI; +import jalview.ws2.client.api.AnnotationWebServiceClientI; import jalview.ws2.client.api.WebServiceClientI; import uk.ac.dundee.compbio.slivkaclient.Job; import uk.ac.dundee.compbio.slivkaclient.Parameter; import uk.ac.dundee.compbio.slivkaclient.SlivkaClient; import uk.ac.dundee.compbio.slivkaclient.SlivkaService; +import static java.lang.String.format; + public class SlivkaWSClient implements WebServiceClientI { final SlivkaService service; @@ -52,7 +64,8 @@ public class SlivkaWSClient implements WebServiceClientI } // pattern for matching media types - static final Pattern mediaTypePattern = Pattern.compile("(?:text|application)\\/(?:x-)?(\\w+)"); + static final Pattern mediaTypePattern = Pattern.compile( + "(?:text|application)\\/(?:x-)?([\\w-]+)"); @Override public WebServiceJobHandle submit(List sequences, @@ -226,4 +239,53 @@ class SlivkaAlignmentWSClient extends SlivkaWSClient throw new IOException("no alignment found"); } -} \ No newline at end of file +} + +class SlivkaAnnotationWSClient extends SlivkaWSClient + implements AnnotationWebServiceClientI +{ + SlivkaAnnotationWSClient(SlivkaService service) + { + super(service); + } + + @Override + public List attachAnnotations(WebServiceJobHandle job, + List sequences, Map colours, + Map filters) throws IOException + { + var slivkaJob = client.getJob(job.getJobId()); + var aln = new Alignment(sequences.toArray(new SequenceI[sequences.size()])); + boolean featPresent = false, annotPresent = false; + for (var f : slivkaJob.getResults()) + { + // TODO: restrict file label to "annotations" or "features" + var match = mediaTypePattern.matcher(f.getMediaType()); + if (!match.find()) + continue; + String fmt = match.group(1); + if (fmt.equalsIgnoreCase("jalview-annotations")) + { + annotPresent = new AnnotationFile().readAnnotationFileWithCalcId( + aln, service.getId(), f.getContentUrl().toString(), + DataSourceType.URL); + if (annotPresent) + Cache.log.debug(format("loaded annotations for %s", service.getId())); + } + else if (fmt.equalsIgnoreCase("jalview-features")) + { + FeaturesFile ff = new FeaturesFile(f.getContentUrl().toString(), + DataSourceType.URL); + featPresent = ff.parse(aln, colours, true); + if (featPresent) + Cache.log.debug(format("loaded features for %s", service.getId())); + } + } + if (!annotPresent) + Cache.log.debug(format("no annotations found for %s", service.getId())); + if (!featPresent) + Cache.log.debug(format("no features found for %s", service.getId())); + return aln.getAlignmentAnnotation() != null ? Arrays.asList(aln.getAlignmentAnnotation()) + : Collections.emptyList(); + } +} -- 1.7.10.2