Exemplo n.º 1
0
  @Test
  public void testCreateArtifact() throws Exception {
    prepare(CreateArtifactCommand.class);

    // failure tests
    pushToOutput("createArtifact --type ComplexTypeDeclaration --name FooName");
    Assert.assertTrue(
        stream.toString().contains("The artifact you are trying to create is a derived artifact"));
    pushToOutput("createArtifact --type XmlDocument --name FooName");
    Assert.assertTrue(
        stream.toString().contains("The artifact you are trying to create is a document artifact"));

    // the initial create needs to return an artifact, its then used to set the context
    BaseArtifactType extendedArtifact =
        ArtifactType.ExtendedArtifactType("FooType").newArtifactInstance();
    extendedArtifact.setName("FooName");
    Mockito.when(clientMock.createArtifact(Mockito.any(BaseArtifactType.class)))
        .thenReturn(extendedArtifact);

    // success tests
    pushToOutput("createArtifact --type FooType --name FooName --description FooDescription");
    ArgumentCaptor<BaseArtifactType> artifact = ArgumentCaptor.forClass(BaseArtifactType.class);
    Mockito.verify(clientMock, Mockito.times(1)).createArtifact(artifact.capture());
    Assert.assertEquals("FooName", artifact.getValue().getName());
    Assert.assertEquals("FooDescription", artifact.getValue().getDescription());
    Assert.assertEquals("FooType", ArtifactType.valueOf(artifact.getValue()).getExtendedType());

    // ensure it was set as the current artifact in the context
    Assert.assertEquals("FooName", getAeshContext().getCurrentArtifact().getName());
  }
  @Override
  public ArtifactBuilder buildArtifacts(
      BaseArtifactType primaryArtifact, ArtifactContent artifactContent) throws IOException {
    super.buildArtifacts(primaryArtifact, artifactContent);

    ClassParser parser = new ClassParser(getContentStream(), primaryArtifact.getName());
    JavaClass javaClass = parser.parse();
    if (javaClass.isInterface()) {
      ((ExtendedDocument) primaryArtifact).setExtendedType(JavaModel.TYPE_JAVA_INTERFACE);
    } else if (javaClass.isClass()) {
      ((ExtendedDocument) primaryArtifact).setExtendedType(JavaModel.TYPE_JAVA_CLASS);
    } else if (javaClass.isEnum()) {
      ((ExtendedDocument) primaryArtifact).setExtendedType(JavaModel.TYPE_JAVA_ENUM);
    }
    String packageName = javaClass.getPackageName();
    String className = javaClass.getClassName();
    primaryArtifact.setName(className);
    String shortName = className;
    if (className.lastIndexOf('.') > 0) {
      shortName = className.substring(className.lastIndexOf('.') + 1);
    }
    SrampModelUtils.setCustomProperty(primaryArtifact, JavaModel.PROP_PACKAGE_NAME, packageName);
    SrampModelUtils.setCustomProperty(primaryArtifact, JavaModel.PROP_CLASS_NAME, shortName);

    return this;
  }
Exemplo n.º 3
0
  /**
   * Tests that we can update basic s-ramp meta data.
   *
   * @throws Exception
   */
  @Test
  public void testUpdateMetaData() throws Exception {
    // First, add an artifact to the repo
    String artifactFileName = "PO.xsd";
    InputStream POXsd =
        this.getClass().getResourceAsStream("/sample-files/xsd/" + artifactFileName);
    Document document = new Document();
    document.setName(artifactFileName);
    document.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT);
    BaseArtifactType artifact = persistenceManager.persistArtifact(document, POXsd);
    Assert.assertNotNull(artifact);
    log.info("persisted PO.xsd to JCR, returned artifact uuid=" + artifact.getUuid());
    Assert.assertEquals(XsdDocument.class, artifact.getClass());
    long size = ((DocumentArtifactType) artifact).getContentSize();
    Assert.assertTrue(
        size
            >= 2376L); // Not doing an equals here due to the vagaries of Windows vs *nix line
                       // endings
    Assert.assertEquals(artifactFileName, artifact.getName());

    // Now update the artifact
    artifact = persistenceManager.getArtifact(artifact.getUuid(), ArtifactType.XsdDocument());
    artifact.setName("My PO");
    artifact.setDescription("A new description of the PO.xsd artifact.");
    artifact.setVersion("2.0.13");
    persistenceManager.updateArtifact(artifact, ArtifactType.XsdDocument());

    // Now verify the meta-data was updated
    artifact = persistenceManager.getArtifact(artifact.getUuid(), ArtifactType.XsdDocument());
    Assert.assertEquals("My PO", artifact.getName());
    Assert.assertEquals("A new description of the PO.xsd artifact.", artifact.getDescription());
    Assert.assertEquals("2.0.13", artifact.getVersion());
  }
