diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java b/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java index a44276cc16..f2f673edd1 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java @@ -18,8 +18,12 @@ package org.jclouds.ec2.domain; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Map; + import org.jclouds.javax.annotation.Nullable; +import com.google.common.collect.ImmutableMap; + /** * * @see tags; - public PublicIpInstanceIdPair(String region, String publicIp, @Nullable String instanceId) { + public PublicIpInstanceIdPair(final String region, final String publicIp, @Nullable final String instanceId, + @Nullable final Map tags) { this.region = checkNotNull(region, "region"); this.instanceId = instanceId; this.publicIp = checkNotNull(publicIp, "publicIp"); + this.tags = tags == null ? ImmutableMap. of() : ImmutableMap.copyOf(tags); } /** @@ -53,8 +60,8 @@ public class PublicIpInstanceIdPair implements Comparable getTags() { + return tags; + } @Override public int hashCode() { @@ -78,6 +89,7 @@ public class PublicIpInstanceIdPair implements Comparable> { +public class DescribeAddressesResponseHandler extends HandlerForGeneratedRequestWithResult> { @Resource protected Logger logger = Logger.NULL; @@ -42,14 +45,38 @@ public class DescribeAddressesResponseHandler extends @Region Supplier defaultRegion; private String instanceId; + private final TagSetHandler tagSetHandler; + private boolean inTagSet; + private Map tagResults; + + @Inject + DescribeAddressesResponseHandler(final TagSetHandler tagSetHandler) { + this.tagSetHandler = tagSetHandler; + } + + @Override + public void startElement(final String uri, final String name, final String qName, final Attributes attrs) { + if (equalsOrSuffix(qName, "tagSet")) { + inTagSet = true; + } + if (inTagSet) { + tagSetHandler.startElement(uri, name, qName, attrs); + } + } 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")) { + @Override + public void endElement(final String uri, final String name, final String qName) { + if (equalsOrSuffix(qName, "tagSet")) { + inTagSet = false; + tagResults = tagSetHandler.getResult(); + } else if (inTagSet) { + tagSetHandler.endElement(uri, name, qName); + } else if (qName.equals("publicIp")) { ipAddress = currentOrNull(); } else if (qName.equals("instanceId")) { instanceId = currentOrNull(); @@ -57,15 +84,23 @@ public class DescribeAddressesResponseHandler extends String region = AWSUtils.findRegionInArgsOrNull(getRequest()); if (region == null) region = defaultRegion.get(); - pairs.add(new PublicIpInstanceIdPair(region, ipAddress, instanceId)); + + pairs.add(new PublicIpInstanceIdPair(region, ipAddress, instanceId, tagResults)); ipAddress = null; instanceId = null; + tagResults = null; } + currentText.setLength(0); } - public void characters(char[] ch, int start, int length) { - currentText.append(ch, start, length); + @Override + public void characters(final char[] ch, final int start, final int length) { + if (inTagSet) { + tagSetHandler.characters(ch, start, length); + } else { + currentText.append(ch, start, length); + } } @Override diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java index fde64cadca..c4dd09e25f 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java @@ -41,8 +41,8 @@ public class LoadPublicIpForInstanceOrNullTest { expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce(); expect(ipClient.describeAddressesInRegion("region")).andReturn( - ImmutableSet. of(new PublicIpInstanceIdPair("region", "1.1.1.1", "i-blah"))) - .atLeastOnce(); + ImmutableSet. of(new PublicIpInstanceIdPair("region", "1.1.1.1", "i-blah", null))) + .atLeastOnce(); replay(client); replay(ipClient); @@ -85,7 +85,7 @@ public class LoadPublicIpForInstanceOrNullTest { expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce(); expect(ipClient.describeAddressesInRegion("region")).andReturn( - ImmutableSet. of(new PublicIpInstanceIdPair("region", "1.1.1.1", null))) + ImmutableSet. of(new PublicIpInstanceIdPair("region", "1.1.1.1", null, null))) .atLeastOnce(); replay(client); diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java index 65c61c26ed..b9684d0870 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java @@ -20,13 +20,15 @@ import static org.testng.Assert.assertEquals; import java.io.InputStream; import java.net.UnknownHostException; +import java.util.Collections; import java.util.Set; import org.jclouds.ec2.domain.PublicIpInstanceIdPair; import org.jclouds.http.functions.ParseSax; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; /** * Tests behavior of {@code DescribeAddressesResponseHandler} @@ -43,13 +45,29 @@ public class DescribeAddressesResponseHandlerTest extends BaseEC2HandlerTest { addDefaultRegionToHandler(handler); Set result = factory.create(handler).parse(is); + + assertEquals(result, ImmutableSet.of(new PublicIpInstanceIdPair(defaultRegion, "67.202.55.255", "i-f15ebb98", + Collections. emptyMap()), new PublicIpInstanceIdPair(defaultRegion, "67.202.55.233", null, + Collections. emptyMap()))); + } + + public void testApplyInputStreamWithTags() throws UnknownHostException { - assertEquals(result, ImmutableList.of(new PublicIpInstanceIdPair(defaultRegion, - "67.202.55.255", "i-f15ebb98"), new PublicIpInstanceIdPair(defaultRegion, - "67.202.55.233", null))); + InputStream is = getClass().getResourceAsStream("/describe_addresses_with_tags.xml"); + + DescribeAddressesResponseHandler handler = injector.getInstance(DescribeAddressesResponseHandler.class); + addDefaultRegionToHandler(handler); + + Set result = factory.create(handler).parse(is); + + assertEquals(result.size(), 3); + assertEquals(result, ImmutableSet.of(new PublicIpInstanceIdPair(defaultRegion, "67.202.55.255", "i-f15ebb98", + Collections. emptyMap()), new PublicIpInstanceIdPair(defaultRegion, "67.202.55.233", null, + Collections. emptyMap()), new PublicIpInstanceIdPair(defaultRegion, "54.76.27.192", null, + ImmutableMap.of("Name", "value-fa97d19c", "Empty", "")))); } - private void addDefaultRegionToHandler(ParseSax.HandlerWithResult handler) { + private void addDefaultRegionToHandler(final ParseSax.HandlerWithResult handler) { handler.setContext(request); } } diff --git a/apis/ec2/src/test/resources/describe_addresses_with_tags.xml b/apis/ec2/src/test/resources/describe_addresses_with_tags.xml new file mode 100644 index 0000000000..f7fd83c335 --- /dev/null +++ b/apis/ec2/src/test/resources/describe_addresses_with_tags.xml @@ -0,0 +1,24 @@ + + + + i-f15ebb98 + 67.202.55.255 + + + 67.202.55.233 + + + 54.76.27.192 + + + Name + value-fa97d19c + + + Empty + + + + + + \ No newline at end of file