/*
* Copyright 2011 JBoss Inc
*
* Licensed 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.
*/
package org.artificer.test.server.atom.services;
import org.apache.commons.io.IOUtils;
import org.artificer.atom.ArtificerAtomUtils;
import org.artificer.atom.providers.ArtificerServerExceptionProvider;
import org.artificer.client.ClientRequest;
import org.artificer.common.ArtificerConstants;
import org.artificer.common.ArtificerModelUtils;
import org.artificer.common.MediaType;
import org.artificer.common.error.ArtificerServerException;
import org.artificer.test.TestUtils;
import org.jboss.resteasy.client.ClientResponse;
import org.jboss.resteasy.plugins.providers.atom.Entry;
import org.jboss.resteasy.plugins.providers.atom.Feed;
import org.jboss.resteasy.plugins.providers.multipart.MultipartConstants;
import org.jboss.resteasy.plugins.providers.multipart.MultipartRelatedOutput;
import org.junit.Assert;
import org.junit.Test;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Artifact;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactEnum;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Document;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DocumentArtifactEnum;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DocumentArtifactTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ExtendedArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ExtendedDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Message;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PartEnum;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PartTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XmlDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocument;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.List;
import java.util.UUID;
/**
* Test of the jax-rs resource that handles Artifacts.
*
* @author eric.wittmann@redhat.com
*/
public class ArtifactResourceTest extends AbstractResourceTest {
String uuid = null;
/**
* @throws Exception
*/
@Test
public void testDerivedArtifactCreate() throws Exception {
// Making a client call to the actual XsdDocument implementation running in
// an embedded container.
ClientRequest request = clientRequest("/s-ramp/xsd/ElementDeclaration");
// read the XsdDocument from file
String artifactFileName = "PO.xsd";
InputStream POXsd = this.getClass().getResourceAsStream("/sample-files/xsd/" + artifactFileName);
String xmltext = TestUtils.convertStreamToString(POXsd);
POXsd.close();
request.header("Slug", artifactFileName);
request.body(MediaType.APPLICATION_XML, xmltext);
try {
request.post(String.class);
Assert.fail("Expected an error here.");
} catch (ArtificerServerException e) {
Assert.assertEquals("Failed to create artifact because \"ElementDeclaration\" is a derived type.", e.getMessage());
String stack = ArtificerServerExceptionProvider.getRootStackTrace(e);
Assert.assertTrue(stack.contains("ArtifactResource.create"));
}
}
/**
* Tests adding a PDF document.
* @throws Exception
*/
@Test
public void testPDFDocument() throws Exception {
// Add the PDF to the repository
String artifactFileName = "sample.pdf";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/core/" + artifactFileName);
//String uuid = null;
try {
ClientRequest request = clientRequest("/s-ramp/core/Document");
request.header("Slug", artifactFileName);
request.body("application/pdf", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof Document);
Document doc = (Document) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals(Long.valueOf(218882), doc.getContentSize());
Assert.assertEquals("application/pdf", doc.getContentType());
uuid = doc.getUuid();
} finally {
IOUtils.closeQuietly(contentStream);
}
// Make sure we can query it now
ClientRequest request = clientRequest("/s-ramp/core/Document/" + uuid);
ClientResponse<Entry> response = request.get(Entry.class);
Entry entry = response.getEntity();
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof Document);
Document doc = (Document) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals(Long.valueOf(218882), doc.getContentSize());
Assert.assertEquals("sample.pdf", doc.getName());
Assert.assertEquals("application/pdf", doc.getContentType());
//Obtain the content for visual inspection
ClientRequest request2 = clientRequest("/s-ramp/core/Document/" + uuid + "/media");
ClientResponse<InputStream> response2 = request2.get(InputStream.class);
if (response2.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
InputStream in = response2.getEntity();
File file = new File("target/SRAMP-sample.pdf");
OutputStream out = new FileOutputStream(file);
IOUtils.copy(in, out);
out.flush();
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
/**
* Tests adding an extended artifact type (no document content).
* @throws Exception
*/
@Test
public void testExtendedArtifactType() throws Exception {
ExtendedArtifactType artifact = new ExtendedArtifactType();
artifact.setArtifactType(BaseArtifactEnum.EXTENDED_ARTIFACT_TYPE);
artifact.setExtendedType("FooApplication");
artifact.setName("Extended Artifact Name");
artifact.setDescription("Extended Artifact Description");
ClientRequest request = clientRequest("/s-ramp/ext/FooApplication");
Entry requestEntry = ArtificerAtomUtils.wrapSrampArtifact(artifact);
request.body(MediaType.APPLICATION_ATOM_XML_ENTRY, requestEntry);
ClientResponse<Entry> response = request.post(Entry.class);
Entry responseEntry = response.getEntity();
Assert.assertEquals("Extended Artifact Name", responseEntry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(responseEntry);
Assert.assertTrue(arty instanceof ExtendedArtifactType);
ExtendedArtifactType extArty = (ExtendedArtifactType) arty;
Assert.assertEquals("Extended Artifact Name", extArty.getName());
Assert.assertEquals("Extended Artifact Description", extArty.getDescription());
uuid = extArty.getUuid();
// Make sure we can query it now
request = clientRequest("/s-ramp/ext/FooApplication/" + uuid);
response = request.get(Entry.class);
Entry entry = response.getEntity();
arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedArtifactType);
extArty = (ExtendedArtifactType) arty;
Assert.assertEquals("Extended Artifact Name", extArty.getName());
Assert.assertEquals("Extended Artifact Description", extArty.getDescription());
}
/**
* Tests adding a BRMS Pkg document.
* @throws Exception
*/
@Test
public void testBrmsPkgDocument() throws Exception {
// Add the pkg to the repository
String artifactFileName = "defaultPackage.pkg";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/ext/" + artifactFileName);
String uuid = null;
try {
ClientRequest request = clientRequest("/s-ramp/ext/BrmsPkgDocument");
request.header("Slug", artifactFileName);
request.body("application/octet-stream", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals("BrmsPkgDocument", doc.getExtendedType());
Assert.assertEquals(Long.valueOf(17043), Long.valueOf(doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_SIZE_QNAME)));
Assert.assertEquals("application/octet-stream", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
uuid = doc.getUuid();
} finally {
IOUtils.closeQuietly(contentStream);
}
// Make sure we can query it now
ClientRequest request = clientRequest("/s-ramp/ext/BrmsPkgDocument/" + uuid);
ClientResponse<Entry> response = request.get(Entry.class);
Entry entry = response.getEntity();
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals(Long.valueOf(17043), Long.valueOf(doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_SIZE_QNAME)));
Assert.assertEquals("defaultPackage.pkg", doc.getName());
Assert.assertEquals("application/octet-stream", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
}
/**
* Tests adding a JPG document.
* @throws Exception
*/
@Test
public void testJPGDocument() throws Exception {
// Add the jpg to the repository
String artifactFileName = "photo.jpg";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/ext/" + artifactFileName);
String uuid = null;
try {
ClientRequest request = clientRequest("/s-ramp/ext/JpgDocument");
request.header("Slug", artifactFileName);
request.body("application/octet-stream", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals("JpgDocument", doc.getExtendedType());
Assert.assertEquals(Long.valueOf(2398), Long.valueOf(doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_SIZE_QNAME)));
Assert.assertEquals("image/jpeg", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
uuid = doc.getUuid();
} finally {
IOUtils.closeQuietly(contentStream);
}
// Make sure we can query it now
ClientRequest request = clientRequest("/s-ramp/ext/JpgDocument/" + uuid);
ClientResponse<Entry> response = request.get(Entry.class);
Entry entry = response.getEntity();
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals(Long.valueOf(2398), Long.valueOf(doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_SIZE_QNAME)));
Assert.assertEquals("photo.jpg", doc.getName());
Assert.assertEquals("image/jpeg", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
//Obtain the content for visual inspection
ClientRequest request2 = clientRequest("/s-ramp/ext/JpgDocument/" + uuid + "/media");
ClientResponse<InputStream> response2 = request2.get(InputStream.class);
if (response2.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
InputStream in = response2.getEntity();
File file = new File("target/SRAMP-photo.jpg");
OutputStream out = new FileOutputStream(file);
IOUtils.copy(in, out);
out.flush();
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
/**
* Tests adding a BPMN Process Definition document.
* @throws Exception
*/
@Test
public void testBpmnExtendedDocumentCreate() throws Exception {
// Add the BPMN process to the repository
String artifactFileName = "Evaluation.bpmn";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/ext/" + artifactFileName);
String uuid = null;
try {
ClientRequest request = clientRequest("/s-ramp/ext/BpmnDocument");
request.header("Slug", artifactFileName);
request.body("application/xml", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals("BpmnDocument", doc.getExtendedType());
long size = Long.valueOf(doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_SIZE_QNAME));
Assert.assertTrue(size >= 12482L);
Assert.assertEquals("application/xml", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
uuid = doc.getUuid();
} finally {
IOUtils.closeQuietly(contentStream);
}
// Make sure we can query it now
ClientRequest request = clientRequest("/s-ramp/ext/BpmnDocument/" + uuid);
ClientResponse<Entry> response = request.get(Entry.class);
Entry entry = response.getEntity();
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals("Evaluation.bpmn", doc.getName());
Assert.assertEquals("application/xml", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
ClientResponse<String> content = request.get(String.class);
String c = content.getEntity();
Assert.assertNotNull(c);
// System.out.println("Content=" + content.getEntity());
}
/**
* Tests adding a BPMN Process Definition document.
* @throws Exception
*/
@Test
public void testWslaExtendedDocumentCreate() throws Exception {
// Add the BPMN process to the repository
String artifactFileName = "Sample.wsla";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/ext/" + artifactFileName);
String uuid = null;
try {
ClientRequest request = clientRequest("/s-ramp/ext/WslaDocument");
request.header("Slug", artifactFileName);
request.body("application/xml", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals("WslaDocument", doc.getExtendedType());
long size = Long.valueOf(doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_SIZE_QNAME));
Assert.assertTrue(size >= 6556L);
Assert.assertEquals("application/xml", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
uuid = doc.getUuid();
} finally {
IOUtils.closeQuietly(contentStream);
}
// Make sure we can query it now
ClientRequest request = clientRequest("/s-ramp/ext/WslaDocument/" + uuid);
ClientResponse<Entry> response = request.get(Entry.class);
Entry entry = response.getEntity();
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof ExtendedDocument);
ExtendedDocument doc = (ExtendedDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Assert.assertEquals("Sample.wsla", doc.getName());
Assert.assertEquals("application/xml", doc.getOtherAttributes().get(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME));
ClientResponse<String> content = request.get(String.class);
String c = content.getEntity();
Assert.assertNotNull(c);
// System.out.println("Content=" + content.getEntity());
}
/**
* Tests adding a wsdl document.
* @throws Exception
*/
@Test
public void testWsdlDocumentCreate() throws Exception {
// Add the PDF to the repository
String artifactFileName = "sample.wsdl";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/wsdl/" + artifactFileName);
String uuid = null;
ClientRequest request = null;
try {
request = clientRequest("/s-ramp/wsdl/WsdlDocument");
request.header("Slug", artifactFileName);
request.body("application/xml", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof WsdlDocument);
WsdlDocument doc = (WsdlDocument) arty;
Assert.assertEquals(artifactFileName, doc.getName());
Long size = doc.getContentSize();
Assert.assertTrue(size >= 1642L);
Assert.assertEquals("application/xml", doc.getContentType());
uuid = doc.getUuid();
} finally {
IOUtils.closeQuietly(contentStream);
}
// Make sure we can query it now
request = clientRequest("/s-ramp/wsdl/WsdlDocument/" + uuid);
ClientResponse<Entry> response = request.get(Entry.class);
Entry entry = response.getEntity();
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertNotNull(arty);
Assert.assertTrue(arty instanceof WsdlDocument);
WsdlDocument wsdlDoc = (WsdlDocument) arty;
Assert.assertEquals("sample.wsdl", wsdlDoc.getName());
// Make sure we can query the derived content
ClientRequest frequest = clientRequest("/s-ramp/wsdl/Message");
ClientResponse<Feed> fresponse = frequest.get(Feed.class);
Feed feed = fresponse.getEntity();
Object totalResultsAttr = feed.getExtensionAttributes().get(ArtificerConstants.SRAMP_TOTAL_RESULTS_QNAME);
int total = Integer.parseInt(String.valueOf(totalResultsAttr));
Assert.assertNotNull(feed);
Assert.assertEquals(2, total);
String findReqMsgUuid = null;
for (Entry atomEntry : feed.getEntries()) {
if ("findRequest".equals(atomEntry.getTitle())) {
findReqMsgUuid = atomEntry.getId().toString().replace("urn:uuid:", "");
}
}
Assert.assertNotNull(findReqMsgUuid);
// Get the full meta data for the derived Message
request = clientRequest("/s-ramp/wsdl/Message/" + findReqMsgUuid);
response = request.get(Entry.class);
entry = response.getEntity();
arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertNotNull(arty);
Assert.assertTrue(arty instanceof Message);
Message message = (Message) arty;
Assert.assertEquals("findRequest", message.getNCName());
Assert.assertEquals("http://ewittman.redhat.com/sample/2012/09/wsdl/sample.wsdl", message.getNamespace());
DocumentArtifactTarget relatedDocumentTarget = message.getRelatedDocument();
Assert.assertEquals(DocumentArtifactEnum.WSDL_DOCUMENT, relatedDocumentTarget.getArtifactType());
Assert.assertEquals(uuid, relatedDocumentTarget.getValue());
List<PartTarget> parts = message.getPart();
Assert.assertNotNull(parts);
Assert.assertEquals(1, parts.size());
Assert.assertEquals(PartEnum.PART, parts.get(0).getArtifactType());
Assert.assertNotNull(parts.get(0).getValue());
}
/**
* Tests the multi-part create scenario.
*/
@Test
public void testMultiPartCreate() {
String uuid = UUID.randomUUID().toString();
try {
ClientRequest request = clientRequest("/s-ramp/core/XmlDocument");
MultipartRelatedOutput output = new MultipartRelatedOutput();
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.setArtifactType(BaseArtifactEnum.XML_DOCUMENT);
xmlDocument.setCreatedBy("kurt");
xmlDocument.setDescription("In depth description of this XML document");
xmlDocument.setName("PO.xml");
xmlDocument.setUuid(uuid);
xmlDocument.setVersion("1.0");
Entry atomEntry = new Entry();
Artifact arty = new Artifact();
arty.setXmlDocument(xmlDocument);
atomEntry.setAnyOtherJAXBObject(arty);
MediaType mediaType = new MediaType("application", "atom+xml");
output.addPart(atomEntry, mediaType);
String artifactFileName = "PO.xml";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/core/" + artifactFileName);
MediaType mediaType2 = new MediaType("application", "xml");
output.addPart(contentStream, mediaType2);
request.body(MultipartConstants.MULTIPART_RELATED, output);
ClientResponse<Entry> response = request.post(Entry.class);
//
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
Artifact artifact = entry.getAnyOtherJAXBObject(Artifact.class);
Assert.assertEquals(uuid,artifact.getXmlDocument().getUuid());
Long size = artifact.getXmlDocument().getContentSize();
Assert.assertTrue(size >= 825L);
Assert.assertEquals(artifactFileName, artifact.getXmlDocument().getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
/**
* Tests adding an artifact without a slug.
* @throws Exception
*/
@Test
public void testCreateNoSlug() throws Exception {
// Add the PDF to the repository
String artifactFileName = "sample.wsdl";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/wsdl/" + artifactFileName);
try {
ClientRequest request = clientRequest("/s-ramp/wsdl/WsdlDocument");
request.body("application/xml", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals("newartifact.wsdl", entry.getTitle());
BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry);
Assert.assertTrue(arty instanceof WsdlDocument);
WsdlDocument doc = (WsdlDocument) arty;
Assert.assertEquals("newartifact.wsdl", doc.getName());
} finally {
IOUtils.closeQuietly(contentStream);
}
}
/**
* Tests that artifact derivation is happening.
* @throws Exception
*/
@Test
public void testArtifactDerivation() throws Exception {
// Add the PDF to the repository
String artifactFileName = "PO.xsd";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/xsd/" + artifactFileName);
ClientRequest request = null;
try {
request = clientRequest("/s-ramp/xsd/XsdDocument");
request.body("application/xml", contentStream);
ClientResponse<Entry> response = request.post(Entry.class);
response.getEntity();
} finally {
IOUtils.closeQuietly(contentStream);
}
// Now let's query for the derived artifacts
request = clientRequest("/s-ramp/xsd/ElementDeclaration");
ClientResponse<Feed> response = request.get(Feed.class);
Feed feed = response.getEntity();
Object totalResultsAttr = feed.getExtensionAttributes().get(ArtificerConstants.SRAMP_TOTAL_RESULTS_QNAME);
int total = Integer.parseInt(String.valueOf(totalResultsAttr));
Assert.assertEquals(2, total);
// TODO: This needs reworked. Depending on what other tests have run and what's in the repo, the query may
// return the max 100 entries and leave off what we're looking for. Query using the titles?
// Map<String, Entry> entryMap = new HashMap<String, Entry>();
// for (Entry entry : feed.getEntries()) {
// entryMap.put(entry.getTitle(), entry);
// }
// Entry purchaseOrder = entryMap.get("purchaseOrder");
// Assert.assertNotNull(purchaseOrder);
// Entry comment = entryMap.get("comment");
// Assert.assertNotNull(comment);
}
/**
* Does a full test of all the basic Artifact operations.
* @throws Exception
*/
@Test
public void testFullPurchaseOrderXSD() throws Exception {
// Add
Entry entry = doAddXsd();
URI entryId = entry.getId();
// Get
entry = doGetXsdEntry(entryId);
// Get artifact content
String content = doGetXsdContent(entryId);
verifyXsdContent(content);
// Update meta data
doUpdateXsdEntry(entry);
entry = doGetXsdEntry(entryId);
verifyEntryUpdated(entry);
deleteXsdEntry(entryId);
verifyEntryDeleted(entryId);
}
/**
* Adds an XSD to the repo by POSTing the content to /s-ramp/xsd/XsdDocument.
*/
private Entry doAddXsd() throws Exception {
// Making a client call to the actual XsdDocument implementation running in
// an embedded container.
ClientRequest request = clientRequest("/s-ramp/xsd/XsdDocument");
// read the XsdDocument from file
String artifactFileName = "PO.xsd";
InputStream POXsd = this.getClass().getResourceAsStream("/sample-files/xsd/" + artifactFileName);
String xmltext = TestUtils.convertStreamToString(POXsd);
POXsd.close();
request.header("Slug", artifactFileName);
request.body(MediaType.APPLICATION_XML, xmltext);
ClientResponse<Entry> response = request.post(Entry.class);
Entry entry = response.getEntity();
Assert.assertEquals(artifactFileName, entry.getTitle());
Artifact artifact = entry.getAnyOtherJAXBObject(Artifact.class);
Long size = artifact.getXsdDocument().getContentSize();
Assert.assertTrue(size >= 2376L);
Assert.assertEquals(artifactFileName, artifact.getXsdDocument().getName());
return entry;
}
/**
* GETs the Atom entry from the repository (to ensure we have the latest).
* @param entryId
* @throws Exception
*/
private Entry doGetXsdEntry(URI entryId) throws Exception {
String uuid = entryId.toString().replace("urn:uuid:", "");
ClientRequest request = clientRequest("/s-ramp/xsd/XsdDocument/" + uuid);
ClientResponse<Entry> response = request.get(Entry.class);
Entry entry = response.getEntity();
Artifact artifact = entry.getAnyOtherJAXBObject(Artifact.class);
Assert.assertNotNull(artifact.getXsdDocument());
return entry;
}
/**
* Gets the content for the artifact from the repo.
* @param entryId
* @throws Exception
*/
private String doGetXsdContent(URI entryId) throws Exception {
String uuid = entryId.toString().replace("urn:uuid:", "");
ClientRequest request = clientRequest("/s-ramp/xsd/XsdDocument/" + uuid + "/media");
ClientResponse<String> response = request.get(String.class);
return response.getEntity();
}
/**
* Verify that the content returned from the repo is right.
* @param content
* @throws IOException
*/
private void verifyXsdContent(String content) throws IOException {
Assert.assertNotNull(content);
String artifactFileName = "PO.xsd";
InputStream POXsd = this.getClass().getResourceAsStream("/sample-files/xsd/" + artifactFileName);
try {
String expectedContent = TestUtils.convertStreamToString(POXsd);
Assert.assertEquals(expectedContent, content);
} finally {
POXsd.close();
}
}
/**
* PUTs the Atom entry back into the repository (after making some changes).
* @param entry
* @throws Exception
*/
private void doUpdateXsdEntry(Entry entry) throws Exception {
// First, make a change to the entry.
XsdDocument xsdDocument = (XsdDocument) ArtificerAtomUtils.unwrapSrampArtifact(entry);
String uuid = xsdDocument.getUuid();
xsdDocument.setDescription("** Updated description! **");
ArtificerModelUtils.setCustomProperty(xsdDocument, "my.property", "Hello World");
Artifact arty = new Artifact();
arty.setXsdDocument(xsdDocument);
entry.setAnyOtherJAXBObject(arty);
// Now PUT the changed entry into the repo
ClientRequest request = clientRequest("/s-ramp/xsd/XsdDocument/" + uuid);
request.body(MediaType.APPLICATION_ATOM_XML_ENTRY, entry);
request.put(Void.class);
}
/**
* Verifies that the entry has been updated, by checking that the s-ramp extended
* Atom entry returned contains the classification and custom property set during
* the update phase of the test.
* @param entry
*/
private void verifyEntryUpdated(Entry entry) throws Exception {
Artifact srampArtifactWrapper = entry.getAnyOtherJAXBObject(Artifact.class);
XsdDocument xsdDocument = srampArtifactWrapper.getXsdDocument();
Assert.assertEquals("** Updated description! **", xsdDocument.getDescription());
Assert.assertEquals("Hello World", ArtificerModelUtils.getCustomProperty(xsdDocument, "my.property"));
Assert.assertNull(ArtificerModelUtils.getCustomProperty(xsdDocument, "my.missing.property"));
Assert.assertNull(ArtificerModelUtils.getGenericRelationship(xsdDocument, "MissingRel"));
}
/**
* Confirms that the content was updated.
* @param content
* @throws IOException
*/
private void verifyContentUpdated(String content) throws IOException {
Assert.assertNotNull(content);
InputStream xsdStream = this.getClass().getResourceAsStream("/sample-files/xsd/PO-updated.xsd");
try {
String expectedContent = TestUtils.convertStreamToString(xsdStream);
Assert.assertEquals(expectedContent, content);
} finally {
xsdStream.close();
}
}
/**
* Delete the XSD entry with the given uuid.
* @param entryId
* @throws Exception
*/
private void deleteXsdEntry(URI entryId) throws Exception {
String uuid = entryId.toString().replace("urn:uuid:", "");
ClientRequest request = clientRequest("/s-ramp/xsd/XsdDocument/" + uuid);
request.delete(Void.class);
}
/**
* Verify that the artifact was really deleted.
* @throws Exception
*/
private void verifyEntryDeleted(URI entryId) throws Exception {
String uuid = entryId.toString().replace("urn:uuid:", "");
ClientRequest request = clientRequest("/s-ramp/xsd/XsdDocument/" + uuid);
try {
request.get(String.class);
Assert.fail("Expected an 'Artifact not found.' error here.");
} catch (ArtificerServerException e) {
Assert.assertTrue(e.getMessage().contains("No artifact found"));
}
}
}