diff --git a/examples/testapp/pom.xml b/examples/testapp/pom.xml
index 46f1fc409..9e0927be9 100644
--- a/examples/testapp/pom.xml
+++ b/examples/testapp/pom.xml
@@ -117,6 +117,13 @@
httpcore
4.3.3
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.4.4
+
diff --git a/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/controller/HttpClient4Controller.java b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/controller/HttpClient4Controller.java
index bb86dd87c..b5d229600 100644
--- a/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/controller/HttpClient4Controller.java
+++ b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/controller/HttpClient4Controller.java
@@ -1,44 +1,39 @@
package com.navercorp.pinpoint.testapp.controller;
-import java.net.URI;
-import java.net.URISyntaxException;
+import java.util.Map;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
+import com.navercorp.pinpoint.testapp.service.remote.RemoteService;
+import com.navercorp.pinpoint.testapp.util.Description;
+
@Controller
@RequestMapping("/httpclient4")
public class HttpClient4Controller {
- @RequestMapping("/queryGoogle")
+ private static final String DEFAULT_GET_GEOCODE_ADDRESS = "Gyeonggi-do, Seongnam-si, Bundang-gu, Jeongja-dong, 178-1";
+ private static final String DEFAULT_GET_TWITTER_URL_COUNT_URL = "http://www.naver.com";
+
+ @Autowired
+ @Qualifier("closeableHttpClientRemoteService")
+ RemoteService remoteService;
+
+ @RequestMapping("/getGeoCode")
+ @Description("")
@ResponseBody
- public String queryGoogle() throws Exception {
- CloseableHttpClient httpClient = HttpClients.createMinimal();
- HttpGet httpGet = new HttpGet(buildQueryUri("www.google.com", "pinpoint"));
- httpClient.execute(httpGet);
- return "queryGoogle";
+ public Map getGeoCode(@RequestParam(defaultValue = DEFAULT_GET_GEOCODE_ADDRESS, required = false) String address) throws Exception {
+ return remoteService.getGeoCode(address);
}
- @RequestMapping("/queryNaver")
+ @RequestMapping("/getTwitterUrlCount")
@ResponseBody
- public String queryNaver() throws Exception {
- CloseableHttpClient httpClient = HttpClients.createMinimal();
- HttpGet httpGet = new HttpGet(buildQueryUri("www.naver.com", "pinpoint"));
- httpClient.execute(httpGet);
- return "queryNaver";
+ public Map getTwitterUrlCount(@RequestParam(defaultValue = DEFAULT_GET_TWITTER_URL_COUNT_URL, required = false) String url) throws Exception {
+ return remoteService.getTwitterUrlCount(url);
}
- private URI buildQueryUri(String host, String queryParam) throws URISyntaxException {
- return new URIBuilder()
- .setScheme("http")
- .setHost(host)
- .setPath("/search")
- .setParameter("q", queryParam)
- .build();
- }
}
diff --git a/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/controller/SimpleController.java b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/controller/SimpleController.java
new file mode 100644
index 000000000..c298a825e
--- /dev/null
+++ b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/controller/SimpleController.java
@@ -0,0 +1,18 @@
+package com.navercorp.pinpoint.testapp.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.navercorp.pinpoint.testapp.util.Description;
+
+@Controller
+public class SimpleController {
+
+ @RequestMapping("/getCurrentTimestamp")
+ @Description("Returns the current timestamp of the server (in ms).")
+ @ResponseBody
+ public Long getCurrentTimestamp() {
+ return System.currentTimeMillis();
+ }
+}
diff --git a/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/AbstractRemoteService.java b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/AbstractRemoteService.java
new file mode 100644
index 000000000..7c3d68c45
--- /dev/null
+++ b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/AbstractRemoteService.java
@@ -0,0 +1,55 @@
+package com.navercorp.pinpoint.testapp.service.remote;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.Map;
+
+import org.apache.commons.codec.CharEncoding;
+import org.apache.http.client.utils.URIBuilder;
+import org.springframework.web.client.RestClientException;
+
+public abstract class AbstractRemoteService implements RemoteService {
+
+ @Override
+ public final Map getGeoCode(String address) {
+ try {
+ String encodedAddress = URLEncoder.encode(address, CharEncoding.UTF_8);
+ URI uri = new URIBuilder()
+ .setScheme("http")
+ .setHost("maps.googleapis.com")
+ .setPath("/maps/api/geocode/json")
+ .setParameter("address", encodedAddress)
+ .setParameter("sensor", "false")
+ .build();
+ @SuppressWarnings("unchecked")
+ Map response = this.getForObject(uri, Map.class);
+ return response;
+ } catch (UnsupportedEncodingException e) {
+ throw new RestClientException(e.getMessage());
+ } catch (URISyntaxException e) {
+ throw new RestClientException(e.getMessage());
+ }
+ }
+
+ @Override
+ public Map getTwitterUrlCount(String url) {
+ try {
+ URI uri = new URIBuilder()
+ .setScheme("http")
+ .setHost("urls.api.twitter.com")
+ .setPath("/1/urls/count.json")
+ .setParameter("url", url)
+ .build();
+ @SuppressWarnings("unchecked")
+ Map response = this.getForObject(uri, Map.class);
+ return response;
+ } catch (URISyntaxException e) {
+ throw new RestClientException(e.getMessage());
+ }
+ }
+
+ protected abstract T getForObject(URI url, Class responseType);
+
+}
diff --git a/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/CloseableHttpClientRemoteService.java b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/CloseableHttpClientRemoteService.java
new file mode 100644
index 000000000..aac621521
--- /dev/null
+++ b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/CloseableHttpClientRemoteService.java
@@ -0,0 +1,22 @@
+package com.navercorp.pinpoint.testapp.service.remote;
+
+import java.net.URI;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+@Service
+public final class CloseableHttpClientRemoteService extends AbstractRemoteService {
+
+ @Autowired
+ @Qualifier("closeableHttpClientRestTemplate")
+ private RestTemplate restTemplate;
+
+ @Override
+ protected T getForObject(URI url, Class responseType) {
+ return this.restTemplate.getForObject(url, responseType);
+ }
+
+}
diff --git a/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/RemoteService.java b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/RemoteService.java
new file mode 100644
index 000000000..a4e7c4319
--- /dev/null
+++ b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/service/remote/RemoteService.java
@@ -0,0 +1,10 @@
+package com.navercorp.pinpoint.testapp.service.remote;
+
+import java.util.Map;
+
+public interface RemoteService {
+
+ public Map getGeoCode(String address);
+
+ public Map getTwitterUrlCount(String url);
+}
diff --git a/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/util/Description.java b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/util/Description.java
new file mode 100644
index 000000000..6c71fbbba
--- /dev/null
+++ b/examples/testapp/src/main/java/com/navercorp/pinpoint/testapp/util/Description.java
@@ -0,0 +1,12 @@
+package com.navercorp.pinpoint.testapp.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Description {
+ String value();
+}
diff --git a/examples/testapp/src/main/resources/servlet-context.xml b/examples/testapp/src/main/resources/servlet-context.xml
index 145d7edfa..a5dd6d0f2 100644
--- a/examples/testapp/src/main/resources/servlet-context.xml
+++ b/examples/testapp/src/main/resources/servlet-context.xml
@@ -10,6 +10,13 @@
+
+
+
+
+
+
+