| /* |
| */ |
| package org.taverna.server.master.rest; |
| |
| import static javax.ws.rs.core.UriBuilder.fromUri; |
| import static org.joda.time.format.ISODateTimeFormat.basicDateTime; |
| import static org.taverna.server.master.common.Roles.USER; |
| import static org.taverna.server.master.rest.handler.Scufl2DocumentHandler.SCUFL2; |
| import static org.taverna.server.master.interaction.InteractionFeedSupport.FEED_URL_DIR; |
| import static org.taverna.server.master.rest.ContentTypes.JSON; |
| import static org.taverna.server.master.rest.ContentTypes.ROBUNDLE; |
| import static org.taverna.server.master.rest.ContentTypes.TEXT; |
| import static org.taverna.server.master.rest.ContentTypes.XML; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.DIR; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.GENERATE_PROVENANCE; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.IN; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.LISTEN; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.LOG; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.NAME; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.OUT; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.PROFILE; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.ROOT; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.RUNBUNDLE; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.SEC; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.STATUS; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.STDERR; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.STDOUT; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.T_CREATE; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.T_EXPIRE; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.T_FINISH; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.T_START; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.USAGE; |
| import static org.taverna.server.master.rest.TavernaServerRunREST.PathNames.WF; |
| import static org.taverna.server.master.rest.handler.T2FlowDocumentHandler.T2FLOW; |
| |
| import java.net.URI; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.annotation.Nonnull; |
| import javax.annotation.security.RolesAllowed; |
| import javax.ws.rs.Consumes; |
| import javax.ws.rs.DELETE; |
| import javax.ws.rs.GET; |
| import javax.ws.rs.OPTIONS; |
| import javax.ws.rs.PUT; |
| import javax.ws.rs.Path; |
| import javax.ws.rs.Produces; |
| import javax.ws.rs.core.Context; |
| import javax.ws.rs.core.Response; |
| import javax.ws.rs.core.UriBuilder; |
| import javax.ws.rs.core.UriInfo; |
| import javax.xml.bind.JAXBException; |
| import javax.xml.bind.annotation.XmlAttribute; |
| import javax.xml.bind.annotation.XmlElement; |
| import javax.xml.bind.annotation.XmlRootElement; |
| import javax.xml.bind.annotation.XmlSchemaType; |
| import javax.xml.bind.annotation.XmlType; |
| import javax.xml.bind.annotation.XmlValue; |
| |
| import org.apache.cxf.jaxrs.model.wadl.Description; |
| import org.joda.time.format.DateTimeFormatter; |
| import org.taverna.server.master.common.Namespaces; |
| import org.taverna.server.master.common.ProfileList; |
| import org.taverna.server.master.common.Status; |
| import org.taverna.server.master.common.Uri; |
| import org.taverna.server.master.common.VersionedElement; |
| import org.taverna.server.master.common.Workflow; |
| import org.taverna.server.master.exceptions.BadStateChangeException; |
| import org.taverna.server.master.exceptions.FilesystemAccessException; |
| import org.taverna.server.master.exceptions.NoDirectoryEntryException; |
| import org.taverna.server.master.exceptions.NoListenerException; |
| import org.taverna.server.master.exceptions.NoUpdateException; |
| import org.taverna.server.master.exceptions.NotOwnerException; |
| import org.taverna.server.master.interfaces.Listener; |
| import org.taverna.server.master.interfaces.TavernaRun; |
| import org.taverna.server.port_description.OutputDescription; |
| |
| /** |
| * This represents how a Taverna Server workflow run looks to a RESTful API. |
| * |
| * @author Donal Fellows. |
| */ |
| @Description("This represents how a Taverna Server workflow run looks to a " |
| + "RESTful API.") |
| @RolesAllowed(USER) |
| public interface TavernaServerRunREST { |
| /** |
| * Describes a workflow run. |
| * |
| * @param ui |
| * About the URI used to access this resource. |
| * @return The description. |
| */ |
| @GET |
| @Path(ROOT) |
| @Description("Describes a workflow run.") |
| @Produces({ XML, JSON }) |
| @Nonnull |
| public RunDescription getDescription(@Nonnull @Context UriInfo ui); |
| |
| /** |
| * Deletes a workflow run. |
| * |
| * @return An HTTP response to the deletion. |
| * @throws NoUpdateException |
| * If the user may see the handle but may not delete it. |
| */ |
| @DELETE |
| @Path(ROOT) |
| @Description("Deletes a workflow run.") |
| @Nonnull |
| public Response destroy() throws NoUpdateException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(ROOT) |
| @Description("Produces the description of the run.") |
| Response runOptions(); |
| |
| /** |
| * Returns the workflow document used to create the workflow run. |
| * |
| * @return The workflow document. |
| */ |
| @GET |
| @Path(WF) |
| @Produces({ T2FLOW, SCUFL2, XML, JSON }) |
| @Description("Gives the workflow document used to create the workflow run.") |
| @Nonnull |
| public Workflow getWorkflow(); |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(WF) |
| @Description("Produces the description of the run workflow.") |
| Response workflowOptions(); |
| |
| /** Get the workflow name. */ |
| @GET |
| @Path(NAME) |
| @Produces(TEXT) |
| @Description("Gives the descriptive name of the workflow run.") |
| @Nonnull |
| public String getName(); |
| |
| /** |
| * Set the workflow name. |
| * |
| * @throws NoUpdateException |
| * If the user is not permitted to change the workflow. |
| */ |
| @PUT |
| @Path(NAME) |
| @Consumes(TEXT) |
| @Produces(TEXT) |
| @Description("Set the descriptive name of the workflow run. Note that " |
| + "this value may be arbitrarily truncated by the implementation.") |
| @Nonnull |
| public String setName(String name) throws NoUpdateException; |
| |
| /** Produce the workflow name HTTP operations. */ |
| @OPTIONS |
| @Path(NAME) |
| @Description("Produces the description of the operations on the run's " |
| + "descriptive name.") |
| @Nonnull |
| Response nameOptions(); |
| |
| /** |
| * Produces the name of the workflow's main profile. |
| * |
| * @return The main profile name, or the empty string if there is no such |
| * profile. |
| */ |
| @GET |
| @Path(PROFILE) |
| @Produces(TEXT) |
| @Description("Gives the name of the workflow's main profile, or the empty string if none is defined.") |
| @Nonnull |
| String getMainProfileName(); |
| |
| /** |
| * Get a description of the profiles supported by the workflow document used |
| * to create this run. |
| * |
| * @return A description of the supported profiles. |
| */ |
| @GET |
| @Path(PROFILE) |
| @Produces({ XML, JSON }) |
| @Description("Describes what profiles exist on the workflow.") |
| @Nonnull |
| ProfileList getProfiles(); |
| |
| /** Produce the workflow profile HTTP operations. */ |
| @OPTIONS |
| @Path(PROFILE) |
| @Description("Produces the description of the operations on the run's " |
| + "profile.") |
| @Nonnull |
| Response profileOptions(); |
| |
| /** |
| * Returns a resource that represents the workflow run's security |
| * properties. These may only be accessed by the owner. |
| * |
| * @return The security resource. |
| * @throws NotOwnerException |
| * If the accessing principal isn't the owning principal. |
| */ |
| @Path(SEC) |
| @Description("Access the workflow run's security.") |
| @Nonnull |
| public TavernaServerSecurityREST getSecurity() throws NotOwnerException; |
| |
| /** |
| * Returns the time when the workflow run becomes eligible for automatic |
| * deletion. |
| * |
| * @return When the run expires. |
| */ |
| @GET |
| @Path(T_EXPIRE) |
| @Produces(TEXT) |
| @Description("Gives the time when the workflow run becomes eligible for " |
| + "automatic deletion.") |
| @Nonnull |
| public String getExpiryTime(); |
| |
| /** |
| * Sets the time when the workflow run becomes eligible for automatic |
| * deletion. |
| * |
| * @param expiry |
| * When the run will expire. |
| * @return When the run will actually expire. |
| * @throws NoUpdateException |
| * If the current user is not permitted to manage the lifetime |
| * of the run. |
| */ |
| @PUT |
| @Path(T_EXPIRE) |
| @Consumes(TEXT) |
| @Produces(TEXT) |
| @Description("Sets the time when the workflow run becomes eligible for " |
| + "automatic deletion.") |
| @Nonnull |
| public String setExpiryTime(@Nonnull String expiry) |
| throws NoUpdateException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(T_EXPIRE) |
| @Description("Produces the description of the run expiry.") |
| Response expiryOptions(); |
| |
| /** |
| * Returns the time when the workflow run was created. |
| * |
| * @return When the run was first submitted to the server. |
| */ |
| @GET |
| @Path(T_CREATE) |
| @Produces(TEXT) |
| @Description("Gives the time when the workflow run was first submitted " |
| + "to the server.") |
| @Nonnull |
| public String getCreateTime(); |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(T_CREATE) |
| @Description("Produces the description of the run create time.") |
| Response createTimeOptions(); |
| |
| /** |
| * Returns the time when the workflow run was started (through a user-driven |
| * state change). |
| * |
| * @return When the run was started, or <tt>null</tt>. |
| */ |
| @GET |
| @Path(T_START) |
| @Produces(TEXT) |
| @Description("Gives the time when the workflow run was started, or an " |
| + "empty string if the run has not yet started.") |
| @Nonnull |
| public String getStartTime(); |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(T_START) |
| @Description("Produces the description of the run start time.") |
| Response startTimeOptions(); |
| |
| /** |
| * Returns the time when the workflow run was detected to have finished. |
| * |
| * @return When the run finished, or <tt>null</tt>. |
| */ |
| @GET |
| @Path(T_FINISH) |
| @Produces(TEXT) |
| @Description("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).") |
| @Nonnull |
| public String getFinishTime(); |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(T_FINISH) |
| @Description("Produces the description of the run finish time.") |
| Response finishTimeOptions(); |
| |
| /** |
| * Gets the current status of the workflow run. |
| * |
| * @return The status code. |
| */ |
| @GET |
| @Path(STATUS) |
| @Produces(TEXT) |
| @Description("Gives the current status of the workflow run.") |
| @Nonnull |
| public String getStatus(); |
| |
| /** |
| * Sets the status of the workflow run. This does nothing if the status code |
| * is the same as the run's current state. |
| * |
| * @param status |
| * The new status code. |
| * @return Description of what status the run is actually in, or a 202 to |
| * indicate that things are still changing. |
| * @throws NoUpdateException |
| * If the current user is not permitted to update the run. |
| * @throws BadStateChangeException |
| * If the state cannot be modified in the manner requested. |
| */ |
| @PUT |
| @Path(STATUS) |
| @Consumes(TEXT) |
| @Produces(TEXT) |
| @Description("Attempts to update the status of the workflow run.") |
| @Nonnull |
| public Response setStatus(@Nonnull String status) throws NoUpdateException, |
| BadStateChangeException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(STATUS) |
| @Description("Produces the description of the run status.") |
| Response statusOptions(); |
| |
| /** |
| * Get the working directory of this workflow run. |
| * |
| * @return A RESTful delegate for the working directory. |
| */ |
| @Path(DIR) |
| @Description("Get the working directory of this workflow run.") |
| @Nonnull |
| public TavernaServerDirectoryREST getWorkingDirectory(); |
| |
| /** |
| * Get the event listeners attached to this workflow run. |
| * |
| * @return A RESTful delegate for the list of listeners. |
| */ |
| @Path(LISTEN) |
| @Description("Get the event listeners attached to this workflow run.") |
| @Nonnull |
| public TavernaServerListenersREST getListeners(); |
| |
| /** |
| * Get a delegate for working with the inputs to this workflow run. |
| * |
| * @param ui |
| * About the URI used to access this resource. |
| * @return A RESTful delegate for the inputs. |
| */ |
| @Path(IN) |
| @Description("Get the inputs to this workflow run.") |
| @Nonnull |
| public TavernaServerInputREST getInputs(@Nonnull @Context UriInfo ui); |
| |
| /** |
| * Get the output Baclava file for this workflow run. |
| * |
| * @return The filename, or empty string to indicate that the outputs will |
| * be written to the <tt>out</tt> directory. |
| */ |
| @GET |
| @Path(OUT) |
| @Produces(TEXT) |
| @Description("Gives the Baclava file where output will be written; empty " |
| + "means use multiple simple files in the out directory.") |
| @Nonnull |
| public String getOutputFile(); |
| |
| /** |
| * Get a description of the outputs. |
| * |
| * @param ui |
| * About the URI used to access this operation. |
| * @return A description of the outputs (higher level than the filesystem). |
| * @throws BadStateChangeException |
| * If the run is in the {@link Status#Initialized Initialized} |
| * state. |
| * @throws FilesystemAccessException |
| * If problems occur when accessing the filesystem. |
| * @throws NoDirectoryEntryException |
| * If things are odd in the filesystem. |
| */ |
| @GET |
| @Path(OUT) |
| @Produces({ XML, JSON }) |
| @Description("Gives a description of the outputs, as currently understood") |
| @Nonnull |
| public OutputDescription getOutputDescription(@Nonnull @Context UriInfo ui) |
| throws BadStateChangeException, FilesystemAccessException, |
| NoDirectoryEntryException; |
| |
| /** |
| * Set the output Baclava file for this workflow run. |
| * |
| * @param filename |
| * The Baclava file to use, or empty to make the outputs be |
| * written to individual files in the <tt>out</tt> subdirectory |
| * of the working directory. |
| * @return The Baclava file as actually set. |
| * @throws NoUpdateException |
| * If the current user is not permitted to update the run. |
| * @throws FilesystemAccessException |
| * If the filename is invalid (starts with <tt>/</tt> or |
| * contains a <tt>..</tt> segment). |
| * @throws BadStateChangeException |
| * If the workflow is not in the Initialized state. |
| */ |
| @PUT |
| @Path(OUT) |
| @Consumes(TEXT) |
| @Produces(TEXT) |
| @Description("Sets the Baclava file where output will be written; empty " |
| + "means use multiple simple files in the out directory.") |
| @Nonnull |
| public String setOutputFile(@Nonnull String filename) |
| throws NoUpdateException, FilesystemAccessException, |
| BadStateChangeException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(OUT) |
| @Description("Produces the description of the run output.") |
| Response outputOptions(); |
| |
| /** |
| * Get a handle to the interaction feed. |
| * |
| * @return |
| */ |
| @Path(FEED_URL_DIR) |
| @Description("Access the interaction feed for the workflow run.") |
| @Nonnull |
| InteractionFeedREST getInteractionFeed(); |
| |
| /** |
| * @return The stdout for the workflow run, or empty string if the run has |
| * not yet started. |
| * @throws NoListenerException |
| */ |
| @GET |
| @Path(STDOUT) |
| @Description("Return the stdout for the workflow run.") |
| @Produces(TEXT) |
| @Nonnull |
| String getStdout() throws NoListenerException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(STDOUT) |
| @Description("Return the stdout for the workflow run.") |
| Response stdoutOptions(); |
| |
| /** |
| * @return The stderr for the workflow run, or empty string if the run has |
| * not yet started. |
| * @throws NoListenerException |
| */ |
| @GET |
| @Path(STDERR) |
| @Description("Return the stderr for the workflow run.") |
| @Produces(TEXT) |
| @Nonnull |
| String getStderr() throws NoListenerException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(STDERR) |
| @Description("Return the stderr for the workflow run.") |
| Response stderrOptions(); |
| |
| /** |
| * @return The usage record for the workflow run, wrapped in a Response, or |
| * "empty content" if the run has not yet finished. |
| * @throws NoListenerException |
| * @throws JAXBException |
| */ |
| @GET |
| @Path(USAGE) |
| @Description("Return the usage record for the workflow run.") |
| @Produces(XML) |
| @Nonnull |
| Response getUsage() throws NoListenerException, JAXBException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(USAGE) |
| @Description("Return the usage record for the workflow run.") |
| Response usageOptions(); |
| |
| /** |
| * @return The log for the workflow run, or empty string if the run has not |
| * yet started. |
| */ |
| @GET |
| @Path(LOG) |
| @Description("Return the log for the workflow run.") |
| @Produces(TEXT) |
| @Nonnull |
| Response getLogContents(); |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(LOG) |
| @Description("Return the log for the workflow run.") |
| Response logOptions(); |
| |
| /** |
| * @return The log for the workflow run, or empty string if the run has not |
| * yet started. |
| */ |
| @GET |
| @Path(RUNBUNDLE) |
| @Description("Return the run bundle for the workflow run.") |
| @Produces(ROBUNDLE) |
| @Nonnull |
| Response getRunBundle(); |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(RUNBUNDLE) |
| @Description("Return the run bundle for the workflow run.") |
| Response runBundleOptions(); |
| |
| /** |
| * @return Whether to create the run bundle for the workflow run. Only |
| * usefully set-able before the start of the run. |
| */ |
| @GET |
| @Path(GENERATE_PROVENANCE) |
| @Description("Whether to create the run bundle for the workflow run.") |
| @Produces(TEXT) |
| @Nonnull |
| boolean getGenerateProvenance(); |
| |
| /** |
| * @param provenanceFlag |
| * Whether to create the run bundle for the workflow run. Only |
| * usefully set-able before the start of the run. |
| * @return What it was actually set to. |
| * @throws NoUpdateException |
| */ |
| @PUT |
| @Path(GENERATE_PROVENANCE) |
| @Description("Whether to create the run bundle for the workflow run.") |
| @Consumes(TEXT) |
| @Produces(TEXT) |
| @Nonnull |
| boolean setGenerateProvenance(boolean provenanceFlag) throws NoUpdateException; |
| |
| /** Get an outline of the operations supported. */ |
| @OPTIONS |
| @Path(GENERATE_PROVENANCE) |
| @Description("Whether to create the run bundle for the workflow run.") |
| Response generateProvenanceOptions(); |
| |
| /** |
| * Factored out path names used in the {@link TavernaServerRunREST} |
| * interface and related places. |
| * |
| * @author Donal Fellows |
| */ |
| interface PathNames { |
| public static final String ROOT = "/"; |
| public static final String WF = "workflow"; |
| public static final String DIR = "wd"; |
| public static final String NAME = "name"; |
| public static final String T_EXPIRE = "expiry"; |
| public static final String T_CREATE = "createTime"; |
| public static final String T_START = "startTime"; |
| public static final String T_FINISH = "finishTime"; |
| public static final String STATUS = "status"; |
| public static final String IN = "input"; |
| public static final String OUT = "output"; |
| public static final String PROFILE = "profile"; |
| public static final String LISTEN = "listeners"; |
| public static final String SEC = "security"; |
| public static final String STDOUT = "stdout"; |
| public static final String STDERR = "stderr"; |
| public static final String USAGE = "usage"; |
| public static final String LOG = "log"; |
| public static final String RUNBUNDLE = "run-bundle"; |
| public static final String GENERATE_PROVENANCE = "generate-provenance"; |
| } |
| |
| /** |
| * The description of where everything is in a RESTful view of a workflow |
| * run. Done with JAXB. |
| * |
| * @author Donal Fellows |
| */ |
| @XmlRootElement |
| @XmlType(name = "") |
| public static class RunDescription extends VersionedElement { |
| /** The identity of the owner of the workflow run. */ |
| @XmlAttribute(namespace = Namespaces.SERVER_REST) |
| public String owner; |
| /** The description of the expiry. */ |
| public Expiry expiry; |
| /** The location of the creation workflow description. */ |
| public Uri creationWorkflow; |
| /** The location of the creation time property. */ |
| public Uri createTime; |
| /** The location of the start time property. */ |
| public Uri startTime; |
| /** The location of the finish time property. */ |
| public Uri finishTime; |
| /** The location of the status description. */ |
| public Uri status; |
| /** The location of the working directory. */ |
| public Uri workingDirectory; |
| /** The location of the inputs. */ |
| public Uri inputs; |
| /** The location of the Baclava output. */ |
| public Uri output; |
| /** The location of the security context. */ |
| public Uri securityContext; |
| /** The list of listeners. */ |
| public ListenerList listeners; |
| /** The location of the interaction feed. */ |
| public Uri interaction; |
| /** The name of the run. */ |
| public Uri name; |
| /** The stdout of the run. */ |
| public Uri stdout; |
| /** The stderr of the run. */ |
| public Uri stderr; |
| /** The usage record for the run. */ |
| public Uri usage; |
| /** The log from the run. */ |
| public Uri log; |
| /** The bundle describing the run. */ |
| @XmlElement(name = RUNBUNDLE) |
| public Uri runBundle; |
| /** Whether to generate a bundle describing the run. */ |
| @XmlElement(name = GENERATE_PROVENANCE) |
| public Uri generateProvenance; |
| |
| /** |
| * How to describe a run's expiry. |
| * |
| * @author Donal Fellows |
| */ |
| @XmlType(name = "") |
| public static class Expiry { |
| /** |
| * Where to go to read the exiry |
| */ |
| @XmlAttribute(name = "href", namespace = Namespaces.XLINK) |
| @XmlSchemaType(name = "anyURI") |
| public URI ref; |
| /** |
| * What the expiry currently is. |
| */ |
| @XmlValue |
| public String timeOfDeath; |
| |
| /** |
| * Make a blank expiry description. |
| */ |
| public Expiry() { |
| } |
| |
| private static DateTimeFormatter dtf; |
| |
| Expiry(TavernaRun r, UriInfo ui, String path, String... parts) { |
| ref = fromUri(new Uri(ui, true, path, parts).ref).build(); |
| if (dtf == null) |
| dtf = basicDateTime(); |
| timeOfDeath = dtf.print(r.getExpiry().getTime()); |
| } |
| } |
| |
| /** |
| * The description of a list of listeners attached to a run. |
| * |
| * @author Donal Fellows |
| */ |
| @XmlType(name = "") |
| public static class ListenerList extends Uri { |
| /** |
| * The references to the individual listeners. |
| */ |
| public List<Uri> listener; |
| |
| /** |
| * An empty description of listeners. |
| */ |
| public ListenerList() { |
| listener = new ArrayList<>(); |
| } |
| |
| /** |
| * @param r |
| * The run whose listeners we're talking about. |
| * @param ub |
| * Uri factory; must've been secured |
| */ |
| private ListenerList(TavernaRun r, UriBuilder ub) { |
| super(ub); |
| listener = new ArrayList<>(r.getListeners().size()); |
| UriBuilder pathUB = ub.clone().path("{name}"); |
| for (Listener l : r.getListeners()) |
| listener.add(new Uri(pathUB.build(l.getName()))); |
| } |
| |
| /** |
| * @param run |
| * The run whose listeners we're talking about. |
| * @param ui |
| * The source of information about URIs. |
| * @param path |
| * Where we are relative to the URI source. |
| * @param parts |
| * Anything required to fill out the path. |
| */ |
| ListenerList(TavernaRun run, UriInfo ui, String path, |
| String... parts) { |
| this(run, secure(fromUri(new Uri(ui, path, parts).ref))); |
| } |
| } |
| |
| /** |
| * An empty description of a run. |
| */ |
| public RunDescription() { |
| } |
| |
| /** |
| * A description of a particular run. |
| * |
| * @param run |
| * The run to describe. |
| * @param ui |
| * The factory for URIs. |
| */ |
| public RunDescription(TavernaRun run, UriInfo ui) { |
| super(true); |
| creationWorkflow = new Uri(ui, WF); |
| expiry = new Expiry(run, ui, T_EXPIRE); |
| status = new Uri(ui, STATUS); |
| workingDirectory = new Uri(ui, DIR); |
| listeners = new ListenerList(run, ui, LISTEN); |
| securityContext = new Uri(ui, SEC); |
| inputs = new Uri(ui, IN); |
| output = new Uri(ui, OUT); |
| createTime = new Uri(ui, T_CREATE); |
| startTime = new Uri(ui, T_START); |
| finishTime = new Uri(ui, T_FINISH); |
| interaction = new Uri(ui, FEED_URL_DIR); |
| name = new Uri(ui, NAME); |
| owner = run.getSecurityContext().getOwner().getName(); |
| stdout = new Uri(ui, STDOUT); |
| stderr = new Uri(ui, STDERR); |
| usage = new Uri(ui, USAGE); |
| log = new Uri(ui, LOG); |
| runBundle = new Uri(ui, RUNBUNDLE); |
| generateProvenance = new Uri(ui, GENERATE_PROVENANCE); |
| } |
| } |
| } |