Exemplo n.º 4
0
  /**
   * Uploads a single deployment to S-RAMP.
   *
   * @param deploymentType
   * @param fileName
   * @param client
   * @param tempFile
   * @param responseParams
   * @param version
   * @throws Exception
   */
  private void uploadSingleDeployment(
      String deploymentType,
      String fileName,
      File tempFile,
      Map<String, String> responseParams,
      String version)
      throws Exception {
    ArtifactType at = ArtifactType.valueOf(deploymentType);
    if (at.isExtendedType()) {
      at = ArtifactType.ExtendedDocument(at.getExtendedType());
    }
    String uuid = null;
    // First, upload the deployment
    InputStream contentStream = null;
    try {
      contentStream = FileUtils.openInputStream(tempFile);
      BaseArtifactType artifact = at.newArtifactInstance();
      artifact.setName(fileName);
      artifact.setVersion(version);
      artifact = clientAccessor.getClient().uploadArtifact(artifact, contentStream);
      responseParams.put("model", at.getArtifactType().getModel()); // $NON-NLS-1$
      responseParams.put("type", at.getArtifactType().getType()); // $NON-NLS-1$
      responseParams.put("uuid", artifact.getUuid()); // $NON-NLS-1$
      uuid = artifact.getUuid();
    } finally {
      IOUtils.closeQuietly(contentStream);
    }

    // Try to expand the artifact (works if an expander is available for the given artifact type).
    ZipToSrampArchive j2sramp = null;
    SrampArchive archive = null;
    try {
      j2sramp = ZipToSrampArchiveRegistry.createExpander(at, tempFile);
      if (j2sramp != null) {
        j2sramp.setContextParam(DefaultMetaDataFactory.PARENT_UUID, uuid);
        archive = j2sramp.createSrampArchive();
        clientAccessor.getClient().uploadBatch(archive);
      }
    } finally {
      SrampArchive.closeQuietly(archive);
      ZipToSrampArchive.closeQuietly(j2sramp);
    }
  }
