You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/04/02 11:14:26 UTC
[14/25] forking jclouds ec2 api
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
new file mode 100644
index 0000000..d8d7a51
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
@@ -0,0 +1,50 @@
+/*
+ * 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 org.jclouds.ec2.suppliers;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
+import org.jclouds.location.Region;
+import org.jclouds.location.suppliers.RegionIdToURISupplier;
+import org.jclouds.util.Suppliers2;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Maps;
+
+@Singleton
+public class DescribeRegionsForRegionURIs implements RegionIdToURISupplier {
+ private final AvailabilityZoneAndRegionApi client;
+
+ @Inject
+ public DescribeRegionsForRegionURIs(EC2Api client) {
+ this.client = client.getAvailabilityZoneAndRegionApi().get();
+ }
+
+ @Singleton
+ @Region
+ @Override
+ public Map<String, Supplier<URI>> get() {
+ Map<String, URI> regionToUris = client.describeRegions();
+ return Maps.transformValues(regionToUris, Suppliers2.<URI> ofInstanceFunction());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java
new file mode 100644
index 0000000..cc2b68a
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java
@@ -0,0 +1,197 @@
+/*
+ * 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 org.jclouds.ec2.util;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.jclouds.util.Maps2;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+
+/**
+ *
+ * Shortcut to create ingress rules
+ *
+ * @author Adrian Cole
+ */
+public class IpPermissions extends IpPermission {
+
+ protected IpPermissions(IpProtocol ipProtocol, int fromPort, int toPort,
+ Multimap<String, String> userIdGroupPairs, Iterable<String> groupIds, Iterable<String> ipRanges) {
+ super(ipProtocol, fromPort, toPort, userIdGroupPairs, groupIds, userIdGroupPairs.size() == 0 ? ipRanges
+ : ImmutableSet.<String> of());
+ }
+
+ /**
+ * don't rely on this being here.. it will move
+ */
+ @Beta
+ public static Multimap<String, String> buildFormParametersForIndex(final int index, IpPermission permission) {
+ Map<String, String> headers = Maps.newLinkedHashMap();
+ headers.put("IpPermissions.%d.IpProtocol", permission.getIpProtocol().toString());
+ headers.put("IpPermissions.%d.FromPort", permission.getFromPort() + "");
+ headers.put("IpPermissions.%d.ToPort", permission.getToPort() + "");
+ String prefix = "IpPermissions.%d.IpRanges.";
+ int i = 0;
+ for (String cidrIp : checkNotNull(permission.getCidrBlocks(), "cidrIps")) {
+ headers.put(prefix + i++ + ".CidrIp", cidrIp);
+ }
+ prefix = "IpPermissions.%d.Groups.";
+ i = 0;
+ for (String groupId : checkNotNull(permission.getGroupIds(), "groupIds")) {
+ headers.put(prefix + i++ + ".GroupId", groupId);
+ }
+ prefix = "IpPermissions.%d.Groups.";
+ i = 0;
+ for (Entry<String, String> tenantIdGroupNamePair : checkNotNull(permission.getTenantIdGroupNamePairs(),
+ "tenantIdGroupNamePairs").entries()) {
+ headers.put(prefix + i + ".UserId", tenantIdGroupNamePair.getKey());
+ headers.put(prefix + i + ".GroupId", tenantIdGroupNamePair.getValue());
+ i++;
+ }
+ prefix = "IpPermissions.%d.IpRanges.";
+ i = 0;
+ for (String cidrIp : checkNotNull(permission.getCidrBlocks(), "cidrIps")) {
+ headers.put(prefix + i++ + ".CidrIp", cidrIp);
+ }
+ return Multimaps.forMap(Maps2.transformKeys(headers, new Function<String, String>() {
+
+ @Override
+ public String apply(String arg0) {
+ return String.format(arg0, index);
+ }
+
+ }));
+ }
+
+ public static ICMPTypeSelection permitICMP() {
+ return new ICMPTypeSelection();
+ }
+
+ public static ToSourceSelection permitAnyProtocol() {
+ return new ToSourceSelection(IpProtocol.ALL, 1, 65535);
+ }
+
+ public static PortSelection permit(IpProtocol protocol) {
+ return new PortSelection(checkNotNull(protocol, "protocol"));
+ }
+
+ public static class ICMPTypeSelection extends ToSourceSelection {
+
+ ICMPTypeSelection() {
+ super(IpProtocol.ICMP, -1, -1);
+ }
+
+ /**
+ * @param type ex. 8 for ECHO (i.e. Ping)
+ * @see <a href="http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml"> ICMP Types</a>
+ */
+ public AndCodeSelection type(int type) {
+ return new AndCodeSelection(type);
+ }
+ }
+
+ public static class AndCodeSelection extends ToSourceSelection {
+ AndCodeSelection(int type) {
+ super(IpProtocol.ICMP, type, -1);
+ }
+
+ public ToSourceSelection andCode(int code) {
+ return new ToSourceSelection(getIpProtocol(), getFromPort(), code);
+ }
+
+ }
+
+ public static class PortSelection extends ToSourceSelection {
+
+ PortSelection(IpProtocol ipProtocol) {
+ super(ipProtocol, ipProtocol == IpProtocol.ICMP ? -1 : 1, ipProtocol == IpProtocol.ICMP ? -1 : 65535);
+ }
+
+ public ToPortSelection fromPort(int port) {
+ return new ToPortSelection(getIpProtocol(), port);
+ }
+
+ public ToSourceSelection port(int port) {
+ return new ToSourceSelection(getIpProtocol(), port, port);
+ }
+ }
+
+ public static class ToPortSelection extends ToSourceSelection {
+
+ ToPortSelection(IpProtocol ipProtocol, int fromPort) {
+ super(ipProtocol, fromPort, ipProtocol == IpProtocol.ICMP ? -1 : 65535);
+ }
+
+ public ToSourceSelection to(int port) {
+ return new ToSourceSelection(getIpProtocol(), getFromPort(), port);
+ }
+ }
+
+ public static class ToVPCSourceSelection extends IpPermissions {
+
+ protected ToVPCSourceSelection(IpProtocol ipProtocol, int fromPort, int toPort) {
+ super(ipProtocol, fromPort, toPort, ImmutableMultimap.<String, String> of(), ImmutableSet.<String> of(),
+ ImmutableSet.of("0.0.0.0/0"));
+ }
+
+ public IpPermissions originatingFromSecurityGroupId(String groupId) {
+ return toVPCSecurityGroups(ImmutableSet.of(checkNotNull(groupId, "groupId")));
+ }
+
+ public IpPermissions toVPCSecurityGroups(Iterable<String> groupIds) {
+ return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(), getTenantIdGroupNamePairs(), groupIds,
+ ImmutableSet.<String> of());
+ }
+ }
+
+ public static class ToSourceSelection extends ToVPCSourceSelection {
+ ToSourceSelection(IpProtocol ipProtocol, int fromPort, int toPort) {
+ super(ipProtocol, fromPort, toPort);
+ }
+
+ public IpPermissions originatingFromCidrBlock(String cidrIp) {
+ return originatingFromCidrBlocks(ImmutableSet.of(checkNotNull(cidrIp, "cidrIp")));
+ }
+
+ public IpPermissions originatingFromCidrBlocks(Iterable<String> cidrIps) {
+ return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(),
+ ImmutableMultimap.<String, String> of(), ImmutableSet.<String> of(), cidrIps);
+ }
+
+ public IpPermissions originatingFromUserAndSecurityGroup(String userId, String groupName) {
+ return toEC2SecurityGroups(ImmutableMultimap.of(checkNotNull(userId, "userId"),
+ checkNotNull(groupName, "groupName")));
+ }
+
+ public IpPermissions toEC2SecurityGroups(Multimap<String, String> tenantIdGroupNamePairs) {
+ return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(), tenantIdGroupNamePairs, getGroupIds(),
+ ImmutableSet.<String> of());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java
new file mode 100644
index 0000000..6944bb3
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java
@@ -0,0 +1,251 @@
+/*
+ * 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 org.jclouds.ec2.util;
+
+import java.util.Comparator;
+import java.util.Map.Entry;
+
+import org.jclouds.ec2.domain.Subnet;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+
+/**
+ * You can specify filters so that the response includes information for only
+ * certain subnets. For example, you can use a filter to specify that you're
+ * interested in the subnets in the available state. You can specify multiple
+ * values for a filter. The response includes information for a subnet only if
+ * it matches at least one of the filter values that you specified.
+ *
+ * You can specify multiple filters; for example, specify subnets that are in a
+ * specific VPC and are in the available state. The response includes
+ * information for a subnet only if it matches all the filters that you
+ * specified. If there's no match, no special message is returned, the response
+ * is simply empty.
+ *
+ * <h4>Wildcards</h4> You can use wildcards with the filter values: {@code *}
+ * matches zero or more characters, and ? matches exactly one character. You can
+ * escape special characters using a backslash before the character. For
+ * example, a value of {@code \*amazon\?\\} searches for the literal string
+ * {@code *amazon?\}.
+ *
+ * @author Adrian Cole
+ * @author Andrew Bayer
+ * @see SubnetApi
+ */
+public class SubnetFilterBuilder extends ImmutableMultimap.Builder<String, String> {
+
+ private static final String AVAILABILITY_ZONE = "availability-zone";
+ private static final String AVAILABLE_IP_ADDRESS_COUNT = "available-ip-address-count";
+ private static final String CIDR = "cidr";
+ private static final String STATE = "state";
+ private static final String SUBNET_ID = "subnet-id";
+ private static final String TAG_KEY = "tag-key";
+ private static final String TAG_VALUE = "tag-value";
+ private static final String TAG_ARBITRARY_BASE = "tag:";
+ private static final String VPC_ID = "vpc-id";
+
+ public SubnetFilterBuilder availabilityZone(String availabilityZone) {
+ return put(AVAILABILITY_ZONE, availabilityZone);
+ }
+
+ public SubnetFilterBuilder availabilityZones(String... availabilityZones) {
+ return putAll(AVAILABILITY_ZONE, availabilityZones);
+ }
+
+ public SubnetFilterBuilder availabilityZones(Iterable<String> availabilityZones) {
+ return putAll(AVAILABILITY_ZONE, availabilityZones);
+ }
+
+ public SubnetFilterBuilder anyAvailabilityZone() {
+ return putAll(AVAILABILITY_ZONE, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder availableIpAddressCount(String availableIpAddressCount) {
+ return put(AVAILABLE_IP_ADDRESS_COUNT, availableIpAddressCount);
+ }
+
+ public SubnetFilterBuilder availableIpAddressCounts(String... availableIpAddressCounts) {
+ return putAll(AVAILABLE_IP_ADDRESS_COUNT, availableIpAddressCounts);
+ }
+
+ public SubnetFilterBuilder availableIpAddressCounts(Iterable<String> availableIpAddressCounts) {
+ return putAll(AVAILABLE_IP_ADDRESS_COUNT, availableIpAddressCounts);
+ }
+
+ public SubnetFilterBuilder anyAvailableIpAddressCount() {
+ return putAll(AVAILABLE_IP_ADDRESS_COUNT, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder cidr(String cidr) {
+ return put(CIDR, cidr);
+ }
+
+ public SubnetFilterBuilder cidrs(String... cidrs) {
+ return putAll(CIDR, cidrs);
+ }
+
+ public SubnetFilterBuilder cidrs(Iterable<String> cidrs) {
+ return putAll(CIDR, cidrs);
+ }
+
+ public SubnetFilterBuilder anyCidr() {
+ return putAll(CIDR, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder state(String state) {
+ return put(STATE, state);
+ }
+
+ public SubnetFilterBuilder states(String... states) {
+ return putAll(STATE, states);
+ }
+
+ public SubnetFilterBuilder states(Iterable<String> states) {
+ return putAll(STATE, states);
+ }
+
+ public SubnetFilterBuilder anyState() {
+ return putAll(STATE, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder available() {
+ return put(STATE, Subnet.State.AVAILABLE.value());
+ }
+
+ public SubnetFilterBuilder pending() {
+ return put(STATE, Subnet.State.PENDING.value());
+ }
+
+ public SubnetFilterBuilder subnetId(String subnetId) {
+ return put(SUBNET_ID, subnetId);
+ }
+
+ public SubnetFilterBuilder subnetIds(String... subnetIds) {
+ return putAll(SUBNET_ID, subnetIds);
+ }
+
+ public SubnetFilterBuilder subnetIds(Iterable<String> subnetIds) {
+ return putAll(SUBNET_ID, subnetIds);
+ }
+
+ public SubnetFilterBuilder anySubnetId() {
+ return putAll(SUBNET_ID, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder tagKey(String tagKey) {
+ return put(TAG_KEY, tagKey);
+ }
+
+ public SubnetFilterBuilder tagKeys(String... tagKeys) {
+ return putAll(TAG_KEY, tagKeys);
+ }
+
+ public SubnetFilterBuilder tagKeys(Iterable<String> tagKeys) {
+ return putAll(TAG_KEY, tagKeys);
+ }
+
+ public SubnetFilterBuilder anyTagKey() {
+ return putAll(TAG_KEY, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder tagValue(String tagValue) {
+ return put(TAG_VALUE, tagValue);
+ }
+
+ public SubnetFilterBuilder tagValues(String... tagValues) {
+ return putAll(TAG_VALUE, tagValues);
+ }
+
+ public SubnetFilterBuilder tagValues(Iterable<String> tagValues) {
+ return putAll(TAG_VALUE, tagValues);
+ }
+
+ public SubnetFilterBuilder anyTagValue() {
+ return putAll(TAG_VALUE, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder vpcId(String vpcId) {
+ return put(VPC_ID, vpcId);
+ }
+
+ public SubnetFilterBuilder vpcIds(String... vpcIds) {
+ return putAll(VPC_ID, vpcIds);
+ }
+
+ public SubnetFilterBuilder vpcIds(Iterable<String> vpcIds) {
+ return putAll(VPC_ID, vpcIds);
+ }
+
+ public SubnetFilterBuilder anyVpcId() {
+ return putAll(VPC_ID, ImmutableSet.<String> of());
+ }
+
+ public SubnetFilterBuilder arbitraryTag(String arbitraryTagKey, String arbitraryTagValue) {
+ return put(TAG_ARBITRARY_BASE + arbitraryTagKey, arbitraryTagValue);
+ }
+
+ public SubnetFilterBuilder arbitraryTag(String arbitraryTagKey, String... arbitraryTagValues) {
+ return putAll(TAG_ARBITRARY_BASE + arbitraryTagKey, arbitraryTagValues);
+ }
+
+ public SubnetFilterBuilder arbitraryTag(String arbitraryTagKey, Iterable<String> arbitraryTagValues) {
+ return putAll(TAG_ARBITRARY_BASE + arbitraryTagKey, arbitraryTagValues);
+ }
+
+
+ // to set correct return val in chain
+
+ @Override
+ public SubnetFilterBuilder put(String key, String value) {
+ return SubnetFilterBuilder.class.cast(super.put(key, value));
+ }
+
+ @Override
+ public SubnetFilterBuilder put(Entry<? extends String, ? extends String> entry) {
+ return SubnetFilterBuilder.class.cast(super.put(entry));
+ }
+
+ @Override
+ public SubnetFilterBuilder putAll(String key, Iterable<? extends String> values) {
+ return SubnetFilterBuilder.class.cast(super.putAll(key, values));
+ }
+
+ @Override
+ public SubnetFilterBuilder putAll(String key, String... values) {
+ return SubnetFilterBuilder.class.cast(super.putAll(key, values));
+ }
+
+ @Override
+ public SubnetFilterBuilder putAll(Multimap<? extends String, ? extends String> multimap) {
+ return SubnetFilterBuilder.class.cast(super.putAll(multimap));
+ }
+
+ @Override
+ @Beta
+ public SubnetFilterBuilder orderKeysBy(Comparator<? super String> keyComparator) {
+ return SubnetFilterBuilder.class.cast(super.orderKeysBy(keyComparator));
+ }
+
+ @Override
+ @Beta
+ public SubnetFilterBuilder orderValuesBy(Comparator<? super String> valueComparator) {
+ return SubnetFilterBuilder.class.cast(super.orderValuesBy(valueComparator));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java
new file mode 100644
index 0000000..c2ccedd
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java
@@ -0,0 +1,223 @@
+/*
+ * 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 org.jclouds.ec2.util;
+
+import java.util.Comparator;
+import java.util.Map.Entry;
+
+import org.jclouds.ec2.domain.Tag;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+
+/**
+ * You can use filters to limit the results when describing tags. For example,
+ * you could get only the tags for a particular resource type. You can specify
+ * multiple values for a filter. A tag must match at least one of the specified
+ * values for it to be included in the results.
+ *
+ * You can specify multiple filters (for example, limit the results to a
+ * specific resource type, and get only tags with values that contain the string
+ * database). The result includes information for a particular tag only if it
+ * matches all your filters. If there's no match, no special message is
+ * returned; the response is simply empty.
+ *
+ * <h4>Wildcards</h4> You can use wildcards with the filter values: {@code *}
+ * matches zero or more characters, and ? matches exactly one character. You can
+ * escape special characters using a backslash before the character. For
+ * example, a value of {@code \*amazon\?\\} searches for the literal string
+ * {@code *amazon?\}.
+ *
+ * @author Adrian Cole
+ * @see TagApi
+ */
+public class TagFilterBuilder extends ImmutableMultimap.Builder<String, String> {
+
+ private static final String KEY = "key";
+ private static final String VALUE = "value";
+ private static final String RESOURCE_ID = "resource-id";
+ private static final String RESOURCE_TYPE = "resource-type";
+
+ public TagFilterBuilder key(String key) {
+ return put(KEY, key);
+ }
+
+ public TagFilterBuilder keys(String... keys) {
+ return putAll(KEY, keys);
+ }
+
+ public TagFilterBuilder keys(Iterable<String> keys) {
+ return putAll(KEY, keys);
+ }
+
+ public TagFilterBuilder anyKey() {
+ return putAll(KEY, ImmutableSet.<String> of());
+ }
+
+ public TagFilterBuilder value(String value) {
+ return put(VALUE, value);
+ }
+
+ public TagFilterBuilder values(String... values) {
+ return putAll(VALUE, ImmutableSet.<String> copyOf(values));
+ }
+
+ public TagFilterBuilder values(Iterable<String> values) {
+ return putAll(VALUE, ImmutableSet.<String> copyOf(values));
+ }
+
+ public TagFilterBuilder anyValue() {
+ return putAll(VALUE, ImmutableSet.<String> of());
+ }
+
+ public TagFilterBuilder resourceId(String resourceId) {
+ return put(RESOURCE_ID, resourceId);
+ }
+
+ public TagFilterBuilder resourceIds(String... resourceIds) {
+ return putAll(RESOURCE_ID, resourceIds);
+ }
+
+ public TagFilterBuilder resourceIds(Iterable<String> resourceIds) {
+ return putAll(RESOURCE_ID, resourceIds);
+ }
+
+ public TagFilterBuilder anyResourceId() {
+ return putAll(RESOURCE_ID, ImmutableSet.<String> of());
+ }
+
+ public TagFilterBuilder resourceType(String resourceType) {
+ return put(RESOURCE_TYPE, resourceType);
+ }
+
+ public TagFilterBuilder resourceTypes(String... resourceTypes) {
+ return putAll(RESOURCE_TYPE, resourceTypes);
+ }
+
+ public TagFilterBuilder resourceTypes(Iterable<String> resourceTypes) {
+ return putAll(RESOURCE_TYPE, resourceTypes);
+ }
+
+ public TagFilterBuilder anyResourceType() {
+ return putAll(RESOURCE_TYPE, ImmutableSet.<String> of());
+ }
+
+ public TagFilterBuilder customerGateway() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.CUSTOMER_GATEWAY);
+ }
+
+ public TagFilterBuilder dhcpOptions() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.DHCP_OPTIONS);
+ }
+
+ public TagFilterBuilder image() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.IMAGE);
+ }
+
+ public TagFilterBuilder instance() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.INSTANCE);
+ }
+
+ public TagFilterBuilder internetGateway() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.INTERNET_GATEWAY);
+ }
+
+ public TagFilterBuilder networkAcl() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.NETWORK_ACL);
+ }
+
+ public TagFilterBuilder reservedInstance() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.RESERVED_INSTANCES);
+ }
+
+ public TagFilterBuilder routeTable() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.ROUTE_TABLE);
+ }
+
+ public TagFilterBuilder securityGroup() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.SECURITY_GROUP);
+ }
+
+ public TagFilterBuilder snapshot() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.SNAPSHOT);
+ }
+
+ public TagFilterBuilder instancesRequest() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.SPOT_INSTANCES_REQUEST);
+ }
+
+ public TagFilterBuilder subnet() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.SUBNET);
+ }
+
+ public TagFilterBuilder volume() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.VOLUME);
+ }
+
+ public TagFilterBuilder vpc() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.VPC);
+ }
+
+ public TagFilterBuilder vpnConnection() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.VPN_CONNECTION);
+ }
+
+ public TagFilterBuilder vpnGateway() {
+ return put(RESOURCE_TYPE, Tag.ResourceType.VPN_GATEWAY);
+ }
+
+ // to set correct return val in chain
+
+ @Override
+ public TagFilterBuilder put(String key, String value) {
+ return TagFilterBuilder.class.cast(super.put(key, value));
+ }
+
+ @Override
+ public TagFilterBuilder put(Entry<? extends String, ? extends String> entry) {
+ return TagFilterBuilder.class.cast(super.put(entry));
+ }
+
+ @Override
+ public TagFilterBuilder putAll(String key, Iterable<? extends String> values) {
+ return TagFilterBuilder.class.cast(super.putAll(key, values));
+ }
+
+ @Override
+ public TagFilterBuilder putAll(String key, String... values) {
+ return TagFilterBuilder.class.cast(super.putAll(key, values));
+ }
+
+ @Override
+ public TagFilterBuilder putAll(Multimap<? extends String, ? extends String> multimap) {
+ return TagFilterBuilder.class.cast(super.putAll(multimap));
+ }
+
+ @Override
+ @Beta
+ public TagFilterBuilder orderKeysBy(Comparator<? super String> keyComparator) {
+ return TagFilterBuilder.class.cast(super.orderKeysBy(keyComparator));
+ }
+
+ @Override
+ @Beta
+ public TagFilterBuilder orderValuesBy(Comparator<? super String> valueComparator) {
+ return TagFilterBuilder.class.cast(super.orderValuesBy(valueComparator));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/Tags.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/Tags.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/Tags.java
new file mode 100644
index 0000000..23e5ca1
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/util/Tags.java
@@ -0,0 +1,101 @@
+/*
+ * 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 org.jclouds.ec2.util;
+
+import static com.google.common.collect.Multimaps.index;
+
+import java.util.Map;
+
+import org.jclouds.ec2.domain.Tag;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Maps;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class Tags {
+ private Tags() {
+ }
+
+ /**
+ * maps the input on {@link Tag#getResourceId()} with a value of a map of its {@link Tag#getKey()} to
+ * {@link Tag#getValue()}
+ */
+ public static Map<String, Map<String, String>> resourceToTagsAsMap(Iterable<Tag> tags) {
+ return Maps.transformValues(index(tags, resourceIdFunction()).asMap(),
+ new Function<Iterable<Tag>, Map<String, String>>() {
+ @Override
+ public Map<String, String> apply(Iterable<Tag> in) {
+ return Maps.transformValues(Maps.uniqueIndex(in, keyFunction()), valueFunction());
+ }
+ });
+ }
+
+ public static enum ValueFunction implements Function<Tag, String> {
+ INSTANCE;
+ @Override
+ public String apply(Tag in) {
+ return in.getValue().or("");
+ }
+
+ @Override
+ public String toString() {
+ return "getValue()";
+ }
+ }
+
+ public static Function<Tag, String> valueFunction() {
+ return ValueFunction.INSTANCE;
+ }
+
+ public static enum KeyFunction implements Function<Tag, String> {
+ INSTANCE;
+ @Override
+ public String apply(Tag in) {
+ return in.getKey();
+ }
+
+ @Override
+ public String toString() {
+ return "getKey()";
+ }
+ }
+
+ public static Function<Tag, String> keyFunction() {
+ return KeyFunction.INSTANCE;
+ }
+
+ public static enum ResourceIdFunction implements Function<Tag, String> {
+ INSTANCE;
+ @Override
+ public String apply(Tag in) {
+ return in.getResourceId();
+ }
+
+ @Override
+ public String toString() {
+ return "getResourceId()";
+ }
+ }
+
+ public static Function<Tag, String> resourceIdFunction() {
+ return ResourceIdFunction.INSTANCE;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java
new file mode 100644
index 0000000..a798201
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java
@@ -0,0 +1,56 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import javax.annotation.Resource;
+
+import org.jclouds.http.functions.ParseSax.HandlerWithResult;
+import org.jclouds.logging.Logger;
+
+/**
+ * @author Adrian Cole
+ */
+public class AllocateAddressResponseHandler extends HandlerWithResult<String> {
+
+ @Resource
+ protected Logger logger = Logger.NULL;
+
+ private String ipAddress;
+ private StringBuilder currentText = new StringBuilder();
+
+ protected String currentOrNull() {
+ String returnVal = currentText.toString().trim();
+ return returnVal.equals("") ? null : returnVal;
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equals("publicIp")) {
+ ipAddress = currentOrNull();
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+
+ @Override
+ public String getResult() {
+ return ipAddress;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java
new file mode 100644
index 0000000..24affca
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java
@@ -0,0 +1,86 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import java.util.Date;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Supplier;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class AttachmentHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Attachment> {
+
+ @Resource
+ protected Logger logger = Logger.NULL;
+
+ protected final DateCodec dateCodec;
+ protected final Supplier<String> defaultRegion;
+
+ @Inject
+ AttachmentHandler(DateCodecFactory dateCodecFactory, @Region Supplier<String> defaultRegion) {
+ this.dateCodec = dateCodecFactory.iso8601();
+ this.defaultRegion = defaultRegion;
+ }
+
+ private StringBuilder currentText = new StringBuilder();
+ private String volumeId;
+ private String instanceId;
+ private String device;
+ private Attachment.Status attachmentStatus;
+ private Date attachTime;
+
+ public Attachment getResult() {
+ String region = AWSUtils.findRegionInArgsOrNull(getRequest());
+ if (region == null)
+ region = defaultRegion.get();
+ return new Attachment(region, volumeId, instanceId, device, attachmentStatus, attachTime);
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equals("volumeId")) {
+ volumeId = currentText.toString().trim();
+ } else if (qName.equals("volumeId")) {
+ volumeId = currentText.toString().trim();
+ } else if (qName.equals("status")) {
+ attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
+ } else if (qName.equals("instanceId")) {
+ instanceId = currentText.toString().trim();
+ } else if (qName.equals("device")) {
+ device = currentText.toString().trim();
+ } else if (qName.equals("attachTime")) {
+ attachTime = dateCodec.toDate(currentText.toString().trim());
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java
new file mode 100644
index 0000000..521d5a6
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java
@@ -0,0 +1,217 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
+import java.util.Date;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.BlockDevice;
+import org.jclouds.ec2.domain.InstanceState;
+import org.jclouds.ec2.domain.Reservation;
+import org.jclouds.ec2.domain.RootDeviceType;
+import org.jclouds.ec2.domain.RunningInstance;
+import org.jclouds.ec2.domain.RunningInstance.Builder;
+import org.jclouds.http.functions.ParseSax.HandlerForGeneratedRequestWithResult;
+import org.jclouds.location.Region;
+import org.xml.sax.Attributes;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Sets;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public abstract class BaseReservationHandler<T> extends HandlerForGeneratedRequestWithResult<T> {
+
+ protected final DateCodec dateCodec;
+ protected final Supplier<String> defaultRegion;
+
+ @Inject
+ public BaseReservationHandler(DateCodecFactory dateCodecFactory, @Region Supplier<String> defaultRegion) {
+ this.dateCodec = dateCodecFactory.iso8601();
+ this.defaultRegion = defaultRegion;
+ }
+
+ protected Builder<?> builder = newBuilder();
+
+ protected Builder<?> newBuilder() {
+ return RunningInstance.builder();
+ }
+
+ protected void inItem() {
+ if (endOfInstanceItem()) {
+ refineBuilderBeforeAddingInstance();
+ instances.add(builder.build());
+ builder = newBuilder();
+ }
+ }
+
+ protected StringBuilder currentText = new StringBuilder();
+ protected int itemDepth;
+ protected boolean inInstancesSet;
+ protected boolean inProductCodes;
+ protected boolean inGroupSet;
+
+ // attachments
+ private String volumeId;
+ private Attachment.Status attachmentStatus;
+ private Date attachTime;
+ private boolean deleteOnTermination;
+ private String deviceName;
+
+ // reservation stuff
+ private Set<String> groupNames = Sets.newLinkedHashSet();
+ private String ownerId;
+ private String requesterId;
+ private String reservationId;
+
+ private Set<RunningInstance> instances = Sets.newLinkedHashSet();
+
+
+ public void startElement(String uri, String name, String qName, Attributes attrs) {
+ if (equalsOrSuffix(qName, "item")) {
+ itemDepth++;
+ } else if (equalsOrSuffix(qName, "instancesSet")) {
+ inInstancesSet = true;
+ } else if (equalsOrSuffix(qName, "productCodes")) {
+ inProductCodes = true;
+ } else if (equalsOrSuffix(qName, "groupSet")) {
+ inGroupSet = true;
+ }
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (equalsOrSuffix(qName, "item")) {
+ inItem();
+ itemDepth--;
+ } else if (equalsOrSuffix(qName, "instancesSet")) {
+ inInstancesSet = false;
+ } else if (equalsOrSuffix(qName, "productCodes")) {
+ inProductCodes = false;
+ } else if (equalsOrSuffix(qName, "groupSet")) {
+ inGroupSet = false;
+ } else if (equalsOrSuffix(qName, "groupId")) {
+ groupNames.add(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "ownerId")) {
+ ownerId = currentOrNull(currentText);
+ } else if (equalsOrSuffix(qName, "requesterId")) {
+ requesterId = currentOrNull(currentText);
+ } else if (equalsOrSuffix(qName, "reservationId")) {
+ reservationId = currentOrNull(currentText);
+ } else if (equalsOrSuffix(qName, "amiLaunchIndex")) {
+ builder.amiLaunchIndex(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "dnsName")) {
+ builder.dnsName(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "imageId")) {
+ builder.imageId(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "instanceId")) {
+ builder.instanceId(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "name")) {
+ String rawState = currentOrNull(currentText);
+ if (rawState != null) {
+ builder.rawState(rawState);
+ builder.instanceState(InstanceState.fromValue(rawState));
+ }
+ } else if (equalsOrSuffix(qName, "instanceType")) {
+ builder.instanceType(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "ipAddress")) {
+ builder.ipAddress(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "kernelId")) {
+ builder.kernelId(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "keyName")) {
+ builder.keyName(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "launchTime")) {
+ builder.launchTime(dateCodec.toDate(currentOrNull(currentText)));
+ } else if (equalsOrSuffix(qName, "availabilityZone")) {
+ builder.availabilityZone(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "virtualizationType")) {
+ builder.virtualizationType(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "platform")) {
+ builder.platform(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "privateDnsName")) {
+ builder.privateDnsName(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "privateIpAddress")) {
+ builder.privateIpAddress(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "ramdiskId")) {
+ builder.ramdiskId(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "reason")) {
+ builder.reason(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "rootDeviceType")) {
+ builder.rootDeviceType(RootDeviceType.fromValue(currentOrNull(currentText)));
+ } else if (equalsOrSuffix(qName, "rootDeviceName")) {
+ builder.rootDeviceName(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "deviceName")) {
+ deviceName = currentOrNull(currentText);
+ } else if (equalsOrSuffix(qName, "volumeId")) {
+ volumeId = currentOrNull(currentText);
+ } else if (equalsOrSuffix(qName, "status")) {
+ attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
+ } else if (equalsOrSuffix(qName, "attachTime")) {
+ attachTime = dateCodec.toDate(currentOrNull(currentText));
+ } else if (equalsOrSuffix(qName, "deleteOnTermination")) {
+ deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
+ } else if (equalsOrSuffix(qName, "ebs")) {
+ builder.device(deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, deleteOnTermination));
+ this.deviceName = null;
+ this.volumeId = null;
+ this.attachmentStatus = null;
+ this.attachTime = null;
+ this.deleteOnTermination = true;
+ }
+ currentText = new StringBuilder();
+ }
+
+
+ protected void refineBuilderBeforeAddingInstance() {
+ String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null;
+ builder.region((region == null) ? defaultRegion.get() : region);
+ builder.groupNames(groupNames);
+ }
+
+ protected boolean endOfInstanceItem() {
+ return itemDepth <= 2 && inInstancesSet && !inProductCodes && !inGroupSet;
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+
+ protected Reservation<? extends RunningInstance> newReservation() {
+ String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null;
+ if (region == null)
+ region = defaultRegion.get();
+ Reservation<? extends RunningInstance> info = new Reservation<RunningInstance>(region, groupNames, instances,
+ ownerId, requesterId, reservationId);
+ this.groupNames = Sets.newLinkedHashSet();
+ this.instances = Sets.newLinkedHashSet();
+ this.ownerId = null;
+ this.requesterId = null;
+ this.reservationId = null;
+ return info;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.java
new file mode 100644
index 0000000..fc5a33f
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.java
@@ -0,0 +1,82 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.BlockDevice;
+import org.jclouds.http.functions.ParseSax;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Inject;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class BlockDeviceMappingHandler extends
+ ParseSax.HandlerWithResult<Map<String, BlockDevice>> {
+ private StringBuilder currentText = new StringBuilder();
+
+ private Map<String, BlockDevice> ebsBlockDevices = Maps.newHashMap();
+ private String deviceName;
+ private String volumeId;
+ private boolean deleteOnTermination = true;// correct default is true.
+ private Attachment.Status attachmentStatus;
+ private Date attachTime;
+
+ protected final DateCodec dateCodec;
+
+ @Inject
+ public BlockDeviceMappingHandler(DateCodecFactory dateCodecFactory) {
+ this.dateCodec = dateCodecFactory.iso8601();
+ }
+
+ public Map<String, BlockDevice> getResult() {
+ return ebsBlockDevices;
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equals("deviceName")) {
+ deviceName = currentText.toString().trim();
+ } else if (qName.equals("volumeId")) {
+ volumeId = currentText.toString().trim();
+ } else if (qName.equals("deleteOnTermination")) {
+ deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
+ } else if (qName.equals("status")) {
+ attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
+ } else if (qName.equals("attachTime")) {
+ attachTime = dateCodec.toDate(currentText.toString().trim());
+ } else if (qName.equals("item")) {
+ ebsBlockDevices.put(deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, deleteOnTermination));
+ this.volumeId = null;
+ this.deviceName = null;
+ this.deleteOnTermination = true;
+ this.attachmentStatus = null;
+ this.attachTime = null;
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java
new file mode 100644
index 0000000..35112d9
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java
@@ -0,0 +1,46 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import org.jclouds.http.functions.ParseSax;
+
+/**
+ *
+ * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeInstanceAttribute.html"
+ * />
+ * @author Adrian Cole
+ */
+public class BooleanValueHandler extends ParseSax.HandlerWithResult<Boolean> {
+
+ private StringBuilder currentText = new StringBuilder();
+ private boolean value;
+
+ public Boolean getResult() {
+ return value;
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equalsIgnoreCase("value")) {
+ this.value = Boolean.parseBoolean(currentText.toString().trim());
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java
new file mode 100644
index 0000000..2ffebc2
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java
@@ -0,0 +1,111 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import java.util.Date;
+
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.BundleTask;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+
+import com.google.common.base.Supplier;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class BundleTaskHandler extends ParseSax.HandlerForGeneratedRequestWithResult<BundleTask> {
+ protected final DateCodec dateCodec;
+ protected final Supplier<String> defaultRegion;
+
+ @Inject
+ protected BundleTaskHandler(DateCodecFactory dateCodecFactory, @Region Supplier<String> defaultRegion) {
+ this.dateCodec = dateCodecFactory.iso8601();
+ this.defaultRegion = defaultRegion;
+ }
+
+ private StringBuilder currentText = new StringBuilder();
+
+ private String bundleId;
+ private String code;
+ private String message;
+ private String instanceId;
+ private int progress = 0;
+ private Date startTime;
+ private String state;
+ private String bucket;
+ private String prefix;
+ private Date updateTime;
+
+ public BundleTask getResult() {
+ String region = AWSUtils.findRegionInArgsOrNull(getRequest());
+ if (region == null)
+ region = defaultRegion.get();
+ BundleTask.Error error = null;
+ if (code != null)
+ error = new BundleTask.Error(code, message);
+ BundleTask returnVal = new BundleTask(region, bundleId, error, instanceId, progress, startTime,
+ state, bucket, prefix, updateTime);
+ this.bundleId = null;
+ this.code = null;
+ this.message = null;
+ this.instanceId = null;
+ this.progress = 0;
+ this.startTime = null;
+ this.state = null;
+ this.bucket = null;
+ this.prefix = null;
+ this.updateTime = null;
+ return returnVal;
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equals("bundleId")) {
+ bundleId = currentText.toString().trim();
+ } else if (qName.equals("code")) {
+ code = currentText.toString().trim();
+ } else if (qName.equals("message")) {
+ message = currentText.toString().trim();
+ } else if (qName.equals("instanceId")) {
+ instanceId = currentText.toString().trim();
+ } else if (qName.equals("progress")) {
+ String temp = currentText.toString().trim();
+ temp = temp.substring(0, temp.length() - 1);
+ progress = Integer.parseInt(temp);
+ } else if (qName.equals("startTime")) {
+ startTime = dateCodec.toDate(currentText.toString().trim());
+ } else if (qName.equals("state")) {
+ state = currentText.toString().trim();
+ } else if (qName.equals("bucket")) {
+ bucket = currentText.toString().trim();
+ } else if (qName.equals("prefix")) {
+ prefix = currentText.toString().trim();
+ } else if (qName.equals("updateTime")) {
+ updateTime = dateCodec.toDate(currentText.toString().trim());
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java
new file mode 100644
index 0000000..ca1c77d
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java
@@ -0,0 +1,198 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.Volume;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+import org.jclouds.location.Zone;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.xml.sax.Attributes;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class CreateVolumeResponseHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Volume> {
+ protected final DateCodec dateCodec;
+ protected final Supplier<String> defaultRegion;
+ protected final Supplier<Map<String, Supplier<Set<String>>>> regionToZonesSupplier;
+ protected final Supplier<Set<String>> zonesSupplier;
+
+ @Inject
+ protected CreateVolumeResponseHandler(DateCodecFactory dateCodecFactory, @Region Supplier<String> defaultRegion,
+ @Zone Supplier<Map<String, Supplier<Set<String>>>> regionToZonesSupplier,
+ @Zone Supplier<Set<String>> zonesSupplier) {
+ this.dateCodec = dateCodecFactory.iso8601();
+ this.defaultRegion = defaultRegion;
+ this.regionToZonesSupplier = regionToZonesSupplier;
+ this.zonesSupplier = zonesSupplier;
+ }
+
+ protected StringBuilder currentText = new StringBuilder();
+
+ protected String id;
+ protected int size;
+ protected String snapshotId;
+ protected String availabilityZone;
+ protected Volume.Status volumeStatus;
+ protected Date createTime;
+ protected Set<Attachment> attachments = Sets.newLinkedHashSet();
+
+ protected String volumeId;
+ protected String instanceId;
+ protected String device;
+ protected Attachment.Status attachmentStatus;
+ protected Date attachTime;
+
+ protected boolean inAttachmentSet;
+
+ protected String region;
+
+ public Volume getResult() {
+ return newVolume();
+ }
+
+ public void startElement(String uri, String name, String qName, Attributes attrs) {
+ if (qName.equals("attachmentSet")) {
+ inAttachmentSet = true;
+ }
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equals("volumeId")) {
+ if (inAttachmentSet) {
+ volumeId = currentText.toString().trim();
+ } else {
+ id = currentText.toString().trim();
+ }
+ } else if (qName.equals("size")) {
+ size = Integer.parseInt(currentText.toString().trim());
+ } else if (qName.equals("availabilityZone")) {
+ availabilityZone = currentText.toString().trim();
+ } else if (qName.equals("volumeId")) {
+ if (inAttachmentSet) {
+ volumeId = currentText.toString().trim();
+ } else {
+ id = currentText.toString().trim();
+ }
+ } else if (qName.equals("status")) {
+ if (inAttachmentSet) {
+ attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
+ } else {
+ volumeStatus = Volume.Status.fromValue(currentText.toString().trim());
+ }
+ } else if (qName.equals("createTime")) {
+ createTime = dateCodec.toDate(currentText.toString().trim());
+ } else if (qName.equals("attachmentSet")) {
+ inAttachmentSet = false;
+ } else if (qName.equals("instanceId")) {
+ instanceId = currentText.toString().trim();
+ } else if (qName.equals("snapshotId")) {
+ snapshotId = currentText.toString().trim();
+ if (snapshotId.equals(""))
+ snapshotId = null;
+ } else if (qName.equals("device")) {
+ device = currentText.toString().trim();
+ } else if (qName.equals("attachTime")) {
+ attachTime = dateCodec.toDate(currentText.toString().trim());
+ } else if (qName.equals("item")) {
+ if (inAttachmentSet) {
+ attachments.add(new Attachment(region, volumeId, instanceId, device, attachmentStatus, attachTime));
+ volumeId = null;
+ instanceId = null;
+ device = null;
+ attachmentStatus = null;
+ attachTime = null;
+ }
+
+ }
+ currentText = new StringBuilder();
+ }
+
+ private Volume newVolume() {
+ Volume volume = new Volume(region, id, size, snapshotId, availabilityZone, volumeStatus, createTime, attachments);
+ id = null;
+ size = 0;
+ snapshotId = null;
+ availabilityZone = null;
+ volumeStatus = null;
+ createTime = null;
+ attachments = Sets.newLinkedHashSet();
+ return volume;
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+
+ @Override
+ public CreateVolumeResponseHandler setContext(HttpRequest request) {
+ super.setContext(request);
+ region = AWSUtils.findRegionInArgsOrNull(getRequest());
+ if (region == null) {
+ Set<String> zones = zonesSupplier.get();
+ String zone = findAvailabilityZoneInArgsOrNull(getRequest(), zones);
+ if (zone != null) {
+ Map<String, Set<String>> regionToZones = Maps.transformValues(regionToZonesSupplier.get(), Suppliers
+ .<Set<String>> supplierFunction());
+ for (Entry<String, Set<String>> entry : regionToZones.entrySet()) {
+ if (entry.getValue().contains(zone)) {
+ region = entry.getKey();
+ break;
+ }
+
+ }
+ checkNotNull(regionToZones, String.format("zone %s not in %s", zone, regionToZones));
+ } else {
+ region = defaultRegion.get();
+ }
+ }
+ return this;
+ }
+
+ public static String findAvailabilityZoneInArgsOrNull(GeneratedHttpRequest gRequest, Set<String> zones) {
+ for (Object arg : gRequest.getInvocation().getArgs()) {
+ if (arg instanceof String) {
+ String zone = (String) arg;
+ if (zones.contains(zone))
+ return zone;
+ }
+ }
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
new file mode 100644
index 0000000..731b8ff
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
@@ -0,0 +1,80 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
+import org.jclouds.http.functions.ParseSax.HandlerForGeneratedRequestWithResult;
+import org.jclouds.location.Region;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Sets;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class DescribeAddressesResponseHandler extends
+ HandlerForGeneratedRequestWithResult<Set<PublicIpInstanceIdPair>> {
+
+ @Resource
+ protected Logger logger = Logger.NULL;
+ private Set<PublicIpInstanceIdPair> pairs = Sets.newLinkedHashSet();
+ private String ipAddress;
+ private StringBuilder currentText = new StringBuilder();
+ @Inject
+ @Region
+ Supplier<String> defaultRegion;
+ private String instanceId;
+
+ protected String currentOrNull() {
+ String returnVal = currentText.toString().trim();
+ return returnVal.equals("") ? null : returnVal;
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equals("publicIp")) {
+ ipAddress = currentOrNull();
+ } else if (qName.equals("instanceId")) {
+ instanceId = currentOrNull();
+ } else if (qName.equals("item")) {
+ String region = AWSUtils.findRegionInArgsOrNull(getRequest());
+ if (region == null)
+ region = defaultRegion.get();
+ pairs.add(new PublicIpInstanceIdPair(region, ipAddress, instanceId));
+ ipAddress = null;
+ instanceId = null;
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+
+ @Override
+ public Set<PublicIpInstanceIdPair> getResult() {
+ return pairs;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java
new file mode 100644
index 0000000..66d1403
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java
@@ -0,0 +1,104 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.ec2.domain.AvailabilityZoneInfo;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+import org.jclouds.logging.Logger;
+import org.xml.sax.Attributes;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Sets;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class DescribeAvailabilityZonesResponseHandler extends ParseSax.HandlerWithResult<Set<AvailabilityZoneInfo>> {
+ private StringBuilder currentText = new StringBuilder();
+ private final Supplier<String> defaultRegion;
+
+ private Set<AvailabilityZoneInfo> availabilityZones = Sets.newLinkedHashSet();
+ private String zone;
+ @Resource
+ protected Logger logger = Logger.NULL;
+ private String region;
+ private String zoneState;
+ private boolean inMessageSet;
+ private Set<String> messages = Sets.newHashSet();
+
+ /**
+ * clones like {@code openstack-nova-ec2}, which don't support multiple regions don't return region in the XML
+ * output.
+ */
+ @Inject
+ DescribeAvailabilityZonesResponseHandler(@Region Supplier<String> defaultRegion) {
+ this.defaultRegion = defaultRegion;
+ }
+
+ @Override
+ public void startDocument() {
+ region = defaultRegion.get();
+ }
+
+ public Set<AvailabilityZoneInfo> getResult() {
+ return availabilityZones;
+ }
+
+ public void startElement(String uri, String name, String qName, Attributes attrs) {
+ if (qName.equals("messageSet")) {
+ inMessageSet = true;
+ }
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (qName.equals("zoneName")) {
+ zone = currentText.toString().trim();
+ } else if (qName.equals("regionName")) {
+ try {
+ region = currentText.toString().trim();
+ } catch (IllegalArgumentException e) {
+ logger.warn(e, "unsupported region: %s", currentText.toString().trim());
+ region = "UNKNOWN";
+ }
+ } else if (qName.equals("zoneState")) {
+ zoneState = currentText.toString().trim();
+ } else if (qName.equals("message")) {
+ messages.add(currentText.toString().trim());
+ } else if (qName.equals("messageSet")) {
+ inMessageSet = false;
+ } else if (qName.equals("item") && !inMessageSet) {
+ availabilityZones.add(new AvailabilityZoneInfo(zone, zoneState, region, messages));
+ this.zone = null;
+ this.region = defaultRegion.get();
+ this.zoneState = null;
+ this.messages = Sets.newHashSet();
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ currentText.append(ch, start, length);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeBundleTasksResponseHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeBundleTasksResponseHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeBundleTasksResponseHandler.java
new file mode 100644
index 0000000..1d826ce
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeBundleTasksResponseHandler.java
@@ -0,0 +1,73 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.jclouds.ec2.domain.BundleTask;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.http.functions.ParseSax.HandlerWithResult;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+import com.google.common.collect.Sets;
+
+/**
+ * @author Adrian Cole
+ */
+public class DescribeBundleTasksResponseHandler extends ParseSax.HandlerWithResult<Set<BundleTask>> {
+
+ private Set<BundleTask> bundleTasks = Sets.newLinkedHashSet();
+ private final BundleTaskHandler bundleTaskHandler;
+
+ @Inject
+ public DescribeBundleTasksResponseHandler(BundleTaskHandler bundleTaskHandler) {
+ this.bundleTaskHandler = bundleTaskHandler;
+ }
+
+ public Set<BundleTask> getResult() {
+ return bundleTasks;
+ }
+
+ @Override
+ public HandlerWithResult<Set<BundleTask>> setContext(HttpRequest request) {
+ bundleTaskHandler.setContext(request);
+ return super.setContext(request);
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ if (!qName.equals("item"))
+ bundleTaskHandler.startElement(uri, localName, qName, attributes);
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ if (qName.equals("item")) {
+ bundleTasks.add(bundleTaskHandler.getResult());
+ }
+ bundleTaskHandler.endElement(uri, localName, qName);
+ }
+
+ public void characters(char ch[], int start, int length) {
+ bundleTaskHandler.characters(ch, start, length);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/58fe66df/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeImagesResponseHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeImagesResponseHandler.java b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeImagesResponseHandler.java
new file mode 100644
index 0000000..b55875a
--- /dev/null
+++ b/dependencies/jclouds/apis/ec2/1.7.1-stratos/src/main/java/org/jclouds/ec2/xml/DescribeImagesResponseHandler.java
@@ -0,0 +1,223 @@
+/*
+ * 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 org.jclouds.ec2.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.ec2.domain.Hypervisor;
+import org.jclouds.ec2.domain.Image;
+import org.jclouds.ec2.domain.RootDeviceType;
+import org.jclouds.ec2.domain.VirtualizationType;
+import org.jclouds.ec2.domain.Image.Architecture;
+import org.jclouds.ec2.domain.Image.EbsBlockDevice;
+import org.jclouds.ec2.domain.Image.ImageState;
+import org.jclouds.ec2.domain.Image.ImageType;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+import org.jclouds.logging.Logger;
+import org.xml.sax.Attributes;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+/**
+ * Parses the following XML document:
+ * <p/>
+ * DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2010-08-31/"
+ *
+ * @author Adrian Cole
+ * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html"
+ * />
+ */
+public class DescribeImagesResponseHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Set<Image>> {
+
+ @Inject
+ public DescribeImagesResponseHandler(@Region Supplier<String> defaultRegion, TagSetHandler tagSetHandler) {
+ this.defaultRegion = defaultRegion;
+ this.tagSetHandler = tagSetHandler;
+ }
+
+ @Resource
+ protected Logger logger = Logger.NULL;
+
+ protected Set<Image> contents = Sets.newLinkedHashSet();
+ private StringBuilder currentText = new StringBuilder();
+ private final Supplier<String> defaultRegion;
+ private final TagSetHandler tagSetHandler;
+
+ private Architecture architecture;
+ private String name;
+ private String description;
+ private String imageId;
+ private String imageLocation;
+ private String imageOwnerId;
+ private ImageState imageState;
+ private String rawState;
+ private ImageType imageType;
+ private boolean isPublic;
+ private String kernelId;
+ private String platform;
+ private Set<String> productCodes = Sets.newHashSet();
+ private String ramdiskId;
+ private boolean inProductCodes;
+ private boolean inBlockDeviceMapping;
+ private boolean inTagSet;
+ private RootDeviceType rootDeviceType = RootDeviceType.INSTANCE_STORE;
+ private Map<String, EbsBlockDevice> ebsBlockDevices = Maps.newHashMap();
+ private Map<String, String> tags = Maps.newLinkedHashMap();
+ private String deviceName;
+ private String snapshotId;
+ private VirtualizationType virtualizationType = VirtualizationType.PARAVIRTUAL;
+ private Hypervisor hypervisor = Hypervisor.XEN;
+
+ private int volumeSize;
+ private boolean deleteOnTermination = true;// correct default is true.
+
+ private String rootDeviceName;
+
+ public Set<Image> getResult() {
+ return contents;
+ }
+
+ public void startElement(String uri, String name, String qName, Attributes attrs) {
+ if (qName.equals("productCodes")) {
+ inProductCodes = true;
+ } else if (qName.equals("blockDeviceMapping")) {
+ inBlockDeviceMapping = true;
+ } else if (equalsOrSuffix(qName, "tagSet")) {
+ inTagSet = true;
+ }
+ if (inTagSet) {
+ tagSetHandler.startElement(uri, name, qName, attrs);
+ }
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if (equalsOrSuffix(qName, "tagSet")) {
+ inTagSet = false;
+ tags = tagSetHandler.getResult();
+ } else if (inTagSet) {
+ tagSetHandler.endElement(uri, name, qName);
+ }
+ if (qName.equals("architecture")) {
+ architecture = Architecture.fromValue(currentText.toString().trim());
+ // Nova Diablo uses the wrong name for this field
+ } else if (qName.equals("name") || qName.equals("displayName")) {
+ this.name = currentText.toString().trim();
+ } else if (qName.equals("description")) {
+ description = currentText.toString().trim();
+ } else if (qName.equals("imageId")) {
+ imageId = currentText.toString().trim();
+ } else if (qName.equals("deviceName")) {
+ deviceName = currentText.toString().trim();
+ } else if (qName.equals("imageLocation")) {
+ imageLocation = currentText.toString().trim();
+ } else if (qName.equals("imageOwnerId")) {
+ imageOwnerId = currentText.toString().trim();
+ } else if (qName.equals("imageState")) {
+ rawState = currentOrNull(currentText);
+ imageState = ImageState.fromValue(rawState);
+ } else if (qName.equals("imageType")) {
+ imageType = ImageType.fromValue(currentText.toString().trim());
+ } else if (qName.equals("isPublic")) {
+ isPublic = Boolean.parseBoolean(currentText.toString().trim());
+ } else if (qName.equals("kernelId")) {
+ kernelId = currentText.toString().trim();
+ } else if (qName.equals("platform")) {
+ platform = currentText.toString().trim();
+ } else if (qName.equals("productCode")) {
+ productCodes.add(currentText.toString().trim());
+ } else if (qName.equals("productCodes")) {
+ inProductCodes = false;
+ } else if (qName.equals("blockDeviceMapping")) {
+ inBlockDeviceMapping = false;
+ } else if (qName.equals("snapshotId")) {
+ snapshotId = currentText.toString().trim();
+ } else if (qName.equals("volumeSize")) {
+ volumeSize = Integer.parseInt(currentText.toString().trim());
+ } else if (qName.equals("deleteOnTermination")) {
+ deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
+ } else if (qName.equals("ramdiskId")) {
+ ramdiskId = currentText.toString().trim();
+ } else if (qName.equals("rootDeviceType")) {
+ rootDeviceType = RootDeviceType.fromValue(currentText.toString().trim());
+ } else if (qName.equals("rootDeviceName")) {
+ rootDeviceName = currentText.toString().trim();
+ } else if (qName.equals("virtualizationType")) {
+ virtualizationType = VirtualizationType.fromValue(currentText.toString().trim());
+ } else if (qName.equals("hypervisor")) {
+ hypervisor = Hypervisor.fromValue(currentText.toString().trim());
+ } else if (qName.equals("item")) {
+ if (inBlockDeviceMapping) {
+ ebsBlockDevices.put(deviceName, new Image.EbsBlockDevice(snapshotId, volumeSize, deleteOnTermination));
+ this.deviceName = null;
+ this.snapshotId = null;
+ this.volumeSize = 0;
+ this.deleteOnTermination = true;
+ } else if (!inTagSet && !inProductCodes) {
+ try {
+ String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null;
+ if (region == null)
+ region = defaultRegion.get();
+ contents.add(new Image(region, architecture, this.name, description, imageId, imageLocation,
+ imageOwnerId, imageState, rawState, imageType, isPublic, productCodes, kernelId, platform,
+ ramdiskId, rootDeviceType, rootDeviceName, ebsBlockDevices, tags, virtualizationType, hypervisor));
+ } catch (NullPointerException e) {
+ logger.warn(e, "malformed image: %s", imageId);
+ }
+ this.name = null;
+ this.description = null;
+ this.architecture = null;
+ this.imageId = null;
+ this.imageLocation = null;
+ this.imageOwnerId = null;
+ this.imageState = null;
+ this.rawState = null;
+ this.imageType = null;
+ this.isPublic = false;
+ this.kernelId = null;
+ this.platform = null;
+ this.productCodes = Sets.newHashSet();
+ this.ramdiskId = null;
+ this.rootDeviceType = RootDeviceType.INSTANCE_STORE;
+ this.rootDeviceName = null;
+ this.ebsBlockDevices = Maps.newHashMap();
+ this.virtualizationType = VirtualizationType.PARAVIRTUAL;
+ this.hypervisor = Hypervisor.XEN;
+ }
+
+ }
+ currentText = new StringBuilder();
+ }
+
+ public void characters(char ch[], int start, int length) {
+ if (inTagSet) {
+ tagSetHandler.characters(ch, start, length);
+ } else {
+ currentText.append(ch, start, length);
+ }
+ }
+}