| // Licensed to the Apache Software Foundation (ASF) under one | 
 | // or more contributor license agreements.  See the NOTICE file | 
 | // distributed with this work for additional information | 
 | // regarding copyright ownership.  The ASF licenses this file | 
 | // to you under the Apache License, Version 2.0 (the | 
 | // "License"); you may not use this file except in compliance | 
 | // with the License.  You may obtain a copy of the License at | 
 | // | 
 | //   http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, | 
 | // software distributed under the License is distributed on an | 
 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 | // KIND, either express or implied.  See the License for the | 
 | // specific language governing permissions and limitations | 
 | // under the License. | 
 | package com.cloud.bridge.service; | 
 |  | 
 | import java.util.ArrayList; | 
 | import java.util.Calendar; | 
 | import java.util.HashMap; | 
 | import java.util.List; | 
 | import java.util.Map; | 
 | import java.util.Set; | 
 | import java.util.UUID; | 
 |  | 
 | import org.apache.commons.codec.binary.Base64; | 
 |  | 
 | import com.amazon.ec2.*; | 
 | import com.cloud.bridge.service.core.ec2.EC2Address; | 
 | import com.cloud.bridge.service.core.ec2.EC2AddressFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2AssociateAddress; | 
 | import com.cloud.bridge.service.core.ec2.EC2AuthorizeRevokeSecurityGroup; | 
 | import com.cloud.bridge.service.core.ec2.EC2AvailabilityZonesFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2CreateImage; | 
 | import com.cloud.bridge.service.core.ec2.EC2CreateImageResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2CreateKeyPair; | 
 | import com.cloud.bridge.service.core.ec2.EC2CreateVolume; | 
 | import com.cloud.bridge.service.core.ec2.EC2Tags; | 
 | import com.cloud.bridge.service.core.ec2.EC2DeleteKeyPair; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeAddresses; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeAddressesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeAvailabilityZones; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeAvailabilityZonesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeImageAttribute; | 
 |  | 
 | import com.cloud.bridge.service.core.ec2.EC2AvailabilityZone; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeImages; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeImagesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeInstances; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeInstancesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeKeyPairs; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeKeyPairsResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2ImageFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2ImageLaunchPermission; | 
 | import com.cloud.bridge.service.core.ec2.EC2ModifyInstanceAttribute; | 
 | import com.cloud.bridge.service.core.ec2.EC2ResourceTag; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeSecurityGroups; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeSecurityGroupsResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeSnapshots; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeSnapshotsResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeTags; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeTagsResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeVolumes; | 
 | import com.cloud.bridge.service.core.ec2.EC2DescribeVolumesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2DisassociateAddress; | 
 | import com.cloud.bridge.service.core.ec2.EC2Engine; | 
 | import com.cloud.bridge.service.core.ec2.EC2Filter; | 
 | import com.cloud.bridge.service.core.ec2.EC2GroupFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2Image; | 
 | import com.cloud.bridge.service.core.ec2.EC2ImageAttributes; | 
 | import com.cloud.bridge.service.core.ec2.EC2ImageAttributes.ImageAttribute; | 
 | import com.cloud.bridge.service.core.ec2.EC2ImportKeyPair; | 
 | import com.cloud.bridge.service.core.ec2.EC2Instance; | 
 | import com.cloud.bridge.service.core.ec2.EC2InstanceFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2IpPermission; | 
 | import com.cloud.bridge.service.core.ec2.EC2KeyPairFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2ModifyImageAttribute; | 
 | import com.cloud.bridge.service.core.ec2.EC2PasswordData; | 
 | import com.cloud.bridge.service.core.ec2.EC2RebootInstances; | 
 | import com.cloud.bridge.service.core.ec2.EC2RegisterImage; | 
 | import com.cloud.bridge.service.core.ec2.EC2ReleaseAddress; | 
 | import com.cloud.bridge.service.core.ec2.EC2TagKeyValue; | 
 | import com.cloud.bridge.service.core.ec2.EC2TagTypeId; | 
 | import com.cloud.bridge.service.core.ec2.EC2RunInstances; | 
 | import com.cloud.bridge.service.core.ec2.EC2RunInstancesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2SSHKeyPair; | 
 | import com.cloud.bridge.service.core.ec2.EC2SecurityGroup; | 
 | import com.cloud.bridge.service.core.ec2.EC2Snapshot; | 
 | import com.cloud.bridge.service.core.ec2.EC2SnapshotFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2StartInstances; | 
 | import com.cloud.bridge.service.core.ec2.EC2StartInstancesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2StopInstances; | 
 | import com.cloud.bridge.service.core.ec2.EC2StopInstancesResponse; | 
 | import com.cloud.bridge.service.core.ec2.EC2TagsFilterSet; | 
 | import com.cloud.bridge.service.core.ec2.EC2Volume; | 
 | import com.cloud.bridge.service.core.ec2.EC2VolumeFilterSet; | 
 | import com.cloud.bridge.service.exception.EC2ServiceException; | 
 | import com.cloud.bridge.service.exception.EC2ServiceException.ClientError; | 
 | import com.cloud.bridge.util.EC2RestAuth; | 
 |  | 
 | public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { | 
 |  | 
 |     private static EC2Engine engine; | 
 |  | 
 |     @SuppressWarnings("static-access") | 
 |     public EC2SoapServiceImpl(EC2Engine engine) { | 
 |         this.engine = engine; | 
 |     } | 
 |  | 
 |     public AttachVolumeResponse attachVolume(AttachVolume attachVolume) { | 
 |         EC2Volume request = new EC2Volume(); | 
 |         AttachVolumeType avt = attachVolume.getAttachVolume(); | 
 |  | 
 |         request.setId(avt.getVolumeId()); | 
 |         request.setInstanceId(avt.getInstanceId()); | 
 |         request.setDevice(avt.getDevice()); | 
 |         return toAttachVolumeResponse(engine.attachVolume(request)); | 
 |     } | 
 |  | 
 |     public AuthorizeSecurityGroupIngressResponse authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngress authorizeSecurityGroupIngress) { | 
 |         AuthorizeSecurityGroupIngressType sgit = authorizeSecurityGroupIngress.getAuthorizeSecurityGroupIngress(); | 
 |         IpPermissionSetType ipPerms = sgit.getIpPermissions(); | 
 |  | 
 |         EC2AuthorizeRevokeSecurityGroup request = toSecurityGroup(sgit.getAuthorizeSecurityGroupIngressTypeChoice_type0().getGroupName(), ipPerms.getItem()); | 
 |         return toAuthorizeSecurityGroupIngressResponse(engine.authorizeSecurityGroup(request)); | 
 |     } | 
 |  | 
 |     public RevokeSecurityGroupIngressResponse revokeSecurityGroupIngress(RevokeSecurityGroupIngress revokeSecurityGroupIngress) { | 
 |         RevokeSecurityGroupIngressType sgit = revokeSecurityGroupIngress.getRevokeSecurityGroupIngress(); | 
 |         IpPermissionSetType ipPerms = sgit.getIpPermissions(); | 
 |  | 
 |         EC2AuthorizeRevokeSecurityGroup request = toSecurityGroup(sgit.getRevokeSecurityGroupIngressTypeChoice_type0().getGroupName(), ipPerms.getItem()); | 
 |         return toRevokeSecurityGroupIngressResponse(engine.revokeSecurityGroup(request)); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Authorize and Revoke Security Group Ingress have the same parameters. | 
 |      */ | 
 |     private EC2AuthorizeRevokeSecurityGroup toSecurityGroup(String groupName, IpPermissionType[] items) { | 
 |         EC2AuthorizeRevokeSecurityGroup request = new EC2AuthorizeRevokeSecurityGroup(); | 
 |  | 
 |         request.setName(groupName); | 
 |  | 
 |         for (IpPermissionType ipPerm : items) { | 
 |             EC2IpPermission perm = new EC2IpPermission(); | 
 |             perm.setProtocol(ipPerm.getIpProtocol()); | 
 |             if (ipPerm.getIpProtocol().equalsIgnoreCase("icmp")) { | 
 |                 perm.setIcmpType(Integer.toString(ipPerm.getFromPort())); | 
 |                 perm.setIcmpCode(Integer.toString(ipPerm.getToPort())); | 
 |             } else { | 
 |                 perm.setFromPort(ipPerm.getFromPort()); | 
 |                 perm.setToPort(ipPerm.getToPort()); | 
 |             } | 
 |             UserIdGroupPairSetType groups = ipPerm.getGroups(); | 
 |             if (null != groups && groups.getItem() != null) { | 
 |                 UserIdGroupPairType[] groupItems = groups.getItem(); | 
 |                 for (UserIdGroupPairType groupPair : groupItems) { | 
 |                     EC2SecurityGroup user = new EC2SecurityGroup(); | 
 |                     user.setName(groupPair.getGroupName()); | 
 |                     user.setAccount(groupPair.getUserId()); | 
 |                     perm.addUser(user); | 
 |                 } | 
 |             } | 
 |  | 
 |             IpRangeSetType ranges = ipPerm.getIpRanges(); | 
 |             if (ranges != null && ranges.getItem() != null) { | 
 |                 IpRangeItemType[] rangeItems = ranges.getItem(); | 
 |                 for (IpRangeItemType ipRange : rangeItems) { | 
 |                     perm.addIpRange(ipRange.getCidrIp()); | 
 |                     perm.setCIDR(ipRange.getCidrIp()); | 
 |                 } | 
 |             } | 
 |  | 
 |             request.addIpPermission(perm); | 
 |         } | 
 |         return request; | 
 |     } | 
 |  | 
 |     public CreateImageResponse createImage(CreateImage createImage) { | 
 |         EC2CreateImage request = new EC2CreateImage(); | 
 |         CreateImageType cit = createImage.getCreateImage(); | 
 |  | 
 |         request.setInstanceId(cit.getInstanceId()); | 
 |         request.setName(cit.getName()); | 
 |         request.setDescription(cit.getDescription()); | 
 |         return toCreateImageResponse(engine.createImage(request)); | 
 |     } | 
 |  | 
 |     public CreateSecurityGroupResponse createSecurityGroup(CreateSecurityGroup createSecurityGroup) { | 
 |         CreateSecurityGroupType sgt = createSecurityGroup.getCreateSecurityGroup(); | 
 |  | 
 |         return toCreateSecurityGroupResponse(engine.createSecurityGroup(sgt.getGroupName(), sgt.getGroupDescription())); | 
 |     } | 
 |  | 
 |     public CreateSnapshotResponse createSnapshot(CreateSnapshot createSnapshot) { | 
 |         CreateSnapshotType cst = createSnapshot.getCreateSnapshot(); | 
 |         return toCreateSnapshotResponse(engine.createSnapshot(cst.getVolumeId()), engine); | 
 |     } | 
 |  | 
 |     public CreateVolumeResponse createVolume(CreateVolume createVolume) { | 
 |         EC2CreateVolume request = new EC2CreateVolume(); | 
 |         CreateVolumeType cvt = createVolume.getCreateVolume(); | 
 |  | 
 |         request.setSize(cvt.getSize()); | 
 |         request.setSnapshotId(cvt.getSnapshotId() != null ? cvt.getSnapshotId() : null); | 
 |         request.setZoneName(cvt.getAvailabilityZone()); | 
 |         return toCreateVolumeResponse(engine.createVolume(request)); | 
 |     } | 
 |  | 
 |     public CreateTagsResponse createTags(CreateTags createTags) { | 
 |         EC2Tags request = new EC2Tags(); | 
 |         ArrayList<String> resourceIdList = new ArrayList<String>(); | 
 |         Map<String, String> resourceTagList = new HashMap<String, String>(); | 
 |  | 
 |         CreateTagsType ctt = createTags.getCreateTags(); | 
 |  | 
 |         ResourceIdSetType resourceIds = ctt.getResourcesSet(); | 
 |         ResourceTagSetType resourceTags = ctt.getTagSet(); | 
 |  | 
 |         ResourceIdSetItemType[] resourceIdItems = resourceIds.getItem(); | 
 |         if (resourceIdItems != null) { | 
 |             for (int i = 0; i < resourceIdItems.length; i++) | 
 |                 resourceIdList.add(resourceIdItems[i].getResourceId()); | 
 |         } | 
 |         request = toResourceTypeAndIds(request, resourceIdList); | 
 |  | 
 |         //add resource tag's to the request | 
 |         ResourceTagSetItemType[] resourceTagItems = resourceTags.getItem(); | 
 |         if (resourceTagItems != null) { | 
 |             for (int i = 0; i < resourceTagItems.length; i++) | 
 |                 resourceTagList.put(resourceTagItems[i].getKey(), resourceTagItems[i].getValue()); | 
 |         } | 
 |         request = toResourceTag(request, resourceTagList); | 
 |  | 
 |         return toCreateTagsResponse(engine.modifyTags(request, "create")); | 
 |     } | 
 |  | 
 |     public DeleteTagsResponse deleteTags(DeleteTags deleteTags) { | 
 |         EC2Tags request = new EC2Tags(); | 
 |         ArrayList<String> resourceIdList = new ArrayList<String>(); | 
 |         Map<String, String> resourceTagList = new HashMap<String, String>(); | 
 |  | 
 |         DeleteTagsType dtt = deleteTags.getDeleteTags(); | 
 |  | 
 |         ResourceIdSetType resourceIds = dtt.getResourcesSet(); | 
 |         DeleteTagsSetType resourceTags = dtt.getTagSet(); | 
 |  | 
 |         ResourceIdSetItemType[] resourceIdItems = resourceIds.getItem(); | 
 |  | 
 |         if (resourceIdItems != null) { | 
 |             for (int i = 0; i < resourceIdItems.length; i++) | 
 |                 resourceIdList.add(resourceIdItems[i].getResourceId()); | 
 |         } | 
 |         request = toResourceTypeAndIds(request, resourceIdList); | 
 |  | 
 |         //add resource tag's to the request | 
 |         DeleteTagsSetItemType[] resourceTagItems = resourceTags.getItem(); | 
 |         if (resourceTagItems != null) { | 
 |             for (int i = 0; i < resourceTagItems.length; i++) | 
 |                 resourceTagList.put(resourceTagItems[i].getKey(), resourceTagItems[i].getValue()); | 
 |         } | 
 |         request = toResourceTag(request, resourceTagList); | 
 |  | 
 |         return toDeleteTagsResponse(engine.modifyTags(request, "delete")); | 
 |     } | 
 |  | 
 |     public static EC2Tags toResourceTypeAndIds(EC2Tags request, ArrayList<String> resourceIdList) { | 
 |         List<String> resourceTypeList = new ArrayList<String>(); | 
 |         for (String resourceId : resourceIdList) { | 
 |             if (!resourceId.contains(":") || resourceId.split(":").length != 2) { | 
 |                 throw new EC2ServiceException(ClientError.InvalidParameterValue, "Invalid usage. ResourceId format is resource-type:resource-uuid"); | 
 |             } | 
 |             String resourceType = resourceId.split(":")[0]; | 
 |             if (resourceTypeList.isEmpty()) | 
 |                 resourceTypeList.add(resourceType); | 
 |             else { | 
 |                 Boolean existsInList = false; | 
 |                 for (String addedResourceType : resourceTypeList) { | 
 |                     if (addedResourceType.equalsIgnoreCase(resourceType)) { | 
 |                         existsInList = true; | 
 |                         break; | 
 |                     } | 
 |                 } | 
 |                 if (!existsInList) | 
 |                     resourceTypeList.add(resourceType); | 
 |             } | 
 |         } | 
 |         for (String resourceType : resourceTypeList) { | 
 |             EC2TagTypeId param1 = new EC2TagTypeId(); | 
 |             param1.setResourceType(resourceType); | 
 |             for (String resourceId : resourceIdList) { | 
 |                 String[] resourceTag = resourceId.split(":"); | 
 |                 if (resourceType.equals(resourceTag[0])) | 
 |                     param1.addResourceId(resourceTag[1]); | 
 |             } | 
 |             request.addResourceType(param1); | 
 |         } | 
 |         return request; | 
 |     } | 
 |  | 
 |     public static EC2Tags toResourceTag(EC2Tags request, Map<String, String> resourceTagList) { | 
 |         Set<String> resourceTagKeySet = resourceTagList.keySet(); | 
 |         for (String resourceTagKey : resourceTagKeySet) { | 
 |             EC2TagKeyValue param1 = new EC2TagKeyValue(); | 
 |             param1.setKey(resourceTagKey); | 
 |             param1.setValue(resourceTagList.get(resourceTagKey)); | 
 |             request.addResourceTag(param1); | 
 |         } | 
 |         return request; | 
 |     } | 
 |  | 
 |     public DeleteSecurityGroupResponse deleteSecurityGroup(DeleteSecurityGroup deleteSecurityGroup) { | 
 |         DeleteSecurityGroupType sgt = deleteSecurityGroup.getDeleteSecurityGroup(); | 
 |         return toDeleteSecurityGroupResponse(engine.deleteSecurityGroup(sgt.getGroupName())); | 
 |     } | 
 |  | 
 |     public DeleteSnapshotResponse deleteSnapshot(DeleteSnapshot deleteSnapshot) { | 
 |         DeleteSnapshotType dst = deleteSnapshot.getDeleteSnapshot(); | 
 |         return toDeleteSnapshotResponse(engine.deleteSnapshot(dst.getSnapshotId())); | 
 |     } | 
 |  | 
 |     public DeleteVolumeResponse deleteVolume(DeleteVolume deleteVolume) { | 
 |         EC2Volume request = new EC2Volume(); | 
 |         DeleteVolumeType avt = deleteVolume.getDeleteVolume(); | 
 |  | 
 |         request.setId(avt.getVolumeId()); | 
 |         return toDeleteVolumeResponse(engine.deleteVolume(request)); | 
 |     } | 
 |  | 
 |     public DeregisterImageResponse deregisterImage(DeregisterImage deregisterImage) { | 
 |         DeregisterImageType dit = deregisterImage.getDeregisterImage(); | 
 |         EC2Image image = new EC2Image(); | 
 |  | 
 |         image.setId(dit.getImageId()); | 
 |         return toDeregisterImageResponse(engine.deregisterImage(image)); | 
 |     } | 
 |  | 
 |     public DescribeAvailabilityZonesResponse describeAvailabilityZones(DescribeAvailabilityZones describeAvailabilityZones) { | 
 |         EC2DescribeAvailabilityZones request = new EC2DescribeAvailabilityZones(); | 
 |  | 
 |         DescribeAvailabilityZonesType dazt = describeAvailabilityZones.getDescribeAvailabilityZones(); | 
 |         DescribeAvailabilityZonesSetType dazs = dazt.getAvailabilityZoneSet(); | 
 |         DescribeAvailabilityZonesSetItemType[] items = dazs.getItem(); | 
 |         if (null != items) {  // -> can be empty | 
 |             for (int i = 0; i < items.length; i++) | 
 |                 request.addZone(items[i].getZoneName()); | 
 |         } | 
 |  | 
 |         FilterSetType fst = dazt.getFilterSet(); | 
 |         if (fst != null) { | 
 |             request.setFilterSet(toAvailabiltyZonesFilterSet(fst)); | 
 |         } | 
 |  | 
 |         return toDescribeAvailabilityZonesResponse(engine.describeAvailabilityZones(request)); | 
 |     } | 
 |  | 
 |     /** | 
 |      * This only supports a query about description. | 
 |      */ | 
 |     public DescribeImageAttributeResponse describeImageAttribute(DescribeImageAttribute describeImageAttribute) { | 
 |         EC2DescribeImageAttribute request = new EC2DescribeImageAttribute(); | 
 |         DescribeImageAttributeType diat = describeImageAttribute.getDescribeImageAttribute(); | 
 |         DescribeImageAttributesGroup diag = diat.getDescribeImageAttributesGroup(); | 
 |         EmptyElementType description = diag.getDescription(); | 
 |         EmptyElementType launchPermission = diag.getLaunchPermission(); | 
 |  | 
 |         if (null != description) { | 
 |             request.setImageId(diat.getImageId()); | 
 |             request.setAttribute(ImageAttribute.description); | 
 |             return toDescribeImageAttributeResponse(engine.describeImageAttribute(request)); | 
 |         } else if (launchPermission != null) { | 
 |             request.setImageId(diat.getImageId()); | 
 |             request.setAttribute(ImageAttribute.launchPermission); | 
 |             return toDescribeImageAttributeResponse(engine.describeImageAttribute(request)); | 
 |         } else | 
 |             throw new EC2ServiceException(ClientError.Unsupported, "Unsupported - only description or launchPermission supported"); | 
 |     } | 
 |  | 
 |     public DescribeImagesResponse describeImages(DescribeImages describeImages) { | 
 |         EC2DescribeImages request = new EC2DescribeImages(); | 
 |         DescribeImagesType dit = describeImages.getDescribeImages(); | 
 |  | 
 |         // -> toEC2DescribeImages | 
 |         DescribeImagesExecutableBySetType param1 = dit.getExecutableBySet(); | 
 |         if (null != param1) { | 
 |             DescribeImagesExecutableByType[] items1 = param1.getItem(); | 
 |             if (null != items1) { | 
 |                 for (int i = 0; i < items1.length; i++) | 
 |                     request.addExecutableBySet(items1[i].getUser()); | 
 |             } | 
 |         } | 
 |         DescribeImagesInfoType param2 = dit.getImagesSet(); | 
 |         if (null != param2) { | 
 |             DescribeImagesItemType[] items2 = param2.getItem(); | 
 |             if (null != items2) { | 
 |                 for (int i = 0; i < items2.length; i++) | 
 |                     request.addImageSet(items2[i].getImageId()); | 
 |             } | 
 |         } | 
 |         DescribeImagesOwnersType param3 = dit.getOwnersSet(); | 
 |         if (null != param3) { | 
 |             DescribeImagesOwnerType[] items3 = param3.getItem(); | 
 |             if (null != items3) { | 
 |                 for (int i = 0; i < items3.length; i++) | 
 |                     request.addOwnersSet(items3[i].getOwner()); | 
 |             } | 
 |         } | 
 |         FilterSetType fst = dit.getFilterSet(); | 
 |         if (fst != null) { | 
 |             request.setFilterSet(toImageFilterSet(fst)); | 
 |         } | 
 |         return toDescribeImagesResponse(engine.describeImages(request)); | 
 |     } | 
 |  | 
 |     public DescribeInstanceAttributeResponse describeInstanceAttribute(DescribeInstanceAttribute describeInstanceAttribute) { | 
 |         EC2DescribeInstances request = new EC2DescribeInstances(); | 
 |         DescribeInstanceAttributeType diat = describeInstanceAttribute.getDescribeInstanceAttribute(); | 
 |         DescribeInstanceAttributesGroup diag = diat.getDescribeInstanceAttributesGroup(); | 
 |         EmptyElementType instanceType = diag.getInstanceType(); | 
 |  | 
 |         // -> toEC2DescribeInstances | 
 |         if (null != instanceType) { | 
 |             request.addInstanceId(diat.getInstanceId()); | 
 |             return toDescribeInstanceAttributeResponse(engine.describeInstances(request)); | 
 |         } | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "Unsupported - only instanceType supported"); | 
 |     } | 
 |  | 
 |     public DescribeInstancesResponse describeInstances(DescribeInstances describeInstances) { | 
 |         EC2DescribeInstances request = new EC2DescribeInstances(); | 
 |         DescribeInstancesType dit = describeInstances.getDescribeInstances(); | 
 |         FilterSetType fst = dit.getFilterSet(); | 
 |  | 
 |         // -> toEC2DescribeInstances | 
 |         DescribeInstancesInfoType diit = dit.getInstancesSet(); | 
 |         DescribeInstancesItemType[] items = diit.getItem(); | 
 |         if (null != items) {  // -> can be empty | 
 |             for (int i = 0; i < items.length; i++) | 
 |                 request.addInstanceId(items[i].getInstanceId()); | 
 |         } | 
 |  | 
 |         if (null != fst) | 
 |             request = toInstanceFilterSet(request, fst); | 
 |  | 
 |         return toDescribeInstancesResponse(engine.describeInstances(request), engine); | 
 |     } | 
 |  | 
 |     @Override | 
 |     public DescribeAddressesResponse describeAddresses(DescribeAddresses describeAddresses) { | 
 |         EC2DescribeAddresses ec2Request = new EC2DescribeAddresses(); | 
 |         DescribeAddressesType dat = describeAddresses.getDescribeAddresses(); | 
 |  | 
 |         DescribeAddressesInfoType dait = dat.getPublicIpsSet(); | 
 |         DescribeAddressesItemType[] items = dait.getItem(); | 
 |         if (items != null) {  // -> can be empty | 
 |             for (DescribeAddressesItemType itemType : items) | 
 |                 ec2Request.addPublicIp(itemType.getPublicIp()); | 
 |         } | 
 |  | 
 |         FilterSetType fset = dat.getFilterSet(); | 
 |         if (fset != null) { | 
 |             ec2Request.setFilterSet(toAddressFilterSet(fset)); | 
 |         } | 
 |  | 
 |         return toDescribeAddressesResponse(engine.describeAddresses(ec2Request)); | 
 |     } | 
 |  | 
 |     @Override | 
 |     public AllocateAddressResponse allocateAddress(AllocateAddress allocateAddress) { | 
 |         return toAllocateAddressResponse(engine.allocateAddress()); | 
 |     } | 
 |  | 
 |     @Override | 
 |     public ReleaseAddressResponse releaseAddress(ReleaseAddress releaseAddress) { | 
 |         EC2ReleaseAddress request = new EC2ReleaseAddress(); | 
 |  | 
 |         request.setPublicIp(releaseAddress.getReleaseAddress().getReleaseAddressTypeChoice_type0().getPublicIp()); | 
 |  | 
 |         return toReleaseAddressResponse(engine.releaseAddress(request)); | 
 |     } | 
 |  | 
 |     @Override | 
 |     public AssociateAddressResponse associateAddress(AssociateAddress associateAddress) { | 
 |         EC2AssociateAddress request = new EC2AssociateAddress(); | 
 |  | 
 |         request.setPublicIp(associateAddress.getAssociateAddress().getAssociateAddressTypeChoice_type0().getPublicIp()); | 
 |         request.setInstanceId(associateAddress.getAssociateAddress().getAssociateAddressTypeChoice_type1().getInstanceId()); | 
 |  | 
 |         return toAssociateAddressResponse(engine.associateAddress(request)); | 
 |     } | 
 |  | 
 |     @Override | 
 |     public DisassociateAddressResponse disassociateAddress(DisassociateAddress disassociateAddress) { | 
 |         EC2DisassociateAddress request = new EC2DisassociateAddress(); | 
 |  | 
 |         request.setPublicIp(disassociateAddress.getDisassociateAddress().getPublicIp()); | 
 |  | 
 |         return toDisassociateAddressResponse(engine.disassociateAddress(request)); | 
 |     } | 
 |  | 
 |     public DescribeSecurityGroupsResponse describeSecurityGroups(DescribeSecurityGroups describeSecurityGroups) { | 
 |         EC2DescribeSecurityGroups request = new EC2DescribeSecurityGroups(); | 
 |  | 
 |         DescribeSecurityGroupsType sgt = describeSecurityGroups.getDescribeSecurityGroups(); | 
 |  | 
 |         FilterSetType fst = sgt.getFilterSet(); | 
 |  | 
 |         // -> toEC2DescribeSecurityGroups | 
 |         DescribeSecurityGroupsSetType sgst = sgt.getSecurityGroupSet(); | 
 |         DescribeSecurityGroupsSetItemType[] items = sgst.getItem(); | 
 |         if (null != items) {  // -> can be empty | 
 |             for (DescribeSecurityGroupsSetItemType item : items) | 
 |                 request.addGroupName(item.getGroupName()); | 
 |         } | 
 |  | 
 |         if (null != fst) { | 
 |             request.setFilterSet(toGroupFilterSet(fst)); | 
 |         } | 
 |  | 
 |         return toDescribeSecurityGroupsResponse(engine.describeSecurityGroups(request)); | 
 |     } | 
 |  | 
 |     public DescribeSnapshotsResponse describeSnapshots(DescribeSnapshots describeSnapshots) { | 
 |         EC2DescribeSnapshots request = new EC2DescribeSnapshots(); | 
 |         DescribeSnapshotsType dst = describeSnapshots.getDescribeSnapshots(); | 
 |  | 
 |         DescribeSnapshotsSetType dsst = dst.getSnapshotSet(); | 
 |         FilterSetType fst = dst.getFilterSet(); | 
 |  | 
 |         if (null != dsst) { | 
 |             DescribeSnapshotsSetItemType[] items = dsst.getItem(); | 
 |             if (null != items) { | 
 |                 for (int i = 0; i < items.length; i++) | 
 |                     request.addSnapshotId(items[i].getSnapshotId()); | 
 |             } | 
 |         } | 
 |  | 
 |         if (null != fst) { | 
 |             String[] timeFilters = new String[1]; | 
 |             timeFilters[0] = new String("start-time"); | 
 |             request = toSnapshotFilterSet(request, fst, timeFilters); | 
 |         } | 
 |  | 
 |         return toDescribeSnapshotsResponse(engine.describeSnapshots(request)); | 
 |     } | 
 |  | 
 |     public DescribeTagsResponse describeTags(DescribeTags decsribeTags) { | 
 |         EC2DescribeTags request = new EC2DescribeTags(); | 
 |         DescribeTagsType dtt = decsribeTags.getDescribeTags(); | 
 |  | 
 |         FilterSetType fst = dtt.getFilterSet(); | 
 |  | 
 |         if (fst != null) | 
 |             request.setFilterSet(toTagsFilterSet(fst)); | 
 |  | 
 |         return toDescribeTagsResponse(engine.describeTags(request)); | 
 |     } | 
 |  | 
 |     public DescribeVolumesResponse describeVolumes(DescribeVolumes describeVolumes) { | 
 |         EC2DescribeVolumes request = new EC2DescribeVolumes(); | 
 |         DescribeVolumesType dvt = describeVolumes.getDescribeVolumes(); | 
 |  | 
 |         DescribeVolumesSetType dvst = dvt.getVolumeSet(); | 
 |         FilterSetType fst = dvt.getFilterSet(); | 
 |  | 
 |         if (null != dvst) { | 
 |             DescribeVolumesSetItemType[] items = dvst.getItem(); | 
 |             if (null != items) { | 
 |                 for (int i = 0; i < items.length; i++) | 
 |                     request.addVolumeId(items[i].getVolumeId()); | 
 |             } | 
 |         } | 
 |  | 
 |         if (null != fst) { | 
 |             String[] timeFilters = new String[2]; | 
 |             timeFilters[0] = new String("attachment.attach-time"); | 
 |             timeFilters[1] = new String("create-time"); | 
 |             request = toVolumeFilterSet(request, fst, timeFilters); | 
 |         } | 
 |  | 
 |         return toDescribeVolumesResponse(engine.describeVolumes(request), engine); | 
 |     } | 
 |  | 
 |     public DetachVolumeResponse detachVolume(DetachVolume detachVolume) { | 
 |         EC2Volume request = new EC2Volume(); | 
 |         DetachVolumeType avt = detachVolume.getDetachVolume(); | 
 |  | 
 |         request.setId(avt.getVolumeId()); | 
 |         request.setInstanceId(avt.getInstanceId()); | 
 |         request.setDevice(avt.getDevice()); | 
 |         return toDetachVolumeResponse(engine.detachVolume(request)); | 
 |     } | 
 |  | 
 |     public ModifyImageAttributeResponse modifyImageAttribute(ModifyImageAttribute modifyImageAttribute) { | 
 |         EC2ModifyImageAttribute request = new EC2ModifyImageAttribute(); | 
 |  | 
 |         ModifyImageAttributeType miat = modifyImageAttribute.getModifyImageAttribute(); | 
 |         ModifyImageAttributeTypeChoice_type0 item = miat.getModifyImageAttributeTypeChoice_type0(); | 
 |  | 
 |         AttributeValueType description = item.getDescription(); | 
 |  | 
 |         LaunchPermissionOperationType launchPermOp = item.getLaunchPermission(); | 
 |  | 
 |         if (null != description) { | 
 |             request.setImageId(miat.getImageId()); | 
 |             request.setAttribute(ImageAttribute.description); | 
 |             request.setDescription(description.getValue()); | 
 |             return toModifyImageAttributeResponse(engine.modifyImageAttribute(request)); | 
 |         } else if (launchPermOp != null) { | 
 |             request.setImageId(miat.getImageId()); | 
 |             request.setAttribute(ImageAttribute.launchPermission); | 
 |             if (launchPermOp.getAdd() != null) { | 
 |                 setAccountOrGroupList(launchPermOp.getAdd().getItem(), request, "add"); | 
 |             } else if (launchPermOp.getRemove() != null) { | 
 |                 setAccountOrGroupList(launchPermOp.getRemove().getItem(), request, "remove"); | 
 |             } | 
 |             return toModifyImageAttributeResponse(engine.modifyImageAttribute(request)); | 
 |         } | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "Unsupported - can only modify image description or launchPermission"); | 
 |     } | 
 |  | 
 |     public ModifyInstanceAttributeResponse modifyInstanceAttribute(ModifyInstanceAttribute modifyInstanceAttribute) { | 
 |         EC2ModifyInstanceAttribute request = new EC2ModifyInstanceAttribute(); | 
 |  | 
 |         ModifyInstanceAttributeType modifyInstanceAttribute2 = modifyInstanceAttribute.getModifyInstanceAttribute(); | 
 |         ModifyInstanceAttributeTypeChoice_type0 mia = modifyInstanceAttribute2.getModifyInstanceAttributeTypeChoice_type0(); | 
 |  | 
 |         request.setInstanceId(modifyInstanceAttribute2.getInstanceId()); | 
 |  | 
 |         // we only support instanceType and userData | 
 |         if (mia.getInstanceType() != null) { | 
 |             request.setInstanceType(mia.getInstanceType().getValue()); | 
 |         } else if (mia.getUserData() != null) { | 
 |             request.setUserData(mia.getUserData().getValue()); | 
 |         } else { | 
 |             throw new EC2ServiceException(ClientError.MissingParamter, "Missing required parameter - InstanceType/UserData should be provided"); | 
 |         } | 
 |         return toModifyInstanceAttributeResponse(engine.modifyInstanceAttribute(request)); | 
 |     } | 
 |  | 
 |     private void setAccountOrGroupList(LaunchPermissionItemType[] items, EC2ModifyImageAttribute request, String operation) { | 
 |         EC2ImageLaunchPermission launchPermission = new EC2ImageLaunchPermission(); | 
 |  | 
 |         if (operation.equalsIgnoreCase("add")) | 
 |             launchPermission.setLaunchPermOp(EC2ImageLaunchPermission.Operation.add); | 
 |         else | 
 |             launchPermission.setLaunchPermOp(EC2ImageLaunchPermission.Operation.remove); | 
 |  | 
 |         for (LaunchPermissionItemType lpItem : items) { | 
 |             if (lpItem.getGroup() != null) { | 
 |                 launchPermission.addLaunchPermission(lpItem.getGroup()); | 
 |             } else if (lpItem.getUserId() != null) { | 
 |                 launchPermission.addLaunchPermission(lpItem.getUserId()); | 
 |             } | 
 |         } | 
 |  | 
 |         request.addLaunchPermission(launchPermission); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Did not find a matching service offering so for now we just return disabled | 
 |      * for each instance request.  We could verify that all of the specified instances | 
 |      * exist to detect an error which would require a listVirtualMachines. | 
 |      */ | 
 |     public MonitorInstancesResponse monitorInstances(MonitorInstances monitorInstances) { | 
 |         MonitorInstancesResponse response = new MonitorInstancesResponse(); | 
 |         MonitorInstancesResponseType param1 = new MonitorInstancesResponseType(); | 
 |         MonitorInstancesResponseSetType param2 = new MonitorInstancesResponseSetType(); | 
 |  | 
 |         MonitorInstancesType mit = monitorInstances.getMonitorInstances(); | 
 |         MonitorInstancesSetType mist = mit.getInstancesSet(); | 
 |         MonitorInstancesSetItemType[] misit = mist.getItem(); | 
 |  | 
 |         if (null != misit) { | 
 |             for (int i = 0; i < misit.length; i++) { | 
 |                 String instanceId = misit[i].getInstanceId(); | 
 |                 MonitorInstancesResponseSetItemType param3 = new MonitorInstancesResponseSetItemType(); | 
 |                 param3.setInstanceId(instanceId); | 
 |                 InstanceMonitoringStateType param4 = new InstanceMonitoringStateType(); | 
 |                 param4.setState("disabled"); | 
 |                 param3.setMonitoring(param4); | 
 |                 param2.addItem(param3); | 
 |             } | 
 |         } | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.setInstancesSet(param2); | 
 |         response.setMonitorInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public RebootInstancesResponse rebootInstances(RebootInstances rebootInstances) { | 
 |         EC2RebootInstances request = new EC2RebootInstances(); | 
 |         RebootInstancesType rit = rebootInstances.getRebootInstances(); | 
 |  | 
 |         // -> toEC2StartInstances | 
 |         RebootInstancesInfoType rist = rit.getInstancesSet(); | 
 |         RebootInstancesItemType[] items = rist.getItem(); | 
 |         if (null != items) {  // -> should not be empty | 
 |             for (int i = 0; i < items.length; i++) | 
 |                 request.addInstanceId(items[i].getInstanceId()); | 
 |         } | 
 |         return toRebootInstancesResponse(engine.rebootInstances(request)); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Processes ec2-register | 
 |      *  | 
 |      * @param | 
 |      *  | 
 |      * @see <a href="http://docs.amazonwebservices.com/AWSEC2/2010-11-15/APIReference/index.html?ApiReference-query-RegisterImage.html">RegisterImage</a> | 
 |      */ | 
 |     public RegisterImageResponse registerImage(RegisterImage registerImage) { | 
 |         EC2RegisterImage request = new EC2RegisterImage(); | 
 |         RegisterImageType rit = registerImage.getRegisterImage(); | 
 |  | 
 |         // -> we redefine the architecture field to hold: "format:zonename:osTypeName", | 
 |         //    these are the bare minimum that we need to call the cloud registerTemplate call. | 
 |         request.setLocation(rit.getImageLocation());   // -> should be a URL for us | 
 |         request.setName(rit.getName()); | 
 |         request.setDescription(rit.getDescription()); | 
 |         request.setArchitecture(rit.getArchitecture()); | 
 |         return toRegisterImageResponse(engine.registerImage(request)); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Processes ec2-reset-image-attribute | 
 |      *  | 
 |      * @param resetImageAttribute | 
 |      *  | 
 |      * @see <a href="http://docs.amazonwebservices.com/AWSEC2/2010-11-15/APIReference/index.html?ApiReference-query-ResetInstanceAttribute.html">ResetInstanceAttribute</a> | 
 |      */ | 
 |  | 
 |     public ResetImageAttributeResponse resetImageAttribute(ResetImageAttribute resetImageAttribute) { | 
 |         EC2ModifyImageAttribute request = new EC2ModifyImageAttribute(); | 
 |         ResetImageAttributeType riat = resetImageAttribute.getResetImageAttribute(); | 
 |         EmptyElementType elementType = riat.getResetImageAttributesGroup().getLaunchPermission(); | 
 |         if (elementType != null) { | 
 |             request.setImageId(riat.getImageId()); | 
 |             request.setAttribute(ImageAttribute.launchPermission); | 
 |             EC2ImageLaunchPermission launchPermission = new EC2ImageLaunchPermission(); | 
 |             launchPermission.setLaunchPermOp(EC2ImageLaunchPermission.Operation.reset); | 
 |             request.addLaunchPermission(launchPermission); | 
 |             return toResetImageAttributeResponse(engine.modifyImageAttribute(request)); | 
 |         } | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "Unsupported - can only reset image launchPermission"); | 
 |     } | 
 |  | 
 |     /** | 
 |      *  ec2-run-instances | 
 |      *     | 
 |      * @param runInstances | 
 |      *  | 
 |      * @see <a href="http://docs.amazonwebservices.com/AWSEC2/2010-11-15/APIReference/index.html?ApiReference-query-RunInstances.html">RunInstances</a> | 
 |      */ | 
 |     public RunInstancesResponse runInstances(RunInstances runInstances) { | 
 |         RunInstancesType rit = runInstances.getRunInstances(); | 
 |         GroupSetType gst = rit.getGroupSet(); | 
 |         PlacementRequestType prt = rit.getPlacement(); | 
 |         UserDataType userData = rit.getUserData(); | 
 |         String type = rit.getInstanceType(); | 
 |         String keyName = rit.getKeyName(); | 
 |  | 
 |         EC2RunInstances request = new EC2RunInstances(); | 
 |  | 
 |         request.setTemplateId(rit.getImageId()); | 
 |  | 
 |         if (rit.getMinCount() < 1) { | 
 |             throw new EC2ServiceException(ClientError.InvalidParameterValue, "Value of parameter MinCount should be greater than 0"); | 
 |         } else | 
 |             request.setMinCount(rit.getMinCount()); | 
 |  | 
 |         if (rit.getMaxCount() < 1) { | 
 |             throw new EC2ServiceException(ClientError.InvalidParameterValue, "Value of parameter MaxCount should be greater than 0"); | 
 |         } else | 
 |             request.setMaxCount(rit.getMaxCount()); | 
 |  | 
 |         if (null != type) | 
 |             request.setInstanceType(type); | 
 |         if (null != prt) | 
 |             request.setZoneName(prt.getAvailabilityZone()); | 
 |         if (null != userData) | 
 |             request.setUserData(userData.getData()); | 
 |         if (null != keyName) | 
 |             request.setKeyName(rit.getKeyName()); | 
 |  | 
 |         // -> we can only support one group per instance | 
 |         if (null != gst) { | 
 |             GroupItemType[] items = gst.getItem(); | 
 |             if (null != items) { | 
 |                 for (int i = 0; i < items.length; i++) { | 
 |                     if (items[i].getGroupName() != null) // either SG-name or SG-id can be provided | 
 |                         request.addSecuritGroupName(items[i].getGroupName()); | 
 |                     else | 
 |                         request.addSecuritGroupId(items[i].getGroupId()); | 
 |                 } | 
 |             } | 
 |         } | 
 |         return toRunInstancesResponse(engine.runInstances(request), engine); | 
 |     } | 
 |  | 
 |     public StartInstancesResponse startInstances(StartInstances startInstances) { | 
 |         EC2StartInstances request = new EC2StartInstances(); | 
 |         StartInstancesType sit = startInstances.getStartInstances(); | 
 |  | 
 |         // -> toEC2StartInstances | 
 |         InstanceIdSetType iist = sit.getInstancesSet(); | 
 |         InstanceIdType[] items = iist.getItem(); | 
 |         if (null != items) {  // -> should not be empty | 
 |             for (int i = 0; i < items.length; i++) | 
 |                 request.addInstanceId(items[i].getInstanceId()); | 
 |         } | 
 |         return toStartInstancesResponse(engine.startInstances(request)); | 
 |     } | 
 |  | 
 |     public StopInstancesResponse stopInstances(StopInstances stopInstances) { | 
 |         EC2StopInstances request = new EC2StopInstances(); | 
 |         StopInstancesType sit = stopInstances.getStopInstances(); | 
 |         Boolean force = sit.getForce(); | 
 |  | 
 |         // -> toEC2StopInstances | 
 |         InstanceIdSetType iist = sit.getInstancesSet(); | 
 |         InstanceIdType[] items = iist.getItem(); | 
 |         if (null != items) {  // -> should not be empty | 
 |             for (int i = 0; i < items.length; i++) | 
 |                 request.addInstanceId(items[i].getInstanceId()); | 
 |         } | 
 |  | 
 |         if (force) | 
 |             request.setForce(sit.getForce()); | 
 |         return toStopInstancesResponse(engine.stopInstances(request)); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Mapping this to the destroyVirtualMachine cloud API concept. | 
 |      * This makes sense since when considering the rebootInstances function.   In reboot | 
 |      * any terminated instances are left alone.   We will do the same with destroyed instances. | 
 |      */ | 
 |     public TerminateInstancesResponse terminateInstances(TerminateInstances terminateInstances) { | 
 |         EC2StopInstances request = new EC2StopInstances(); | 
 |         TerminateInstancesType sit = terminateInstances.getTerminateInstances(); | 
 |  | 
 |         // -> toEC2StopInstances | 
 |         InstanceIdSetType iist = sit.getInstancesSet(); | 
 |         InstanceIdType[] items = iist.getItem(); | 
 |         if (null != items) {  // -> should not be empty | 
 |             for (int i = 0; i < items.length; i++) | 
 |                 request.addInstanceId(items[i].getInstanceId()); | 
 |         } | 
 |  | 
 |         request.setDestroyInstances(true); | 
 |         return toTermInstancesResponse(engine.stopInstances(request)); | 
 |     } | 
 |  | 
 |     /** | 
 |      * See comment for monitorInstances. | 
 |      */ | 
 |     public UnmonitorInstancesResponse unmonitorInstances(UnmonitorInstances unmonitorInstances) { | 
 |         UnmonitorInstancesResponse response = new UnmonitorInstancesResponse(); | 
 |         MonitorInstancesResponseType param1 = new MonitorInstancesResponseType(); | 
 |         MonitorInstancesResponseSetType param2 = new MonitorInstancesResponseSetType(); | 
 |  | 
 |         MonitorInstancesType mit = unmonitorInstances.getUnmonitorInstances(); | 
 |         MonitorInstancesSetType mist = mit.getInstancesSet(); | 
 |         MonitorInstancesSetItemType[] items = mist.getItem(); | 
 |  | 
 |         if (null != items) { | 
 |             for (int i = 0; i < items.length; i++) { | 
 |                 String instanceId = items[i].getInstanceId(); | 
 |                 MonitorInstancesResponseSetItemType param3 = new MonitorInstancesResponseSetItemType(); | 
 |                 param3.setInstanceId(instanceId); | 
 |                 InstanceMonitoringStateType param4 = new InstanceMonitoringStateType(); | 
 |                 param4.setState("disabled"); | 
 |                 param3.setMonitoring(param4); | 
 |                 param2.addItem(param3); | 
 |             } | 
 |         } | 
 |  | 
 |         param1.setInstancesSet(param2); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setUnmonitorInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @param modifyInstanceAttribute | 
 |      * @return     | 
 |      */ | 
 |     public static ModifyInstanceAttributeResponse toModifyInstanceAttributeResponse(Boolean status) { | 
 |         ModifyInstanceAttributeResponse miat = new ModifyInstanceAttributeResponse(); | 
 |  | 
 |         ModifyInstanceAttributeResponseType param = new ModifyInstanceAttributeResponseType(); | 
 |         param.set_return(status); | 
 |         param.setRequestId(UUID.randomUUID().toString()); | 
 |         miat.setModifyInstanceAttributeResponse(param); | 
 |         return miat; | 
 |     } | 
 |  | 
 |     public static DescribeImageAttributeResponse toDescribeImageAttributeResponse(EC2ImageAttributes engineResponse) { | 
 |         DescribeImageAttributeResponse response = new DescribeImageAttributeResponse(); | 
 |         DescribeImageAttributeResponseType param1 = new DescribeImageAttributeResponseType(); | 
 |  | 
 |         if (engineResponse != null) { | 
 |             DescribeImageAttributeResponseTypeChoice_type0 param2 = new DescribeImageAttributeResponseTypeChoice_type0(); | 
 |  | 
 |             if (engineResponse.getIsPublic()) { | 
 |                 LaunchPermissionListType param3 = new LaunchPermissionListType(); | 
 |                 LaunchPermissionItemType param4 = new LaunchPermissionItemType(); | 
 |                 param4.setGroup("all"); | 
 |                 param3.addItem(param4); | 
 |                 param2.setLaunchPermission(param3); | 
 |             } else if (engineResponse.getAccountNamesWithLaunchPermission() != null) { | 
 |                 LaunchPermissionListType param3 = new LaunchPermissionListType(); | 
 |                 for (String accountName : engineResponse.getAccountNamesWithLaunchPermission()) { | 
 |                     LaunchPermissionItemType param4 = new LaunchPermissionItemType(); | 
 |                     param4.setUserId(accountName); | 
 |                     param3.addItem(param4); | 
 |                 } | 
 |                 param2.setLaunchPermission(param3); | 
 |  | 
 |             } else if (engineResponse.getDescription() != null) { | 
 |                 NullableAttributeValueType param3 = new NullableAttributeValueType(); | 
 |                 param3.setValue(engineResponse.getDescription()); | 
 |                 param2.setDescription(param3); | 
 |             } | 
 |  | 
 |             param1.setDescribeImageAttributeResponseTypeChoice_type0(param2); | 
 |             param1.setImageId(engineResponse.getImageId()); | 
 |         } | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeImageAttributeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static ModifyImageAttributeResponse toModifyImageAttributeResponse(boolean engineResponse) { | 
 |         ModifyImageAttributeResponse response = new ModifyImageAttributeResponse(); | 
 |         ModifyImageAttributeResponseType param1 = new ModifyImageAttributeResponseType(); | 
 |  | 
 |         param1.set_return(engineResponse); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setModifyImageAttributeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static ResetImageAttributeResponse toResetImageAttributeResponse(boolean engineResponse) { | 
 |         ResetImageAttributeResponse response = new ResetImageAttributeResponse(); | 
 |         ResetImageAttributeResponseType param1 = new ResetImageAttributeResponseType(); | 
 |  | 
 |         param1.set_return(engineResponse); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setResetImageAttributeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeImagesResponse toDescribeImagesResponse(EC2DescribeImagesResponse engineResponse) { | 
 |         DescribeImagesResponse response = new DescribeImagesResponse(); | 
 |         DescribeImagesResponseType param1 = new DescribeImagesResponseType(); | 
 |         DescribeImagesResponseInfoType param2 = new DescribeImagesResponseInfoType(); | 
 |  | 
 |         EC2Image[] images = engineResponse.getImageSet(); | 
 |         for (int i = 0; i < images.length; i++) { | 
 |             String accountName = images[i].getAccountName(); | 
 |             String domainId = images[i].getDomainId(); | 
 |             String ownerId = domainId + ":" + accountName; | 
 |  | 
 |             DescribeImagesResponseItemType param3 = new DescribeImagesResponseItemType(); | 
 |             param3.setImageId(images[i].getId()); | 
 |             param3.setImageLocation(""); | 
 |             param3.setImageState(images[i].getState()); | 
 |             param3.setImageOwnerId(ownerId); | 
 |             param3.setIsPublic(images[i].getIsPublic()); | 
 |  | 
 |             ProductCodesSetType param4 = new ProductCodesSetType(); | 
 |             ProductCodesSetItemType param5 = new ProductCodesSetItemType(); | 
 |             param5.setProductCode(""); | 
 |             param5.setType(""); | 
 |             param4.addItem(param5); | 
 |             param3.setProductCodes(param4); | 
 |  | 
 |             String description = images[i].getDescription(); | 
 |             param3.setDescription((null == description ? "" : description)); | 
 |  | 
 |             param3.setArchitecture(images[i].getArchitecture()); | 
 |  | 
 |             param3.setImageType(images[i].getImageType()); | 
 |             param3.setKernelId(""); | 
 |             param3.setRamdiskId(""); | 
 |             param3.setPlatform(""); | 
 |             param3.setHypervisor(images[i].getHypervisor()); | 
 |  | 
 |             StateReasonType param6 = new StateReasonType(); | 
 |             param6.setCode(""); | 
 |             param6.setMessage(""); | 
 |             param3.setStateReason(param6); | 
 |  | 
 |             param3.setImageOwnerAlias(""); | 
 |             param3.setName(images[i].getName()); | 
 |             param3.setRootDeviceType(""); | 
 |             param3.setRootDeviceName(""); | 
 |  | 
 |             BlockDeviceMappingType param7 = new BlockDeviceMappingType(); | 
 |             BlockDeviceMappingItemType param8 = new BlockDeviceMappingItemType(); | 
 |             BlockDeviceMappingItemTypeChoice_type0 param9 = new BlockDeviceMappingItemTypeChoice_type0(); | 
 |             param8.setDeviceName(""); | 
 |             param9.setVirtualName(""); | 
 |             EbsBlockDeviceType param10 = new EbsBlockDeviceType(); | 
 |             param10.setSnapshotId(""); | 
 |             param10.setVolumeSize(0); | 
 |             param10.setDeleteOnTermination(false); | 
 |             param9.setEbs(param10); | 
 |             param8.setBlockDeviceMappingItemTypeChoice_type0(param9); | 
 |             param7.addItem(param8); | 
 |  | 
 |             param3.setBlockDeviceMapping(param7); | 
 |  | 
 |             EC2TagKeyValue[] tags = images[i].getResourceTags(); | 
 |             param3.setTagSet(setResourceTags(tags)); | 
 |  | 
 |             param2.addItem(param3); | 
 |         } | 
 |  | 
 |         param1.setImagesSet(param2); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeImagesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static CreateImageResponse toCreateImageResponse(EC2CreateImageResponse engineResponse) { | 
 |         CreateImageResponse response = new CreateImageResponse(); | 
 |         CreateImageResponseType param1 = new CreateImageResponseType(); | 
 |  | 
 |         param1.setImageId(engineResponse.getId()); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setCreateImageResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static RegisterImageResponse toRegisterImageResponse(EC2CreateImageResponse engineResponse) { | 
 |         RegisterImageResponse response = new RegisterImageResponse(); | 
 |         RegisterImageResponseType param1 = new RegisterImageResponseType(); | 
 |  | 
 |         param1.setImageId(engineResponse.getId()); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setRegisterImageResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DeregisterImageResponse toDeregisterImageResponse(boolean engineResponse) { | 
 |         DeregisterImageResponse response = new DeregisterImageResponse(); | 
 |         DeregisterImageResponseType param1 = new DeregisterImageResponseType(); | 
 |  | 
 |         param1.set_return(engineResponse); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDeregisterImageResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     // filtersets | 
 |     private EC2AddressFilterSet toAddressFilterSet(FilterSetType fst) { | 
 |         EC2AddressFilterSet vfs = new EC2AddressFilterSet(); | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (items != null) { | 
 |             // -> each filter can have one or more values associated with it | 
 |             for (FilterType item : items) { | 
 |                 EC2Filter oneFilter = new EC2Filter(); | 
 |                 String filterName = item.getName(); | 
 |                 oneFilter.setName(filterName); | 
 |  | 
 |                 ValueSetType vst = item.getValueSet(); | 
 |                 ValueType[] valueItems = vst.getItem(); | 
 |                 for (ValueType valueItem : valueItems) { | 
 |                     oneFilter.addValueEncoded(valueItem.getValue()); | 
 |                 } | 
 |                 vfs.addFilter(oneFilter); | 
 |             } | 
 |         } | 
 |         return vfs; | 
 |     } | 
 |  | 
 |     private EC2KeyPairFilterSet toKeyPairFilterSet(FilterSetType fst) { | 
 |         EC2KeyPairFilterSet vfs = new EC2KeyPairFilterSet(); | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (items != null) { | 
 |             // -> each filter can have one or more values associated with it | 
 |             for (FilterType item : items) { | 
 |                 EC2Filter oneFilter = new EC2Filter(); | 
 |                 String filterName = item.getName(); | 
 |                 oneFilter.setName(filterName); | 
 |  | 
 |                 ValueSetType vst = item.getValueSet(); | 
 |                 ValueType[] valueItems = vst.getItem(); | 
 |                 for (ValueType valueItem : valueItems) { | 
 |                     oneFilter.addValueEncoded(valueItem.getValue()); | 
 |                 } | 
 |                 vfs.addFilter(oneFilter); | 
 |             } | 
 |         } | 
 |         return vfs; | 
 |     } | 
 |  | 
 |     private EC2DescribeVolumes toVolumeFilterSet(EC2DescribeVolumes request, FilterSetType fst, String[] timeStrs) { | 
 |         EC2VolumeFilterSet vfs = new EC2VolumeFilterSet(); | 
 |         boolean timeFilter = false; | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (null != items) { | 
 |             // -> each filter can have one or more values associated with it | 
 |             for (int j = 0; j < items.length; j++) { | 
 |                 String filterName = items[j].getName(); | 
 |                 ValueSetType vst = items[j].getValueSet(); | 
 |                 ValueType[] valueItems = vst.getItem(); | 
 |  | 
 |                 if (filterName.startsWith("tag:")) { | 
 |                     String key = filterName.split(":")[1]; | 
 |                     for (ValueType valueItem : valueItems) { | 
 |                         EC2TagKeyValue tag = new EC2TagKeyValue(); | 
 |                         tag.setKey(key); | 
 |                         tag.setValue(valueItem.getValue()); | 
 |                         request.addResourceTag(tag); | 
 |                     } | 
 |                 } else { | 
 |                     EC2Filter oneFilter = new EC2Filter(); | 
 |                     oneFilter.setName(filterName); | 
 |  | 
 |                     // -> is the filter one of the xsd:dateTime filters? | 
 |                     timeFilter = false; | 
 |                     for (int m = 0; m < timeStrs.length; m++) { | 
 |                         timeFilter = filterName.equalsIgnoreCase(timeStrs[m]); | 
 |                         if (timeFilter) | 
 |                             break; | 
 |                     } | 
 |  | 
 |                     for (int k = 0; k < valueItems.length; k++) { | 
 |                         // -> time values are not encoded as regexes | 
 |                         if (timeFilter) | 
 |                             oneFilter.addValue(valueItems[k].getValue()); | 
 |                         else | 
 |                             oneFilter.addValueEncoded(valueItems[k].getValue()); | 
 |                     } | 
 |                     vfs.addFilter(oneFilter); | 
 |                 } | 
 |             } | 
 |             request.setFilterSet(vfs); | 
 |         } | 
 |         return request; | 
 |     } | 
 |  | 
 |     private EC2DescribeSnapshots toSnapshotFilterSet(EC2DescribeSnapshots request, FilterSetType fst, String[] timeStrs) { | 
 |         EC2SnapshotFilterSet sfs = new EC2SnapshotFilterSet(); | 
 |         boolean timeFilter = false; | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (null != items) { | 
 |             // -> each filter can have one or more values associated with it | 
 |             for (int j = 0; j < items.length; j++) { | 
 |                 String filterName = items[j].getName(); | 
 |                 ValueSetType vst = items[j].getValueSet(); | 
 |                 ValueType[] valueItems = vst.getItem(); | 
 |  | 
 |                 if (filterName.startsWith("tag:")) { | 
 |                     String key = filterName.split(":")[1]; | 
 |                     for (ValueType valueItem : valueItems) { | 
 |                         EC2TagKeyValue tag = new EC2TagKeyValue(); | 
 |                         tag.setKey(key); | 
 |                         tag.setValue(valueItem.getValue()); | 
 |                         request.addResourceTag(tag); | 
 |                     } | 
 |                 } else { | 
 |                     EC2Filter oneFilter = new EC2Filter(); | 
 |                     oneFilter.setName(filterName); | 
 |  | 
 |                     // -> is the filter one of the xsd:dateTime filters? | 
 |                     timeFilter = false; | 
 |                     for (int m = 0; m < timeStrs.length; m++) { | 
 |                         timeFilter = filterName.equalsIgnoreCase(timeStrs[m]); | 
 |                         if (timeFilter) | 
 |                             break; | 
 |                     } | 
 |  | 
 |                     for (int k = 0; k < valueItems.length; k++) { | 
 |                         // -> time values are not encoded as regexes | 
 |                         if (timeFilter) | 
 |                             oneFilter.addValue(valueItems[k].getValue()); | 
 |                         else | 
 |                             oneFilter.addValueEncoded(valueItems[k].getValue()); | 
 |                     } | 
 |                     sfs.addFilter(oneFilter); | 
 |                 } | 
 |             } | 
 |             request.setFilterSet(sfs); | 
 |         } | 
 |         return request; | 
 |     } | 
 |  | 
 |     // TODO make these filter set functions use generics  | 
 |     private EC2GroupFilterSet toGroupFilterSet(FilterSetType fst) { | 
 |         EC2GroupFilterSet gfs = new EC2GroupFilterSet(); | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (null != items) { | 
 |             // -> each filter can have one or more values associated with it | 
 |             for (int j = 0; j < items.length; j++) { | 
 |                 EC2Filter oneFilter = new EC2Filter(); | 
 |                 String filterName = items[j].getName(); | 
 |                 oneFilter.setName(filterName); | 
 |  | 
 |                 ValueSetType vst = items[j].getValueSet(); | 
 |                 ValueType[] valueItems = vst.getItem(); | 
 |                 for (int k = 0; k < valueItems.length; k++) { | 
 |                     oneFilter.addValueEncoded(valueItems[k].getValue()); | 
 |                 } | 
 |                 gfs.addFilter(oneFilter); | 
 |             } | 
 |         } | 
 |         return gfs; | 
 |     } | 
 |  | 
 |     private EC2DescribeInstances toInstanceFilterSet(EC2DescribeInstances request, FilterSetType fst) { | 
 |         EC2InstanceFilterSet ifs = new EC2InstanceFilterSet(); | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (null != items) { | 
 |             // -> each filter can have one or more values associated with it | 
 |             for (int j = 0; j < items.length; j++) { | 
 |                 String filterName = items[j].getName(); | 
 |                 ValueSetType vst = items[j].getValueSet(); | 
 |                 ValueType[] valueItems = vst.getItem(); | 
 |  | 
 |                 if (filterName.startsWith("tag:")) { | 
 |                     String key = filterName.split(":")[1]; | 
 |                     for (ValueType valueItem : valueItems) { | 
 |                         EC2TagKeyValue tag = new EC2TagKeyValue(); | 
 |                         tag.setKey(key); | 
 |                         tag.setValue(valueItem.getValue()); | 
 |                         request.addResourceTag(tag); | 
 |                     } | 
 |                 } else { | 
 |                     EC2Filter oneFilter = new EC2Filter(); | 
 |                     oneFilter.setName(filterName); | 
 |                     for (int k = 0; k < valueItems.length; k++) | 
 |                         oneFilter.addValueEncoded(valueItems[k].getValue()); | 
 |                     ifs.addFilter(oneFilter); | 
 |                 } | 
 |             } | 
 |             request.setFilterSet(ifs); | 
 |         } | 
 |         return request; | 
 |     } | 
 |  | 
 |     private EC2AvailabilityZonesFilterSet toAvailabiltyZonesFilterSet(FilterSetType fst) { | 
 |         EC2AvailabilityZonesFilterSet azfs = new EC2AvailabilityZonesFilterSet(); | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (items != null) { | 
 |             for (FilterType item : items) { | 
 |                 EC2Filter oneFilter = new EC2Filter(); | 
 |                 String filterName = item.getName(); | 
 |                 oneFilter.setName(filterName); | 
 |  | 
 |                 ValueSetType vft = item.getValueSet(); | 
 |                 ValueType[] valueItems = vft.getItem(); | 
 |                 for (ValueType valueItem : valueItems) { | 
 |                     oneFilter.addValueEncoded(valueItem.getValue()); | 
 |                 } | 
 |                 azfs.addFilter(oneFilter); | 
 |             } | 
 |         } | 
 |         return azfs; | 
 |     } | 
 |  | 
 |     private EC2TagsFilterSet toTagsFilterSet(FilterSetType fst) { | 
 |         EC2TagsFilterSet tfs = new EC2TagsFilterSet(); | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (items != null) { | 
 |             for (FilterType item : items) { | 
 |                 EC2Filter oneFilter = new EC2Filter(); | 
 |                 String filterName = item.getName(); | 
 |                 oneFilter.setName(filterName); | 
 |  | 
 |                 ValueSetType vft = item.getValueSet(); | 
 |                 ValueType[] valueItems = vft.getItem(); | 
 |                 for (ValueType valueItem : valueItems) { | 
 |                     oneFilter.addValueEncoded(valueItem.getValue()); | 
 |                 } | 
 |                 tfs.addFilter(oneFilter); | 
 |             } | 
 |         } | 
 |         return tfs; | 
 |     } | 
 |  | 
 |     private EC2ImageFilterSet toImageFilterSet(FilterSetType fst) { | 
 |         EC2ImageFilterSet ifs = new EC2ImageFilterSet(); | 
 |  | 
 |         FilterType[] items = fst.getItem(); | 
 |         if (items != null) { | 
 |             for (FilterType item : items) { | 
 |                 EC2Filter oneFilter = new EC2Filter(); | 
 |                 String filterName = item.getName(); | 
 |                 oneFilter.setName(filterName); | 
 |  | 
 |                 ValueSetType vft = item.getValueSet(); | 
 |                 ValueType[] valueItems = vft.getItem(); | 
 |                 for (ValueType valueItem : valueItems) { | 
 |                     oneFilter.addValueEncoded(valueItem.getValue()); | 
 |                 } | 
 |                 ifs.addFilter(oneFilter); | 
 |             } | 
 |         } | 
 |         return ifs; | 
 |     } | 
 |  | 
 |     // toMethods | 
 |     public static DescribeVolumesResponse toDescribeVolumesResponse(EC2DescribeVolumesResponse engineResponse, EC2Engine engine) { | 
 |         DescribeVolumesResponse response = new DescribeVolumesResponse(); | 
 |         DescribeVolumesResponseType param1 = new DescribeVolumesResponseType(); | 
 |         DescribeVolumesSetResponseType param2 = new DescribeVolumesSetResponseType(); | 
 |  | 
 |         EC2Volume[] volumes = engineResponse.getVolumeSet(); | 
 |         for (EC2Volume vol : volumes) { | 
 |             DescribeVolumesSetItemResponseType param3 = new DescribeVolumesSetItemResponseType(); | 
 |             param3.setVolumeId(vol.getId().toString()); | 
 |  | 
 |             Long volSize = new Long(vol.getSize()); | 
 |             param3.setSize(volSize.toString()); | 
 |             String snapId = vol.getSnapshotId() != null ? vol.getSnapshotId().toString() : ""; | 
 |             param3.setSnapshotId(snapId); | 
 |             param3.setAvailabilityZone(vol.getZoneName()); | 
 |             param3.setStatus(vol.getState()); | 
 |             param3.setVolumeType("standard"); | 
 |  | 
 |             // -> CloudStack seems to have issues with timestamp formats so just in case | 
 |             Calendar cal = EC2RestAuth.parseDateString(vol.getCreated()); | 
 |             if (cal == null) { | 
 |                 cal = Calendar.getInstance(); | 
 |                 cal.set(1970, 1, 1); | 
 |             } | 
 |             param3.setCreateTime(cal); | 
 |  | 
 |             AttachmentSetResponseType param4 = new AttachmentSetResponseType(); | 
 |             if (null != vol.getInstanceId()) { | 
 |                 AttachmentSetItemResponseType param5 = new AttachmentSetItemResponseType(); | 
 |                 param5.setVolumeId(vol.getId().toString()); | 
 |                 param5.setInstanceId(vol.getInstanceId().toString()); | 
 |                 String devicePath = engine.cloudDeviceIdToDevicePath(vol.getHypervisor(), vol.getDeviceId()); | 
 |                 param5.setDevice(devicePath); | 
 |                 param5.setStatus(vol.getAttachmentState()); | 
 |                 if (vol.getAttached() == null) { | 
 |                     param5.setAttachTime(cal); | 
 |                 } else { | 
 |                     Calendar attachTime = EC2RestAuth.parseDateString(vol.getAttached()); | 
 |                     param5.setAttachTime(attachTime); | 
 |                 } | 
 |                 param5.setDeleteOnTermination(false); | 
 |                 param4.addItem(param5); | 
 |             } | 
 |  | 
 |             param3.setAttachmentSet(param4); | 
 |  | 
 |             EC2TagKeyValue[] tags = vol.getResourceTags(); | 
 |             param3.setTagSet(setResourceTags(tags)); | 
 |             param2.addItem(param3); | 
 |         } | 
 |         param1.setVolumeSet(param2); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeVolumesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeInstanceAttributeResponse toDescribeInstanceAttributeResponse(EC2DescribeInstancesResponse engineResponse) { | 
 |         DescribeInstanceAttributeResponse response = new DescribeInstanceAttributeResponse(); | 
 |         DescribeInstanceAttributeResponseType param1 = new DescribeInstanceAttributeResponseType(); | 
 |  | 
 |         EC2Instance[] instanceSet = engineResponse.getInstanceSet(); | 
 |         if (0 < instanceSet.length) { | 
 |             DescribeInstanceAttributeResponseTypeChoice_type0 param2 = new DescribeInstanceAttributeResponseTypeChoice_type0(); | 
 |             NullableAttributeValueType param3 = new NullableAttributeValueType(); | 
 |             param3.setValue(instanceSet[0].getServiceOffering()); | 
 |             param2.setInstanceType(param3); | 
 |             param1.setDescribeInstanceAttributeResponseTypeChoice_type0(param2); | 
 |             param1.setInstanceId(instanceSet[0].getId()); | 
 |         } | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeInstanceAttributeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeInstancesResponse toDescribeInstancesResponse(EC2DescribeInstancesResponse engineResponse, EC2Engine engine) { | 
 |         DescribeInstancesResponse response = new DescribeInstancesResponse(); | 
 |         DescribeInstancesResponseType param1 = new DescribeInstancesResponseType(); | 
 |         ReservationSetType param2 = new ReservationSetType(); | 
 |  | 
 |         EC2Instance[] instances = engineResponse.getInstanceSet(); | 
 |  | 
 |         for (EC2Instance inst : instances) { | 
 |             String accountName = inst.getAccountName(); | 
 |             String domainId = inst.getDomainId(); | 
 |             String ownerId = domainId + ":" + accountName; | 
 |  | 
 |             ReservationInfoType param3 = new ReservationInfoType(); | 
 |  | 
 |             param3.setReservationId(inst.getId());   // -> an id we could track down if needed | 
 |             param3.setOwnerId(ownerId); | 
 |             param3.setRequesterId(""); | 
 |  | 
 |             GroupSetType param4 = new GroupSetType(); | 
 |  | 
 |             EC2SecurityGroup[] groups = inst.getGroupSet(); | 
 |             if (null == groups || 0 == groups.length) { | 
 |                 GroupItemType param5 = new GroupItemType(); | 
 |                 param5.setGroupId(""); | 
 |                 param5.setGroupName(""); | 
 |                 param4.addItem(param5); | 
 |             } else { | 
 |                 for (EC2SecurityGroup group : groups) { | 
 |                     GroupItemType param5 = new GroupItemType(); | 
 |                     param5.setGroupId(group.getId()); | 
 |                     param5.setGroupName(""); | 
 |                     param4.addItem(param5); | 
 |                 } | 
 |             } | 
 |             param3.setGroupSet(param4); | 
 |  | 
 |             RunningInstancesSetType param6 = new RunningInstancesSetType(); | 
 |             RunningInstancesItemType param7 = new RunningInstancesItemType(); | 
 |  | 
 |             param7.setInstanceId(inst.getId()); | 
 |             param7.setImageId(inst.getTemplateId()); | 
 |  | 
 |             InstanceStateType param8 = new InstanceStateType(); | 
 |             param8.setCode(toAmazonCode(inst.getState())); | 
 |             param8.setName(toAmazonStateName(inst.getState())); | 
 |             param7.setInstanceState(param8); | 
 |  | 
 |             param7.setPrivateDnsName(""); | 
 |             param7.setDnsName(""); | 
 |             param7.setReason(""); | 
 |             param7.setKeyName(inst.getKeyPairName()); | 
 |             param7.setAmiLaunchIndex(null); | 
 |             param7.setInstanceType(inst.getServiceOffering()); | 
 |  | 
 |             ProductCodesSetType param9 = new ProductCodesSetType(); | 
 |             ProductCodesSetItemType param10 = new ProductCodesSetItemType(); | 
 |             param10.setProductCode(""); | 
 |             param10.setType(""); | 
 |             param9.addItem(param10); | 
 |             param7.setProductCodes(param9); | 
 |  | 
 |             Calendar cal = inst.getCreated(); | 
 |             if (null == cal) { | 
 |                 cal = Calendar.getInstance(); | 
 | //                 cal.set( 1970, 1, 1 ); | 
 |             } | 
 |             param7.setLaunchTime(cal); | 
 |  | 
 |             PlacementResponseType param11 = new PlacementResponseType(); | 
 |             param11.setAvailabilityZone(inst.getZoneName()); | 
 |             param11.setGroupName(""); | 
 |             param7.setPlacement(param11); | 
 |             param7.setKernelId(""); | 
 |             param7.setRamdiskId(""); | 
 |             param7.setPlatform(""); | 
 |  | 
 |             InstanceMonitoringStateType param12 = new InstanceMonitoringStateType(); | 
 |             param12.setState(""); | 
 |             param7.setMonitoring(param12); | 
 |             param7.setSubnetId(""); | 
 |             param7.setVpcId(""); | 
 | //            String ipAddr = inst.getPrivateIpAddress(); | 
 | //            param7.setPrivateIpAddress((null != ipAddr ? ipAddr : "")); | 
 |             param7.setPrivateIpAddress(inst.getPrivateIpAddress()); | 
 |             param7.setIpAddress(inst.getIpAddress()); | 
 |  | 
 |             StateReasonType param13 = new StateReasonType(); | 
 |             param13.setCode(""); | 
 |             param13.setMessage(""); | 
 |             param7.setStateReason(param13); | 
 |             param7.setArchitecture(""); | 
 |             param7.setRootDeviceType(""); | 
 |             String devicePath = engine.cloudDeviceIdToDevicePath(inst.getHypervisor(), inst.getRootDeviceId()); | 
 |             param7.setRootDeviceName(devicePath); | 
 |  | 
 |             GroupSetType param14 = new GroupSetType(); | 
 |             GroupItemType param15 = new GroupItemType(); // VPC security group | 
 |             param15.setGroupName(""); | 
 |             param15.setGroupName(""); | 
 |             param14.addItem(param15); | 
 |             param7.setGroupSet(param14); | 
 |  | 
 |             param7.setInstanceLifecycle(""); | 
 |             param7.setSpotInstanceRequestId(""); | 
 |             param7.setHypervisor(inst.getHypervisor()); | 
 |  | 
 |             EC2TagKeyValue[] tags = inst.getResourceTags(); | 
 |             param7.setTagSet(setResourceTags(tags)); | 
 |  | 
 |             param6.addItem(param7); | 
 |             param3.setInstancesSet(param6); | 
 |             param2.addItem(param3); | 
 |         } | 
 |         param1.setReservationSet(param2); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeAddressesResponse toDescribeAddressesResponse(EC2DescribeAddressesResponse engineResponse) { | 
 |         List<DescribeAddressesResponseItemType> items = new ArrayList<DescribeAddressesResponseItemType>(); | 
 |         EC2Address[] addressSet = engineResponse.getAddressSet(); | 
 |  | 
 |         for (EC2Address addr : addressSet) { | 
 |             DescribeAddressesResponseItemType item = new DescribeAddressesResponseItemType(); | 
 |             item.setPublicIp(addr.getIpAddress()); | 
 |             item.setInstanceId(addr.getAssociatedInstanceId()); | 
 |             items.add(item); | 
 |         } | 
 |         DescribeAddressesResponseInfoType descAddrRespInfoType = new DescribeAddressesResponseInfoType(); | 
 |         descAddrRespInfoType.setItem(items.toArray(new DescribeAddressesResponseItemType[0])); | 
 |  | 
 |         DescribeAddressesResponseType descAddrRespType = new DescribeAddressesResponseType(); | 
 |         descAddrRespType.setRequestId(UUID.randomUUID().toString()); | 
 |         descAddrRespType.setAddressesSet(descAddrRespInfoType); | 
 |  | 
 |         DescribeAddressesResponse descAddrResp = new DescribeAddressesResponse(); | 
 |         descAddrResp.setDescribeAddressesResponse(descAddrRespType); | 
 |  | 
 |         return descAddrResp; | 
 |     } | 
 |  | 
 |     public static AllocateAddressResponse toAllocateAddressResponse(final EC2Address ec2Address) { | 
 |         AllocateAddressResponse response = new AllocateAddressResponse(); | 
 |         AllocateAddressResponseType param1 = new AllocateAddressResponseType(); | 
 |  | 
 |         param1.setPublicIp(ec2Address.getIpAddress()); | 
 |         param1.setDomain("standard"); | 
 |         param1.setAllocationId(""); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setAllocateAddressResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static ReleaseAddressResponse toReleaseAddressResponse(final boolean result) { | 
 |         ReleaseAddressResponse response = new ReleaseAddressResponse(); | 
 |         ReleaseAddressResponseType param1 = new ReleaseAddressResponseType(); | 
 |  | 
 |         param1.set_return(result); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |  | 
 |         response.setReleaseAddressResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static AssociateAddressResponse toAssociateAddressResponse(final boolean result) { | 
 |         AssociateAddressResponse response = new AssociateAddressResponse(); | 
 |         AssociateAddressResponseType param1 = new AssociateAddressResponseType(); | 
 |  | 
 |         param1.setAssociationId(""); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.set_return(result); | 
 |  | 
 |         response.setAssociateAddressResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DisassociateAddressResponse toDisassociateAddressResponse(final boolean result) { | 
 |         DisassociateAddressResponse response = new DisassociateAddressResponse(); | 
 |         DisassociateAddressResponseType param1 = new DisassociateAddressResponseType(); | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.set_return(result); | 
 |  | 
 |         response.setDisassociateAddressResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     /** | 
 |      * Map our cloud state values into what Amazon defines. | 
 |      * Where are the values that can be returned by our cloud api defined? | 
 |      *  | 
 |      * @param cloudState | 
 |      * @return  | 
 |      */ | 
 |     public static int toAmazonCode(String cloudState) { | 
 |         if (null == cloudState) | 
 |             return 48; | 
 |  | 
 |         if (cloudState.equalsIgnoreCase("Destroyed")) | 
 |             return 48; | 
 |         else if (cloudState.equalsIgnoreCase("Stopped")) | 
 |             return 80; | 
 |         else if (cloudState.equalsIgnoreCase("Running")) | 
 |             return 16; | 
 |         else if (cloudState.equalsIgnoreCase("Starting")) | 
 |             return 0; | 
 |         else if (cloudState.equalsIgnoreCase("Stopping")) | 
 |             return 64; | 
 |         else if (cloudState.equalsIgnoreCase("Error")) | 
 |             return 1; | 
 |         else if (cloudState.equalsIgnoreCase("Expunging")) | 
 |             return 48; | 
 |         else | 
 |             return 16; | 
 |     } | 
 |  | 
 |     public static String toAmazonStateName(String cloudState) { | 
 |         if (null == cloudState) | 
 |             return new String("terminated"); | 
 |  | 
 |         if (cloudState.equalsIgnoreCase("Destroyed")) | 
 |             return new String("terminated"); | 
 |         else if (cloudState.equalsIgnoreCase("Stopped")) | 
 |             return new String("stopped"); | 
 |         else if (cloudState.equalsIgnoreCase("Running")) | 
 |             return new String("running"); | 
 |         else if (cloudState.equalsIgnoreCase("Starting")) | 
 |             return new String("pending"); | 
 |         else if (cloudState.equalsIgnoreCase("Stopping")) | 
 |             return new String("stopping"); | 
 |         else if (cloudState.equalsIgnoreCase("Error")) | 
 |             return new String("error"); | 
 |         else if (cloudState.equalsIgnoreCase("Expunging")) | 
 |             return new String("terminated"); | 
 |         else | 
 |             return new String("running"); | 
 |     } | 
 |  | 
 |     public static StopInstancesResponse toStopInstancesResponse(EC2StopInstancesResponse engineResponse) { | 
 |         StopInstancesResponse response = new StopInstancesResponse(); | 
 |         StopInstancesResponseType param1 = new StopInstancesResponseType(); | 
 |         InstanceStateChangeSetType param2 = new InstanceStateChangeSetType(); | 
 |  | 
 |         EC2Instance[] instances = engineResponse.getInstanceSet(); | 
 |         for (int i = 0; i < instances.length; i++) { | 
 |             InstanceStateChangeType param3 = new InstanceStateChangeType(); | 
 |             param3.setInstanceId(instances[i].getId()); | 
 |  | 
 |             InstanceStateType param4 = new InstanceStateType(); | 
 |             param4.setCode(toAmazonCode(instances[i].getState())); | 
 |             param4.setName(toAmazonStateName(instances[i].getState())); | 
 |             param3.setCurrentState(param4); | 
 |  | 
 |             InstanceStateType param5 = new InstanceStateType(); | 
 |             param5.setCode(toAmazonCode(instances[i].getPreviousState())); | 
 |             param5.setName(toAmazonStateName(instances[i].getPreviousState())); | 
 |             param3.setPreviousState(param5); | 
 |  | 
 |             param2.addItem(param3); | 
 |         } | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.setInstancesSet(param2); | 
 |         response.setStopInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static StartInstancesResponse toStartInstancesResponse(EC2StartInstancesResponse engineResponse) { | 
 |         StartInstancesResponse response = new StartInstancesResponse(); | 
 |         StartInstancesResponseType param1 = new StartInstancesResponseType(); | 
 |         InstanceStateChangeSetType param2 = new InstanceStateChangeSetType(); | 
 |  | 
 |         EC2Instance[] instances = engineResponse.getInstanceSet(); | 
 |         for (int i = 0; i < instances.length; i++) { | 
 |             InstanceStateChangeType param3 = new InstanceStateChangeType(); | 
 |             param3.setInstanceId(instances[i].getId()); | 
 |  | 
 |             InstanceStateType param4 = new InstanceStateType(); | 
 |             param4.setCode(toAmazonCode(instances[i].getState())); | 
 |             param4.setName(toAmazonStateName(instances[i].getState())); | 
 |             param3.setCurrentState(param4); | 
 |  | 
 |             InstanceStateType param5 = new InstanceStateType(); | 
 |             param5.setCode(toAmazonCode(instances[i].getPreviousState())); | 
 |             param5.setName(toAmazonStateName(instances[i].getPreviousState())); | 
 |             param3.setPreviousState(param5); | 
 |  | 
 |             param2.addItem(param3); | 
 |         } | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.setInstancesSet(param2); | 
 |         response.setStartInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static TerminateInstancesResponse toTermInstancesResponse(EC2StopInstancesResponse engineResponse) { | 
 |         TerminateInstancesResponse response = new TerminateInstancesResponse(); | 
 |         TerminateInstancesResponseType param1 = new TerminateInstancesResponseType(); | 
 |         InstanceStateChangeSetType param2 = new InstanceStateChangeSetType(); | 
 |  | 
 |         EC2Instance[] instances = engineResponse.getInstanceSet(); | 
 |         for (int i = 0; i < instances.length; i++) { | 
 |             InstanceStateChangeType param3 = new InstanceStateChangeType(); | 
 |             param3.setInstanceId(instances[i].getId()); | 
 |  | 
 |             InstanceStateType param4 = new InstanceStateType(); | 
 |             param4.setCode(toAmazonCode(instances[i].getState())); | 
 |             param4.setName(toAmazonStateName(instances[i].getState())); | 
 |             param3.setCurrentState(param4); | 
 |  | 
 |             InstanceStateType param5 = new InstanceStateType(); | 
 |             param5.setCode(toAmazonCode(instances[i].getPreviousState())); | 
 |             param5.setName(toAmazonStateName(instances[i].getPreviousState())); | 
 |             param3.setPreviousState(param5); | 
 |  | 
 |             param2.addItem(param3); | 
 |         } | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.setInstancesSet(param2); | 
 |         response.setTerminateInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static RebootInstancesResponse toRebootInstancesResponse(boolean engineResponse) { | 
 |         RebootInstancesResponse response = new RebootInstancesResponse(); | 
 |         RebootInstancesResponseType param1 = new RebootInstancesResponseType(); | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.set_return(engineResponse); | 
 |         response.setRebootInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static RunInstancesResponse toRunInstancesResponse(EC2RunInstancesResponse engineResponse, EC2Engine engine) { | 
 |         RunInstancesResponse response = new RunInstancesResponse(); | 
 |         RunInstancesResponseType param1 = new RunInstancesResponseType(); | 
 |  | 
 |         param1.setReservationId(""); | 
 |  | 
 |         RunningInstancesSetType param6 = new RunningInstancesSetType(); | 
 |         EC2Instance[] instances = engineResponse.getInstanceSet(); | 
 |         for (EC2Instance inst : instances) { | 
 |             RunningInstancesItemType param7 = new RunningInstancesItemType(); | 
 |             param7.setInstanceId(inst.getId()); | 
 |             param7.setImageId(inst.getTemplateId()); | 
 |  | 
 |             String accountName = inst.getAccountName(); | 
 |             String domainId = inst.getDomainId(); | 
 |             String ownerId = domainId + ":" + accountName; | 
 |  | 
 |             param1.setOwnerId(ownerId); | 
 |  | 
 |             EC2SecurityGroup[] groups = inst.getGroupSet(); | 
 |             GroupSetType param2 = new GroupSetType(); | 
 |             if (null == groups || 0 == groups.length) { | 
 |                 GroupItemType param3 = new GroupItemType(); | 
 |                 param3.setGroupId(""); | 
 |                 param2.addItem(param3); | 
 |             } else { | 
 |                 for (EC2SecurityGroup group : groups) { | 
 |                     GroupItemType param3 = new GroupItemType(); | 
 |                     param3.setGroupId(group.getId()); | 
 |                     param2.addItem(param3); | 
 |                 } | 
 |             } | 
 |             param1.setGroupSet(param2); | 
 |  | 
 |             InstanceStateType param8 = new InstanceStateType(); | 
 |             param8.setCode(toAmazonCode(inst.getState())); | 
 |             param8.setName(toAmazonStateName(inst.getState())); | 
 |             param7.setInstanceState(param8); | 
 |  | 
 |             param7.setPrivateDnsName(""); | 
 |             param7.setDnsName(""); | 
 |             param7.setReason(""); | 
 |             param7.setKeyName(inst.getKeyPairName()); | 
 |             param7.setAmiLaunchIndex(null); | 
 |  | 
 |             ProductCodesSetType param9 = new ProductCodesSetType(); | 
 |             ProductCodesSetItemType param10 = new ProductCodesSetItemType(); | 
 |             param10.setProductCode(""); | 
 |             param10.setType(""); | 
 |             param9.addItem(param10); | 
 |             param7.setProductCodes(param9); | 
 |  | 
 |             param7.setInstanceType(inst.getServiceOffering()); | 
 |             // -> CloudStack seems to have issues with timestamp formats so just in case | 
 |             Calendar cal = inst.getCreated(); | 
 |             if (null == cal) { | 
 |                 cal = Calendar.getInstance(); | 
 |                 cal.set(1970, 1, 1); | 
 |             } | 
 |             param7.setLaunchTime(cal); | 
 |  | 
 |             PlacementResponseType param11 = new PlacementResponseType(); | 
 |             param11.setAvailabilityZone(inst.getZoneName()); | 
 |             param7.setPlacement(param11); | 
 |  | 
 |             param7.setKernelId(""); | 
 |             param7.setRamdiskId(""); | 
 |             param7.setPlatform(""); | 
 |  | 
 |             InstanceMonitoringStateType param12 = new InstanceMonitoringStateType(); | 
 |             param12.setState(""); | 
 |             param7.setMonitoring(param12); | 
 |             param7.setSubnetId(""); | 
 |             param7.setVpcId(""); | 
 |             String ipAddr = inst.getPrivateIpAddress(); | 
 |             param7.setPrivateIpAddress((null != ipAddr ? ipAddr : "")); | 
 |             param7.setIpAddress(inst.getIpAddress()); | 
 |  | 
 |             StateReasonType param13 = new StateReasonType(); | 
 |             param13.setCode(""); | 
 |             param13.setMessage(""); | 
 |             param7.setStateReason(param13); | 
 |             param7.setArchitecture(""); | 
 |             param7.setRootDeviceType(""); | 
 |             param7.setRootDeviceName(""); | 
 |  | 
 |             param7.setInstanceLifecycle(""); | 
 |             param7.setSpotInstanceRequestId(""); | 
 |             param7.setVirtualizationType(""); | 
 |             param7.setClientToken(""); | 
 |  | 
 |             ResourceTagSetType param18 = new ResourceTagSetType(); | 
 |             ResourceTagSetItemType param19 = new ResourceTagSetItemType(); | 
 |             param19.setKey(""); | 
 |             param19.setValue(""); | 
 |             param18.addItem(param19); | 
 |             param7.setTagSet(param18); | 
 |  | 
 |             GroupSetType param14 = new GroupSetType(); | 
 |             GroupItemType param15 = new GroupItemType(); | 
 |             param15.setGroupId(""); | 
 |             param15.setGroupName(""); | 
 |             param14.addItem(param15); | 
 |             param7.setGroupSet(param14); | 
 |  | 
 |             String hypervisor = inst.getHypervisor(); | 
 |             param7.setHypervisor((null != hypervisor ? hypervisor : "")); | 
 |             param6.addItem(param7); | 
 |         } | 
 |         param1.setInstancesSet(param6); | 
 |         param1.setRequesterId(""); | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setRunInstancesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeAvailabilityZonesResponse toDescribeAvailabilityZonesResponse(EC2DescribeAvailabilityZonesResponse engineResponse) { | 
 |         DescribeAvailabilityZonesResponse response = new DescribeAvailabilityZonesResponse(); | 
 |         DescribeAvailabilityZonesResponseType param1 = new DescribeAvailabilityZonesResponseType(); | 
 |         AvailabilityZoneSetType param2 = new AvailabilityZoneSetType(); | 
 |  | 
 |         EC2AvailabilityZone[] zones = engineResponse.getAvailabilityZoneSet(); | 
 |         for (EC2AvailabilityZone zone : zones) { | 
 |             AvailabilityZoneItemType param3 = new AvailabilityZoneItemType(); | 
 |             param3.setZoneName(zone.getName()); | 
 |             param3.setZoneState("available"); | 
 |             param3.setRegionName(""); | 
 |  | 
 |             AvailabilityZoneMessageSetType param4 = new AvailabilityZoneMessageSetType(); | 
 |             AvailabilityZoneMessageType param5 = new AvailabilityZoneMessageType(); | 
 |             param5.setMessage(zone.getMessage()); | 
 |             param4.addItem(param5); | 
 |             param3.setMessageSet(param4); | 
 |             param2.addItem(param3); | 
 |         } | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         param1.setAvailabilityZoneInfo(param2); | 
 |         response.setDescribeAvailabilityZonesResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static AttachVolumeResponse toAttachVolumeResponse(EC2Volume engineResponse) { | 
 |         AttachVolumeResponse response = new AttachVolumeResponse(); | 
 |         AttachVolumeResponseType param1 = new AttachVolumeResponseType(); | 
 |  | 
 |         Calendar cal = Calendar.getInstance(); | 
 |  | 
 |         // -> if the instanceId was not given in the request then we have no way to get it | 
 |         param1.setVolumeId(engineResponse.getId().toString()); | 
 |         param1.setInstanceId(engineResponse.getInstanceId().toString()); | 
 |         param1.setDevice(engineResponse.getDevice()); | 
 |         param1.setStatus(engineResponse.getAttachmentState()); | 
 |         param1.setAttachTime(cal); | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setAttachVolumeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DetachVolumeResponse toDetachVolumeResponse(EC2Volume engineResponse) { | 
 |         DetachVolumeResponse response = new DetachVolumeResponse(); | 
 |         DetachVolumeResponseType param1 = new DetachVolumeResponseType(); | 
 |         Calendar cal = Calendar.getInstance(); | 
 |         cal.set(1970, 1, 1);   // return one value, Unix Epoch, what else can we return?  | 
 |  | 
 |         param1.setVolumeId(engineResponse.getId().toString()); | 
 |         param1.setInstanceId((null == engineResponse.getInstanceId() ? "" : engineResponse.getInstanceId().toString())); | 
 |         param1.setDevice((null == engineResponse.getDevice() ? "" : engineResponse.getDevice())); | 
 |         param1.setStatus(engineResponse.getAttachmentState()); | 
 |         param1.setAttachTime(cal); | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDetachVolumeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static CreateVolumeResponse toCreateVolumeResponse(EC2Volume engineResponse) { | 
 |         CreateVolumeResponse response = new CreateVolumeResponse(); | 
 |         CreateVolumeResponseType param1 = new CreateVolumeResponseType(); | 
 |  | 
 |         param1.setVolumeId(engineResponse.getId().toString()); | 
 |         Long volSize = new Long(engineResponse.getSize()); | 
 |         param1.setSize(volSize.toString()); | 
 |         if (engineResponse.getSnapshotId() != null) | 
 |             param1.setSnapshotId(engineResponse.getSnapshotId()); | 
 |         else | 
 |             param1.setSnapshotId(""); | 
 |         param1.setAvailabilityZone(engineResponse.getZoneName()); | 
 |         if (null != engineResponse.getState()) | 
 |             param1.setStatus(engineResponse.getState()); | 
 |         else | 
 |             param1.setStatus("");  // ToDo - throw an Soap Fault  | 
 |  | 
 |         // -> CloudStack seems to have issues with timestamp formats so just in case | 
 |         Calendar cal = EC2RestAuth.parseDateString(engineResponse.getCreated()); | 
 |         if (null == cal) { | 
 |             cal = Calendar.getInstance(); | 
 | //             cal.set( 1970, 1, 1 ); | 
 |         } | 
 |         param1.setCreateTime(cal); | 
 |  | 
 |         param1.setVolumeType("standard"); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setCreateVolumeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DeleteVolumeResponse toDeleteVolumeResponse(EC2Volume engineResponse) { | 
 |         DeleteVolumeResponse response = new DeleteVolumeResponse(); | 
 |         DeleteVolumeResponseType param1 = new DeleteVolumeResponseType(); | 
 |  | 
 |         if (null != engineResponse.getState()) | 
 |             param1.set_return(true); | 
 |         else | 
 |             param1.set_return(false);  // ToDo - supposed to return an error | 
 |  | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDeleteVolumeResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeSnapshotsResponse toDescribeSnapshotsResponse(EC2DescribeSnapshotsResponse engineResponse) { | 
 |         DescribeSnapshotsResponse response = new DescribeSnapshotsResponse(); | 
 |         DescribeSnapshotsResponseType param1 = new DescribeSnapshotsResponseType(); | 
 |         DescribeSnapshotsSetResponseType param2 = new DescribeSnapshotsSetResponseType(); | 
 |  | 
 |         EC2Snapshot[] snaps = engineResponse.getSnapshotSet(); | 
 |         for (EC2Snapshot snap : snaps) { | 
 |             DescribeSnapshotsSetItemResponseType param3 = new DescribeSnapshotsSetItemResponseType(); | 
 |             param3.setSnapshotId(snap.getId()); | 
 |             param3.setVolumeId(snap.getVolumeId()); | 
 |  | 
 |             // our semantics are different than those ec2 uses | 
 |             if (snap.getState().equalsIgnoreCase("backedup")) { | 
 |                 param3.setStatus("completed"); | 
 |                 param3.setProgress("100%"); | 
 |             } else if (snap.getState().equalsIgnoreCase("creating")) { | 
 |                 param3.setStatus("pending"); | 
 |                 param3.setProgress("33%"); | 
 |             } else if (snap.getState().equalsIgnoreCase("backingup")) { | 
 |                 param3.setStatus("pending"); | 
 |                 param3.setProgress("66%"); | 
 |             } else { | 
 |                 // if we see anything besides: backedup/creating/backingup, we assume error | 
 |                 param3.setStatus("error"); | 
 |                 param3.setProgress("0%"); | 
 |             } | 
 | //             param3.setStatus( snap.getState()); | 
 |  | 
 |             String ownerId = snap.getDomainId() + ":" + snap.getAccountName(); | 
 |  | 
 |             // -> CloudStack seems to have issues with timestamp formats so just in case | 
 |             Calendar cal = snap.getCreated(); | 
 |             if (null == cal) { | 
 |                 cal = Calendar.getInstance(); | 
 |                 cal.set(1970, 1, 1); | 
 |             } | 
 |             param3.setStartTime(cal); | 
 |  | 
 |             param3.setOwnerId(ownerId); | 
 |             if (snap.getVolumeSize() == null) | 
 |                 param3.setVolumeSize("0"); | 
 |             else | 
 |                 param3.setVolumeSize(snap.getVolumeSize().toString()); | 
 |             param3.setDescription(snap.getName()); | 
 |             param3.setOwnerAlias(snap.getAccountName()); | 
 |  | 
 |             EC2TagKeyValue[] tags = snap.getResourceTags(); | 
 |             param3.setTagSet(setResourceTags(tags)); | 
 |             param2.addItem(param3); | 
 |         } | 
 |  | 
 |         param1.setSnapshotSet(param2); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeSnapshotsResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DeleteSnapshotResponse toDeleteSnapshotResponse(boolean engineResponse) { | 
 |         DeleteSnapshotResponse response = new DeleteSnapshotResponse(); | 
 |         DeleteSnapshotResponseType param1 = new DeleteSnapshotResponseType(); | 
 |  | 
 |         param1.set_return(engineResponse); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDeleteSnapshotResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static CreateSnapshotResponse toCreateSnapshotResponse(EC2Snapshot engineResponse, EC2Engine engine) { | 
 |         CreateSnapshotResponse response = new CreateSnapshotResponse(); | 
 |         CreateSnapshotResponseType param1 = new CreateSnapshotResponseType(); | 
 |  | 
 |         String accountName = engineResponse.getAccountName(); | 
 |         String domainId = engineResponse.getDomainId().toString(); | 
 |         String ownerId = domainId + ":" + accountName; | 
 |  | 
 |         param1.setSnapshotId(engineResponse.getId().toString()); | 
 |         param1.setVolumeId(engineResponse.getVolumeId().toString()); | 
 |         param1.setStatus("completed"); | 
 |  | 
 |         // -> CloudStack seems to have issues with timestamp formats so just in case | 
 |         Calendar cal = engineResponse.getCreated(); | 
 |         if (null == cal) { | 
 |             cal = Calendar.getInstance(); | 
 |             cal.set(1970, 1, 1); | 
 |         } | 
 |         param1.setStartTime(cal); | 
 |  | 
 |         param1.setProgress("100"); | 
 |         param1.setOwnerId(ownerId); | 
 |         Long volSize = new Long(engineResponse.getVolumeSize()); | 
 |         param1.setVolumeSize(volSize.toString()); | 
 |         param1.setDescription(engineResponse.getName()); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setCreateSnapshotResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeSecurityGroupsResponse toDescribeSecurityGroupsResponse(EC2DescribeSecurityGroupsResponse engineResponse) { | 
 |         DescribeSecurityGroupsResponse response = new DescribeSecurityGroupsResponse(); | 
 |         DescribeSecurityGroupsResponseType param1 = new DescribeSecurityGroupsResponseType(); | 
 |         SecurityGroupSetType param2 = new SecurityGroupSetType(); | 
 |  | 
 |         EC2SecurityGroup[] groups = engineResponse.getGroupSet(); | 
 |         for (EC2SecurityGroup group : groups) { | 
 |             SecurityGroupItemType param3 = new SecurityGroupItemType(); | 
 |             String accountName = group.getAccountName(); | 
 |             String domainId = group.getDomainId(); | 
 |             String ownerId = domainId + ":" + accountName; | 
 |  | 
 |             param3.setOwnerId(ownerId); | 
 |             param3.setGroupName(group.getName()); | 
 |             String desc = group.getDescription(); | 
 |             param3.setGroupDescription((null != desc ? desc : "")); | 
 |             param3.setGroupId(group.getId()); | 
 |             param3.setVpcId(""); | 
 |  | 
 |             IpPermissionSetType param4 = new IpPermissionSetType(); | 
 |             EC2IpPermission[] perms = group.getIpPermissionSet(); | 
 |             for (EC2IpPermission perm : perms) { | 
 |                 // TODO: Fix kludges like this... | 
 |                 if (perm == null) | 
 |                     continue; | 
 |                 IpPermissionType param5 = new IpPermissionType(); | 
 |                 param5.setIpProtocol(perm.getProtocol()); | 
 |                 if (perm.getProtocol().equalsIgnoreCase("icmp")) { | 
 |                     param5.setFromPort(Integer.parseInt(perm.getIcmpType())); | 
 |                     param5.setToPort(Integer.parseInt(perm.getIcmpCode())); | 
 |                 } else { | 
 |                     param5.setFromPort(perm.getFromPort()); | 
 |                     param5.setToPort(perm.getToPort()); | 
 |                 } | 
 |  | 
 |                 // -> user groups | 
 |                 EC2SecurityGroup[] userSet = perm.getUserSet(); | 
 |                 if (null == userSet || 0 == userSet.length) { | 
 |                     UserIdGroupPairSetType param8 = new UserIdGroupPairSetType(); | 
 |                     param5.setGroups(param8); | 
 |                 } else { | 
 |                     for (EC2SecurityGroup secGroup : userSet) { | 
 |                         UserIdGroupPairSetType param8 = new UserIdGroupPairSetType(); | 
 |                         UserIdGroupPairType param9 = new UserIdGroupPairType(); | 
 |                         param9.setUserId(secGroup.getAccount()); | 
 |                         param9.setGroupName(secGroup.getName()); | 
 |                         param8.addItem(param9); | 
 |                         param5.setGroups(param8); | 
 |                     } | 
 |                 } | 
 |  | 
 |                 // -> or CIDR list | 
 |                 String[] rangeSet = perm.getIpRangeSet(); | 
 |                 if (null == rangeSet || 0 == rangeSet.length) { | 
 |                     IpRangeSetType param6 = new IpRangeSetType(); | 
 |                     param5.setIpRanges(param6); | 
 |                 } else { | 
 |                     for (String range : rangeSet) { | 
 |                         // TODO: This needs further attention... | 
 |                         IpRangeSetType param6 = new IpRangeSetType(); | 
 |                         if (range != null) { | 
 |                             IpRangeItemType param7 = new IpRangeItemType(); | 
 |                             param7.setCidrIp(range); | 
 |                             param6.addItem(param7); | 
 |                         } | 
 |                         param5.setIpRanges(param6); | 
 |                     } | 
 |                 } | 
 |                 param4.addItem(param5); | 
 |             } | 
 |             param3.setIpPermissions(param4); | 
 |             EC2TagKeyValue[] tags = group.getResourceTags(); | 
 |             param3.setTagSet(setResourceTags(tags)); | 
 |             param2.addItem(param3); | 
 |         } | 
 |         param1.setSecurityGroupInfo(param2); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeSecurityGroupsResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static CreateSecurityGroupResponse toCreateSecurityGroupResponse(EC2SecurityGroup sg) { | 
 |         CreateSecurityGroupResponse response = new CreateSecurityGroupResponse(); | 
 |         CreateSecurityGroupResponseType param1 = new CreateSecurityGroupResponseType(); | 
 |  | 
 |         param1.setGroupId(sg.getId()); | 
 |         if (sg.getId() != null) | 
 |             param1.set_return(true); | 
 |         else | 
 |             param1.set_return(false); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setCreateSecurityGroupResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DeleteSecurityGroupResponse toDeleteSecurityGroupResponse(boolean success) { | 
 |         DeleteSecurityGroupResponse response = new DeleteSecurityGroupResponse(); | 
 |         DeleteSecurityGroupResponseType param1 = new DeleteSecurityGroupResponseType(); | 
 |  | 
 |         param1.set_return(success); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDeleteSecurityGroupResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static AuthorizeSecurityGroupIngressResponse toAuthorizeSecurityGroupIngressResponse(boolean success) { | 
 |         AuthorizeSecurityGroupIngressResponse response = new AuthorizeSecurityGroupIngressResponse(); | 
 |         AuthorizeSecurityGroupIngressResponseType param1 = new AuthorizeSecurityGroupIngressResponseType(); | 
 |  | 
 |         param1.set_return(success); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setAuthorizeSecurityGroupIngressResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static RevokeSecurityGroupIngressResponse toRevokeSecurityGroupIngressResponse(boolean success) { | 
 |         RevokeSecurityGroupIngressResponse response = new RevokeSecurityGroupIngressResponse(); | 
 |         RevokeSecurityGroupIngressResponseType param1 = new RevokeSecurityGroupIngressResponseType(); | 
 |  | 
 |         param1.set_return(success); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setRevokeSecurityGroupIngressResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static CreateTagsResponse toCreateTagsResponse(boolean success) { | 
 |         CreateTagsResponse response = new CreateTagsResponse(); | 
 |         CreateTagsResponseType param1 = new CreateTagsResponseType(); | 
 |  | 
 |         param1.set_return(success); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setCreateTagsResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DeleteTagsResponse toDeleteTagsResponse(boolean success) { | 
 |         DeleteTagsResponse response = new DeleteTagsResponse(); | 
 |         DeleteTagsResponseType param1 = new DeleteTagsResponseType(); | 
 |  | 
 |         param1.set_return(success); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDeleteTagsResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public static DescribeTagsResponse toDescribeTagsResponse(EC2DescribeTagsResponse engineResponse) { | 
 |         DescribeTagsResponse response = new DescribeTagsResponse(); | 
 |         DescribeTagsResponseType param1 = new DescribeTagsResponseType(); | 
 |  | 
 |         EC2ResourceTag[] tags = engineResponse.getTagsSet(); | 
 |         TagSetType param2 = new TagSetType(); | 
 |         for (EC2ResourceTag tag : tags) { | 
 |             TagSetItemType param3 = new TagSetItemType(); | 
 |             param3.setResourceId(tag.getResourceId()); | 
 |             param3.setResourceType(tag.getResourceType()); | 
 |             param3.setKey(tag.getKey()); | 
 |             if (tag.getValue() != null) | 
 |                 param3.setValue(tag.getValue()); | 
 |             param2.addItem(param3); | 
 |         } | 
 |         param1.setTagSet(param2); | 
 |         param1.setRequestId(UUID.randomUUID().toString()); | 
 |         response.setDescribeTagsResponse(param1); | 
 |         return response; | 
 |     } | 
 |  | 
 |     public DescribeKeyPairsResponse describeKeyPairs(DescribeKeyPairs describeKeyPairs) { | 
 |  | 
 |         EC2DescribeKeyPairs ec2Request = new EC2DescribeKeyPairs(); | 
 |  | 
 |         // multiple keynames may be provided | 
 |         DescribeKeyPairsInfoType kset = describeKeyPairs.getDescribeKeyPairs().getKeySet(); | 
 |         if (kset != null) { | 
 |             DescribeKeyPairsItemType[] keyPairKeys = kset.getItem(); | 
 |             if (keyPairKeys != null) { | 
 |                 for (DescribeKeyPairsItemType key : keyPairKeys) { | 
 |                     ec2Request.addKeyName(key.getKeyName()); | 
 |                 } | 
 |             } | 
 |         } | 
 |  | 
 |         // multiple filters may be provided | 
 |         FilterSetType fset = describeKeyPairs.getDescribeKeyPairs().getFilterSet(); | 
 |         if (fset != null) { | 
 |             ec2Request.setKeyFilterSet(toKeyPairFilterSet(fset)); | 
 |         } | 
 |  | 
 |         return toDescribeKeyPairs(engine.describeKeyPairs(ec2Request)); | 
 |     } | 
 |  | 
 |     public static DescribeKeyPairsResponse toDescribeKeyPairs(final EC2DescribeKeyPairsResponse response) { | 
 |         EC2SSHKeyPair[] keyPairs = response.getKeyPairSet(); | 
 |  | 
 |         DescribeKeyPairsResponseInfoType respInfoType = new DescribeKeyPairsResponseInfoType(); | 
 |         if (keyPairs != null && keyPairs.length > 0) { | 
 |             for (final EC2SSHKeyPair key : keyPairs) { | 
 |                 DescribeKeyPairsResponseItemType respItemType = new DescribeKeyPairsResponseItemType(); | 
 |                 respItemType.setKeyFingerprint(key.getFingerprint()); | 
 |                 respItemType.setKeyName(key.getKeyName()); | 
 |                 respInfoType.addItem(respItemType); | 
 |             } | 
 |         } | 
 |  | 
 |         DescribeKeyPairsResponseType respType = new DescribeKeyPairsResponseType(); | 
 |         respType.setRequestId(UUID.randomUUID().toString()); | 
 |         respType.setKeySet(respInfoType); | 
 |  | 
 |         DescribeKeyPairsResponse resp = new DescribeKeyPairsResponse(); | 
 |         resp.setDescribeKeyPairsResponse(respType); | 
 |         return resp; | 
 |     } | 
 |  | 
 |     public ImportKeyPairResponse importKeyPair(ImportKeyPair importKeyPair) { | 
 |         String publicKey = importKeyPair.getImportKeyPair().getPublicKeyMaterial(); | 
 |         if (!publicKey.contains(" ")) | 
 |             publicKey = new String(Base64.decodeBase64(publicKey.getBytes())); | 
 |  | 
 |         EC2ImportKeyPair ec2Request = new EC2ImportKeyPair(); | 
 |         if (ec2Request != null) { | 
 |             ec2Request.setKeyName(importKeyPair.getImportKeyPair().getKeyName()); | 
 |             ec2Request.setPublicKeyMaterial(publicKey); | 
 |         } | 
 |  | 
 |         return toImportKeyPair(engine.importKeyPair(ec2Request)); | 
 |     } | 
 |  | 
 |     public static ImportKeyPairResponse toImportKeyPair(final EC2SSHKeyPair key) { | 
 |         ImportKeyPairResponseType respType = new ImportKeyPairResponseType(); | 
 |         respType.setRequestId(UUID.randomUUID().toString()); | 
 |         respType.setKeyName(key.getKeyName()); | 
 |         respType.setKeyFingerprint(key.getFingerprint()); | 
 |  | 
 |         ImportKeyPairResponse response = new ImportKeyPairResponse(); | 
 |         response.setImportKeyPairResponse(respType); | 
 |  | 
 |         return response; | 
 |     } | 
 |  | 
 |     public CreateKeyPairResponse createKeyPair(CreateKeyPair createKeyPair) { | 
 |         EC2CreateKeyPair ec2Request = new EC2CreateKeyPair(); | 
 |         if (ec2Request != null) { | 
 |             ec2Request.setKeyName(createKeyPair.getCreateKeyPair().getKeyName()); | 
 |         } | 
 |  | 
 |         return toCreateKeyPair(engine.createKeyPair(ec2Request)); | 
 |     } | 
 |  | 
 |     public static CreateKeyPairResponse toCreateKeyPair(final EC2SSHKeyPair key) { | 
 |         CreateKeyPairResponseType respType = new CreateKeyPairResponseType(); | 
 |         respType.setRequestId(UUID.randomUUID().toString()); | 
 |         respType.setKeyName(key.getKeyName()); | 
 |         respType.setKeyFingerprint(key.getFingerprint()); | 
 |         respType.setKeyMaterial(key.getPrivateKey()); | 
 |  | 
 |         CreateKeyPairResponse response = new CreateKeyPairResponse(); | 
 |         response.setCreateKeyPairResponse(respType); | 
 |  | 
 |         return response; | 
 |     } | 
 |  | 
 |     public DeleteKeyPairResponse deleteKeyPair(DeleteKeyPair deleteKeyPair) { | 
 |         EC2DeleteKeyPair ec2Request = new EC2DeleteKeyPair(); | 
 |         ec2Request.setKeyName(deleteKeyPair.getDeleteKeyPair().getKeyName()); | 
 |  | 
 |         return toDeleteKeyPair(engine.deleteKeyPair(ec2Request)); | 
 |     } | 
 |  | 
 |     public static DeleteKeyPairResponse toDeleteKeyPair(final boolean success) { | 
 |         DeleteKeyPairResponseType respType = new DeleteKeyPairResponseType(); | 
 |         respType.setRequestId(UUID.randomUUID().toString()); | 
 |         respType.set_return(success); | 
 |  | 
 |         DeleteKeyPairResponse response = new DeleteKeyPairResponse(); | 
 |         response.setDeleteKeyPairResponse(respType); | 
 |  | 
 |         return response; | 
 |     } | 
 |  | 
 |     public GetPasswordDataResponse getPasswordData(GetPasswordData getPasswordData) { | 
 |         return toGetPasswordData(engine.getPasswordData(getPasswordData.getGetPasswordData().getInstanceId())); | 
 |     } | 
 |  | 
 |     public static ResourceTagSetType setResourceTags(EC2TagKeyValue[] tags) { | 
 |         ResourceTagSetType param1 = new ResourceTagSetType(); | 
 |         if (null == tags || 0 == tags.length) { | 
 |             ResourceTagSetItemType param2 = new ResourceTagSetItemType(); | 
 |             param2.setKey(""); | 
 |             param2.setValue(""); | 
 |             param1.addItem(param2); | 
 |         } else { | 
 |             for (EC2TagKeyValue tag : tags) { | 
 |                 ResourceTagSetItemType param2 = new ResourceTagSetItemType(); | 
 |                 param2.setKey(tag.getKey()); | 
 |                 if (tag.getValue() != null) | 
 |                     param2.setValue(tag.getValue()); | 
 |                 else | 
 |                     param2.setValue(""); | 
 |                 param1.addItem(param2); | 
 |             } | 
 |         } | 
 |         return param1; | 
 |     } | 
 |  | 
 |     @SuppressWarnings("serial") | 
 |     public static GetPasswordDataResponse toGetPasswordData(final EC2PasswordData passwdData) { | 
 |         return new GetPasswordDataResponse() { | 
 |             { | 
 |                 setGetPasswordDataResponse(new GetPasswordDataResponseType() { | 
 |                     { | 
 |                         setRequestId(UUID.randomUUID().toString()); | 
 |                         setTimestamp(Calendar.getInstance()); | 
 |                         setPasswordData(passwdData.getEncryptedPassword()); | 
 |                         setInstanceId(passwdData.getInstanceId()); | 
 |                     } | 
 |                 }); | 
 |             } | 
 |         }; | 
 |     } | 
 |  | 
 |     // Actions not yet implemented: | 
 |  | 
 |     public ActivateLicenseResponse activateLicense(ActivateLicense activateLicense) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public AssociateDhcpOptionsResponse associateDhcpOptions(AssociateDhcpOptions associateDhcpOptions) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     }; | 
 |  | 
 |     public AttachVpnGatewayResponse attachVpnGateway(AttachVpnGateway attachVpnGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public BundleInstanceResponse bundleInstance(BundleInstance bundleInstance) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CancelBundleTaskResponse cancelBundleTask(CancelBundleTask cancelBundleTask) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CancelConversionTaskResponse cancelConversionTask(CancelConversionTask cancelConversionTask) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CancelSpotInstanceRequestsResponse cancelSpotInstanceRequests(CancelSpotInstanceRequests cancelSpotInstanceRequests) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ConfirmProductInstanceResponse confirmProductInstance(ConfirmProductInstance confirmProductInstance) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateCustomerGatewayResponse createCustomerGateway(CreateCustomerGateway createCustomerGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateDhcpOptionsResponse createDhcpOptions(CreateDhcpOptions createDhcpOptions) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreatePlacementGroupResponse createPlacementGroup(CreatePlacementGroup createPlacementGroup) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateSpotDatafeedSubscriptionResponse createSpotDatafeedSubscription(CreateSpotDatafeedSubscription createSpotDatafeedSubscription) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateSubnetResponse createSubnet(CreateSubnet createSubnet) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateVpcResponse createVpc(CreateVpc createVpc) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateVpnConnectionResponse createVpnConnection(CreateVpnConnection createVpnConnection) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateVpnGatewayResponse createVpnGateway(CreateVpnGateway createVpnGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeactivateLicenseResponse deactivateLicense(DeactivateLicense deactivateLicense) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteCustomerGatewayResponse deleteCustomerGateway(DeleteCustomerGateway deleteCustomerGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteDhcpOptionsResponse deleteDhcpOptions(DeleteDhcpOptions deleteDhcpOptions) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeletePlacementGroupResponse deletePlacementGroup(DeletePlacementGroup deletePlacementGroup) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteSpotDatafeedSubscriptionResponse deleteSpotDatafeedSubscription(DeleteSpotDatafeedSubscription deleteSpotDatafeedSubscription) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteSubnetResponse deleteSubnet(DeleteSubnet deleteSubnet) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteVpcResponse deleteVpc(DeleteVpc deleteVpc) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteVpnConnectionResponse deleteVpnConnection(DeleteVpnConnection deleteVpnConnection) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteVpnGatewayResponse deleteVpnGateway(DeleteVpnGateway deleteVpnGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeBundleTasksResponse describeBundleTasks(DescribeBundleTasks describeBundleTasks) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeConversionTasksResponse describeConversionTasks(DescribeConversionTasks describeConversionTasks) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeCustomerGatewaysResponse describeCustomerGateways(DescribeCustomerGateways describeCustomerGateways) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeDhcpOptionsResponse describeDhcpOptions(DescribeDhcpOptions describeDhcpOptions) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeLicensesResponse describeLicenses(DescribeLicenses describeLicenses) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribePlacementGroupsResponse describePlacementGroups(DescribePlacementGroups describePlacementGroups) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeRegionsResponse describeRegions(DescribeRegions describeRegions) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeReservedInstancesResponse describeReservedInstances(DescribeReservedInstances describeReservedInstances) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeReservedInstancesOfferingsResponse describeReservedInstancesOfferings(DescribeReservedInstancesOfferings describeReservedInstancesOfferings) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeSnapshotAttributeResponse describeSnapshotAttribute(DescribeSnapshotAttribute describeSnapshotAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeSpotDatafeedSubscriptionResponse describeSpotDatafeedSubscription(DescribeSpotDatafeedSubscription describeSpotDatafeedSubscription) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeSpotInstanceRequestsResponse describeSpotInstanceRequests(DescribeSpotInstanceRequests describeSpotInstanceRequests) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeSpotPriceHistoryResponse describeSpotPriceHistory(DescribeSpotPriceHistory describeSpotPriceHistory) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeSubnetsResponse describeSubnets(DescribeSubnets describeSubnets) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeVpcsResponse describeVpcs(DescribeVpcs describeVpcs) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeVpnConnectionsResponse describeVpnConnections(DescribeVpnConnections describeVpnConnections) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeVpnGatewaysResponse describeVpnGateways(DescribeVpnGateways describeVpnGateways) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DetachVpnGatewayResponse detachVpnGateway(DetachVpnGateway detachVpnGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public GetConsoleOutputResponse getConsoleOutput(GetConsoleOutput getConsoleOutput) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ImportInstanceResponse importInstance(ImportInstance importInstance) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ImportVolumeResponse importVolume(ImportVolume importVolume) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ModifySnapshotAttributeResponse modifySnapshotAttribute(ModifySnapshotAttribute modifySnapshotAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public PurchaseReservedInstancesOfferingResponse purchaseReservedInstancesOffering(PurchaseReservedInstancesOffering purchaseReservedInstancesOffering) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public RequestSpotInstancesResponse requestSpotInstances(RequestSpotInstances requestSpotInstances) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ResetInstanceAttributeResponse resetInstanceAttribute(ResetInstanceAttribute resetInstanceAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ResetSnapshotAttributeResponse resetSnapshotAttribute(ResetSnapshotAttribute resetSnapshotAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ResetNetworkInterfaceAttributeResponse resetNetworkInterfaceAttribute(ResetNetworkInterfaceAttribute resetNetworkInterfaceAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateRouteTableResponse createRouteTable(CreateRouteTable createRouteTable) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateNetworkAclEntryResponse createNetworkAclEntry(CreateNetworkAclEntry createNetworkAclEntry) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeVolumeAttributeResponse describeVolumeAttribute(DescribeVolumeAttribute describeVolumeAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteNetworkInterfaceResponse deleteNetworkInterface(DeleteNetworkInterface deleteNetworkInterface) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateInternetGatewayResponse createInternetGateway(CreateInternetGateway createInternetGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DisassociateRouteTableResponse disassociateRouteTable(DisassociateRouteTable disassociateRouteTable) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ReplaceNetworkAclEntryResponse replaceNetworkAclEntry(ReplaceNetworkAclEntry replaceNetworkAclEntry) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public AuthorizeSecurityGroupEgressResponse authorizeSecurityGroupEgress(AuthorizeSecurityGroupEgress authorizeSecurityGroupEgress) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteNetworkAclEntryResponse deleteNetworkAclEntry(DeleteNetworkAclEntry deleteNetworkAclEntry) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteRouteTableResponse deleteRouteTable(DeleteRouteTable deleteRouteTable) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeNetworkInterfaceAttributeResponse describeNetworkInterfaceAttribute(DescribeNetworkInterfaceAttribute describeNetworkInterfaceAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateReservedInstancesListingResponse createReservedInstancesListing(CreateReservedInstancesListing createReservedInstancesListing) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateNetworkAclResponse createNetworkAcl(CreateNetworkAcl createNetworkAcl) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ModifyVolumeAttributeResponse modifyVolumeAttribute(ModifyVolumeAttribute modifyVolumeAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ReplaceNetworkAclAssociationResponse replaceNetworkAclAssociation(ReplaceNetworkAclAssociation replaceNetworkAclAssociation) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public EnableVgwRoutePropagationResponse enableVgwRoutePropagation(EnableVgwRoutePropagation enableVgwRoutePropagation) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public UnassignPrivateIpAddressesResponse unassignPrivateIpAddresses(UnassignPrivateIpAddresses unassignPrivateIpAddresses) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteVpnConnectionRouteResponse deleteVpnConnectionRoute(DeleteVpnConnectionRoute deleteVpnConnectionRoute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CancelReservedInstancesListingResponse cancelReservedInstancesListing(CancelReservedInstancesListing cancelReservedInstancesListing) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeNetworkAclsResponse describeNetworkAcls(DescribeNetworkAcls describeNetworkAcls) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public EnableVolumeIOResponse enableVolumeIO(EnableVolumeIO enableVolumeIO) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeInternetGatewaysResponse describeInternetGateways(DescribeInternetGateways describeInternetGateways) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeReservedInstancesListingsResponse describeReservedInstancesListings(DescribeReservedInstancesListings describeReservedInstancesListings) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeInstanceStatusResponse describeInstanceStatus(DescribeInstanceStatus describeInstanceStatus) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ModifyNetworkInterfaceAttributeResponse modifyNetworkInterfaceAttribute(ModifyNetworkInterfaceAttribute modifyNetworkInterfaceAttribute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DisableVgwRoutePropagationResponse disableVgwRoutePropagation(DisableVgwRoutePropagation disableVgwRoutePropagation) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeVolumeStatusResponse describeVolumeStatus(DescribeVolumeStatus describeVolumeStatus) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DetachNetworkInterfaceResponse detachNetworkInterface(DetachNetworkInterface detachNetworkInterface) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeNetworkInterfacesResponse describeNetworkInterfaces(DescribeNetworkInterfaces describeNetworkInterfaces) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CancelExportTaskResponse cancelExportTask(CancelExportTask cancelExportTask) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateRouteResponse createRoute(CreateRoute createRoute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeRouteTablesResponse describeRouteTables(DescribeRouteTables describeRouteTables) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteNetworkAclResponse deleteNetworkAcl(DeleteNetworkAcl deleteNetworkAcl) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteRouteResponse deleteRoute(DeleteRoute deleteRoute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateVpnConnectionRouteResponse createVpnConnectionRoute(CreateVpnConnectionRoute createVpnConnectionRoute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public AttachInternetGatewayResponse attachInternetGateway(AttachInternetGateway attachInternetGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ReplaceRouteTableAssociationResponse replaceRouteTableAssociation(ReplaceRouteTableAssociation replaceRouteTableAssociation) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public AssociateRouteTableResponse associateRouteTable(AssociateRouteTable associateRouteTable) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DetachInternetGatewayResponse detachInternetGateway(DetachInternetGateway detachInternetGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DescribeExportTasksResponse describeExportTasks(DescribeExportTasks describeExportTasks) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateInstanceExportTaskResponse createInstanceExportTask(CreateInstanceExportTask createInstanceExportTask) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public AssignPrivateIpAddressesResponse assignPrivateIpAddresses(AssignPrivateIpAddresses assignPrivateIpAddresses) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ReportInstanceStatusResponse reportInstanceStatus(ReportInstanceStatus reportInstanceStatus) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public DeleteInternetGatewayResponse deleteInternetGateway(DeleteInternetGateway deleteInternetGateway) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public AttachNetworkInterfaceResponse attachNetworkInterface(AttachNetworkInterface attachNetworkInterface) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public CreateNetworkInterfaceResponse createNetworkInterface(CreateNetworkInterface createNetworkInterface) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public RevokeSecurityGroupEgressResponse revokeSecurityGroupEgress(RevokeSecurityGroupEgress revokeSecurityGroupEgress) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 |  | 
 |     public ReplaceRouteResponse replaceRoute(ReplaceRoute replaceRoute) { | 
 |         throw new EC2ServiceException(ClientError.Unsupported, "This operation is not available"); | 
 |     } | 
 | } |