You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/17 12:29:43 UTC
[39/50] [abbrv] incubator-taverna-server git commit: Implementation
of a client for Taverna Server. Still experimental.
Implementation of a client for Taverna Server. Still experimental.
Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/commit/f769f201
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/tree/f769f201
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/diff/f769f201
Branch: refs/heads/master
Commit: f769f201c262282af4662cf645a411788304b80f
Parents: 72ca37b
Author: Donal Fellows <do...@manchester.ac.uk>
Authored: Fri Jun 27 14:17:31 2014 +0100
Committer: Donal Fellows <do...@manchester.ac.uk>
Committed: Fri Jun 27 14:17:31 2014 +0100
----------------------------------------------------------------------
pom.xml | 3 +-
server-client/pom.xml | 104 ++++
.../taverna/server/client/TavernaServer.java | 517 +++++++++++++++++
.../org/taverna/server/client/package-info.java | 5 +
server-client/src/main/wadl/tavserv.wadl | 563 +++++++++++++++++++
5 files changed, 1191 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/f769f201/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 4bb31dc..10df511 100644
--- a/pom.xml
+++ b/pom.xml
@@ -540,10 +540,11 @@
<module>server-webapp</module>
<module>server-runinterface</module>
<module>server-worker</module>
- <module>server-distribution</module>
<module>server-unix-forker</module>
<module>server-usagerecord</module>
<module>server-port-description</module>
<module>server-rmidaemon</module>
+ <module>server-client</module>
+ <module>server-distribution</module>
</modules>
</project>
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/f769f201/server-client/pom.xml
----------------------------------------------------------------------
diff --git a/server-client/pom.xml b/server-client/pom.xml
new file mode 100644
index 0000000..93665f8
--- /dev/null
+++ b/server-client/pom.xml
@@ -0,0 +1,104 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>uk.org.taverna.server</groupId>
+ <artifactId>server</artifactId>
+ <version>2.5.5-SNAPSHOT</version>
+ </parent>
+ <artifactId>server-client</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jvnet.ws.wadl</groupId>
+ <artifactId>wadl-core</artifactId>
+ <version>1.1.6</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-client</artifactId>
+ <version>1.8</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.4</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tika</groupId>
+ <artifactId>tika-core</artifactId>
+ <version>1.5</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.jvnet.ws.wadl</groupId>
+ <artifactId>wadl-client-plugin</artifactId>
+ <version>1.1.6</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <packageName>org.taverna.server.client.wadl</packageName>
+ <includes>*.wadl</includes>
+ <customClassNames>
+ <property>
+ <name>http://example.com/taverna/rest</name>
+ <value>TavernaServer</value>
+ </property>
+ </customClassNames>
+ </configuration>
+ </plugin>
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <!--This plugin's configuration is used to store Eclipse m2e settings
+ only. It has no influence on the Maven build itself. -->
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>
+ org.jvnet.ws.wadl
+ </groupId>
+ <artifactId>
+ wadl-client-plugin
+ </artifactId>
+ <versionRange>
+ [1.1.6,)
+ </versionRange>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <execute />
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/f769f201/server-client/src/main/java/uk/org/taverna/server/client/TavernaServer.java
----------------------------------------------------------------------
diff --git a/server-client/src/main/java/uk/org/taverna/server/client/TavernaServer.java b/server-client/src/main/java/uk/org/taverna/server/client/TavernaServer.java
new file mode 100644
index 0000000..5a66256
--- /dev/null
+++ b/server-client/src/main/java/uk/org/taverna/server/client/TavernaServer.java
@@ -0,0 +1,517 @@
+package uk.org.taverna.server.client;
+
+import static java.io.File.createTempFile;
+import static java.nio.file.Files.readAllBytes;
+import static javax.ws.rs.client.Entity.entity;
+import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE;
+import static org.apache.commons.io.IOUtils.copy;
+import static org.apache.tika.mime.MimeTypes.getDefaultMimeTypes;
+import static org.joda.time.format.ISODateTimeFormat.dateTime;
+import static org.joda.time.format.ISODateTimeFormat.dateTimeParser;
+import static org.taverna.server.client.wadl.TavernaServer.createClient;
+import static org.taverna.server.client.wadl.TavernaServer.root;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.zip.ZipFile;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.tika.mime.MimeTypeException;
+import org.joda.time.DateTime;
+import org.taverna.server.client.wadl.TavernaServer.Root;
+import org.taverna.server.client.wadl.TavernaServer.Root.RunsRunName;
+import org.w3c.dom.Element;
+
+import uk.org.taverna.ns._2010.port.InputPort;
+import uk.org.taverna.ns._2010.port.OutputPort;
+import uk.org.taverna.ns._2010.xml.server.Capability;
+import uk.org.taverna.ns._2010.xml.server.DirectoryEntry;
+import uk.org.taverna.ns._2010.xml.server.DirectoryReference;
+import uk.org.taverna.ns._2010.xml.server.FileReference;
+import uk.org.taverna.ns._2010.xml.server.KeyPairCredential;
+import uk.org.taverna.ns._2010.xml.server.PasswordCredential;
+import uk.org.taverna.ns._2010.xml.server.TavernaRun;
+import uk.org.taverna.ns._2010.xml.server.VersionedElement;
+import uk.org.taverna.ns._2010.xml.server.rest.DirectoryContents;
+import uk.org.taverna.ns._2010.xml.server.rest.InputDescription;
+import uk.org.taverna.ns._2010.xml.server.rest.InputDescription.Value;
+import uk.org.taverna.ns._2010.xml.server.rest.MakeDirectory;
+import uk.org.taverna.ns._2010.xml.server.rest.UploadFile;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientHandlerException;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.UniformInterfaceException;
+import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
+
+public class TavernaServer {
+ private Root root;
+
+ /**
+ * States of a workflow run. They are {@link #Initialized Initialized},
+ * {@link #Operating Operating}, {@link #Stopped Stopped}, and
+ * {@link #Finished Finished}. Conceptually, there is also a
+ * <tt>Destroyed</tt> state, but the workflow run does not exist (and hence
+ * can't have its state queried or set) in that case.
+ *
+ * @author Donal Fellows
+ */
+ public static enum Status {
+ /**
+ * The workflow run has been created, but is not yet running. The run
+ * will need to be manually moved to {@link #Operating Operating} when
+ * ready.
+ */
+ Initialized,
+ /**
+ * The workflow run is going, reading input, generating output, etc.
+ * Will eventually either move automatically to {@link #Finished
+ * Finished} or can be moved manually to {@link #Stopped Stopped} (where
+ * supported).
+ */
+ Operating,
+ /**
+ * The workflow run is paused, and will need to be moved back to
+ * {@link #Operating Operating} manually.
+ */
+ Stopped,
+ /**
+ * The workflow run has ceased; data files will continue to exist until
+ * the run is destroyed (which may be manual or automatic).
+ */
+ Finished
+ }
+
+ public static enum Property {
+ STDOUT("stdout"), STDERR("stderr"), EXIT_CODE("exitcode"), READY_TO_NOTIFY(
+ "readyToNotify"), EMAIL("notificationAddress"), USAGE(
+ "usageRecord");
+
+ private String s;
+
+ private Property(String s) {
+ this.s = s;
+ }
+
+ @Override
+ public String toString() {
+ return s;
+ }
+ }
+
+ public class Run {
+ private RunsRunName run;
+
+ Run(String value) {
+ run = root.runsRunName(value);
+ }
+
+ public String getName() {
+ return run.name().getAsTextPlain(String.class);
+ }
+
+ public void setName(String name) {
+ run.name().putTextPlain(name, String.class);
+ }
+
+ public Date getExpiry() {
+ return dateTimeParser().parseDateTime(
+ run.expiry().getAsTextPlain(String.class)).toDate();
+ }
+
+ public void setExpiry(Date expiryTimestamp) {
+ run.expiry().putTextPlain(
+ dateTime().print(new DateTime(expiryTimestamp)),
+ String.class);
+ }
+
+ public Date getCreate() {
+ String timestamp = run.createTime().getAsTextPlain(String.class);
+ if (timestamp == null || timestamp.trim().isEmpty())
+ return null;
+ return dateTimeParser().parseDateTime(timestamp).toDate();
+ }
+
+ public Date getStart() {
+ String timestamp = run.startTime().getAsTextPlain(String.class);
+ if (timestamp == null || timestamp.trim().isEmpty())
+ return null;
+ return dateTimeParser().parseDateTime(timestamp).toDate();
+ }
+
+ public Date getFinish() {
+ String timestamp = run.finishTime().getAsTextPlain(String.class);
+ if (timestamp == null || timestamp.trim().isEmpty())
+ return null;
+ return dateTimeParser().parseDateTime(timestamp).toDate();
+ }
+
+ public Status getStatus() {
+ return Status.valueOf(run.status().getAsTextPlain(String.class));
+ }
+
+ public void setStatus(Status status) {
+ run.status().putTextPlain(status, String.class);
+ }
+
+ public void start() {
+ setStatus(Status.Operating);
+ }
+
+ public void kill() {
+ setStatus(Status.Finished);
+ }
+
+ public boolean isRunning() {
+ return getStatus() == Status.Operating;
+ }
+
+ public String getStandardOutput() {
+ return run.stdout().getAsTextPlain(String.class);
+ }
+
+ public String getStandardError() {
+ return run.stderr().getAsTextPlain(String.class);
+ }
+
+ public String getLog() {
+ return run.log().getAsTextPlain(String.class);
+ }
+
+ public Integer getExitCode() {
+ String code = run.listeners().name("io")
+ .propertiesPropertyName("exitCode")
+ .getAsTextPlain(String.class);
+ if (code == null || code.trim().isEmpty())
+ return null;
+ return Integer.parseInt(code);
+ }
+
+ public String getProperty(Property prop) {
+ return run.listeners().name("io")
+ .propertiesPropertyName(prop.toString())
+ .getAsTextPlain(String.class);
+ }
+
+ public void setGenerateRunBundle(boolean generateRunBundle) {
+ run.generateProvenance().putTextPlain(generateRunBundle,
+ String.class);
+ }
+
+ public byte[] getRunBundle() {
+ return run.runBundle().getAsVndWf4everRobundleZip(byte[].class);
+ }
+
+ public List<InputPort> getInputs() {
+ return run.input().expected().getAsInputDescriptionXml().getInput();
+ }
+
+ public List<OutputPort> getOutputs() {
+ return run.output().getAsOutputDescriptionXml().getOutput();
+ }
+
+ public void setInput(String name, String value) {
+ Value v = new Value();
+ v.setValue(value);
+ InputDescription idesc = new InputDescription();
+ idesc.setValue(v);
+ run.input().inputName(name).putXmlAsInputDescription(idesc);
+ }
+
+ public void setInput(String name, String value, char listSeparator) {
+ Value v = new Value();
+ v.setValue(value);
+ InputDescription idesc = new InputDescription();
+ idesc.setValue(v);
+ idesc.setListDelimiter(new String(new char[] { listSeparator }));
+ run.input().inputName(name).putXmlAsInputDescription(idesc);
+ }
+
+ public byte[] getWorkflow() {
+ return run.workflow().getAsVndTavernaT2flowXml(byte[].class);
+ }
+
+ // TODO Consider better ways to do this
+ public Element getInteractionFeed() {
+ return run.interaction().getAsAtomXml(Element.class);
+ }
+
+ public Element getInteractionEntry(String id) {
+ return run.interaction().id(id).getAsAtomXml(Element.class);
+ }
+
+ public Element getUsageRecord() {
+ return run.usage().getAsXml(Element.class);
+ }
+
+ public Directory getWorkingDirectory() {
+ return new Directory();
+ }
+
+ public abstract class DirEntry {
+ final String path;
+
+ protected DirEntry(String path) {
+ this.path = path.replaceFirst("/+$", "");
+ }
+
+ public void delete() {
+ run.wd().path2(path).deleteAsXml(ClientResponse.class);
+ }
+
+ String path(ClientResponse response) {
+ String[] bits = response.getLocation().getPath().split("/");
+ return concat(bits[bits.length - 1]);
+ }
+
+ String localName() {
+ String[] bits = path.split("/");
+ return bits[bits.length - 1];
+ }
+
+ String concat(String name) {
+ return path + "/" + name.split("/", 2)[0];
+ }
+ }
+
+ public class Directory extends DirEntry {
+ Directory() {
+ super("");
+ }
+
+ Directory(String path) {
+ super(path);
+ }
+
+ public List<DirEntry> list() {
+ List<DirEntry> result = new ArrayList<>();
+ for (DirectoryEntry de : run.wd().path3(path)
+ .getAsXml(DirectoryContents.class).getDirOrFile())
+ if (de instanceof DirectoryReference)
+ result.add(new Directory(de.getValue()));
+ else if (de instanceof FileReference)
+ result.add(new File(de.getValue()));
+ return result;
+ }
+
+ public File createFile(String name, byte[] content) {
+ UploadFile uf = new UploadFile();
+ uf.setName(name);
+ uf.setValue(content);
+ return new File(path(run.wd().path(path)
+ .putAsXml(uf, ClientResponse.class)));
+ }
+
+ public File createFile(String name, java.io.File content) {
+ return new File(path(run
+ .wd()
+ .path(concat(name))
+ .putOctetStreamAsXml(
+ entity(content, APPLICATION_OCTET_STREAM_TYPE),
+ ClientResponse.class)));
+ }
+
+ public File createFile(String name, URI source) {
+ return new File(path(run
+ .wd()
+ .path(concat(name))
+ .postTextUriListAsXml(source.toString(),
+ ClientResponse.class)));
+ }
+
+ public Directory createDirectory(String name) {
+ MakeDirectory mkdir = new MakeDirectory();
+ mkdir.setName(name);
+ return new Directory(path(run.wd().path(path)
+ .putAsXml(mkdir, ClientResponse.class)));
+ }
+
+ public byte[] getZippedContents() {
+ return run.wd().path3(path).getAsZip(byte[].class);
+ }
+
+ public ZipFile getZip() throws IOException {
+ byte[] contents = getZippedContents();
+ java.io.File tmp = createTempFile(localName(), ".zip");
+ try (OutputStream os = new FileOutputStream(tmp)) {
+ os.write(contents);
+ }
+ return new ZipFile(tmp);
+ }
+ }
+
+ public class File extends DirEntry {
+ File(String path) {
+ super(path);
+ }
+
+ public InputStream getAsStream() {
+ return run.wd().path3(path).getAsOctetStream(InputStream.class);
+ }
+
+ public byte[] get() {
+ return run.wd().path3(path).getAsOctetStream(byte[].class);
+ }
+
+ public String get(Charset encoding) {
+ return new String(run.wd().path3(path)
+ .getAsOctetStream(byte[].class), encoding);
+ }
+
+ public java.io.File getAsFile() throws ClientHandlerException,
+ UniformInterfaceException, IOException, MimeTypeException {
+ ClientResponse cr = run.wd().path3(path)
+ .getAsOctetStream(ClientResponse.class);
+ String[] bits = localName().split("[.]");
+ String ext = getDefaultMimeTypes().forName(
+ cr.getHeaders().getFirst("Content-Type"))
+ .getExtension();
+ if (ext == null)
+ ext = bits[bits.length-1];
+ java.io.File tmp = createTempFile(bits[0], ext);
+ try (OutputStream os = new FileOutputStream(tmp);
+ InputStream is = cr.getEntity(InputStream.class)) {
+ copy(is, os);
+ }
+ return tmp;
+ }
+
+ public void setContents(byte[] newContents) {
+ run.wd().path(path)
+ .putOctetStreamAsXml(newContents, ClientResponse.class);
+ }
+
+ public void setContents(String newContents) {
+ run.wd().path(path)
+ .putOctetStreamAsXml(newContents, ClientResponse.class);
+ }
+
+ public void setContents(String newContents, Charset encoding) {
+ run.wd()
+ .path(path)
+ .putOctetStreamAsXml(newContents.getBytes(encoding),
+ ClientResponse.class);
+ }
+
+ public void setContents(InputStream newContents) {
+ run.wd().path(path)
+ .putOctetStreamAsXml(newContents, ClientResponse.class);
+ }
+
+ public void setContents(java.io.File newContents)
+ throws IOException {
+ run.wd()
+ .path(path)
+ .putOctetStreamAsXml(
+ entity(newContents,
+ APPLICATION_OCTET_STREAM_TYPE),
+ ClientResponse.class);
+ }
+ }
+
+ public String getOwner() {
+ return run.security().owner().getAsTextPlain(String.class);
+ }
+
+ // TODO permissions
+
+ public void grantPasswordCredential(URI contextService,
+ String username, String password) {
+ PasswordCredential pc = new PasswordCredential();
+ pc.setServiceURI(contextService.toString());
+ pc.setUsername(username);
+ pc.setPassword(password);
+ run.security().credentials()
+ .postXmlAsOctetStream(pc, ClientResponse.class);
+ }
+
+ public void grantKeyCredential(URI contextService, java.io.File source,
+ String unlockPassword, String aliasEntry) throws IOException {
+ KeyPairCredential kpc = new KeyPairCredential();
+ kpc.setServiceURI(contextService.toString());
+ try (InputStream in = new FileInputStream(source)) {
+ byte[] buffer = new byte[(int) source.length()];
+ IOUtils.read(in, buffer);
+ kpc.setCredentialBytes(buffer);
+ }
+ if (source.getName().endsWith(".p12"))
+ kpc.setFileType("PKCS12");
+ else
+ kpc.setFileType("JKS");
+ kpc.setCredentialName(aliasEntry);
+ kpc.setUnlockPassword(unlockPassword);
+ run.security().credentials()
+ .postXmlAsOctetStream(kpc, ClientResponse.class);
+ }
+ }
+
+ public TavernaServer(URI serviceRoot) {
+ root = root(createClient(), serviceRoot);
+ }
+
+ public TavernaServer(URI serviceRoot, String username, String password) {
+ Client client = createClient();
+ client.addFilter(new HTTPBasicAuthFilter(username, password));
+ root = root(client, serviceRoot);
+ }
+
+ public List<Capability> getCapabilities() {
+ return root.policy().capabilities().getAsCapabilitiesXml()
+ .getCapability();
+ }
+
+ public int getRunLimit() {
+ return root.policy().runLimit().getAsTextPlain(Integer.class);
+ }
+
+ public int getOperatingLimit() {
+ return root.policy().operatingLimit().getAsTextPlain(Integer.class);
+ }
+
+ public List<String> getPermittedWorkflows() {
+ return root.policy().permittedWorkflows().getAsPermittedWorkflowsXml()
+ .getWorkflow();
+ }
+
+ public List<Run> getExistingRuns() {
+ List<Run> runs = new ArrayList<>();
+ for (TavernaRun run : root.runs().getAsRunListXml().getRun())
+ runs.add(new Run(run.getValue()));
+ return runs;
+ }
+
+ public VersionedElement getServerVersionInfo() {
+ return root.getAsServerDescriptionXml();
+ }
+
+ private Run response2run(ClientResponse response) {
+ if (response.getClientResponseStatus().getStatusCode() == 201) {
+ String[] path = response.getLocation().getPath().split("/");
+ return new Run(path[path.length - 1]);
+ }
+ return null;
+ }
+
+ public Run createWorkflowRun(byte[] t2flowBytes) {
+ return response2run(root.runs().postVndTavernaT2flowXmlAsOctetStream(
+ t2flowBytes, ClientResponse.class));
+ }
+
+ public Run createWorkflowRun(File t2flowFile) throws IOException {
+ return createWorkflowRun(readAllBytes(t2flowFile.toPath()));
+ }
+
+ public Run createWorkflowRun(URI t2flowUri) {
+ return response2run(root.runs().postTextUriListAsOctetStream(
+ t2flowUri.toString(), ClientResponse.class));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/f769f201/server-client/src/main/java/uk/org/taverna/server/client/package-info.java
----------------------------------------------------------------------
diff --git a/server-client/src/main/java/uk/org/taverna/server/client/package-info.java b/server-client/src/main/java/uk/org/taverna/server/client/package-info.java
new file mode 100644
index 0000000..59e809d
--- /dev/null
+++ b/server-client/src/main/java/uk/org/taverna/server/client/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * Implementation of a basic client for Taverna Server.
+ * @author Donal Fellows
+ */
+package uk.org.taverna.server.client;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/f769f201/server-client/src/main/wadl/tavserv.wadl
----------------------------------------------------------------------
diff --git a/server-client/src/main/wadl/tavserv.wadl b/server-client/src/main/wadl/tavserv.wadl
new file mode 100644
index 0000000..564864f
--- /dev/null
+++ b/server-client/src/main/wadl/tavserv.wadl
@@ -0,0 +1,563 @@
+<application xmlns="http://wadl.dev.java.net/2009/02" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:prefix1="http://ns.taverna.org.uk/2010/xml/server/rest/" xmlns:prefix3="http://ns.taverna.org.uk/2010/xml/server/" xmlns:prefix10="http://ns.taverna.org.uk/2010/port/"><grammars><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:admin="http://ns.taverna.org.uk/2010/xml/server/admin/" xmlns:feed="http://ns.taverna.org.uk/2010/xml/server/feed/" xmlns:port="http://ns.taverna.org.uk/2010/port/" xmlns:tns="http://ns.taverna.org.uk/2010/xml/server/rest/" xmlns:ts="http://ns.taverna.org.uk/2010/xml/server/" xmlns:ts-rest="http://ns.taverna.org.uk/2010/xml/server/rest/" xmlns:ts-soap="http://ns.taverna.org.uk/2010/xml/server/soap/" xmlns:xlink="http://www.w3.org/1999/xlink" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://ns.taverna.org.uk/2010/xml/server/rest/">
+ <xs:import namespace="http://ns.taverna.org.uk/2010/xml/server/"/>
+ <xs:import namespace="http://www.w3.org/1999/xlink"/>
+ <xs:element name="capabilities">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="capability" type="ts:Capability"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="credential" type="ts-rest:Credential"/>
+ <xs:element name="credentials" type="ts-rest:credentialList"/>
+ <xs:element name="directoryContents" type="ts-rest:DirectoryContents"/>
+ <xs:element name="enabledNotificationFabrics">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="notifier" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="filesystemOperation" type="ts-rest:FilesystemCreationOperation"/>
+ <xs:element name="listenerDefinition" type="ts-rest:ListenerDefinition"/>
+ <xs:element name="listenerDescription" type="ts-rest:ListenerDescription"/>
+ <xs:element name="listeners">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="listener" type="ts-rest:ListenerDescription"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="mkdir" type="ts-rest:MakeDirectory"/>
+ <xs:element name="permissionUpdate" type="ts-rest:permissionDescription"/>
+ <xs:element name="permissionsDescriptor" type="ts-rest:permissionsDescription"/>
+ <xs:element name="permittedListeners">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="type" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="permittedWorkflows">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="workflow" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="policyDescription">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="runLimit" type="ts:Location"/>
+ <xs:element minOccurs="0" name="operatingLimit" type="ts:Location"/>
+ <xs:element minOccurs="0" name="permittedWorkflows" type="ts:Location"/>
+ <xs:element minOccurs="0" name="permittedListenerTypes" type="ts:Location"/>
+ <xs:element minOccurs="0" name="enabledNotificationFabrics" type="ts:Location"/>
+ <xs:element minOccurs="0" name="capabilities" type="ts:Location"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="properties">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="property" type="ts-rest:PropertyDescription"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="runDescription">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="expiry">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xlink:href"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element minOccurs="0" name="creationWorkflow" type="ts:Location"/>
+ <xs:element minOccurs="0" name="createTime" type="ts:Location"/>
+ <xs:element minOccurs="0" name="startTime" type="ts:Location"/>
+ <xs:element minOccurs="0" name="finishTime" type="ts:Location"/>
+ <xs:element minOccurs="0" name="status" type="ts:Location"/>
+ <xs:element minOccurs="0" name="workingDirectory" type="ts:Location"/>
+ <xs:element minOccurs="0" name="inputs" type="ts:Location"/>
+ <xs:element minOccurs="0" name="output" type="ts:Location"/>
+ <xs:element minOccurs="0" name="securityContext" type="ts:Location"/>
+ <xs:element minOccurs="0" name="listeners">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ts:Location">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="listener" nillable="true" type="ts:Location"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element minOccurs="0" name="interaction" type="ts:Location"/>
+ <xs:element minOccurs="0" name="name" type="ts:Location"/>
+ <xs:element minOccurs="0" name="stdout" type="ts:Location"/>
+ <xs:element minOccurs="0" name="stderr" type="ts:Location"/>
+ <xs:element minOccurs="0" name="usage" type="ts:Location"/>
+ <xs:element minOccurs="0" name="log" type="ts:Location"/>
+ <xs:element minOccurs="0" name="run-bundle" type="ts:Location"/>
+ <xs:element minOccurs="0" name="generate-provenance" type="ts:Location"/>
+ </xs:sequence>
+ <xs:attribute ref="ts-rest:owner"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="runInput" type="ts-rest:InputDescription"/>
+ <xs:element name="runInputs" type="ts-rest:TavernaRunInputs"/>
+ <xs:element name="runList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="run" type="ts:TavernaRun"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="securityDescriptor" type="ts-rest:SecurityDescriptor"/>
+ <xs:element name="serverDescription">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="runs" type="ts:Location"/>
+ <xs:element minOccurs="0" name="policy" type="ts:Location"/>
+ <xs:element minOccurs="0" name="feed" type="ts:Location"/>
+ <xs:element minOccurs="0" name="interactionFeed" type="ts:Location"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="trustedIdentities" type="ts-rest:trustList"/>
+ <xs:element name="upload" type="ts-rest:UploadFile"/>
+ <xs:element name="userPermission" type="ts-rest:linkedPermissionDescription"/>
+ <xs:complexType name="InputDescription">
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:choice minOccurs="0">
+ <xs:element name="file">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="ts-rest:InputContents"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="reference">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="ts-rest:InputContents"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="value">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="ts-rest:InputContents"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute ref="ts-rest:name"/>
+ <xs:attribute ref="ts-rest:descriptorRef"/>
+ <xs:attribute ref="ts-rest:listDelimiter"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:simpleType name="InputContents">
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ <xs:complexType name="ListenerDescription">
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="configuration" type="ts:Location"/>
+ <xs:element minOccurs="0" name="properties">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="property" type="ts-rest:PropertyDescription"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute ref="xlink:href"/>
+ <xs:attribute ref="ts-rest:name"/>
+ <xs:attribute ref="ts-rest:type"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="PropertyDescription">
+ <xs:complexContent>
+ <xs:extension base="ts:Location">
+ <xs:sequence/>
+ <xs:attribute ref="ts-rest:name"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="TavernaRunInputs">
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="expected" type="ts:Location"/>
+ <xs:element minOccurs="0" name="baclava" type="ts:Location"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="input" nillable="true" type="ts:Location"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType final="extension restriction" name="Credential">
+ <xs:choice>
+ <xs:element ref="ts:keypair"/>
+ <xs:element ref="ts:userpass"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="DirectoryContents">
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded" minOccurs="0">
+ <xs:element ref="ts:dir"/>
+ <xs:element ref="ts:file"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="FilesystemCreationOperation">
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary">
+ <xs:attribute ref="ts-rest:name"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="MakeDirectory">
+ <xs:simpleContent>
+ <xs:extension base="ts-rest:FilesystemCreationOperation"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="UploadFile">
+ <xs:simpleContent>
+ <xs:extension base="ts-rest:FilesystemCreationOperation"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="permissionsDescription">
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="permission" type="ts-rest:linkedPermissionDescription"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="linkedPermissionDescription">
+ <xs:complexContent>
+ <xs:extension base="ts:Location">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="userName" type="xs:string"/>
+ <xs:element minOccurs="0" name="permission" type="ts:Permission"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType final="extension restriction" name="trustList">
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="trust" type="ts:TrustDescriptor"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="permissionDescription">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="userName" type="xs:string"/>
+ <xs:element minOccurs="0" name="permission" type="ts:Permission"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType final="extension restriction" name="SecurityDescriptor">
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="owner" type="xs:string"/>
+ <xs:element minOccurs="0" name="permissions" type="ts:Location"/>
+ <xs:element minOccurs="0" name="credentials" type="ts-rest:CredentialCollection"/>
+ <xs:element minOccurs="0" name="trusts" type="ts-rest:TrustCollection"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType final="extension restriction" name="CredentialCollection">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" ref="ts-rest:credential"/>
+ </xs:sequence>
+ <xs:attribute ref="xlink:href"/>
+ </xs:complexType>
+ <xs:complexType final="extension restriction" name="TrustCollection">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="trust" type="ts:TrustDescriptor"/>
+ </xs:sequence>
+ <xs:attribute ref="xlink:href"/>
+ </xs:complexType>
+ <xs:complexType final="extension restriction" name="credentialList">
+ <xs:complexContent>
+ <xs:extension base="ts:VersionedElement">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" ref="ts-rest:credential"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="ListenerDefinition">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="ts-rest:type"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:attribute name="descriptorRef" type="xs:anyURI"/>
+ <xs:attribute name="listDelimiter" type="xs:string"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="owner" type="xs:string"/>
+ <xs:attribute name="type" type="xs:string"/>
+</xs:schema>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/1999/xlink" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://www.w3.org/1999/xlink">
+ <xs:attribute name="href" type="xs:string"/>
+</xs:schema>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:port="http://ns.taverna.org.uk/2010/port/" xmlns:run="http://ns.taverna.org.uk/2010/run/" xmlns:tns="http://ns.taverna.org.uk/2010/port/" xmlns:xlink="http://www.w3.org/1999/xlink" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://ns.taverna.org.uk/2010/port/">
+ <xs:import namespace="http://www.w3.org/1999/xlink"/>
+ <xs:element name="inputDescription" type="port:inputDescription"/>
+ <xs:element name="workflowOutputs" type="port:outputDescription"/>
+ <xs:complexType name="outputDescription">
+ <xs:complexContent>
+ <xs:extension base="port:PortDescription">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="output" type="port:OutputPort"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType abstract="true" name="PortDescription">
+ <xs:sequence/>
+ <xs:attribute ref="port:workflowId"/>
+ <xs:attribute ref="port:workflowRun"/>
+ <xs:attribute ref="port:workflowRunId"/>
+ </xs:complexType>
+ <xs:complexType name="OutputPort">
+ <xs:complexContent>
+ <xs:extension base="port:Port">
+ <xs:choice>
+ <xs:element name="value" type="port:LeafValue"/>
+ <xs:element name="list" type="port:ListValue"/>
+ <xs:element name="error" type="port:ErrorValue"/>
+ <xs:element name="absent" type="port:AbsentValue"/>
+ </xs:choice>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="Port">
+ <xs:sequence/>
+ <xs:attribute ref="port:name" use="required"/>
+ <xs:attribute ref="port:depth"/>
+ </xs:complexType>
+ <xs:complexType name="LeafValue">
+ <xs:complexContent>
+ <xs:extension base="port:Value">
+ <xs:sequence/>
+ <xs:attribute ref="port:contentFile"/>
+ <xs:attribute ref="port:contentType"/>
+ <xs:attribute ref="port:contentByteLength"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType abstract="true" name="Value">
+ <xs:sequence/>
+ <xs:attribute ref="xlink:href"/>
+ </xs:complexType>
+ <xs:complexType name="ErrorValue">
+ <xs:complexContent>
+ <xs:extension base="port:Value">
+ <xs:sequence/>
+ <xs:attribute ref="port:depth"/>
+ <xs:attribute ref="port:errorFile"/>
+ <xs:attribute ref="port:errorByteLength"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="ListValue">
+ <xs:complexContent>
+ <xs:extension base="port:Value">
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded" minOccurs="0">
+ <xs:element name="value" type="port:LeafValue"/>
+ <xs:element name="list" type="port:ListValue"/>
+ <xs:element name="error" type="port:ErrorValue"/>
+ <xs:element name="absent" type="port:AbsentValue"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute ref="port:length"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="AbsentValue">
+ <xs:complexContent>
+ <xs:extension base="port:Value">
+ <xs:sequence/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="inputDescription">
+ <xs:complexContent>
+ <xs:extension base="port:PortDescription">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="input" type="port:InputPort"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="InputPort">
+ <xs:complexContent>
+ <xs:extension base="port:Port">
+ <xs:sequence/>
+ <xs:attribute ref="xlink:href"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:attribute name="contentByteLength" type="xs:long"/>
+ <xs:attribute name="contentFile" type="xs:string"/>
+ <xs:attribute name="contentType" type="xs:string"/>
+ <xs:attribute name="depth" type="xs:int"/>
+ <xs:attribute name="errorByteLength" type="xs:long"/>
+ <xs:attribute name="errorFile" type="xs:string"/>
+ <xs:attribute name="length" type="xs:int"/>
+ <xs:attribute name="name" type="xs:ID"/>
+ <xs:attribute name="workflowId" type="xs:string"/>
+ <xs:attribute name="workflowRun" type="xs:anyURI"/>
+ <xs:attribute name="workflowRunId" type="xs:string"/>
+</xs:schema>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:admin="http://ns.taverna.org.uk/2010/xml/server/admin/" xmlns:feed="http://ns.taverna.org.uk/2010/xml/server/feed/" xmlns:tns="http://ns.taverna.org.uk/2010/xml/server/" xmlns:ts="http://ns.taverna.org.uk/2010/xml/server/" xmlns:ts-rest="http://ns.taverna.org.uk/2010/xml/server/rest/" xmlns:ts-soap="http://ns.taverna.org.uk/2010/xml/server/soap/" xmlns:xlink="http://www.w3.org/1999/xlink" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://ns.taverna.org.uk/2010/xml/server/">
+ <xs:import namespace="http://www.w3.org/1999/xlink"/>
+ <xs:element name="capability" type="ts:Capability"/>
+ <xs:element name="dir" type="ts:DirectoryReference"/>
+ <xs:element name="file" type="ts:FileReference"/>
+ <xs:element name="keypair" type="ts:KeyPairCredential"/>
+ <xs:element name="runReference" type="ts:TavernaRun"/>
+ <xs:element name="trustedIdentity" type="ts:TrustDescriptor"/>
+ <xs:element name="userpass" type="ts:PasswordCredential"/>
+ <xs:element name="workflow" type="ts:Workflow"/>
+ <xs:complexType abstract="true" name="VersionedElement">
+ <xs:sequence/>
+ <xs:attribute ref="ts:serverVersion"/>
+ <xs:attribute ref="ts:serverRevision"/>
+ <xs:attribute ref="ts:serverBuildTimestamp"/>
+ </xs:complexType>
+ <xs:complexType name="Location">
+ <xs:sequence/>
+ <xs:attribute ref="xlink:href"/>
+ </xs:complexType>
+ <xs:complexType name="Capability">
+ <xs:sequence/>
+ <xs:attribute ref="ts:capability"/>
+ <xs:attribute ref="ts:version"/>
+ </xs:complexType>
+ <xs:complexType name="KeyPairCredential">
+ <xs:complexContent>
+ <xs:extension base="ts:CredentialDescriptor">
+ <xs:sequence>
+ <xs:element name="credentialName" type="xs:string"/>
+ <xs:element minOccurs="0" name="credentialFile" type="xs:string"/>
+ <xs:element minOccurs="0" name="fileType" type="xs:string"/>
+ <xs:element minOccurs="0" name="unlockPassword" type="xs:string"/>
+ <xs:element minOccurs="0" name="credentialBytes" type="xs:base64Binary"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType abstract="true" name="CredentialDescriptor">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="serviceURI" type="xs:anyURI"/>
+ </xs:sequence>
+ <xs:attribute ref="xlink:href"/>
+ </xs:complexType>
+ <xs:complexType name="PasswordCredential">
+ <xs:complexContent>
+ <xs:extension base="ts:CredentialDescriptor">
+ <xs:sequence>
+ <xs:element name="username" type="xs:string"/>
+ <xs:element name="password" type="xs:string"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="DirectoryEntry">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xlink:href"/>
+ <xs:attribute ref="ts:name"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="DirectoryReference">
+ <xs:simpleContent>
+ <xs:extension base="ts:DirectoryEntry"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="FileReference">
+ <xs:simpleContent>
+ <xs:extension base="ts:DirectoryEntry"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="TavernaRun">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xlink:href"/>
+ <xs:attribute ref="ts:serverVersion"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="Workflow">
+ <xs:sequence>
+ <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType final="extension restriction" name="TrustDescriptor">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="certificateFile" type="xs:string"/>
+ <xs:element minOccurs="0" name="fileType" type="xs:string"/>
+ <xs:element minOccurs="0" name="certificateBytes" type="xs:base64Binary"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="serverName" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute ref="xlink:href"/>
+ </xs:complexType>
+ <xs:simpleType name="Permission">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="none"/>
+ <xs:enumeration value="read"/>
+ <xs:enumeration value="update"/>
+ <xs:enumeration value="destroy"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:attribute name="capability" type="xs:anyURI"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="serverBuildTimestamp" type="xs:string"/>
+ <xs:attribute name="serverRevision" type="xs:string"/>
+ <xs:attribute name="serverVersion" type="xs:string"/>
+ <xs:attribute name="version" type="xs:string"/>
+</xs:schema>
+</grammars><resources base="http://example.com/taverna/rest"><resource path="/"><method name="GET"><doc>Produces the description of the service.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:serverDescription"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the service.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><resource path="runs"><method name="GET"><doc>Produces a list of all runs visible to the user.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:runList"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the operations on the collection of runs.</doc><response><representation mediaType="application/octet-stream"><
/representation></response></method><method name="POST"><doc>Accepts (or not) a request to create a new run executing the given workflow.</doc><request><representation mediaType="application/vnd.taverna.t2flow+xml" element="prefix3:workflow"><doc>Accepts (or not) a request to create a new run executing the given workflow.</doc></representation><representation mediaType="application/xml" element="prefix3:workflow"><doc>Accepts (or not) a request to create a new run executing the given workflow.</doc></representation></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="POST"><doc>Accepts a URL to a workflow to download and run. The URL must be hosted on a publicly-accessible service.</doc><request><representation mediaType="text/uri-list"><doc>Accepts a URL to a workflow to download and run. The URL must be hosted on a publicly-accessible service.</doc></representation></request><response><representation mediaType=
"application/octet-stream"></representation></response></method></resource><resource path="/policy"><method name="GET"><doc>Describe the parts of this policy.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:policyDescription"></representation><representation mediaType="application/json"></representation></response></method><resource path="/capabilities"><method name="GET"><doc>Gets a description of the capabilities supported by this installation of Taverna Server.</doc><response><representation mediaType="application/xml" element="prefix1:capabilities"></representation><representation mediaType="application/json"></representation></response></method></resource><resource path="/enabledNotificationFabrics"><method name="GET"><doc>Gets the list of supported, enabled notification fabrics. Each corresponds (approximately) to a protocol, e.g., email.</doc><response><representation mediaType="application/xml" element="prefix1:enabledNotificati
onFabrics"></representation><representation mediaType="application/json"></representation></response></method></resource><resource path="/operatingLimit"><method name="GET"><doc>Gets the maximum number of simultaneously operating runs that the user may have. Note that this is often a global limit; it does not represent a promise that a particular user may be able to have that many operating runs at once.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:int"><doc>Gets the maximum number of simultaneously operating runs that the user may have. Note that this is often a global limit; it does not represent a promise that a particular user may be able to have that many operating runs at once.</doc></param></representation></response></method></resource><resource path="/permittedListenerTypes"><method name="GET"><doc>Gets the list of permitted event listener types.</doc><response><representation mediaType="application/xml" element="prefix1:
permittedListeners"></representation><representation mediaType="application/json"></representation></response></method></resource><resource path="/permittedWorkflows"><method name="GET"><doc>Gets the list of permitted workflows.</doc><response><representation mediaType="application/xml" element="prefix1:permittedWorkflows"></representation><representation mediaType="application/json"></representation></response></method></resource><resource path="/runLimit"><method name="GET"><doc>Gets the maximum number of simultaneous runs in any state that the user may create.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:int"><doc>Gets the maximum number of simultaneous runs in any state that the user may create.</doc></param></representation></response></method></resource></resource><resource path="/runs/{runName}"><doc>This represents how a Taverna Server workflow run looks to a RESTful API.</doc><param name="runName" style="template" type="x
s:string"/><method name="DELETE"><doc>Deletes a workflow run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="GET"><doc>Describes a workflow run.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:runDescription"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><resource path="/createTime"><method name="GET"><doc>Gives the time when the workflow run was first submitted to the server.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the time when the workflow run was first submitted to the server.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the d
escription of the run create time.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/expiry"><method name="GET"><doc>Gives the time when the workflow run becomes eligible for automatic deletion.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the time when the workflow run becomes eligible for automatic deletion.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run expiry.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Sets the time when the workflow run becomes eligible for automatic deletion.</doc><request><representation mediaType="text/plain"><param name="request" style="plain" type="xs:string"><doc>Sets the time when the workflow run becomes eligible for automatic deletion.</doc></param><
/representation></request><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Sets the time when the workflow run becomes eligible for automatic deletion.</doc></param></representation></response></method></resource><resource path="/finishTime"><method name="GET"><doc>Gives the time when the workflow run was first detected as finished, or an empty string if it has not yet finished (including if it has never started).</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the time when the workflow run was first detected as finished, or an empty string if it has not yet finished (including if it has never started).</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run finish time.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="
/generate-provenance"><method name="GET"><doc>Whether to create the run bundle for the workflow run.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:boolean"><doc>Whether to create the run bundle for the workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Whether to create the run bundle for the workflow run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Whether to create the run bundle for the workflow run.</doc><request><representation mediaType="text/plain"><param name="request" style="plain" type="xs:boolean"><doc>Whether to create the run bundle for the workflow run.</doc></param></representation></request><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:boolean"><doc>Whether to create the run bundle for the workflow run.</doc></param></representation></response></
method></resource><resource path="/log"><method name="GET"><doc>Return the log for the workflow run.</doc><response><representation mediaType="text/plain"></representation></response></method><method name="OPTIONS"><doc>Return the log for the workflow run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/name"><method name="GET"><doc>Gives the descriptive name of the workflow run.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the descriptive name of the workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of the operations on the run's descriptive name.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Set the descriptive name of the workflow run. Note that this value may be arbitraril
y truncated by the implementation.</doc><request><representation mediaType="text/plain"><param name="request" style="plain" type="xs:string"><doc>Set the descriptive name of the workflow run. Note that this value may be arbitrarily truncated by the implementation.</doc></param></representation></request><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Set the descriptive name of the workflow run. Note that this value may be arbitrarily truncated by the implementation.</doc></param></representation></response></method></resource><resource path="/output"><method name="GET"><doc>Gives the Baclava file where output will be written; empty means use multiple simple files in the out directory.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the Baclava file where output will be written; empty means use multiple simple files in the out directory.</doc></param></repre
sentation></response></method><method name="GET"><doc>Gives a description of the outputs, as currently understood</doc><request></request><response><representation mediaType="application/xml" element="prefix10:workflowOutputs"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run output.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Sets the Baclava file where output will be written; empty means use multiple simple files in the out directory.</doc><request><representation mediaType="text/plain"><param name="request" style="plain" type="xs:string"><doc>Sets the Baclava file where output will be written; empty means use multiple simple files in the out directory.</doc></param></representation></request><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:st
ring"><doc>Sets the Baclava file where output will be written; empty means use multiple simple files in the out directory.</doc></param></representation></response></method></resource><resource path="/run-bundle"><method name="GET"><doc>Return the run bundle for the workflow run.</doc><response><representation mediaType="application/vnd.wf4ever.robundle+zip"></representation></response></method><method name="OPTIONS"><doc>Return the run bundle for the workflow run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/startTime"><method name="GET"><doc>Gives the time when the workflow run was started, or an empty string if the run has not yet started.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the time when the workflow run was started, or an empty string if the run has not yet started.</doc></param></representation></response></met
hod><method name="OPTIONS"><doc>Produces the description of the run start time.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/status"><method name="GET"><doc>Gives the current status of the workflow run.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the current status of the workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run status.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Attempts to update the status of the workflow run.</doc><request><representation mediaType="text/plain"><param name="request" style="plain" type="xs:string"><doc>Attempts to update the status of the workflow run.</doc></param></representation></request><response><representation mediaType="text/pla
in"></representation></response></method></resource><resource path="/stderr"><method name="GET"><doc>Return the stderr for the workflow run.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Return the stderr for the workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Return the stderr for the workflow run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/stdout"><method name="GET"><doc>Return the stdout for the workflow run.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Return the stdout for the workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Return the stdout for the workflow run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resour
ce><resource path="/usage"><method name="GET"><doc>Return the usage record for the workflow run.</doc><response><representation mediaType="application/xml"></representation></response></method><method name="OPTIONS"><doc>Return the usage record for the workflow run.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/workflow"><method name="GET"><doc>Gives the workflow document used to create the workflow run.</doc><response><representation mediaType="application/vnd.taverna.t2flow+xml" element="prefix3:workflow"></representation><representation mediaType="application/xml" element="prefix3:workflow"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run workflow.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/inp
ut"><doc>This represents how a Taverna Server workflow run's inputs looks to a RESTful API.</doc><method name="GET"><doc>Describe the sub-URIs of this resource.</doc><response><representation mediaType="application/xml" element="prefix1:runInputs"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run's inputs' operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><resource path="/baclava"><method name="GET"><doc>Gives the Baclava file describing the inputs, or empty if individual files are used.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the Baclava file describing the inputs, or empty if individual files are used.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of the inp
uts' baclava operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Sets the Baclava file describing the inputs.</doc><request><representation mediaType="text/plain"><param name="request" style="plain" type="xs:string"><doc>Sets the Baclava file describing the inputs.</doc></param></representation></request><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Sets the Baclava file describing the inputs.</doc></param></representation></response></method></resource><resource path="/expected"><method name="GET"><doc>Describe the expected inputs of this workflow run.</doc><response><representation mediaType="application/xml" element="prefix10:inputDescription"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the expected inputs' operati
ons.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/input/{name}"><param name="name" style="template" type="xs:string"/><method name="GET"><doc>Gives a description of what is used to supply a particular input.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:runInput"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the one input's operations.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Sets the source for a particular input port.</doc><request><representation mediaType="application/xml" element="prefix1:runInput"><doc>Sets the source for a particular input port.</doc></representation><representation mediaType="application/json"><doc>Sets the
source for a particular input port.</doc></representation></request><response><representation mediaType="application/xml" element="prefix1:runInput"></representation><representation mediaType="application/json"></representation></response></method></resource></resource><resource path="/interaction"><method name="GET"><doc>Get the feed document for this ATOM feed.</doc><response><representation mediaType="application/atom+xml"></representation></response></method><method name="OPTIONS"><doc>Describes what HTTP operations are supported on the feed.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="POST"><doc>Adds an entry to this ATOM feed.</doc><request><representation mediaType="application/atom+xml"><doc>Adds an entry to this ATOM feed.</doc></representation></request><response><representation mediaType="application/atom+xml"></representation></response></method><resource path="/{id}"><param name="id" style="temp
late" type="xs:string"/><method name="DELETE"><doc>Deletes an entry from this ATOM feed.</doc><request></request><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Deletes an entry from this ATOM feed.</doc></param></representation></response></method><method name="GET"><doc>Get the entry with a particular ID within this ATOM feed.</doc><request></request><response><representation mediaType="application/atom+xml"></representation></response></method><method name="OPTIONS"><doc>Describes what HTTP operations are supported on an entry.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method></resource></resource><resource path="/listeners"><doc>This represents all the event listeners attached to a workflow run.</doc><method name="GET"><doc>Get the listeners installed in the workflow run.</doc><request></request><response><representation mediaType="application/xml"
element="prefix1:listeners"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run listeners' operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="POST"><doc>Add a new event listener to the named workflow run.</doc><request><representation mediaType="application/xml" element="prefix1:listenerDefinition"><doc>Add a new event listener to the named workflow run.</doc></representation><representation mediaType="application/json"><doc>Add a new event listener to the named workflow run.</doc></representation></request><response><representation mediaType="application/octet-stream"></representation></response></method><resource path="/{name}"><doc>This represents a single event listener attached to a workflow run.</doc><param name="name" style="template" type="xs:string"/><method name="GET"><doc>Get th
e description of this listener.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:listenerDescription"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run listener's operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><resource path="/configuration"><method name="GET"><doc>Get the configuration for the given event listener that is attached to a workflow run.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Get the configuration for the given event listener that is attached to a workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run listener's configuration's operations.</doc><response><representation mediaType="applica
tion/octet-stream"></representation></response></method></resource><resource path="/properties"><method name="GET"><doc>Get the list of properties supported by a given event listener attached to a workflow run.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:properties"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run listener's properties' operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/properties/{propertyName}"><doc>This represents a single property attached of an event listener.</doc><param name="propertyName" style="template" type="xs:string"/><method name="GET"><doc>Get the value of the particular property of an event listener attached to a workflow run.</doc><response><representation mediaType="text/plain"><param
name="result" style="plain" type="xs:string"><doc>Get the value of the particular property of an event listener attached to a workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run listener's property's operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Set the value of the particular property of an event listener attached to a workflow run.</doc><request><representation mediaType="text/plain"><param name="request" style="plain" type="xs:string"><doc>Set the value of the particular property of an event listener attached to a workflow run.</doc></param></representation></request><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Set the value of the particular property of an event listener attached to a workflow run.</doc></param></representation></response><
/method></resource></resource></resource><resource path="/security"><doc>Manages the security of the workflow run. In general, only the owner of a run may access this resource.</doc><method name="GET"><doc>Gives a description of the security information supported by the workflow run.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:securityDescriptor"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run security.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><resource path="/credentials"><method name="DELETE"><doc>Deletes all credentials.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="GET"><doc>Gives a list of credentials supplied to this workflow run.</doc><response><representation
mediaType="application/xml" element="prefix1:credentials"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run credentials' operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="POST"><doc>Creates a new credential.</doc><request><representation mediaType="application/xml" element="prefix1:credential"><doc>Creates a new credential.</doc></representation><representation mediaType="application/json"><doc>Creates a new credential.</doc></representation></request><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/credentials/{id}"><param name="id" style="template" type="xs:string"/><method name="DELETE"><doc>Deletes a particular credential.</doc><request></request><response><representation mediaType="application/octet-stre
am"></representation></response></method><method name="GET"><doc>Describes a particular credential.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:credential"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run credential's operations.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Updates a particular credential.</doc><request><representation mediaType="application/xml" element="prefix1:credential"><doc>Updates a particular credential.</doc></representation><representation mediaType="application/json"><doc>Updates a particular credential.</doc></representation></request><response><representation mediaType="application/xml" element="prefix1:credential"></representation><representation mediaType="application/json"></represe
ntation></response></method></resource><resource path="/owner"><method name="GET"><doc>Gives the identity of who owns the workflow run.</doc><response><representation mediaType="text/plain"><param name="result" style="plain" type="xs:string"><doc>Gives the identity of who owns the workflow run.</doc></param></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run owner.</doc><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/permissions"><method name="GET"><doc>Gives a list of all non-default permissions associated with the enclosing workflow run. By default, nobody has any access at all except for the owner of the run.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:permissionsDescriptor"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Pro
duces the description of the run permissions' operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="POST"><doc>Creates a new assignment of permissions to a particular user.</doc><request><representation mediaType="application/xml" element="prefix1:permissionUpdate"><doc>Creates a new assignment of permissions to a particular user.</doc></representation><representation mediaType="application/json"><doc>Creates a new assignment of permissions to a particular user.</doc></representation></request><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/permissions/{id}"><param name="id" style="template" type="xs:string"/><method name="DELETE"><doc>Deletes (by resetting to default) the permissions associated with a particular user.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></
response></method><method name="GET"><doc>Describes the permission granted to a particular user.</doc><request></request><response><representation mediaType="text/plain"></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run permission's operations.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Updates the permissions granted to a particular user.</doc><request><representation mediaType="text/plain"><doc>Updates the permissions granted to a particular user.</doc></representation></request><response><representation mediaType="text/plain"></representation></response></method></resource><resource path="/trusts"><method name="DELETE"><doc>Deletes all trusted identities.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="GET"><doc>Gives a list of trust
ed identities supplied to this workflow run.</doc><response><representation mediaType="application/xml" element="prefix1:trustedIdentities"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the run trusted certificates' operations.</doc><response><representation mediaType="application/octet-stream"></representation></response></method><method name="POST"><doc>Adds a new trusted identity.</doc><request><representation mediaType="application/xml" element="prefix3:trustedIdentity"><doc>Adds a new trusted identity.</doc></representation><representation mediaType="application/json"><doc>Adds a new trusted identity.</doc></representation></request><response><representation mediaType="application/octet-stream"></representation></response></method></resource><resource path="/trusts/{id}"><param name="id" style="template" type="xs:string"/><method name="DELETE"><doc>Deletes a particu
lar trusted identity.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="GET"><doc>Describes a particular trusted identity.</doc><request></request><response><representation mediaType="application/xml" element="prefix3:trustedIdentity"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of one run trusted certificate's operations.</doc><request></request><response><representation mediaType="application/octet-stream"></representation></response></method><method name="PUT"><doc>Updates a particular trusted identity.</doc><request><representation mediaType="application/xml" element="prefix3:trustedIdentity"><doc>Updates a particular trusted identity.</doc></representation><representation mediaType="application/json"><doc>Updates a particular trusted identity.</doc></representation></request><respo
nse><representation mediaType="application/xml" element="prefix3:trustedIdentity"></representation><representation mediaType="application/json"></representation></response></method></resource></resource><resource path="/wd"><doc>Representation of how a workflow run's working directory tree looks.</doc><method name="GET"><doc>Describes the working directory of the workflow run.</doc><request></request><response><representation mediaType="application/xml" element="prefix1:directoryContents"></representation><representation mediaType="application/json"></representation></response></method><resource path="/{path:(.*)}"><param name="path" style="template" repeating="true"/><method name="POST"><doc>Creates or updates a file in a particular location beneath the working directory of the workflow run with the contents of a publicly readable URL.</doc><request><representation mediaType="text/uri-list"><doc>Creates or updates a file in a particular location beneath the working directory o
f the workflow run with the contents of a publicly readable URL.</doc></representation></request><response><representation mediaType="application/xml"></representation><representation mediaType="application/json"></representation></response></method><method name="PUT"><doc>Creates or updates a file in a particular location beneath the working directory of the workflow run.</doc><request><representation mediaType="application/octet-stream"><doc>Creates or updates a file in a particular location beneath the working directory of the workflow run.</doc></representation><representation mediaType="*/*"><doc>Creates or updates a file in a particular location beneath the working directory of the workflow run.</doc></representation></request><response><representation mediaType="application/xml"></representation><representation mediaType="application/json"></representation></response></method></resource><resource path="/{path:.*}"><param name="path" style="template" repeating="true"/><method
name="DELETE"><doc>Deletes a file or directory that is in or below the working directory of a workflow run.</doc><request></request><response><representation mediaType="application/xml"></representation><representation mediaType="application/json"></representation></response></method><method name="OPTIONS"><doc>Produces the description of the files/directories' baclava operations.</doc><request></request><response><representation mediaType="application/xml"></representation><representation mediaType="application/json"></representation></response></method><method name="POST"><doc>Creates a directory in the filesystem beneath the working directory of the workflow run, or creates or updates a file's contents, where that file is in or below the working directory of a workflow run.</doc><request><representation mediaType="application/xml" element="prefix1:filesystemOperation"><doc>Creates a directory in the filesystem beneath the working directory of the workflow run, or create
s or updates a file's contents, where that file is in or below the working directory of a workflow run.</doc></representation><representation mediaType="application/json"><doc>Creates a directory in the filesystem beneath the working directory of the workflow run, or creates or updates a file's contents, where that file is in or below the working directory of a workflow run.</doc></representation></request><response><representation mediaType="application/xml"></representation><representation mediaType="application/json"></representation></response></method></resource><resource path="/{path:.+}"><param name="path" style="template" repeating="true"/><method name="GET"><doc>Gives a description of the named entity in or beneath the working directory of the workflow run (either a Directory or File).</doc><request></request><response><representation mediaType="application/xml"></representation><representation mediaType="application/json"></representation><representation mediaTyp
e="application/octet-stream"></representation><representation mediaType="application/zip"></representation><representation mediaType="*/*"></representation></response></method></resource></resource></resource></resource></resources></application>
\ No newline at end of file