package org.apache.taverna.scufl2.rdfxml; /* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ import static org.apache.taverna.scufl2.rdfxml.RDFXMLReader.APPLICATION_RDF_XML; import static org.apache.taverna.scufl2.rdfxml.RDFXMLReader.APPLICATION_VND_TAVERNA_SCUFL2_WORKFLOW_BUNDLE; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.util.Collections; import java.util.Set; import javax.xml.bind.JAXBException; import org.apache.taverna.scufl2.api.annotation.Revision; import org.apache.taverna.scufl2.api.annotation.Revisioned; import org.apache.taverna.scufl2.api.common.URITools; import org.apache.taverna.scufl2.api.container.WorkflowBundle; import org.apache.taverna.scufl2.api.core.Workflow; import org.apache.taverna.scufl2.api.io.WorkflowBundleWriter; import org.apache.taverna.scufl2.api.io.WriterException; import org.apache.taverna.scufl2.api.profiles.Profile; import org.apache.taverna.scufl2.ucfpackage.UCFPackage; public class RDFXMLWriter implements WorkflowBundleWriter { private static final String WF = "wf-"; private static final String REVISIONS = "-revisions"; protected static final String RDF = ".rdf"; protected static final String WORKFLOW = "workflow/"; protected static final String HISTORY = "history/"; protected static final String PROFILE = "profile/"; protected static final String WORKFLOW_BUNDLE_RDF = "workflowBundle.rdf"; private static URITools uriTools = new URITools(); public static final URITools getUriTools() { return uriTools; } public static final void setUriTools(URITools uriTools) { RDFXMLWriter.uriTools = uriTools; } /** * Version of Workflow Bundle format */ public final String WORKFLOW_BUNDLE_VERSION = "0.4.0"; @Override public Set<String> getMediaTypes() { return Collections .singleton(APPLICATION_VND_TAVERNA_SCUFL2_WORKFLOW_BUNDLE); } @Override public void writeBundle(WorkflowBundle wfBundle, File destination, String mediaType) throws WriterException, IOException { UCFPackage ucfPackage = makeUCFPackage(wfBundle); ucfPackage.save(destination); } protected UCFPackage makeUCFPackage(WorkflowBundle wfBundle) throws IOException, WriterException { //UCFPackage ucfPackage = new UCFPackage(); UCFPackage ucfPackage = wfBundle.getResources(); if (ucfPackage.getPackageMediaType() == null) ucfPackage .setPackageMediaType(APPLICATION_VND_TAVERNA_SCUFL2_WORKFLOW_BUNDLE); RDFXMLSerializer serializer = new RDFXMLSerializer(wfBundle); for (Workflow wf : wfBundle.getWorkflows()) { String path = WORKFLOW + uriTools.validFilename(wf.getName()) + RDF; try (OutputStream outputStream = ucfPackage .addResourceUsingOutputStream(path, APPLICATION_RDF_XML)) { serializer.workflowDoc(outputStream, wf, URI.create(path)); } catch (JAXBException e) { throw new WriterException("Can't generate " + path, e); } path = HISTORY + WF + uriTools.validFilename(wf.getName()) + REVISIONS + RDF; addRevisions(wf, path, wfBundle); } for (Profile pf : wfBundle.getProfiles()) { String path = PROFILE + uriTools.validFilename(pf.getName()) + RDF; try (OutputStream outputStream = ucfPackage .addResourceUsingOutputStream(path, APPLICATION_RDF_XML)) { serializer.profileDoc(outputStream, pf, URI.create(path)); } catch (JAXBException e) { throw new WriterException("Can't generate " + path, e); } path = HISTORY + "pf-" + uriTools.validFilename(pf.getName()) + REVISIONS + RDF; addRevisions(pf, path, wfBundle); } try (OutputStream outputStream = ucfPackage .addResourceUsingOutputStream(WORKFLOW_BUNDLE_RDF, APPLICATION_RDF_XML)) { serializer.workflowBundleDoc(outputStream, URI.create(WORKFLOW_BUNDLE_RDF)); } catch (JAXBException e) { throw new WriterException("Can't generate " + WORKFLOW_BUNDLE_RDF, e); } if (ucfPackage.getPackageMediaType().equals( APPLICATION_VND_TAVERNA_SCUFL2_WORKFLOW_BUNDLE)) ucfPackage .setRootFile(WORKFLOW_BUNDLE_RDF, WORKFLOW_BUNDLE_VERSION); String path = HISTORY + "wfbundle" + REVISIONS + RDF; addRevisions(wfBundle, path, wfBundle); return ucfPackage; } protected void addRevisions(Revisioned revisioned, String path, WorkflowBundle wfBundle) throws WriterException { @SuppressWarnings("unused") URI uriBase = uriTools.uriForBean(wfBundle).resolve(path); Revision currentRevision = revisioned.getCurrentRevision(); if (currentRevision == null) return; // try { // wfBundle.getResources() // .addResource(visitor.getDoc(), path, APPLICATION_RDF_XML); // } catch (IOException e) { // throw new WriterException("Can't write revisions to " + path, e); // } } @Override public void writeBundle(WorkflowBundle wfBundle, OutputStream output, String mediaType) throws WriterException, IOException { UCFPackage ucfPackage = makeUCFPackage(wfBundle); ucfPackage.save(output); } }