Exemplo n.º 5
0
  private String uploadArtifact(MavenMetaData metadata, InputStream content)
      throws MavenRepositoryException {
    String uuid = null;
    if (content == null) {
      throw new MavenRepositoryException(
          Messages.i18n.format("maven.resource.upload.no.content")); // $NON-NLS-1$
    }
    String fileName = metadata.getFileName();
    PersistenceManager persistenceManager = PersistenceFactory.newInstance();

    // We need to query firstly to check if there is an existing item. If
    // there is an existing item, then it would be updated
    // Adding the criterias and parameters
    List<String> criteria = new ArrayList<String>();
    List<Object> parameters = new ArrayList<Object>();
    criteria.add("@maven.artifactId = ?"); // $NON-NLS-1$
    criteria.add("@maven.groupId = ?"); // $NON-NLS-1$
    criteria.add("@maven.type = ?"); // $NON-NLS-1$

    parameters.add(metadata.getArtifactId());
    parameters.add(metadata.getGroupId());
    if (StringUtils.isNotBlank(metadata.getParentType())) {
      parameters.add(metadata.getParentType());
    } else {
      parameters.add(metadata.getType());
    }

    if (StringUtils.isNotBlank(metadata.getVersion())) {
      criteria.add("@maven.version = ?"); // $NON-NLS-1$
      parameters.add(metadata.getVersion());
    } else {
      criteria.add("xp2:not(@maven.version)"); // $NON-NLS-1$
    }
    if (StringUtils.isNotBlank(metadata.getParentFileName())) {
      criteria.add("@name = ?"); // $NON-NLS-1$
      parameters.add(metadata.getParentFileName());
    }

    if (StringUtils.isNotBlank(metadata.getSnapshotId())) {
      criteria.add("@maven.snapshot.id = ?"); // $NON-NLS-1$
      parameters.add(metadata.getSnapshotId());
    } else {
      criteria.add("xp2:not(@maven.snapshot.id)"); // $NON-NLS-1$
    }

    ArtifactSet artifactSet = null;
    BaseArtifactType baseArtifact = null;
    try {
      // Query the previous criterias
      artifactSet = query(criteria, parameters);
      if (artifactSet.size() >= 1) {
        // Found some content!
        baseArtifact = artifactSet.iterator().next();
      }
    } catch (SrampAtomException e) {
      throw new MavenRepositoryException(
          Messages.i18n.format("maven.resource.upload.sramp.query.error", metadata.toString()),
          e); //$NON-NLS-1$
    } finally {
      if (artifactSet != null) {
        artifactSet.close();
      }
    }
    if (MavenFileExtensionEnum.value(metadata.getType()) != null) {
      if (baseArtifact != null) {
        boolean update = false;
        ArtifactType artifactType = ArtifactType.valueOf(baseArtifact.getArtifactType());
        if (metadata.getType().equals(MavenFileExtensionEnum.HASH_MD5.getExtension())
            || metadata.getType().equals(MavenFileExtensionEnum.HASH_SHA1.getExtension())) {
          String content_value = ""; // $NON-NLS-1$
          try {
            content_value = IOUtils.toString(content);
          } catch (IOException e1) {
            throw new MavenRepositoryException(
                Messages.i18n.format("maven.resource.upload.sramp.error", metadata.toString()),
                e1); //$NON-NLS-1$
          }

          if (StringUtils.isNotBlank(content_value)) {
            if (metadata.getType().equals(MavenFileExtensionEnum.HASH_MD5.getExtension())) {
              SrampModelUtils.setCustomProperty(
                  baseArtifact, JavaModel.PROP_MAVEN_HASH_MD5, content_value);
              update = true;
            } else if (metadata.getType().equals(MavenFileExtensionEnum.HASH_SHA1.getExtension())) {
              SrampModelUtils.setCustomProperty(
                  baseArtifact, JavaModel.PROP_MAVEN_HASH_SHA1, content_value);
              update = true;
            }
            if (update) {

              try {
                persistenceManager.updateArtifact(baseArtifact, artifactType);
              } catch (SrampException e) {
                throw new MavenRepositoryException(
                    Messages.i18n.format("maven.resource.upload.sramp.error", metadata.toString()),
                    e); //$NON-NLS-1$
              }
            }
          }
        } else {
          try {
            persistenceManager.updateArtifactContent(baseArtifact.getUuid(), artifactType, content);
          } catch (SrampException e) {
            throw new MavenRepositoryException(
                Messages.i18n.format("maven.resource.upload.sramp.error", metadata.toString()),
                e); //$NON-NLS-1$
          }
        }
      }
    } else {
      BaseArtifactType persisted = null;
      // If there is an existing artifact in s-ramp it would be updaded
      // with the new content
      if (baseArtifact != null) {
        if (metadata.isSnapshotVersion()
            || metadata.getFileName().equals("maven-metadata.xml")) { // $NON-NLS-1$
          ArtifactType artifactType = ArtifactType.valueOf(baseArtifact);
          try {
            persistenceManager.updateArtifactContent(baseArtifact.getUuid(), artifactType, content);
          } catch (SrampException e) {
            throw new MavenRepositoryException(
                Messages.i18n.format(
                    "maven.resource.upload.sramp.update.content.error", //$NON-NLS-1$
                    baseArtifact.getUuid()),
                e);
          }
          persisted = baseArtifact;
        } else {
          throw new MavenRepositoryException(
              Messages.i18n.format(
                  "maven.resource.upload.sramp.release.artifact.exist", //$NON-NLS-1$
                  metadata.getFullName()));
        }

      } else {
        // we need to create a new artifact in s-ramp and persist the
        // content
        ArtifactType artifactType = determineArtifactType(fileName);
        BaseArtifactType baseArtifactType = artifactType.newArtifactInstance();
        try {
          persisted = persistenceManager.persistArtifact(baseArtifactType, content);
        } catch (SrampException e1) {
          throw new MavenRepositoryException(
              Messages.i18n.format("maven.resource.upload.sramp.new.content.error"),
              e1); //$NON-NLS-1$
        }
      }
      // Store the metadata to the persisted artifact
      SrampModelUtils.setCustomProperty(
          persisted, JavaModel.PROP_MAVEN_GROUP_ID, metadata.getGroupId());
      SrampModelUtils.setCustomProperty(
          persisted, JavaModel.PROP_MAVEN_ARTIFACT_ID, metadata.getArtifactId());
      SrampModelUtils.setCustomProperty(
          persisted, JavaModel.PROP_MAVEN_VERSION, metadata.getVersion());

      if (StringUtils.isNotBlank(metadata.getClassifier())) {
        SrampModelUtils.setCustomProperty(
            persisted, JavaModel.PROP_MAVEN_CLASSIFIER, metadata.getClassifier());
      }
      if (StringUtils.isNotBlank(metadata.getType())) {
        SrampModelUtils.setCustomProperty(persisted, JavaModel.PROP_MAVEN_TYPE, metadata.getType());
      }
      if (StringUtils.isNotBlank(metadata.getSnapshotId())) {
        SrampModelUtils.setCustomProperty(
            persisted, JavaModel.PROP_MAVEN_SNAPSHOT_ID, metadata.getSnapshotId());
      }
      try {
        // Persist the content size, because it will be required when
        // reading
        persisted
            .getOtherAttributes()
            .put(SrampConstants.SRAMP_CONTENT_SIZE_QNAME, content.available() + ""); // $NON-NLS-1$
      } catch (IOException e) {
        logger.error(""); // $NON-NLS-1$
      }

      persisted.setName(metadata.getFileName());
      ArtifactType artifactType = ArtifactType.valueOf(persisted);
      try {
        persistenceManager.updateArtifact(persisted, artifactType);
      } catch (SrampException e) {
        throw new MavenRepositoryException(
            Messages.i18n.format(
                "maven.resource.upload.sramp.update.content.metadata.error", //$NON-NLS-1$
                persisted.getUuid()),
            e);
      }
      uuid = persisted.getUuid();
    }

    return uuid;
  }
