Skip to content

Commit c473ac9

Browse files
committed
Merge pull request #23 from twz123/standard-object-methods-for-proxy
Object standard methods support for proxy instances
2 parents d6cb7e1 + 216c505 commit c473ac9

File tree

4 files changed

+78
-7
lines changed

4 files changed

+78
-7
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,12 @@
228228
<artifactId>joda-time</artifactId>
229229
<version>2.6</version>
230230
</dependency>
231+
<dependency>
232+
<groupId>org.mockito</groupId>
233+
<artifactId>mockito-core</artifactId>
234+
<version>2.0.31-beta</version>
235+
<scope>test</scope>
236+
</dependency>
231237
</dependencies>
232238
<profiles>
233239
<profile>

src/main/java/de/zalando/sprocwrapper/proxy/SProcProxy.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
99

10+
import com.google.common.base.Objects;
11+
import com.google.common.reflect.AbstractInvocationHandler;
12+
1013
import de.zalando.sprocwrapper.dsprovider.DataSourceProvider;
1114

1215
/**
1316
* @author jmussler
1417
*/
15-
class SProcProxy implements java.lang.reflect.InvocationHandler {
18+
class SProcProxy extends AbstractInvocationHandler {
1619

1720
private final HashMap<Method, StoredProcedure> sprocs = new HashMap<Method, StoredProcedure>();
1821
private final DataSourceProvider dataSourceProvider;
1922

2023
private static final Logger LOG = LoggerFactory.getLogger(OtherStoredProcedureParameter.class);
24+
private final String description;
2125

2226
public boolean addStoredProcedure(final Method method, final StoredProcedure p) {
2327
if (sprocs.containsKey(method)) {
@@ -28,23 +32,33 @@ public boolean addStoredProcedure(final Method method, final StoredProcedure p)
2832
return true;
2933
}
3034

31-
public SProcProxy(final DataSourceProvider provider) {
35+
public SProcProxy(final DataSourceProvider provider, final String description) {
3236
if (provider == null) {
3337
throw new IllegalArgumentException("DataSourceProvider cannot be null");
3438
}
3539

3640
dataSourceProvider = provider;
41+
this.description = description;
3742
}
3843

3944
@Override
40-
public Object invoke(final Object proxy, final Method m, final Object[] args) {
41-
StoredProcedure p = sprocs.get(m);
45+
protected Object handleInvocation(final Object proxy, final Method method, final Object[] args) {
46+
final StoredProcedure p = sprocs.get(method);
4247

4348
if (p == null) {
44-
LOG.warn("no StoredProcedure found for method {}", m);
49+
LOG.warn("no StoredProcedure found for method {}", method);
4550
return null;
4651
}
4752

48-
return p.execute(dataSourceProvider, new InvocationContext(proxy, m, args));
53+
return p.execute(dataSourceProvider, new InvocationContext(proxy, method, args));
54+
}
55+
56+
@Override
57+
public String toString() {
58+
return
59+
Objects.toStringHelper(this) //
60+
.addValue(description) //
61+
.add("dataSourceProvider", dataSourceProvider) //
62+
.toString();
4963
}
5064
}

src/main/java/de/zalando/sprocwrapper/proxy/SProcProxyBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private SProcProxyBuilder() {
2323

2424
@SuppressWarnings("unchecked")
2525
public static <T> T build(final DataSourceProvider d, final Class<T> c) {
26-
final SProcProxy proxy = new SProcProxy(d);
26+
final SProcProxy proxy = new SProcProxy(d, c.getName());
2727

2828

2929
try {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package de.zalando.sprocwrapper.proxy;
2+
3+
import static org.hamcrest.CoreMatchers.is;
4+
import static org.hamcrest.CoreMatchers.not;
5+
import static org.hamcrest.CoreMatchers.nullValue;
6+
7+
import static org.hamcrest.MatcherAssert.assertThat;
8+
9+
import org.junit.Before;
10+
import org.junit.Test;
11+
12+
import org.junit.runner.RunWith;
13+
14+
import org.mockito.Mock;
15+
16+
import org.mockito.runners.MockitoJUnitRunner;
17+
18+
import de.zalando.sprocwrapper.dsprovider.DataSourceProvider;
19+
20+
@RunWith(MockitoJUnitRunner.class)
21+
public class SProcProxyBuilderTest {
22+
23+
private interface EmptySProcService {
24+
// empty
25+
}
26+
27+
@Mock
28+
private DataSourceProvider dataSourceProvider;
29+
30+
private EmptySProcService underTest;
31+
32+
@Before
33+
public void setUp() {
34+
underTest = SProcProxyBuilder.build(dataSourceProvider, EmptySProcService.class);
35+
}
36+
37+
@Test
38+
public void hashCodeOnDynamicProxyWorks() {
39+
assertThat("hashCode() on dynamic proxy returned 0", underTest.hashCode(), is(not(0)));
40+
}
41+
42+
@Test
43+
public void equalsOnDynamicProxyWorks() {
44+
assertThat("proxy.equals(proxy) is false", underTest.equals(underTest));
45+
}
46+
47+
@Test
48+
public void toStringOnDynamicProxyWorks() {
49+
assertThat("toString() on dynamic proxy returned null", underTest.toString(), is(not(nullValue())));
50+
}
51+
}

0 commit comments

Comments
 (0)