Add equals/hashCode to Providers.guicify(...) results.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=65072672
diff --git a/core/src/com/google/inject/util/Providers.java b/core/src/com/google/inject/util/Providers.java
index e191b01..c18d351 100644
--- a/core/src/com/google/inject/util/Providers.java
+++ b/core/src/com/google/inject/util/Providers.java
@@ -97,40 +97,60 @@
Set<InjectionPoint> injectionPoints =
InjectionPoint.forInstanceMethodsAndFields(provider.getClass());
if(injectionPoints.isEmpty()) {
- return new Provider<T>() {
- public T get() {
- return delegate.get();
- }
-
- @Override public String toString() {
- return "guicified(" + delegate + ")";
- }
- };
+ return new GuicifiedProvider<T>(delegate);
} else {
Set<Dependency<?>> mutableDeps = Sets.newHashSet();
for(InjectionPoint ip : injectionPoints) {
mutableDeps.addAll(ip.getDependencies());
}
final Set<Dependency<?>> dependencies = ImmutableSet.copyOf(mutableDeps);
- return new ProviderWithDependencies<T>() {
- @SuppressWarnings("unused")
- @Inject
- void initialize(Injector injector) {
- injector.injectMembers(delegate);
- }
-
- public Set<Dependency<?>> getDependencies() {
- return dependencies;
- }
-
- public T get() {
- return delegate.get();
- }
-
- @Override public String toString() {
- return "guicified(" + delegate + ")";
- }
- };
+ return new GuicifiedProviderWithDependencies<T>(dependencies, delegate);
+ }
+ }
+
+ private static class GuicifiedProvider<T> implements Provider<T> {
+ protected final javax.inject.Provider<T> delegate;
+
+ private GuicifiedProvider(javax.inject.Provider<T> delegate) {
+ this.delegate = delegate;
+ }
+
+ public T get() {
+ return delegate.get();
+ }
+
+ @Override public String toString() {
+ return "guicified(" + delegate + ")";
+ }
+
+ @Override public boolean equals(Object obj) {
+ return (obj instanceof GuicifiedProvider)
+ && Objects.equal(delegate, ((GuicifiedProvider<?>) obj).delegate);
+ }
+
+ @Override public int hashCode() {
+ return Objects.hashCode(delegate);
+ }
+ }
+
+ private static final class GuicifiedProviderWithDependencies<T>
+ extends GuicifiedProvider<T> implements ProviderWithDependencies<T> {
+ private final Set<Dependency<?>> dependencies;
+
+ private GuicifiedProviderWithDependencies(Set<Dependency<?>> dependencies,
+ javax.inject.Provider<T> delegate) {
+ super(delegate);
+ this.dependencies = dependencies;
+ }
+
+ @SuppressWarnings("unused")
+ @Inject
+ void initialize(Injector injector) {
+ injector.injectMembers(delegate);
+ }
+
+ public Set<Dependency<?>> getDependencies() {
+ return dependencies;
}
}
}
diff --git a/core/test/com/google/inject/util/ProvidersTest.java b/core/test/com/google/inject/util/ProvidersTest.java
index d03b5bc..e442c40 100644
--- a/core/test/com/google/inject/util/ProvidersTest.java
+++ b/core/test/com/google/inject/util/ProvidersTest.java
@@ -16,11 +16,14 @@
package com.google.inject.util;
+import com.google.common.base.Objects;
import com.google.common.testing.EqualsTester;
import com.google.inject.Provider;
import junit.framework.TestCase;
+import javax.inject.Inject;
+
/**
* Unit tests for {@link Providers}.
*
@@ -50,4 +53,58 @@
Providers.of("Hello"))
.testEquals();
}
+
+ public void testGuicifyEquality() {
+ new EqualsTester()
+ .addEqualityGroup(
+ Providers.guicify(new JavaxProvider(10)),
+ Providers.guicify(new JavaxProvider(10)))
+ .addEqualityGroup(
+ Providers.guicify(new JavaxProvider(11)),
+ Providers.guicify(new JavaxProvider(11)))
+ .addEqualityGroup(
+ Providers.guicify(new JavaxProviderWithDependencies()),
+ Providers.guicify(new JavaxProviderWithDependencies()))
+ .testEquals();
+ }
+
+ private static class JavaxProvider implements javax.inject.Provider<Integer> {
+ private final int value;
+
+ public JavaxProvider(int value) {
+ this.value = value;
+ }
+
+ public Integer get() {
+ return value;
+ }
+
+ @Override public int hashCode() {
+ return Objects.hashCode(value);
+ }
+
+ @Override public boolean equals(Object obj) {
+ return (obj instanceof JavaxProvider) && (value == ((JavaxProvider) obj).value);
+ }
+ }
+
+ private static class JavaxProviderWithDependencies implements javax.inject.Provider<Integer> {
+ private int value;
+
+ @Inject void setValue(int value) {
+ this.value = value;
+ }
+
+ public Integer get() {
+ return value;
+ }
+
+ @Override public int hashCode() {
+ return 42;
+ }
+
+ @Override public boolean equals(Object obj) {
+ return (obj instanceof JavaxProviderWithDependencies);
+ }
+ }
}