/**
 * Licensed to jclouds, Inc. (jclouds) under one or more
 * contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 *(Link.builder().regarding copyright ownership.  jclouds 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(Link.builder().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.jclouds.vcloud.director.v1_5.features;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.fail;

import java.net.URI;

import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.Error;
import org.jclouds.vcloud.director.v1_5.domain.File;
import org.jclouds.vcloud.director.v1_5.domain.Link;
import org.jclouds.vcloud.director.v1_5.domain.Media;
import org.jclouds.vcloud.director.v1_5.domain.Media.ImageType;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.Owner;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest;
import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
import org.testng.annotations.Test;

import com.google.common.collect.ImmutableSet;

/**
 * Test the {@link MediaApi} via its side effects.
 * 
 * @author danikov
 */
@Test(groups = { "unit", "user" }, singleThreaded = true, testName = "MediaApiExpectTest")
public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
   
   @Test
   public void testAddMedia() {
      URI uploadLink = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media")
               .acceptMedia(VCloudDirectorMediaType.MEDIA)
               .xmlFilePayload("/media/addMediaSource.xml", VCloudDirectorMediaType.MEDIA)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/addMedia.xml", VCloudDirectorMediaType.MEDIA)
               .httpResponseBuilder().statusCode(201).build());
      
      Media source = Media.builder()
         .size(0)
         .imageType(ImageType.ISO)
         .name("Test media 1")
         .type("application/vnd.vmware.vcloud.media+xml")
         .description("Test media generated by testCreateMedia()")
         .build();
      Media expected = addMedia();
      
      assertEquals(api.getMediaApi().add(uploadLink, source), expected);
   }
   
   @Test
   public void testCloneMedia() {
      URI vdcURI = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneMedia")
               .acceptMedia(VCloudDirectorMediaType.MEDIA)
               .xmlFilePayload("/media/cloneMediaParams.xml", VCloudDirectorMediaType.CLONE_MEDIA_PARAMS)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/cloneMedia.xml", VCloudDirectorMediaType.MEDIA)
               .httpResponseBuilder().statusCode(201).build());
      
      CloneMediaParams params = CloneMediaParams.builder()
         .name("moved test media")
         .description("moved by testCloneMedia()")
         .source(Reference.builder()
               .type("application/vnd.vmware.vcloud.media+xml")
               .name("copied test media")
               .href(URI.create("https://mycloud.greenhousedata.com/api/media/da8361af-cccd-4103-a71c-493513c49094"))
               .build())
         .isSourceDelete(false)
         .build();
      Media expected = cloneMedia();
      
      assertEquals(api.getMediaApi().clone(vdcURI, params), expected);
   }
   
   @Test
   public void testGetMedia() {
      URI mediaUri = URI.create(endpoint + "/media/794eb334-754e-4917-b5a0-5df85cbd61d1");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/media.xml", VCloudDirectorMediaType.MEDIA)
               .httpResponseBuilder().build());
      
      Media expected = getMedia();
      assertEquals(api.getMediaApi().get(mediaUri), expected);
   }
   
   @Test
   public void testResponse400ForInvalidMedia() {
      URI mediaUri = URI.create(endpoint + "/media/NOTAUUID");
 
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/media/NOTAUUID")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/error400.xml", VCloudDirectorMediaType.ERROR)
               .httpResponseBuilder().statusCode(400).build());
 
      Error expected = Error.builder()
            .message("validation error on field 'id': String value has invalid format or length")
            .majorErrorCode(400)
            .minorErrorCode("BAD_REQUEST")
            .build();
       
      try {
         api.getMediaApi().get(mediaUri);
         fail("Should give HTTP 400 error");
      } catch (VCloudDirectorException vde) {
         assertEquals(vde.getError(), expected);
      } catch (Exception e) {
         fail("Should have thrown a VCloudDirectorException", e);
      }
   }
 
   @Test
   public void testNullResponseForCatalogIdUsedAsMediaId() {
      URI mediaUri = URI.create(endpoint + "/media/e9cd3387-ac57-4d27-a481-9bee75e0690f");
 
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/media/e9cd3387-ac57-4d27-a481-9bee75e0690f")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/error403-catalog.xml", VCloudDirectorMediaType.ERROR)
               .httpResponseBuilder().statusCode(403).build());
 
      assertNull(api.getMediaApi().get(mediaUri));
   }
 
   @Test
   public void testResponse403ForFakeMediaId() {
      URI mediaUri = URI.create(endpoint + "/media/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
 
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/media/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/error403-fake.xml", VCloudDirectorMediaType.ERROR)
               .httpResponseBuilder().statusCode(403).build());
 
      assertNull(api.getMediaApi().get(mediaUri));
   }
   
   @Test
   public void testEditMedia() {
      URI mediaUri = URI.create(endpoint + "/media/794eb334-754e-4917-b5a0-5df85cbd61d1");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
            new VcloudHttpRequestPrimer()
               .apiCommand("PUT", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1")
               .xmlFilePayload("/media/editMedia.xml", VCloudDirectorMediaType.MEDIA)
               .acceptMedia(VCloudDirectorMediaType.TASK)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/editMediaTask.xml", VCloudDirectorMediaType.TASK)
               .httpResponseBuilder().build());
      
      Media edit = editMedia();
      Task expected = editMediaTask();
      
      assertEquals(api.getMediaApi().edit(mediaUri, edit), expected);
   }
   
   @Test
   public void testRemoveMedia() {
      URI mediaUri = URI.create(endpoint + "/media/794eb334-754e-4917-b5a0-5df85cbd61d1");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("DELETE", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1")
               .acceptMedia(VCloudDirectorMediaType.TASK)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/removeMediaTask.xml", VCloudDirectorMediaType.TASK)
               .httpResponseBuilder().build());
      
      Task expected = removeMediaTask();

      assertEquals(api.getMediaApi().remove(mediaUri), expected);
   }
   
   @Test
   public void testGetMetadata() {
      URI mediaUri = URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1/metadata")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/metadata.xml", VCloudDirectorMediaType.METADATA)
               .httpResponseBuilder().build());
      
      
      Metadata expected = metadata();

      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).get(), expected);
   }
   
   @Test
   public void testMergeMetadata() {
      URI mediaUri = URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1/metadata")
               .xmlFilePayload("/media/mergeMetadata.xml", VCloudDirectorMediaType.METADATA)
               .acceptMedia(VCloudDirectorMediaType.TASK)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/mergeMetadataTask.xml", VCloudDirectorMediaType.TASK)
               .httpResponseBuilder().build());
      
      Metadata inputMetadata = metadata();
      Task expectedTask = mergeMetadataTask();

      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).putAll(inputMetadata), expectedTask);
   }
   
   public void testGetMetadataValue() {
      URI mediaUri = URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1/metadata/key")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/metadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE)
               .httpResponseBuilder().build());
     
      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).get("key"), "value");
   }
   
   @Test
   public void testSetMetadataValue() {
      URI mediaUri = URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("PUT", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1/metadata/key")
               .xmlFilePayload("/media/setMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE)
               .acceptMedia(VCloudDirectorMediaType.TASK)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/setMetadataValueTask.xml", VCloudDirectorMediaType.TASK)
               .httpResponseBuilder().build());
            
      Task expectedTask = setMetadataEntryTask();

      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).put("key", "value"), expectedTask);
   }
   
   @Test
   public void testRemoveMetadataValue() {
      URI mediaUri = URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("DELETE", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1/metadata/key")
               .acceptMedia(VCloudDirectorMediaType.TASK)
               .httpRequestBuilder().build(),
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/removeMetadataEntryTask.xml", VCloudDirectorMediaType.TASK)
               .httpResponseBuilder().build());
      
      Task expectedTask = removeTask();

      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).remove("key"), expectedTask);
   }
   
   @Test
   public void testGetOwner() {
      URI mediaUri = URI.create(endpoint + "/media/794eb334-754e-4917-b5a0-5df85cbd61d1");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1/owner")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/owner.xml", VCloudDirectorMediaType.OWNER)
               .httpResponseBuilder().build());
      
      Owner expected = owner().toBuilder()
               .link(Link.builder()
                        .rel("up")
                        .type("application/vnd.vmware.vcloud.media+xml")
                        .href(URI.create("https://mycloud.greenhousedata.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
                        .build())
               .build();
      
      assertEquals(api.getMediaApi().getOwner(mediaUri), expected);
   }
   
   static Media addMedia() {
      return Media.builder()
         .size(0)
         .imageType(ImageType.ISO)
         .status(0)
         .name("Test media 1")
         .id("urn:vcloud:media:d51b0b9d-099c-499f-97f8-4fbe40ba06d7")
         .type("application/vnd.vmware.vcloud.media+xml")
         .description("Test media generated by testCreateMedia()")
         .href(URI.create("https://mycloud.greenhousedata.com/api/media/d51b0b9d-099c-499f-97f8-4fbe40ba06d7"))
         .link(Link.builder()
            .rel("up")
            .type("application/vnd.vmware.vcloud.vdc+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"))
            .build())
         .link(Link.builder()
            .rel("remove")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/d51b0b9d-099c-499f-97f8-4fbe40ba06d7"))
            .build())
         .files(ImmutableSet.of(File.builder()
               .size(0l)
               .bytesTransferred(0l)
               .name("file")
               .link(Link.builder()
                  .rel("upload:default")
                  .href(URI.create("https://mycloud.greenhousedata.com:443/transfer/b1fdf2d0-feff-4414-a8d1-3a8d86c4ccc5/file"))
                  .build())
               .build()))
         .owner(owner())
         .build();
   }
   
   static Media cloneMedia() {
      return Media.builder()
         .size(175163392)
         .imageType(ImageType.ISO)
         .status(0)
         .name("copied test media-copy-671136ae-b8f0-4389-bca6-50e9c42268f2")
         .id("urn:vcloud:media:a6b023f2-7f90-4e89-a24d-56e0eba83a5a")
         .type("application/vnd.vmware.vcloud.media+xml")
         .href(URI.create("https://mycloud.greenhousedata.com/api/media/a6b023f2-7f90-4e89-a24d-56e0eba83a5a"))
         .link(Link.builder()
            .rel("up")
            .type("application/vnd.vmware.vcloud.vdc+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"))
            .build())
         .link(Link.builder()
            .rel("remove")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/a6b023f2-7f90-4e89-a24d-56e0eba83a5a"))
            .build())
         .description("copied by testCloneMedia()")
         .tasks(ImmutableSet.<Task>builder()
            .add(Task.builder()
                .status("running")
                .startTime(dateService.iso8601DateParse("2012-03-02T04:58:48.754-07:00"))
                .operationName("vdcCopyMedia")
                .operation("Copying Media File copied test media-copy-671136ae-b8f0-4389-bca6-50e9c42268f2(a6b023f2-7f90-4e89-a24d-56e0eba83a5a)")
                .expiryTime(dateService.iso8601DateParse("2012-05-31T04:58:48.754-06:00"))
                .name("task")
                .id("urn:vcloud:task:7e4f6baf-7ef0-43ea-93cc-62cc329afb5d")
                .type("application/vnd.vmware.vcloud.task+xml")
                .href(URI.create("https://mycloud.greenhousedata.com/api/task/7e4f6baf-7ef0-43ea-93cc-62cc329afb5d"))
                .link(Link.builder()
                   .rel("task:cancel")
                   .href(URI.create("https://mycloud.greenhousedata.com/api/task/7e4f6baf-7ef0-43ea-93cc-62cc329afb5d/action/cancel"))
                   .build())
                .owner(Reference.builder()
                   .type("application/vnd.vmware.vcloud.media+xml")
                   .name("copied test media-copy-671136ae-b8f0-4389-bca6-50e9c42268f2")
                   .href(URI.create("https://mycloud.greenhousedata.com/api/media/a6b023f2-7f90-4e89-a24d-56e0eba83a5a"))
                   .build())
                .user(Reference.builder()
                   .type("application/vnd.vmware.admin.user+xml")
                   .name("acole")
                   .href(URI.create("https://mycloud.greenhousedata.com/api/admin/user/c090335b-708c-4c1c-9e3d-89560d002120"))
                   .build())
                .org(Reference.builder()
                   .type("application/vnd.vmware.vcloud.org+xml")
                   .name("cloudsoft")
                   .href(URI.create("https://mycloud.greenhousedata.com/api/org/c076f90a-397a-49fa-89b8-b294c1599cd0"))
                   .build())
                .build())
             .build())
         .owner(owner())
         .build();
   }
   
   private static Media getMedia() {
      return Media.builder()
         .size(175163392)
         .imageType(ImageType.ISO)
         .status(1)
         .name("DansTestMedia")
         .id("urn:vcloud:media:794eb334-754e-4917-b5a0-5df85cbd61d1")
         .href(URI.create("https://mycloud.greenhousedata.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
         .link(Link.builder()
               .rel("up")
               .type("application/vnd.vmware.vcloud.vdc+xml")
               .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"))
               .build())
         .link(Link.builder()
            .rel("catalogItem")
            .type("application/vnd.vmware.vcloud.catalogItem+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/catalogItem/1979d680-304e-4118-9283-9210c3b3ed8d"))
            .build())
         .link(Link.builder()
            .rel("remove")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
            .build())
         .link(Link.builder()
            .rel("edit")
            .type("application/vnd.vmware.vcloud.media+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
            .build())
         .link(Link.builder()
            .rel("down")
            .type("application/vnd.vmware.vcloud.owner+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1/owner"))
            .build())
         .link(Link.builder()
            .rel("down")
            .type("application/vnd.vmware.vcloud.metadata+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1/metadata"))
            .build())
         .type("application/vnd.vmware.vcloud.media+xml")
         .description("Windows 2003 R2 Disk2 Standard 32bit & 64bit")
         .owner(owner())
         .build();
   }
   
   private static Media editMedia() {
      return Media.builder()
         .size(175163392)
         .imageType(ImageType.ISO)
         .status(1)
         .name("new testMedia1")
         .id("urn:vcloud:media:c93e5cdc-f29a-4749-8ed2-093df04cc75e")
         .type("application/vnd.vmware.vcloud.media+xml")
         .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e"))
         .link(Link.builder()
            .rel("up")
            .type("application/vnd.vmware.vcloud.vdc+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"))
            .build())
         .link(Link.builder()
            .rel("catalogItem")
            .type("application/vnd.vmware.vcloud.catalogItem+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/catalogItem/1b317eb9-0e25-429a-ada2-3c7a74a0367b"))
            .build())
         .link(Link.builder()
            .rel("remove")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e"))
            .build())
         .link(Link.builder()
            .rel("edit")
            .type("application/vnd.vmware.vcloud.media+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e"))
            .build())
         .link(Link.builder()
            .rel("down")
            .type("application/vnd.vmware.vcloud.owner+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/owner"))
            .build())
         .link(Link.builder()
            .rel("down")
            .type("application/vnd.vmware.vcloud.metadata+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata"))
            .build())
         .description("new test description")
         .owner(Owner.builder()
            .type("application/vnd.vmware.vcloud.owner+xml")
            .user(Reference.builder()
               .type("application/vnd.vmware.admin.user+xml")
               .name("dan")
               .href(URI.create("https://mycloud.greenhousedata.com/api/admin/user/7818d31c-df33-4d77-9bbc-0a0741cf3d44"))
               .build())
            .build())
         .build();
   }
   
   private static Task editMediaTask() {
      return Task.builder()
            .name("task")
            .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
            .type("application/vnd.vmware.vcloud.task+xml")
            .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
            .status("running")
            .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
            .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
            .operationName("mediaUpdate")
            .operation("Updating Media (794eb334-754e-4917-b5a0-5df85cbd61d1)")
            .link(Link.builder()
                  .rel("task:cancel")
                  .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
                  .build())
            .owner(Reference.builder()
                  .type("application/vnd.vmware.vcloud.media+xml")
                  .name("")
                  .href(URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
                  .build())
            .user(Reference.builder()
                  .type("application/vnd.vmware.admin.user+xml")
                  .name("adk@cloudsoftcorp.com")
                  .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
                  .build())
            .org(Reference.builder()
                  .type("application/vnd.vmware.vcloud.org+xml")
                  .name("JClouds")
                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
                  .build())
            .build();
   }
   
   public static Task removeMediaTask() {
      return Task.builder()
         .name("task")
         .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
         .type("application/vnd.vmware.vcloud.task+xml")
         .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
         .status("running")
         .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
         .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
         .operationName("vdcDeleteMedia")
         .operation("Deleting Media File (794eb334-754e-4917-b5a0-5df85cbd61d1)")
         .link(Link.builder()
               .rel("task:cancel")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
               .build())
         .owner(Reference.builder()
               .type("application/vnd.vmware.vcloud.media+xml")
               .name("")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
               .build())
         .user(Reference.builder()
               .type("application/vnd.vmware.admin.user+xml")
               .name("adk@cloudsoftcorp.com")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
               .build())
         .org(Reference.builder()
               .type("application/vnd.vmware.vcloud.org+xml")
               .name("JClouds")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
               .build())
         .build();
   }
   
   private static Owner owner() {
      return Owner.builder()
      .type("application/vnd.vmware.vcloud.owner+xml")
      .user(Reference.builder()
         .type("application/vnd.vmware.admin.user+xml")
         .name("acole")
         .href(URI.create("https://mycloud.greenhousedata.com/api/admin/user/c090335b-708c-4c1c-9e3d-89560d002120"))
         .build())
      .build();
   }
   
   private static Metadata metadata() {
      return Metadata.builder()
         .type("application/vnd.vmware.vcloud.metadata+xml")
         .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata"))
         .link(Link.builder()
            .rel("up")
            .type("application/vnd.vmware.vcloud.media+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.metadata+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata"))
            .build())
         .entry(MetadataEntry.builder()
             .type("application/vnd.vmware.vcloud.metadata.value+xml")
             .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata/key"))
             .link(Link.builder()
               .rel("up")
               .type("application/vnd.vmware.vcloud.metadata+xml")
               .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata"))
               .build())
            .link(Link.builder()
               .rel("edit")
               .type("application/vnd.vmware.vcloud.metadata.value+xml")
               .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata/key"))
               .build())
             .link(Link.builder()
               .rel("remove")
               .href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata/key"))
               .build())
             .key("key").value("value").build())
         .build();
   }
   
   private Task mergeMetadataTask() {
      return Task.builder()
         .status("running")
         .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
         .operationName("metadataUpdate")
         .operation("Updating metadata for Media File (794eb334-754e-4917-b5a0-5df85cbd61d1)")
         .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
         .name("task")
         .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
         .type("application/vnd.vmware.vcloud.task+xml")
         .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
         .link(Link.builder()
            .rel("task:cancel")
            .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
            .build())
         .owner(Reference.builder()
            .type("application/vnd.vmware.vcloud.media+xml")
            .name("")
            .href(URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
            .build())
         .user(Reference.builder()
               .type("application/vnd.vmware.admin.user+xml")
               .name("adk@cloudsoftcorp.com")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
               .build())
         .org(Reference.builder()
               .type("application/vnd.vmware.vcloud.org+xml")
               .name("JClouds")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
               .build())
         .build();
   }
   
   private Task setMetadataEntryTask() {
      return Task.builder()
         .status("running")
         .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
         .operationName("metadataUpdate")
         .operation("Updating metadata for Media File (794eb334-754e-4917-b5a0-5df85cbd61d1)")
         .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
         .name("task")
         .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
         .type("application/vnd.vmware.vcloud.task+xml")
         .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
         .link(Link.builder()
            .rel("task:cancel")
            .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
            .build())
         .owner(Reference.builder()
            .type("application/vnd.vmware.vcloud.media+xml")
            .name("")
            .href(URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
            .build())
         .user(Reference.builder()
               .type("application/vnd.vmware.admin.user+xml")
               .name("adk@cloudsoftcorp.com")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
               .build())
         .org(Reference.builder()
               .type("application/vnd.vmware.vcloud.org+xml")
               .name("JClouds")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
               .build())
         .build();
   }
   
   public static Task removeTask() {
      return Task.builder()
         .name("task")
         .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
         .type("application/vnd.vmware.vcloud.task+xml")
         .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
         .status("running")
         .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
         .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
         .operationName("metadataDelete")
         .operation("Deleting metadata for Media File (794eb334-754e-4917-b5a0-5df85cbd61d1)")
         .link(Link.builder()
               .rel("task:cancel")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
               .build())
         .owner(Reference.builder()
               .type("application/vnd.vmware.vcloud.media+xml")
               .name("")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
               .build())
         .user(Reference.builder()
               .type("application/vnd.vmware.admin.user+xml")
               .name("adk@cloudsoftcorp.com")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
               .build())
         .org(Reference.builder()
               .type("application/vnd.vmware.vcloud.org+xml")
               .name("JClouds")
               .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
               .build())
         .build();
   }
}
