/**
   * Static method that converts the persistence {@link VirtualMachine} object to transfer {@link
   * VirtualMachineDto} object. It also adds REST self-discover {@link RESTLink}s
   *
   * @param vm Input persistence object.
   * @param restBuilder Context-injected {@link RESTLink} builder to create the links.
   * @return the corresponding transfer object.
   * @throws Exception Serialization unhandled exception.
   */
  public static VirtualMachineDto createTransferObject(
      final Integer datacenterId,
      final Integer rackId,
      final Integer machineId,
      final VirtualMachine vm,
      final VirtualAppliance vapp,
      final IRESTBuilder restBuilder)
      throws Exception {
    // TODO: Try with enterprise and user != null
    VirtualMachineDto vmDto =
        ModelTransformer.transportFromPersistence(VirtualMachineDto.class, vm);
    if (vm.getIdType() == 0) {
      vmDto.setIdType(com.abiquo.server.core.cloud.VirtualMachine.NOT_MANAGED);
    } else {
      vmDto.setIdType(com.abiquo.server.core.cloud.VirtualMachine.MANAGED);
    }
    Integer enterpriseId = null;
    Integer userId = null;

    if (vm.getEnterprise() != null) {
      enterpriseId = vm.getEnterprise().getId();
    }
    if (vm.getUser() != null) {
      userId = vm.getUser().getId();
    }
    vmDto.setLinks(
        restBuilder.buildVirtualMachineAdminLinks(
            datacenterId,
            rackId,
            machineId,
            enterpriseId,
            userId,
            vm.getHypervisor().getType(),
            vapp,
            vm.getId()));

    final VirtualMachineTemplate vmtemplate = vm.getVirtualMachineTemplate();
    if (vmtemplate != null) {
      if (vmtemplate.getRepository() != null) {
        vmDto.addLink(
            restBuilder.buildVirtualMachineTemplateLink(
                vmtemplate.getEnterprise().getId(),
                vmtemplate.getRepository().getDatacenter().getId(),
                vmtemplate.getId()));
      } else {
        // imported virtual machines
        vmDto.addLink(
            restBuilder.buildVirtualMachineTemplateLink(
                vmtemplate.getEnterprise().getId(),
                vm.getHypervisor().getMachine().getRack().getDatacenter().getId(),
                vmtemplate.getId()));
      }
    }
    return vmDto;
  }
  public static IpPoolManagementDto createTransferObject(
      final IpPoolManagement ip, final IRESTBuilder restBuilder) throws Exception {
    IpPoolManagementDto dto =
        ModelTransformer.transportFromPersistence(IpPoolManagementDto.class, ip);

    // Create the links to the resources where the IP object is assigned to
    dto.addLinks(restBuilder.buildIpRasdLinks(ip));
    dto.addLinks(restBuilder.buildRasdLinks(ip));

    return dto;
  }
  @GET
  public IpsPoolManagementDto getIPAddresses(
      @PathParam(VirtualDatacenterResource.VIRTUAL_DATACENTER) final Integer vdcId,
      @PathParam(PrivateNetworkResource.PRIVATE_NETWORK) final Integer vlanId,
      @QueryParam(START_WITH) @DefaultValue("0") @Min(0) final Integer startwith,
      @QueryParam(BY) @DefaultValue("ip") final String orderBy,
      @QueryParam(FILTER) @DefaultValue("") final String filter,
      @QueryParam(LIMIT) @Min(0) @DefaultValue(DEFAULT_PAGE_LENGTH_STRING) final Integer limit,
      @QueryParam(ASC) @DefaultValue("true") final Boolean descOrAsc,
      @QueryParam(ONLYAVAILABLE) @DefaultValue("false") final Boolean available,
      @Context final IRESTBuilder restBuilder)
      throws Exception {

    List<IpPoolManagement> all =
        service.getListIpPoolManagementByVlan(
            vdcId, vlanId, startwith, orderBy, filter, limit, descOrAsc);

    IpsPoolManagementDto ips = new IpsPoolManagementDto();

    for (IpPoolManagement ip : all) {
      ips.add(createTransferObject(ip, restBuilder));
    }

    ips.addLinks(
        restBuilder.buildPaggingLinks(uriInfo.getAbsolutePath().toString(), (PagedList) all));
    ips.setTotalSize(((PagedList) all).getTotalResults());

    return ips;
  }
  public static DatastoreDto createTransferObject(
      Datastore datastore,
      Integer datacenterId,
      Integer rackId,
      Integer machineId,
      IRESTBuilder restBuilder)
      throws Exception {
    DatastoreDto dto = ModelTransformer.transportFromPersistence(DatastoreDto.class, datastore);

    dto.setLinks(restBuilder.buildDatastoreLinks(datacenterId, rackId, machineId, datastore));

    return dto;
  }