Exemplo n.º 6
0
  /**
   * Main.
   *
   * @param args
   */
  public static void main(String[] args) throws Exception {
    System.out.println("\n*** Running Artificer Query Demo ***\n");

    String endpoint = System.getProperty("artificer.endpoint");
    String username = System.getProperty("artificer.auth.username");
    String password = System.getProperty("artificer.auth.password");
    if (endpoint == null || endpoint.trim().length() == 0) {
      endpoint = DEFAULT_ENDPOINT;
    }
    if (username == null || username.trim().length() == 0) {
      username = DEFAULT_USER;
    }
    if (password == null || password.trim().length() == 0) {
      password = DEFAULT_PASSWORD;
    }
    System.out.println("Artificer Endpoint: " + endpoint);
    System.out.println("Artificer User: "******"/s-ramp[@from-demo = ?]")
            .parameter(PropertyDemo.class.getSimpleName())
            .count(1)
            .query();
    if (rs.size() > 0) {
      System.out.println("It looks like you already ran this demo!");
      System.out.println("I'm going to quit, because I don't want to clutter up");
      System.out.println("your repository with duplicate stuff.");
      System.exit(1);
    }

    // Before we do anything else, we need to upload some artifacts to the
    // Artificer repository.
    ArtifactType type = ArtifactType.valueOf("Document");
    System.out.print("Uploading two artifacts...");
    BaseArtifactType artifact1 =
        client.uploadArtifact(
            type,
            PropertyDemo.class.getResourceAsStream("property-demo-doc-1.txt"),
            "property-demo-doc-1.txt");
    BaseArtifactType artifact2 =
        client.uploadArtifact(
            type,
            PropertyDemo.class.getResourceAsStream("property-demo-doc-2.txt"),
            "property-demo-doc-2.txt");
    System.out.println("uploaded.");

    // And then we can change their names if we want!
    artifact1.setName("property-demo-document-1.txt");
    artifact2.setName("property-demo-document-2.txt");

    // Now, we can modify the artifacts by adding some custom properties to them.
    ArtificerModelUtils.setCustomProperty(artifact1, "property-demo", "true");
    ArtificerModelUtils.setCustomProperty(artifact1, "artifact-num", "one");
    ArtificerModelUtils.setCustomProperty(artifact1, "hello", "world");
    ArtificerModelUtils.setCustomProperty(artifact2, "property-demo", "true");
    ArtificerModelUtils.setCustomProperty(artifact2, "artifact-num", "two");
    ArtificerModelUtils.setCustomProperty(artifact2, "foo", "bar");

    // Also tag these artifacts as coming from this demo.
    ArtificerModelUtils.setCustomProperty(
        artifact1, "from-demo", PropertyDemo.class.getSimpleName());
    ArtificerModelUtils.setCustomProperty(
        artifact2, "from-demo", PropertyDemo.class.getSimpleName());

    // And now update both artifacts so that the repository knows about these
    // new properties.
    System.out.print("Updating (meta-data for) both artifacts...");
    client.updateArtifactMetaData(artifact1);
    client.updateArtifactMetaData(artifact2);
    System.out.println("updated.");

    // Next, fetch the artifact meta-data from the server and make sure the properties
    // we set above are really there.
    System.out.print("Re-fetching (meta-data for) both artifacts...");
    BaseArtifactType metaData1 = client.getArtifactMetaData(type, artifact1.getUuid());
    BaseArtifactType metaData2 = client.getArtifactMetaData(type, artifact2.getUuid());
    System.out.println("fetched.");
    if (metaData1.getProperty().size() < 3) {
      System.out.println("Properties not found on artifact 1!  Oh noes!");
      System.exit(1);
    } else {
      System.out.println("All properties accounted for (artifact 1)!");
    }
    if (metaData2.getProperty().size() < 3) {
      System.out.println("Properties not found on artifact 2!  Oh noes!");
      System.exit(1);
    } else {
      System.out.println("All properties accounted for (artifact 2)!");
    }

    // Now we know that adding properties works.  Note that of course you can also
    // remove properties and change their values, and that will work the same way
    // (just remember to call updateArtifactMetaData after you make changes).

    // The next thing I want to show you is how to query for artifacts in the
    // repository by their properties.  You can query by either base property or
    // by custom user property.
    String q = "/s-ramp/core/Document[@name = 'property-demo-document-1.txt']";
    QueryResultSet resultSet = client.query(q);
    if (resultSet.size() == 0) {
      System.out.println("Failed to find property-demo-document-1.txt!");
      System.exit(1);
    }
    // Find all of the documents with the 'property-demo' property set to 'true' (should
    // be all of them)
    q = "/s-ramp/core/Document[@property-demo = 'true']";
    resultSet = client.query(q);
    if (resultSet.size() == 0) {
      System.out.println("Failed to find document(s) with @property-demo set to 'true'!");
      System.exit(1);
    } else {
      System.out.println("Search 1 succeeded.");
    }
    long total = resultSet.size();
    // Find only the ones with 'artifact-num' set to 'one' (should be half of them)
    q = "/s-ramp/core/Document[@artifact-num = 'one']";
    resultSet = client.query(q);
    if (resultSet.size() == 0) {
      System.out.println("Failed to find document(s) with @artifact-num set to 'one'!");
      System.exit(1);
    }
    long ones = resultSet.size();
    if (!(total / 2 == ones)) {
      System.out.println("The wrong number of documents with @artifact-num set to 'one' found!");
      System.exit(1);
    } else {
      System.out.println("Search 2 succeeded.");
    }

    // All done.
    System.out.println("\n*** Demo Completed Successfully ***\n\n");
    Thread.sleep(3000);
  }
  @Test
  public void testZipPackage() throws Exception {
    ArtificerArchive archive = null;
    InputStream xsd1ContentStream = null;
    InputStream xsd2ContentStream = null;
    File zipFile = null;
    InputStream zipStream = null;
    ClientRequest request = null;

    try {
      // Create a test s-ramp archive
      archive = new ArtificerArchive();
      xsd1ContentStream = this.getClass().getResourceAsStream("/sample-files/xsd/PO.xsd");
      BaseArtifactType metaData = new XsdDocument();
      metaData.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT);
      metaData.setName("PO.xsd");
      archive.addEntry("schemas/PO.xsd", metaData, xsd1ContentStream);
      xsd2ContentStream = this.getClass().getResourceAsStream("/sample-files/xsd/XMLSchema.xsd");
      metaData = new XsdDocument();
      metaData.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT);
      metaData.setName("XMLSchema.xsd");
      metaData.setVersion("1.0");
      archive.addEntry("schemas/XMLSchema.xsd", metaData, xsd2ContentStream);

      zipFile = archive.pack();
      zipStream = FileUtils.openInputStream(zipFile);

      // Now POST the archive to the s-ramp repository (POST to /s-ramp as application/zip)
      request = clientRequest("/s-ramp");
      request.body(MediaType.APPLICATION_ZIP, zipStream);
      ClientResponse<MultipartInput> clientResponse = request.post(MultipartInput.class);

      // Process the response - it should be multipart/mixed with each part being
      // itself an http response with a code, content-id, and an s-ramp atom entry
      // body
      MultipartInput response = clientResponse.getEntity();
      List<InputPart> parts = response.getParts();
      Map<String, BaseArtifactType> artyMap = new HashMap<String, BaseArtifactType>();
      for (InputPart part : parts) {
        String id = part.getHeaders().getFirst("Content-ID");
        HttpResponseBean rbean = part.getBody(HttpResponseBean.class, null);
        Assert.assertEquals(201, rbean.getCode());
        Entry entry = (Entry) rbean.getBody();
        BaseArtifactType artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry);
        artyMap.put(id, artifact);
      }

      Assert.assertTrue(artyMap.keySet().contains("<schemas/PO.xsd@package>"));
      Assert.assertTrue(artyMap.keySet().contains("<schemas/XMLSchema.xsd@package>"));

      // Assertions for artifact 1
      BaseArtifactType arty = artyMap.get("<schemas/PO.xsd@package>");
      Assert.assertNotNull(arty);
      Assert.assertEquals("PO.xsd", arty.getName());
      Assert.assertNull(arty.getVersion());

      arty = artyMap.get("<schemas/XMLSchema.xsd@package>");
      Assert.assertNotNull(arty);
      Assert.assertEquals("XMLSchema.xsd", arty.getName());
      Assert.assertEquals("1.0", arty.getVersion());
    } finally {
      IOUtils.closeQuietly(xsd1ContentStream);
      IOUtils.closeQuietly(xsd2ContentStream);
      ArtificerArchive.closeQuietly(archive);
      IOUtils.closeQuietly(zipStream);
      FileUtils.deleteQuietly(zipFile);
    }

    // Verify by querying
    // Do a query using GET with query params
    request = clientRequest("/s-ramp/xsd/XsdDocument");
    ClientResponse<Feed> response = request.get(Feed.class);
    Feed feed = response.getEntity();
    Assert.assertEquals(2, feed.getEntries().size());
    Set<String> artyNames = new HashSet<String>();
    for (Entry entry : feed.getEntries()) {
      artyNames.add(entry.getTitle());
    }
    Assert.assertTrue(artyNames.contains("PO.xsd"));
    Assert.assertTrue(artyNames.contains("XMLSchema.xsd"));
  }
  /**
   * This also tests the zipPackage method of the {@link
   * org.artificer.server.atom.services.BatchResource} class, but it is more thorough. It tests
   * adding new content, updating existing content, etc.
   */
  @Test
  public void testZipPackage_Multi() throws Exception {
    ArtificerArchive archive = null;
    InputStream xsd1ContentStream = null;
    InputStream wsdlContentStream = null;
    File zipFile = null;
    InputStream zipStream = null;
    ClientRequest request = null;

    WsdlDocument wsdlDoc = createWsdlArtifact();
    XmlDocument xmlDoc = createXmlArtifact();

    String xsdUuid = null;
    String wsdlUuid = null;
    String xmlUuid = null;

    try {
      // Create a test s-ramp archive
      archive = new ArtificerArchive();

      // A new XSD document
      xsd1ContentStream = this.getClass().getResourceAsStream("/sample-files/xsd/PO.xsd");
      BaseArtifactType metaData = new XsdDocument();
      metaData.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT);
      metaData.setUuid(UUID.randomUUID().toString()); // will be ignored
      metaData.setName("PO.xsd");
      archive.addEntry("schemas/PO.xsd", metaData, xsd1ContentStream);
      // Update an existing WSDL document (content and meta-data)
      wsdlContentStream =
          this.getClass().getResourceAsStream("/sample-files/wsdl/sample-updated.wsdl");
      metaData = wsdlDoc;
      metaData.setVersion("2.0");
      ArtificerModelUtils.setCustomProperty(metaData, "foo", "bar");
      archive.addEntry("wsdl/sample.wsdl", metaData, wsdlContentStream);
      // Update an existing XML document (meta-data only)
      metaData = xmlDoc;
      metaData.setVersion("3.0");
      ArtificerModelUtils.setCustomProperty(metaData, "far", "baz");
      archive.addEntry("core/PO.xml", metaData, null);

      zipFile = archive.pack();
      zipStream = FileUtils.openInputStream(zipFile);

      // Now POST the archive to the s-ramp repository (POST to /s-ramp as application/zip)
      request = clientRequest("/s-ramp");
      request.body(MediaType.APPLICATION_ZIP, zipStream);
      ClientResponse<MultipartInput> clientResponse = request.post(MultipartInput.class);

      // Process the response - it should be multipart/mixed with each part being
      // itself an http response with a code, content-id, and an s-ramp atom entry
      // body
      MultipartInput response = clientResponse.getEntity();
      List<InputPart> parts = response.getParts();
      Map<String, HttpResponseBean> respMap = new HashMap<String, HttpResponseBean>();
      for (InputPart part : parts) {
        String id = part.getHeaders().getFirst("Content-ID");
        HttpResponseBean rbean = part.getBody(HttpResponseBean.class, null);
        respMap.put(id, rbean);
      }

      // Should be three responses.
      Assert.assertEquals(3, respMap.size());
      Assert.assertTrue(respMap.keySet().contains("<schemas/PO.xsd@package>"));
      Assert.assertTrue(respMap.keySet().contains("<wsdl/sample.wsdl@package>"));
      Assert.assertTrue(respMap.keySet().contains("<core/PO.xml@package>"));

      // Assertions for artifact 1 (PO.xsd)
      HttpResponseBean httpResp = respMap.get("<schemas/PO.xsd@package>");
      Assert.assertEquals(201, httpResp.getCode());
      Assert.assertEquals("Created", httpResp.getStatus());
      Entry entry = (Entry) httpResp.getBody();
      BaseArtifactType artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry);
      Assert.assertEquals("PO.xsd", artifact.getName());
      Assert.assertNull(artifact.getVersion());
      Long size = ((XsdDocument) artifact).getContentSize();
      Assert.assertTrue(size >= 2376L);
      xsdUuid = artifact.getUuid();

      // Assertions for artifact 2 (sample.wsdl)
      httpResp = respMap.get("<wsdl/sample.wsdl@package>");
      Assert.assertEquals(200, httpResp.getCode());
      Assert.assertEquals("OK", httpResp.getStatus());
      entry = (Entry) httpResp.getBody();
      artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry);
      Assert.assertEquals("sample.wsdl", artifact.getName());
      Assert.assertEquals("2.0", artifact.getVersion());
      wsdlUuid = artifact.getUuid();

      // Assertions for artifact 3 (PO.xml)
      httpResp = respMap.get("<core/PO.xml@package>");
      Assert.assertEquals(200, httpResp.getCode());
      Assert.assertEquals("OK", httpResp.getStatus());
      entry = (Entry) httpResp.getBody();
      artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry);
      Assert.assertEquals("PO.xml", artifact.getName());
      Assert.assertEquals("3.0", artifact.getVersion());
      xmlUuid = artifact.getUuid();
    } finally {
      IOUtils.closeQuietly(xsd1ContentStream);
      IOUtils.closeQuietly(wsdlContentStream);
      ArtificerArchive.closeQuietly(archive);
      IOUtils.closeQuietly(zipStream);
      FileUtils.deleteQuietly(zipFile);
    }

    // Verify by querying
    // Do a query using GET with query params
    Map<String, BaseArtifactType> artyMap = new HashMap<String, BaseArtifactType>();
    request = clientRequest("/s-ramp/xsd/XsdDocument");
    ClientResponse<Feed> response = request.get(Feed.class);
    Feed feed = response.getEntity();
    Assert.assertEquals(1, feed.getEntries().size());
    for (Entry entry : feed.getEntries()) {
      String uuid = entry.getId().toString().replace("urn:uuid:", "");
      request = clientRequest("/s-ramp/xsd/XsdDocument/" + uuid);
      BaseArtifactType artifact =
          ArtificerAtomUtils.unwrapSrampArtifact(request.get(Entry.class).getEntity());
      artyMap.put(artifact.getUuid(), artifact);
    }
    request = clientRequest("/s-ramp/wsdl/WsdlDocument");
    response = request.get(Feed.class);
    feed = response.getEntity();
    Assert.assertEquals(1, feed.getEntries().size());
    for (Entry entry : feed.getEntries()) {
      String uuid = entry.getId().toString().replace("urn:uuid:", "");
      request = clientRequest("/s-ramp/wsdl/WsdlDocument/" + uuid);
      BaseArtifactType artifact =
          ArtificerAtomUtils.unwrapSrampArtifact(request.get(Entry.class).getEntity());
      artyMap.put(artifact.getUuid(), artifact);
    }
    request = clientRequest("/s-ramp/core/XmlDocument");
    response = request.get(Feed.class);
    feed = response.getEntity();
    Assert.assertEquals(1, feed.getEntries().size());
    for (Entry entry : feed.getEntries()) {
      String uuid = entry.getId().toString().replace("urn:uuid:", "");
      request = clientRequest("/s-ramp/core/XmlDocument/" + uuid);
      BaseArtifactType artifact =
          ArtificerAtomUtils.unwrapSrampArtifact(request.get(Entry.class).getEntity());
      artyMap.put(artifact.getUuid(), artifact);
    }

    Assert.assertEquals(3, artyMap.size());

    // Assertions for artifact 1 (PO.xsd)
    BaseArtifactType artifact = artyMap.get(xsdUuid);
    Assert.assertEquals("PO.xsd", artifact.getName());
    Assert.assertNull(artifact.getVersion());

    // Assertions for artifact 2 (sample.wsdl)
    artifact = artyMap.get(wsdlUuid);
    Assert.assertEquals("sample.wsdl", artifact.getName());
    Assert.assertEquals("2.0", artifact.getVersion());

    // Assertions for artifact 3 (PO.xml)
    artifact = artyMap.get(xmlUuid);
    Assert.assertEquals("PO.xml", artifact.getName());
    Assert.assertEquals("3.0", artifact.getVersion());
  }