diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/domain/Service.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/domain/Service.java
index 2da7bab460..949ce8a8f6 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/domain/Service.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/domain/Service.java
@@ -22,9 +22,12 @@ import static com.google.common.base.Objects.equal;
import static com.google.common.base.Objects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
+import java.beans.ConstructorProperties;
import java.util.Set;
import com.google.common.base.Objects;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ForwardingSet;
import com.google.common.collect.ImmutableSet;
/**
@@ -36,7 +39,7 @@ import com.google.common.collect.ImmutableSet;
* @see
*/
-public class Service implements Comparable {
+public class Service extends ForwardingSet implements Comparable {
public static Builder builder() {
return new Builder();
@@ -91,16 +94,11 @@ public class Service implements Comparable {
}
}
- protected Service() {
- // we want serializers like Gson to work w/o using sun.misc.Unsafe,
- // prohibited in GAE. This also implies fields are not final.
- // see http://code.google.com/p/jclouds/issues/detail?id=925
- }
-
- protected String type;
- protected String name;
- protected Set endpoints = ImmutableSet.of();
+ protected final String type;
+ protected final String name;
+ protected final Set endpoints;
+ @ConstructorProperties({ "type", "name", "endpoints" })
public Service(String type, String name, Set endpoints) {
this.type = checkNotNull(type, "type");
this.name = checkNotNull(name, "name");
@@ -155,11 +153,15 @@ public class Service implements Comparable {
@Override
public int compareTo(Service that) {
- if (that == null)
- return 1;
- if (this == that)
- return 0;
- return this.type.compareTo(that.type);
+ return ComparisonChain.start()
+ .compare(this.type, that.type)
+ .compare(this.name, that.name)
+ .result();
+ }
+
+ @Override
+ protected Set delegate() {
+ return endpoints;
}
}
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/suppliers/LocationIdToURIFromAccessForTypeAndVersion.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/suppliers/LocationIdToURIFromAccessForTypeAndVersion.java
index 4206cf673c..0d5bcb050e 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/suppliers/LocationIdToURIFromAccessForTypeAndVersion.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/suppliers/LocationIdToURIFromAccessForTypeAndVersion.java
@@ -21,6 +21,7 @@ package org.jclouds.openstack.keystone.v2_0.suppliers;
import java.net.URI;
import java.util.Map;
import java.util.NoSuchElementException;
+import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -35,6 +36,7 @@ import com.google.common.base.Predicate;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
import com.google.inject.assistedinject.Assisted;
@Singleton
@@ -59,32 +61,36 @@ public class LocationIdToURIFromAccessForTypeAndVersion implements Supplier