streams-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sblack...@apache.org
Subject [2/4] incubator-streams git commit: resolves STREAMS-508
Date Wed, 21 Jun 2017 03:30:02 GMT
resolves STREAMS-508


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/af636824
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/af636824
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/af636824

Branch: refs/heads/master
Commit: af6368249963440bbfb3cdcec159f9fd14106e23
Parents: c8e56dc
Author: Steve Blackmon <sblackmon@apache.org>
Authored: Sat Jun 10 14:55:22 2017 -0500
Committer: Steve Blackmon <sblackmon@apache.org>
Committed: Sat Jun 10 15:00:53 2017 -0500

----------------------------------------------------------------------
 .../streams-provider-twitter/pom.xml            |   1 -
 .../org/apache/streams/twitter/api/Account.java |  53 ++
 .../apache/streams/twitter/api/Favorites.java   |  50 ++
 .../apache/streams/twitter/api/Followers.java   |  15 +-
 .../org/apache/streams/twitter/api/Friends.java |  15 +-
 .../apache/streams/twitter/api/Statuses.java    |  54 +-
 .../org/apache/streams/twitter/api/Twitter.java | 507 ++++---------------
 .../api/TwitterOAuthRequestInterceptor.java     |  29 +-
 .../twitter/api/TwitterRetryHandler.java        | 163 ++----
 .../org/apache/streams/twitter/api/Users.java   |  17 +-
 .../twitter/converter/TwitterJodaDateSwap.java  |  51 ++
 .../FetchAndReplaceTwitterProcessor.java        |   5 +-
 .../twitter/api/AccountSettingsResponse.json    | 111 ++++
 .../twitter/api/FavoritesListRequest.json       |  41 ++
 .../streams/twitter/api/ResponseErrors.json     |  27 +
 .../api/StatusesHomeTimelineRequest.json        |  42 ++
 .../api/StatusesMentionsTimelineRequest.json    |  37 ++
 .../twitter/api/StatusesShowRequest.json        |   5 +-
 .../streams/twitter/api/UsersLookupRequest.json |   4 +-
 .../streams/twitter/pojo/AccountSettings.json   | 111 ++++
 .../streams/twitter/test/api/TwitterIT.java     | 226 +++++++++
 .../api/TwitterOAuthRequestInterceptorTest.java |  20 +-
 .../src/test/resources/TwitterIT.conf           |  20 +
 .../TwitterUserInformationProviderIT.conf       |   1 -
 24 files changed, 1049 insertions(+), 556 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/pom.xml
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/pom.xml b/streams-contrib/streams-provider-twitter/pom.xml
index 6a0778d..e306ebf 100644
--- a/streams-contrib/streams-provider-twitter/pom.xml
+++ b/streams-contrib/streams-provider-twitter/pom.xml
@@ -99,7 +99,6 @@
         <dependency>
             <groupId>org.apache.juneau</groupId>
             <artifactId>juneau-rest-client</artifactId>
-            <version>6.1.0-incubating</version>
         </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Account.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Account.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Account.java
new file mode 100644
index 0000000..f031514
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Account.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.streams.twitter.api;
+
+import org.apache.streams.twitter.pojo.User;
+
+import org.apache.juneau.remoteable.RemoteMethod;
+import org.apache.juneau.remoteable.Remoteable;
+
+import java.util.List;
+
+/**
+ */
+@Remoteable(path = "https://api.twitter.com/1.1/account")
+public interface Account {
+
+  /**
+   * Returns settings (including current trend, geo and sleep time information) for the authenticating user.
+   *
+   * @return AccountSettingsResponse
+   * @see <a href=https://dev.twitter.com/rest/reference/get/account/settings">https://dev.twitter.com/rest/reference/get/account/settings</a>
+   *
+   */
+  @RemoteMethod(httpMethod = "GET", path = "/settings.json")
+  public AccountSettings settings();
+
+  /**
+   * Returns settings (including current trend, geo and sleep time information) for the authenticating user.
+   *
+   * @return User
+   * @see <a href=https://dev.twitter.com/rest/reference/get/account/verify_credentials">https://dev.twitter.com/rest/reference/get/account/verify_credentials</a>
+   *
+   */
+  @RemoteMethod(httpMethod = "GET", path = "/verify_credentials.json")
+  public User verifyCredentials();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Favorites.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Favorites.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Favorites.java
new file mode 100644
index 0000000..b68e88b
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Favorites.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.streams.twitter.api;
+
+import org.apache.streams.twitter.pojo.Tweet;
+
+import org.apache.juneau.remoteable.Body;
+import org.apache.juneau.remoteable.QueryIfNE;
+import org.apache.juneau.remoteable.RemoteMethod;
+import org.apache.juneau.remoteable.Remoteable;
+
+import java.util.List;
+
+/**
+ * Interface for /favorites methods.
+ *
+ * @see <a href="https://dev.twitter.com/rest/reference">https://dev.twitter.com/rest/reference</a>
+ */
+@Remoteable(path = "https://api.twitter.com/1.1/favorites")
+public interface Favorites {
+
+  /**
+   * Returns the 20 most recent Tweets favorited by the authenticating or specified user.
+   * Bind this at: /favorites
+   *
+   * @param parameters {@link org.apache.streams.twitter.api.FavoritesListRequest}
+   * @return List < Tweet >
+   * @see <a href="https://dev.twitter.com/rest/reference/get/favorites/list">https://dev.twitter.com/rest/reference/get/favorites/list</a>
+   *
+   */
+  @RemoteMethod(httpMethod = "GET", path = "/list.json")
+  public List<Tweet> list( @QueryIfNE("*") FavoritesListRequest parameters);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Followers.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Followers.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Followers.java
index 5e04e6e..41dfbde 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Followers.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Followers.java
@@ -20,13 +20,18 @@ package org.apache.streams.twitter.api;
 
 import org.apache.streams.twitter.pojo.Tweet;
 
+import org.apache.juneau.remoteable.QueryIfNE;
+import org.apache.juneau.remoteable.RemoteMethod;
+import org.apache.juneau.remoteable.Remoteable;
+
 import java.util.List;
 
 /**
- * Returns a collection of the most recent Tweets posted by the user indicated by the screen_name or user_id parameters.
+ * Interface for /followers methods.
  *
- * @see <a href="https://dev.twitter.com/rest/reference/get/followers/ids">https://api.twitter.com/1.1/statuses/user_timeline.json</a>
+ * @see <a href="https://dev.twitter.com/rest/reference">https://dev.twitter.com/rest/reference</a>
  */
+@Remoteable(path = "https://api.twitter.com/1.1/followers")
 public interface Followers {
 
   /**
@@ -37,7 +42,8 @@ public interface Followers {
    * @see <a href="https://dev.twitter.com/rest/reference/get/followers/ids">https://dev.twitter.com/rest/reference/get/followers/ids</a>
    *
    */
-  public FollowersIdsResponse ids(FollowersIdsRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/ids.json")
+  public FollowersIdsResponse ids( @QueryIfNE("*") FollowersIdsRequest parameters);
 
   /**
    * Returns a cursored collection of user objects for users following the specified user.
@@ -47,6 +53,7 @@ public interface Followers {
    * @see <a href="https://dev.twitter.com/rest/reference/get/followers/list">https://dev.twitter.com/rest/reference/get/followers/list</a>
    *
    */
-  public FollowersListResponse list(FollowersListRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/list.json")
+  public FollowersListResponse list( @QueryIfNE("*") FollowersListRequest parameters);
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Friends.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Friends.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Friends.java
index d0d1f72..dbe5e49 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Friends.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Friends.java
@@ -20,13 +20,18 @@ package org.apache.streams.twitter.api;
 
 import org.apache.streams.twitter.pojo.Tweet;
 
+import org.apache.juneau.remoteable.QueryIfNE;
+import org.apache.juneau.remoteable.RemoteMethod;
+import org.apache.juneau.remoteable.Remoteable;
+
 import java.util.List;
 
 /**
- * Returns a collection of the most recent Tweets posted by the user indicated by the screen_name or user_id parameters.
+ * Interface for /friends methods.
  *
- * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/user_timeline">https://api.twitter.com/1.1/statuses/user_timeline.json</a>
+ * @see <a href="https://dev.twitter.com/rest/reference">https://dev.twitter.com/rest/reference</a>
  */
+@Remoteable(path = "https://api.twitter.com/1.1/friends")
 public interface Friends {
 
   /**
@@ -37,7 +42,8 @@ public interface Friends {
    * @see <a href="https://dev.twitter.com/rest/reference/get/friends/ids">https://dev.twitter.com/rest/reference/get/friends/ids</a>
    *
    */
-  public FriendsIdsResponse ids(FriendsIdsRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/ids.json")
+  public FriendsIdsResponse ids( @QueryIfNE("*") FriendsIdsRequest parameters);
 
   /**
    * Returns a cursored collection of user objects for every user the specified user is following.
@@ -47,6 +53,7 @@ public interface Friends {
    * @see <a href="https://dev.twitter.com/rest/reference/get/friends/list">https://dev.twitter.com/rest/reference/get/friends/list</a>
    *
    */
-  public FriendsListResponse list(FriendsListRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/list.json")
+  public FriendsListResponse list( @QueryIfNE("*") FriendsListRequest parameters);
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Statuses.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Statuses.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Statuses.java
index c9945b0..e0177d9 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Statuses.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Statuses.java
@@ -20,16 +20,36 @@ package org.apache.streams.twitter.api;
 
 import org.apache.streams.twitter.pojo.Tweet;
 
+import org.apache.juneau.remoteable.Body;
+import org.apache.juneau.remoteable.Path;
+import org.apache.juneau.remoteable.Query;
+import org.apache.juneau.remoteable.QueryIfNE;
+import org.apache.juneau.remoteable.RemoteMethod;
+import org.apache.juneau.remoteable.Remoteable;
+import org.apache.juneau.remoteable.RequestBean;
+
 import java.util.List;
 
 /**
- * Returns a collection of the most recent Tweets posted by the user indicated by the screen_name or user_id parameters.
+ * Interface for /statuses methods.
  *
- * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/user_timeline">https://api.twitter.com/1.1/statuses/user_timeline.json</a>
+ * @see <a href="https://dev.twitter.com/rest/reference">https://dev.twitter.com/rest/reference</a>
  */
+@Remoteable(path = "https://api.twitter.com/1.1/statuses")
 public interface Statuses {
 
   /**
+   * Returns a collection of the most recent Tweets posted by the user indicated by the screen_name or user_id parameters.
+   *
+   * @param parameters {@link org.apache.streams.twitter.api.StatusesHomeTimelineRequest}
+   * @return List<Tweet>
+   * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/home_timeline">https://dev.twitter.com/rest/reference/get/statuses/home_timeline</a>
+   *
+   */
+  @RemoteMethod(httpMethod = "GET", path = "/home_timeline.json")
+  public List<Tweet> homeTimeline( @QueryIfNE("*") StatusesHomeTimelineRequest parameters );
+
+  /**
    * Returns fully-hydrated Tweet objects for up to 100 Tweets per request, as specified by comma-separated values passed to the id parameter.
    *
    * @param parameters {@link org.apache.streams.twitter.api.StatusesLookupRequest}
@@ -37,7 +57,23 @@ public interface Statuses {
    * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/lookup">https://dev.twitter.com/rest/reference/get/statuses/lookup</a>
    *
    */
-  public List<Tweet> lookup(StatusesLookupRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/lookup.json")
+  public List<Tweet> lookup( @QueryIfNE("*") StatusesLookupRequest parameters);
+
+  /**
+   * Returns the 20 most recent mentions (Tweets containing a users’s @screen_name) for the authenticating user.
+   *
+   * The timeline returned is the equivalent of the one seen when you view your mentions on twitter.com.
+   *
+   * This method can only return up to 800 tweets.
+   *
+   * @param parameters {@link org.apache.streams.twitter.api.StatusesUserTimelineRequest}
+   * @return List<Tweet>
+   * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/mentions_timeline">https://dev.twitter.com/rest/reference/get/statuses/mentions_timeline</a>
+   *
+   */
+  @RemoteMethod(httpMethod = "GET", path = "/mentions_timeline.json")
+  public List<Tweet> mentionsTimeline( @QueryIfNE("*") StatusesMentionsTimelineRequest parameters);
 
   /**
    * Returns a single Tweet, specified by the id parameter. The Tweet’s author will also be embedded within the Tweet.
@@ -47,7 +83,8 @@ public interface Statuses {
    * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/show/id">https://dev.twitter.com/rest/reference/get/statuses/show/id</a>
    *
    */
-  public Tweet show(StatusesShowRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/show/{id}")
+  public Tweet show( @RequestBean StatusesShowRequest parameters);
 
   /**
    * Returns a collection of the most recent Tweets posted by the user indicated by the screen_name or user_id parameters.
@@ -57,6 +94,13 @@ public interface Statuses {
    * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/user_timeline">https://dev.twitter.com/rest/reference/get/statuses/user_timeline</a>
    *
    */
-  public List<Tweet> userTimeline(StatusesUserTimelineRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/user_timeline.json")
+  public List<Tweet> userTimeline( @QueryIfNE("*") StatusesUserTimelineRequest parameters);
+
+  interface StatusesShowRequestAnnotations {
+
+    @Path("id")
+    Long getId();
 
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Twitter.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Twitter.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Twitter.java
index c5262c0..85150d8 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Twitter.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Twitter.java
@@ -20,45 +20,37 @@ package org.apache.streams.twitter.api;
 
 import org.apache.streams.jackson.StreamsJacksonMapper;
 import org.apache.streams.twitter.TwitterConfiguration;
+import org.apache.streams.twitter.converter.TwitterDateTimeFormat;
+import org.apache.streams.twitter.converter.TwitterJodaDateSwap;
 import org.apache.streams.twitter.pojo.Tweet;
 import org.apache.streams.twitter.pojo.User;
 import org.apache.streams.twitter.provider.TwitterProviderUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.client.HttpRequestRetryHandler;
+import org.apache.http.HttpResponseInterceptor;
 import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.params.ClientPNames;
-import org.apache.http.client.params.CookiePolicy;
-import org.apache.http.client.utils.URIBuilder;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
 import org.apache.juneau.json.JsonParser;
-import org.apache.juneau.parser.ParseException;
-import org.apache.juneau.plaintext.PlainTextSerializer;
-import org.apache.juneau.rest.client.RestCall;
-import org.apache.juneau.rest.client.RestCallException;
+import org.apache.juneau.json.JsonSerializer;
 import org.apache.juneau.rest.client.RestClient;
-//import org.apache.juneau.rest.client.RestClientBuilder;
-import org.apache.juneau.rest.client.RetryOn;
+import org.apache.juneau.rest.client.RestClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.LinkedList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 
+//import org.apache.juneau.rest.client.RestClientBuilder;
+
 /**
  * Implementation of all twitter interfaces using juneau.
  */
-public class Twitter implements Followers, Friends, Statuses, Users {
+public class Twitter implements Account, Favorites, Followers, Friends, Statuses, Users {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(Twitter.class);
 
@@ -74,6 +66,12 @@ public class Twitter implements Followers, Friends, Statuses, Users {
 
   private HttpRequestInterceptor oauthInterceptor;
 
+  private static Map<String,Object> properties = new HashMap<String,Object>();
+
+  static {
+    properties.put("format", TwitterDateTimeFormat.TWITTER_FORMAT);
+  }
+
   RestClient restClient;
 
   private Twitter(TwitterConfiguration configuration) throws InstantiationException {
@@ -81,33 +79,37 @@ public class Twitter implements Followers, Friends, Statuses, Users {
     this.rootUrl = TwitterProviderUtil.baseUrl(configuration);
     this.oauthInterceptor = new TwitterOAuthRequestInterceptor(configuration.getOauth());
     this.httpclient = HttpClientBuilder.create()
-        .addInterceptorFirst(oauthInterceptor)
-        .setDefaultRequestConfig(RequestConfig.custom()
-          .setConnectionRequestTimeout(5000)
-          .setConnectTimeout(5000)
-          .setSocketTimeout(5000)
-          .setCookieSpec("easy")
-          .build()
+        .setDefaultRequestConfig(
+            RequestConfig.custom()
+                .setConnectionRequestTimeout(5000)
+                .setConnectTimeout(5000)
+                .setSocketTimeout(5000)
+                .setCookieSpec("easy")
+                .build()
         )
         .setMaxConnPerRoute(20)
         .setMaxConnTotal(100)
+        .addInterceptorFirst(oauthInterceptor)
+        .addInterceptorLast((HttpRequestInterceptor) (httpRequest, httpContext) -> System.out.println(httpRequest.getRequestLine().getUri()))
+        .addInterceptorLast((HttpResponseInterceptor) (httpResponse, httpContext) -> System.out.println(httpResponse.getStatusLine()))
+        .build();
+    this.restClient = new RestClientBuilder()
+        .httpClient(httpclient, true)
+        .parser(
+            JsonParser.DEFAULT.builder()
+                .ignoreUnknownBeanProperties(true)
+                .pojoSwaps(TwitterJodaDateSwap.class)
+                .build())
+        .serializer(
+            JsonSerializer.DEFAULT.builder()
+                .pojoSwaps(TwitterJodaDateSwap.class)
+                .build())
+        .rootUrl(rootUrl)
+        .retryable(
+            configuration.getRetryMax().intValue(),
+            configuration.getRetrySleepMs(),
+            new TwitterRetryHandler())
         .build();
-
-//  TODO: juneau-6.3.x-incubating
-//  this.restClient = new RestClientBuilder()
-//        .httpClient(httpclient, true)
-//        .parser(JsonParser.class)
-//        .rootUrl(rootUrl)
-//        .retryable(
-//            configuration.getRetryMax().intValue(),
-//            configuration.getRetrySleepMs(),
-//            new TwitterRetryHandler())
-//        .build();
-    this.restClient = new RestClient()
-        .setHttpClient(httpclient)
-        .setParser(JsonParser.class)
-        .setRootUrl(rootUrl);
-
     this.mapper = StreamsJacksonMapper.getInstance();
   }
 
@@ -123,399 +125,100 @@ public class Twitter implements Followers, Friends, Statuses, Users {
 
   @Override
   public List<Tweet> userTimeline(StatusesUserTimelineRequest parameters) {
-    try {
-//  TODO: juneau-6.3.x-incubating
-//      Statuses restStatuses = restClient.getRemoteableProxy("/statuses/user_timeline.json", Statuses.class);
-//      List<Tweet> result = restStatuses.userTimeline(parameters);
-//      return result;
-      URIBuilder uriBuilder = new URIBuilder()
-          .setPath("/statuses/user_timeline.json");
-      if( Objects.nonNull(parameters.getUserId()) && StringUtils.isNotBlank(parameters.getUserId().toString())) {
-        uriBuilder.addParameter("user_id", parameters.getUserId().toString());
-      }
-      if( StringUtils.isNotBlank(parameters.getScreenName())) {
-        uriBuilder.addParameter("screen_name", parameters.getScreenName());
-      }
-      if( Objects.nonNull(parameters.getSinceId()) && StringUtils.isNotBlank(parameters.getSinceId().toString())) {
-        uriBuilder.addParameter("since_id", parameters.getSinceId().toString());
-      }
-      if( Objects.nonNull(parameters.getCount()) && StringUtils.isNotBlank(parameters.getCount().toString())) {
-        uriBuilder.addParameter("count", parameters.getCount().toString());
-      }
-      if( Objects.nonNull(parameters.getMaxId()) && StringUtils.isNotBlank(parameters.getMaxId().toString())) {
-        uriBuilder.addParameter("max_id", parameters.getMaxId().toString());
-      }
-      if( Objects.nonNull(parameters.getTrimUser()) && StringUtils.isNotBlank(parameters.getTrimUser().toString())) {
-        uriBuilder.addParameter("trim_user", parameters.getTrimUser().toString());
-      }
-      if( Objects.nonNull(parameters.getExcludeReplies()) && StringUtils.isNotBlank(parameters.getExcludeReplies().toString())) {
-        uriBuilder.addParameter("exclude_replies", parameters.getExcludeReplies().toString());
-      }
-      if( Objects.nonNull(parameters.getContributorDetails()) && StringUtils.isNotBlank(parameters.getContributorDetails().toString())) {
-        uriBuilder.addParameter("contributor_details", parameters.getContributorDetails().toString());
-      }
-      if( Objects.nonNull(parameters.getIncludeRts()) && StringUtils.isNotBlank(parameters.getIncludeRts().toString())) {
-        uriBuilder.addParameter("include_rts", parameters.getIncludeRts().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        ArrayNode resultArrayNode = mapper.readValue(restResponseEntity, ArrayNode.class);
-        List<Tweet> result = new ArrayList();
-        resultArrayNode.iterator().forEachRemaining(item -> result.add(mapper.convertValue(item, Tweet.class)));
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    } catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return new ArrayList<>();
+    Statuses restStatuses = restClient.getRemoteableProxy(Statuses.class, TwitterProviderUtil.baseUrl(configuration)+"/statuses");
+    List<Tweet> result = restStatuses.userTimeline(parameters);
+    return result;
+  }
+
+  //  TODO: juneau-6.3.x-incubating
+  @Override
+  public List<Tweet> homeTimeline(StatusesHomeTimelineRequest parameters) {
+    Statuses restStatuses = restClient.getRemoteableProxy(Statuses.class, TwitterProviderUtil.baseUrl(configuration)+"/statuses");
+    List<Tweet> result = restStatuses.homeTimeline(parameters);
+    return result;
   }
 
   @Override
   public List<Tweet> lookup(StatusesLookupRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Statuses restStatuses = restClient.getRemoteableProxy("/statuses/lookup.json", Statuses.class);
-//      List<Tweet> result = restStatuses.lookup(parameters);
-//      return result;
-    String ids = StringUtils.join(parameters.getId(), ',');
-    try {
-      URIBuilder uriBuilder = new URIBuilder()
-          .setPath("/statuses/lookup.json");
-      if( Objects.nonNull(parameters.getId()) && StringUtils.isNotBlank(parameters.getId().toString())) {
-        uriBuilder.addParameter("id", parameters.getId().toString());
-      }
-      if( Objects.nonNull(parameters.getTrimUser()) && StringUtils.isNotBlank(parameters.getTrimUser().toString())) {
-        uriBuilder.addParameter("trim_user", parameters.getTrimUser().toString());
-      }
-      if( Objects.nonNull(parameters.getIncludeEntities()) && StringUtils.isNotBlank(parameters.getIncludeEntities().toString())) {
-        uriBuilder.addParameter("include_entities", parameters.getIncludeEntities().toString());
-      }
-      if( Objects.nonNull(parameters.getMap()) && StringUtils.isNotBlank(parameters.getMap().toString())) {
-        uriBuilder.addParameter("map", parameters.getMap().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        ArrayNode resultArrayNode = mapper.readValue(restResponseEntity, ArrayNode.class);
-        List<Tweet> result = new ArrayList();
-        resultArrayNode.iterator().forEachRemaining(item -> result.add(mapper.convertValue(item, Tweet.class)));
-        //List<Tweet> result = restCall.getResponse(LinkedList.class, Tweet.class);
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    } catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return new ArrayList<>();
+    Statuses restStatuses = restClient.getRemoteableProxy(Statuses.class, TwitterProviderUtil.baseUrl(configuration)+"/statuses");
+    List<Tweet> result = restStatuses.lookup(parameters);
+    return result;
+  }
+
+  @Override
+  public List<Tweet> mentionsTimeline(StatusesMentionsTimelineRequest parameters) {
+    Statuses restStatuses = restClient.getRemoteableProxy(Statuses.class, TwitterProviderUtil.baseUrl(configuration)+"/statuses");
+    List<Tweet> result = restStatuses.mentionsTimeline(parameters);
+    return result;
   }
 
   @Override
   public Tweet show(StatusesShowRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Statuses restStatuses = restClient.getRemoteableProxy("/statuses/show.json", Statuses.class);
-//      Tweet result = restStatuses.show(parameters);
-//      return result;
-    try {
-      URIBuilder uriBuilder = new URIBuilder()
-          .setPath("/statuses/show.json");
-      if (Objects.nonNull(parameters.getId()) && StringUtils.isNotBlank(parameters.getId().toString())) {
-        uriBuilder.addParameter("id", parameters.getId().toString());
-      }
-      if (Objects.nonNull(parameters.getTrimUser()) && StringUtils.isNotBlank(parameters.getTrimUser().toString())) {
-        uriBuilder.addParameter("trim_user", parameters.getTrimUser().toString());
-      }
-      if (Objects.nonNull(parameters.getIncludeEntities()) && StringUtils.isNotBlank(parameters.getIncludeEntities().toString())) {
-        uriBuilder.addParameter("include_entities", parameters.getIncludeEntities().toString());
-      }
-      if (Objects.nonNull(parameters.getIncludeMyRetweet()) && StringUtils.isNotBlank(parameters.getIncludeMyRetweet().toString())) {
-        uriBuilder.addParameter("include_my_retweet", parameters.getIncludeMyRetweet().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        //Tweet result = restCall.getResponse(Tweet.class);
-        Tweet result = mapper.readValue(restResponseEntity, Tweet.class);
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    } catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return null;
+    Statuses restStatuses = restClient.getRemoteableProxy(Statuses.class, TwitterProviderUtil.baseUrl(configuration)+"/statuses");
+    Tweet result = restStatuses.show(parameters);
+    return result;
   }
 
   @Override
   public FriendsIdsResponse ids(FriendsIdsRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Friends restFriends = restClient.getRemoteableProxy("/friends/ids.json", Friends.class);
-//      FriendsIdsResponse result = restFriends.ids(parameters);
-//      return result;
-    try {
-      URIBuilder uriBuilder = new URIBuilder()
-          .setPath("/friends/ids.json");
-      if( Objects.nonNull(parameters.getCount()) && StringUtils.isNotBlank(parameters.getCount().toString())) {
-        uriBuilder.addParameter("count", parameters.getCount().toString());
-      }
-      if( Objects.nonNull(parameters.getCursor()) && StringUtils.isNotBlank(parameters.getCursor().toString())) {
-        uriBuilder.addParameter("cursor", parameters.getCursor().toString());
-      }
-      if( Objects.nonNull(parameters.getId()) && StringUtils.isNotBlank(parameters.getId().toString())) {
-        uriBuilder.addParameter("id", parameters.getId().toString());
-      }
-      if( StringUtils.isNotBlank(parameters.getScreenName())) {
-        uriBuilder.addParameter("screen_name", parameters.getScreenName());
-      }
-      if( Objects.nonNull(parameters.getStringifyIds()) && StringUtils.isNotBlank(parameters.getStringifyIds().toString())) {
-        uriBuilder.addParameter("stringify_ids", parameters.getStringifyIds().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        //FriendsIdsResponse result = restCall.getResponse(FriendsIdsResponse.class);
-        FriendsIdsResponse result = mapper.readValue(restResponseEntity, FriendsIdsResponse.class);
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    } catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return null;
+    Friends restFriends = restClient.getRemoteableProxy(Friends.class, TwitterProviderUtil.baseUrl(configuration)+"/friends");
+    FriendsIdsResponse result = restFriends.ids(parameters);
+    return result;
   }
 
   @Override
   public FriendsListResponse list(FriendsListRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Friends restFriends = restClient.getRemoteableProxy("/friends/list.json", Friends.class);
-//      FriendsListResponse result = restFriends.list(parameters);
-//      return result;
-    try {
-      URIBuilder uriBuilder = new URIBuilder()
-          .setPath("/friends/list.json");
-      if (Objects.nonNull(parameters.getCount()) && StringUtils.isNotBlank(parameters.getCount().toString())) {
-        uriBuilder.addParameter("count", parameters.getCount().toString());
-      }
-      if (Objects.nonNull(parameters.getCursor()) && StringUtils.isNotBlank(parameters.getCursor().toString())) {
-        uriBuilder.addParameter("cursor", parameters.getCursor().toString());
-      }
-      if (Objects.nonNull(parameters.getId()) && StringUtils.isNotBlank(parameters.getId().toString())) {
-        uriBuilder.addParameter("id", parameters.getId().toString());
-      }
-      if (Objects.nonNull(parameters.getIncludeUserEntities()) && StringUtils.isNotBlank(parameters.getIncludeUserEntities().toString())) {
-        uriBuilder.addParameter("include_user_entities", parameters.getIncludeUserEntities().toString());
-      }
-      if (StringUtils.isNotBlank(parameters.getScreenName())) {
-        uriBuilder.addParameter("screen_name", parameters.getScreenName());
-      }
-      if (Objects.nonNull(parameters.getSkipStatus()) && StringUtils.isNotBlank(parameters.getSkipStatus().toString())) {
-        uriBuilder.addParameter("skip_status", parameters.getSkipStatus().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        //FriendsListResponse result = restCall.getResponse(FriendsListResponse.class);
-        FriendsListResponse result = mapper.readValue(restResponseEntity, FriendsListResponse.class);
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    }catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return null;
+    Friends restFriends = restClient.getRemoteableProxy(Friends.class, TwitterProviderUtil.baseUrl(configuration)+"/friends");
+    FriendsListResponse result = restFriends.list(parameters);
+    return result;
   }
 
   @Override
   public FollowersIdsResponse ids(FollowersIdsRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Followers restFollowers = restClient.getRemoteableProxy("/friends/list.json", Followers.class);
-//      FollowersIdsResponse result = restFollowers.ids(parameters);
-//      return result;
-    try {
-      URIBuilder uriBuilder = new URIBuilder()
-          .setPath("/followers/ids.json");
-      if (Objects.nonNull(parameters.getCount()) && StringUtils.isNotBlank(parameters.getCount().toString())) {
-        uriBuilder.addParameter("count", parameters.getCount().toString());
-      }
-      if (Objects.nonNull(parameters.getCursor()) && StringUtils.isNotBlank(parameters.getCursor().toString())) {
-        uriBuilder.addParameter("cursor", parameters.getCursor().toString());
-      }
-      if (Objects.nonNull(parameters.getId()) && StringUtils.isNotBlank(parameters.getId().toString())) {
-        uriBuilder.addParameter("id", parameters.getId().toString());
-      }
-      if (StringUtils.isNotBlank(parameters.getScreenName())) {
-        uriBuilder.addParameter("screen_name", parameters.getScreenName());
-      }
-      if (Objects.nonNull(parameters.getStringifyIds()) && StringUtils.isNotBlank(parameters.getStringifyIds().toString())) {
-        uriBuilder.addParameter("stringify_ids", parameters.getStringifyIds().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        //FollowersIdsResponse result = restCall.getResponse(FollowersIdsResponse.class);
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        FollowersIdsResponse result = mapper.readValue(restResponseEntity, FollowersIdsResponse.class);
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    } catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return null;
+    Followers restFollowers = restClient.getRemoteableProxy(Followers.class, TwitterProviderUtil.baseUrl(configuration)+"/followers");
+    FollowersIdsResponse result = restFollowers.ids(parameters);
+    return result;
   }
 
   @Override
   public FollowersListResponse list(FollowersListRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Followers restFollowers = restClient.getRemoteableProxy("/friends/list.json", Followers.class);
-//      FollowersListResponse result = restFollowers.list(parameters);
-//      return result;
-    try {
-      URIBuilder uriBuilder =
-          new URIBuilder()
-              .setPath("/followers/list.json");
-      if (Objects.nonNull(parameters.getCount()) && StringUtils.isNotBlank(parameters.getCount().toString())) {
-        uriBuilder.addParameter("count", parameters.getCount().toString());
-      }
-      if (Objects.nonNull(parameters.getCursor()) && StringUtils.isNotBlank(parameters.getCursor().toString())) {
-        uriBuilder.addParameter("cursor", parameters.getCursor().toString());
-      }
-      if (Objects.nonNull(parameters.getId()) && StringUtils.isNotBlank(parameters.getId().toString())) {
-        uriBuilder.addParameter("id", parameters.getId().toString());
-      }
-      if (Objects.nonNull(parameters.getIncludeUserEntities()) && StringUtils.isNotBlank(parameters.getIncludeUserEntities().toString())) {
-        uriBuilder.addParameter("include_user_entities", parameters.getIncludeUserEntities().toString());
-      }
-      if (StringUtils.isNotBlank(parameters.getScreenName())) {
-        uriBuilder.addParameter("screen_name", parameters.getScreenName());
-      }
-      if (Objects.nonNull(parameters.getSkipStatus()) && StringUtils.isNotBlank(parameters.getSkipStatus().toString())) {
-        uriBuilder.addParameter("skip_status", parameters.getSkipStatus().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        //FollowersListResponse result = restCall.getResponse(FollowersListResponse.class);
-        FollowersListResponse result = mapper.readValue(restResponseEntity, FollowersListResponse.class);
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    }catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return null;
+    Followers restFollowers = restClient.getRemoteableProxy(Followers.class, TwitterProviderUtil.baseUrl(configuration)+"/followers");
+    FollowersListResponse result = restFollowers.list(parameters);
+    return result;
   }
 
   @Override
   public List<User> lookup(UsersLookupRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Users restUsers = restClient.getRemoteableProxy("/users/lookup.json", Users.class);
-//      List<User> result = restUsers.lookup(parameters);
-//      return result;
-    String user_ids = StringUtils.join(parameters.getUserId(), ',');
-    String screen_names = StringUtils.join(parameters.getScreenName(), ',');
-    try {
-      URIBuilder uriBuilder =
-          new URIBuilder()
-              .setPath("/users/lookup.json");
-      if (Objects.nonNull(parameters.getIncludeEntities()) && StringUtils.isNotBlank(parameters.getIncludeEntities().toString())) {
-        uriBuilder.addParameter("include_entities", parameters.getIncludeEntities().toString());
-      }
-      if (Objects.nonNull(screen_names) && StringUtils.isNotBlank(screen_names)) {
-        uriBuilder.addParameter("screen_name", screen_names);
-      }
-      if (Objects.nonNull(user_ids) && StringUtils.isNotBlank(user_ids)) {
-        uriBuilder.addParameter("user_id", user_ids);
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-//      List<User> result = restCall.getResponse(LinkedList.class, User.class);
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        ArrayNode resultArrayNode = mapper.readValue(restResponseEntity, ArrayNode.class);
-        List<User> result = new ArrayList();
-        resultArrayNode.iterator().forEachRemaining(item -> result.add(mapper.convertValue(item, User.class)));
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    } catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return new ArrayList<>();
+    Users restUsers = restClient.getRemoteableProxy(Users.class, TwitterProviderUtil.baseUrl(configuration)+"/users");
+    List<User> result = restUsers.lookup(parameters);
+    return result;
   }
 
   @Override
   public User show(UsersShowRequest parameters) {
-//  TODO: juneau-6.3.x-incubating
-//      Users restUsers = restClient.getRemoteableProxy("/users/lookup.json", Users.class);
-//      User result = restUsers.show(parameters);
-//      return result;
-    try {
-      URIBuilder uriBuilder =
-          new URIBuilder()
-              .setPath("/users/show.json");
-      if (Objects.nonNull(parameters.getIncludeEntities()) && StringUtils.isNotBlank(parameters.getIncludeEntities().toString())) {
-        uriBuilder.addParameter("include_entities", parameters.getIncludeEntities().toString());
-      }
-      if (Objects.nonNull(parameters.getScreenName()) && StringUtils.isNotBlank(parameters.getScreenName())) {
-        uriBuilder.addParameter("screen_name", parameters.getScreenName());
-      }
-      if (Objects.nonNull(parameters.getUserId()) && StringUtils.isNotBlank(parameters.getUserId().toString())) {
-        uriBuilder.addParameter("user_id", parameters.getUserId().toString());
-      }
-      RestCall restCall = restClient.doGet(uriBuilder.build().toString());
-      try {
-        String restResponseEntity = restCall
-            .setRetryable(configuration.getRetryMax().intValue(), configuration.getRetrySleepMs().intValue(), new TwitterRetryHandler())
-            .getResponseAsString();
-        User result = mapper.readValue(restResponseEntity, User.class);
-        return result;
-      } catch (RestCallException e) {
-        LOGGER.warn("RestCallException", e);
-      }
-    } catch (IOException e) {
-      LOGGER.warn("IOException", e);
-    } catch (URISyntaxException e) {
-      LOGGER.warn("URISyntaxException", e);
-    }
-    return null;
+    Users restUsers = restClient.getRemoteableProxy(Users.class, TwitterProviderUtil.baseUrl(configuration)+"/users");
+    User result = restUsers.show(parameters);
+    return result;
   }
 
+  @Override
+  public List<Tweet> list(FavoritesListRequest parameters) {
+    Favorites restFavorites = restClient.getRemoteableProxy(Favorites.class, TwitterProviderUtil.baseUrl(configuration)+"/favorites");
+    List<Tweet> result = restFavorites.list(parameters);
+    return result;
+  }
+
+  @Override
+  public AccountSettings settings() {
+    Account restAccount = restClient.getRemoteableProxy(Account.class, TwitterProviderUtil.baseUrl(configuration)+"/account");
+    AccountSettings result = restAccount.settings();
+    return result;
+  }
+
+  @Override
+  public User verifyCredentials() {
+    Account restAccount = restClient.getRemoteableProxy(Account.class, TwitterProviderUtil.baseUrl(configuration)+"/account");
+    User result = restAccount.verifyCredentials();
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterOAuthRequestInterceptor.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterOAuthRequestInterceptor.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterOAuthRequestInterceptor.java
index 83b60c4..0b56c05 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterOAuthRequestInterceptor.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterOAuthRequestInterceptor.java
@@ -20,6 +20,7 @@ package org.apache.streams.twitter.api;
 
 import org.apache.streams.twitter.TwitterOAuthConfiguration;
 
+import org.apache.commons.codec.binary.Base64;
 import org.apache.http.HttpException;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpRequestInterceptor;
@@ -30,7 +31,6 @@ import org.apache.http.protocol.HttpContext;
 import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import sun.misc.BASE64Encoder;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -60,7 +60,7 @@ public class TwitterOAuthRequestInterceptor implements HttpRequestInterceptor {
   private static final String oauth_signature_method = "HMAC-SHA1";
   private static final String oauth_version = "1.0";
 
-  private static final BASE64Encoder base64Encoder = new BASE64Encoder();
+  private static final Base64 base64 = new Base64();
 
   TwitterOAuthConfiguration oAuthConfiguration;
 
@@ -75,6 +75,7 @@ public class TwitterOAuthRequestInterceptor implements HttpRequestInterceptor {
 
     String oauth_timestamp = generateTimestamp();
 
+
     Map<String,String> oauthParamMap = new HashMap<>();
     oauthParamMap.put("oauth_consumer_key", oAuthConfiguration.getConsumerKey());
     oauthParamMap.put("oauth_nonce", oauth_nonce);
@@ -84,16 +85,20 @@ public class TwitterOAuthRequestInterceptor implements HttpRequestInterceptor {
     oauthParamMap.put("oauth_version", oauth_version);
 
     String request_host = ((HttpRequestWrapper)httpRequest).getTarget().toString().replace(":443","");
-    String request_path = httpRequest.getRequestLine().getUri().substring(0, httpRequest.getRequestLine().getUri().indexOf('?'));
-    String request_param_line = httpRequest.getRequestLine().getUri().substring(httpRequest.getRequestLine().getUri().indexOf('?')+1);
-    String[] request_params = URLDecoder.decode(request_param_line).split("&");
+    String request_path = httpRequest.getRequestLine().getUri();
 
     Map<String,String> allParamsMap = new HashMap<>(oauthParamMap);
 
-    for( String request_param : request_params ) {
-      String key = request_param.substring(0, request_param.indexOf('='));
-      String value = request_param.substring(request_param.indexOf('=')+1, request_param.length());
-      allParamsMap.put(key, value);
+    if( request_path.contains("?")) {
+      request_path = request_path.substring(0, httpRequest.getRequestLine().getUri().indexOf('?'));
+      String request_param_line = httpRequest.getRequestLine().getUri().substring(httpRequest.getRequestLine().getUri().indexOf('?')+1);
+      String[] request_params = URLDecoder.decode(request_param_line).split("&");
+
+      for( String request_param : request_params ) {
+        String key = request_param.substring(0, request_param.indexOf('='));
+        String value = request_param.substring(request_param.indexOf('=')+1, request_param.length());
+        allParamsMap.put(key, value);
+      }
     }
 
     if( ((HttpRequestWrapper) httpRequest).getOriginal() instanceof HttpPost) {
@@ -129,6 +134,8 @@ public class TwitterOAuthRequestInterceptor implements HttpRequestInterceptor {
 
     httpRequest.setHeader("Authorization", authorization_header_string);
 
+    // might need to replace all the params here in alphabetical order
+
   }
 
   public String generateTimestamp() {
@@ -141,7 +148,7 @@ public class TwitterOAuthRequestInterceptor implements HttpRequestInterceptor {
   public String generateNonce() {
     String uuid_string = UUID.randomUUID().toString();
     uuid_string = uuid_string.replaceAll("-", "");
-    String oauth_nonce = base64Encoder.encode(uuid_string.getBytes());
+    String oauth_nonce = base64.encode(uuid_string.getBytes()).toString();
     return oauth_nonce;
   }
 
@@ -231,6 +238,6 @@ public class TwitterOAuthRequestInterceptor implements HttpRequestInterceptor {
 
     byte[] text = baseString.getBytes();
 
-    return new String(base64Encoder.encode(mac.doFinal(text))).trim();
+    return new String(base64.encode(mac.doFinal(text))).trim();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterRetryHandler.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterRetryHandler.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterRetryHandler.java
index 3f7a853..27e2827 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterRetryHandler.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterRetryHandler.java
@@ -22,8 +22,12 @@ import org.apache.streams.util.api.requests.backoff.AbstractBackOffStrategy;
 import org.apache.streams.util.api.requests.backoff.BackOffException;
 import org.apache.streams.util.api.requests.backoff.impl.LinearTimeBackOffStrategy;
 
+import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpRequestRetryHandler;
 import org.apache.http.protocol.HttpContext;
+import org.apache.http.util.EntityUtils;
+import org.apache.juneau.json.JsonParser;
+import org.apache.juneau.parser.ParseException;
 import org.apache.juneau.rest.client.RetryOn;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,132 +35,55 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import javax.ws.rs.core.Response;
 
 /**
  *  Handle expected and unexpected exceptions.
  */
-public class TwitterRetryHandler implements RetryOn {
+public class TwitterRetryHandler extends RetryOn {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(TwitterRetryHandler.class);
 
-  private static AbstractBackOffStrategy backoff_strategy;
-
-// TODO: once request context is available, we can maintain multiple BackoffStrategy one per request path / params
-//  private static Map<String, AbstractBackOffStrategy> backoffs = new ConcurrentHashMap<>();
-
-// This is everything we used to check via twitter4j to decide whether to retry.
-//
-// @Deprecated
-//  public static int handleTwitterError(Twitter twitter, Exception exception) {
-//    return handleTwitterError( twitter, null, exception);
-//  }
-//
-//
-//  public static int handleTwitterError(Twitter twitter, Long id, Exception exception) {
-//
-//    if (exception instanceof TwitterException) {
-//      TwitterException twitterException = (TwitterException)exception;
-//
-//      if (twitterException.exceededRateLimitation()) {
-//
-//        long millisUntilReset = retry;
-//
-//        final RateLimitStatus rateLimitStatus = twitterException.getRateLimitStatus();
-//        if (rateLimitStatus != null) {
-//          millisUntilReset = rateLimitStatus.getSecondsUntilReset() * 1000;
-//        }
-//
-//        LOGGER.warn("Rate Limit Exceeded. Will retry in {} seconds...", millisUntilReset / 1000);
-//
-//        try {
-//          Thread.sleep(millisUntilReset);
-//        } catch (InterruptedException e1) {
-//          Thread.currentThread().interrupt();
-//        }
-//
-//        return 1;
-//      } else if (twitterException.isCausedByNetworkIssue()) {
-//        LOGGER.info("Twitter Network Issues Detected. Backing off...");
-//        LOGGER.info("{} - {}", twitterException.getExceptionCode(), twitterException.getLocalizedMessage());
-//        try {
-//          Thread.sleep(retry);
-//        } catch (InterruptedException e1) {
-//          Thread.currentThread().interrupt();
-//        }
-//        return 1;
-//      } else if (twitterException.isErrorMessageAvailable()) {
-//        if (twitterException.getMessage().toLowerCase().contains("does not exist")) {
-//          if ( id != null ) {
-//            LOGGER.warn("User does not exist: {}", id);
-//          } else {
-//            LOGGER.warn("User does not exist");
-//          }
-//          return (int)retryMax;
-//        } else {
-//          return (int)retryMax / 3;
-//        }
-//      } else {
-//        if (twitterException.getExceptionCode().equals("ced778ef-0c669ac0")) {
-//          // This is a known weird issue, not exactly sure the cause, but you'll never be able to get the data.
-//          return (int)retryMax / 3;
-//        } else if (twitterException.getExceptionCode().equals("4be80492-0a7bf7c7")) {
-//          // This is a 401 reflecting credentials don't have access to the requested resource.
-//          if ( id != null ) {
-//            LOGGER.warn("Authentication Exception accessing id: {}", id);
-//          } else {
-//            LOGGER.warn("Authentication Exception");
-//          }
-//          return (int)retryMax;
-//        } else {
-//          LOGGER.warn("Unknown Twitter Exception...");
-//          LOGGER.warn("   Access: {}", twitterException.getAccessLevel());
-//          LOGGER.warn("     Code: {}", twitterException.getExceptionCode());
-//          LOGGER.warn("  Message: {}", twitterException.getLocalizedMessage());
-//          return (int)retryMax / 10;
-//        }
-//      }
-//    } else if (exception instanceof RuntimeException) {
-//      LOGGER.warn("TwitterGrabber: Unknown Runtime Error", exception.getMessage());
-//      return (int)retryMax / 3;
-//    } else {
-//      LOGGER.info("Completely Unknown Exception: {}", exception);
-//      return (int)retryMax / 3;
-//    }
-//  }
-//  TODO: juneau 6.3.x-incubating
-//  @Override
-//  public boolean onCode(int httpResponseCode) {
-//
-//    LOGGER.warn("TwitterRetryHandler: {}", httpResponseCode);
-//
-//    if( httpResponseCode > 400 ) {
-//      return true;
-//    } else {
-//      return false;
-//    }
-//
-//  }
+  protected boolean onResponse(HttpResponse response) {
+    LOGGER.debug(response.toString());
+    switch(response.getStatusLine().getStatusCode()) {
+      case 200: // Response.Status.OK
+      case 304: // Response.Status.NOT_MODIFIED
+      case 400: // Response.Status.BAD_REQUEST
+        return false;
+      case 401: // Response.Status.UNAUTHORIZED
+        return true;
+      case 403: // Response.Status.FORBIDDEN
+      case 404: // Response.Status.NOT_FOUND
+      case 406: // Response.Status.NOT_ACCEPTABLE
+      case 410: // Response.Status.GONE
+        return false;
+      case 420: // Enhance Your Calm
+      case 429: // Too Many Requests
+        return true;
+      case 500: // Response.Status.INTERNAL_SERVER_ERROR
+      case 502: // Bad Gateway
+      case 503: // Response.Status.SERVICE_UNAVAILABLE
+      case 504: // Gateway Timeout
+        return true;
+      default:
+        return false;
+    }
+  }
 
-  @Override
-  public boolean onCode(int httpResponseCode) {
-//    if( backoff_strategy == null ) {
-//      backoff_strategy = new LinearTimeBackOffStrategy(retrySleepMs / 1000, retryMax);
-//    }
-//    if( httpResponseCode > 400 ) {
-//      try {
-//        backoff_strategy.backOff();
-//        return true;
-//      } catch (BackOffException boe) {
-//        backoff_strategy.reset();
-//        return false;
-//      }
-//    } else {
-//      return false;
-//    }
-    if( httpResponseCode > 400 ) {
-      return true;
-    } else {
-      return false;
+  private ResponseErrors parseResponseErrors(HttpResponse response) {
+    ResponseErrors responseErrors = null;
+    if (response.getEntity() != null) {
+      try {
+        String responseEntity = EntityUtils.toString(response.getEntity());
+        LOGGER.debug(responseEntity);
+        responseErrors = JsonParser.DEFAULT.parse(responseEntity, ResponseErrors.class);
+      } catch (IOException e) {
+        e.printStackTrace();
+      } catch (ParseException e) {
+        e.printStackTrace();
+      }
     }
+    return responseErrors;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Users.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Users.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Users.java
index 5de9046..cc58dd7 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Users.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Users.java
@@ -21,11 +21,20 @@ package org.apache.streams.twitter.api;
 import org.apache.streams.twitter.pojo.Tweet;
 import org.apache.streams.twitter.pojo.User;
 
+import org.apache.juneau.remoteable.Path;
+import org.apache.juneau.remoteable.QueryIfNE;
+import org.apache.juneau.remoteable.RemoteMethod;
+import org.apache.juneau.remoteable.Remoteable;
+import org.apache.juneau.remoteable.RequestBean;
+
 import java.util.List;
 
 /**
- * Returns a collection of the most recent Tweets posted by the user indicated by the screen_name or user_id parameters.
+ * Interface for /users methods.
+ *
+ * @see <a href="https://dev.twitter.com/rest/reference">https://dev.twitter.com/rest/reference</a>
  */
+@Remoteable(path = "https://api.twitter.com/1.1/users")
 public interface Users {
 
   /**
@@ -36,7 +45,8 @@ public interface Users {
    * @see <a href="https://dev.twitter.com/rest/reference/get/users/lookup">https://dev.twitter.com/rest/reference/get/users/lookup</a>
    *
    */
-  public List<User> lookup(UsersLookupRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/lookup.json")
+  public List<User> lookup( @QueryIfNE UsersLookupRequest parameters);
 
   /**
    * Returns a variety of information about the user specified by the required user_id or screen_name parameter. The author’s most recent Tweet will be returned inline when possible.
@@ -46,6 +56,7 @@ public interface Users {
    * @see <a href="https://dev.twitter.com/rest/reference/get/users/show">https://dev.twitter.com/rest/reference/get/users/show</a>
    *
    */
-  public User show(UsersShowRequest parameters);
+  @RemoteMethod(httpMethod = "GET", path = "/show.json")
+  public User show( @QueryIfNE UsersShowRequest parameters);
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJodaDateSwap.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJodaDateSwap.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJodaDateSwap.java
new file mode 100644
index 0000000..18f8332
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/converter/TwitterJodaDateSwap.java
@@ -0,0 +1,51 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.streams.twitter.converter;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.juneau.BeanSession;
+import org.apache.juneau.ClassMeta;
+import org.apache.juneau.parser.ParseException;
+import org.apache.juneau.transform.StringSwap;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.ISODateTimeFormat;
+
+/**
+ * Transforms {@link org.joda.time.DateTime} to {@link String Strings}.
+ */
+
+public class TwitterJodaDateSwap extends StringSwap<DateTime> {
+
+  DateTimeFormatter dateFormatter = DateTimeFormat.forPattern(TwitterDateTimeFormat.TWITTER_FORMAT);
+
+  @Override /* PojoSwap */
+  public String swap(BeanSession session, DateTime o) {
+    return dateFormatter.print(o);
+  }
+
+  @Override /* PojoSwap */
+  public DateTime unswap(BeanSession session, String f, ClassMeta<?> hint) throws ParseException {
+    if( hint.equals("org.joda.time.DateTime"))
+      return dateFormatter.parseDateTime(f);
+    else return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/processor/FetchAndReplaceTwitterProcessor.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/processor/FetchAndReplaceTwitterProcessor.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/processor/FetchAndReplaceTwitterProcessor.java
index a170626..3ce83dc 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/processor/FetchAndReplaceTwitterProcessor.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/processor/FetchAndReplaceTwitterProcessor.java
@@ -142,10 +142,7 @@ public class FetchAndReplaceTwitterProcessor implements StreamsProcessor {
     String id = doc.getObject().getId();
     LOGGER.debug("Fetching status from Twitter for {}", id);
     Long tweetId = Long.valueOf(id.replace("id:twitter:tweets:", ""));
-    Tweet tweet = client.show(
-        new StatusesShowRequest()
-            .withId(tweetId)
-    );
+    Tweet tweet = client.show(new StatusesShowRequest().withId(tweetId));
     return tweet;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/AccountSettingsResponse.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/AccountSettingsResponse.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/AccountSettingsResponse.json
new file mode 100644
index 0000000..760d2b5
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/AccountSettingsResponse.json
@@ -0,0 +1,111 @@
+{
+  "$schema": "http://json-schema.org/draft-03/schema",
+  "$license": [
+    "http://www.apache.org/licenses/LICENSE-2.0"
+  ],
+  "id": "#",
+  "javaType": "org.apache.streams.twitter.api.AccountSettingsResponse",
+  "javaInterfaces": [
+    "java.io.Serializable"
+  ],
+  "description": "https://dev.twitter.com/rest/reference/get/account/settings",
+  "properties": {
+    "always_use_https": {
+      "type": "boolean"
+    },
+    "discoverable_by_email": {
+      "type": "boolean"
+    },
+    "geo_enabled": {
+      "type": "boolean"
+    },
+    "language": {
+      "type": "string"
+    },
+    "language": {
+      "type": "string"
+    },
+    "protected": {
+      "type": "boolean"
+    },
+    "screen_name": {
+      "type": "string"
+    },
+    "show_all_inline_media": {
+      "type": "boolean"
+    },
+    "sleep_time": {
+      "type": "object",
+      "properties": {
+        "enabled": {
+          "type": "boolean"
+        },
+        "end_time": {
+          "type": "string",
+          "format": "date-time"
+        },
+        "start_time": {
+          "type": "string",
+          "format": "date-time"
+        }
+      }
+    },
+    "time_zone": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "tzinfo_name": {
+          "type": "string"
+        },
+        "utc_offset": {
+          "type": "integer"
+        }
+      }
+    },
+    "trend_location": {
+      "type": "array",
+      "items": {
+        "type": "object",
+        "properties": {
+          "country": {
+            "type": "string"
+          },
+          "countryCode": {
+            "type": "string"
+          },
+          "name": {
+            "type": "string"
+          },
+          "parentid": {
+            "type": "integer"
+          },
+          "placeType": {
+            "type": "object",
+            "properties": {
+              "code": {
+                "type": "integer"
+              },
+              "name": {
+                "type": "string"
+              }
+            }
+          },
+          "url": {
+            "type": "string"
+          },
+          "woeid": {
+            "type": "integer"
+          }
+        }
+      }
+    },
+    "use_cookie_personalization": {
+      "type": "boolean"
+    },
+    "allow_contributor_request": {
+      "type": "string"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/FavoritesListRequest.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/FavoritesListRequest.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/FavoritesListRequest.json
new file mode 100644
index 0000000..d6e0c84
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/FavoritesListRequest.json
@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json-schema.org/draft-03/schema",
+  "$license": [
+    "http://www.apache.org/licenses/LICENSE-2.0"
+  ],
+  "id": "#",
+  "javaType" : "org.apache.streams.twitter.api.FavoritesListRequest",
+  "javaInterfaces": ["java.io.Serializable"],
+  "properties": {
+    "user_id": {
+      "description": "The ID of the user for whom to return results. Either an id or screen_name is required for this method.",
+      "required": false,
+      "type": "integer"
+    },
+    "screen_name": {
+      "description": "The screen name of the user for whom to return results. Either a id or screen_name is required for this method.",
+      "required": false,
+      "type": "string"
+    },
+    "count": {
+      "description": "Specifies the number of records to retrieve. Must be less than or equal to 200; defaults to 20. The value of count is best thought of as a limit to the number of tweets to return because suspended or deleted content is removed after the count has been applied.",
+      "required": false,
+      "type": "integer"
+    },
+    "since_id": {
+      "description": "Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available.",
+      "required": false,
+      "type": "integer"
+    },
+    "max_id": {
+      "description": "Returns results with an ID less than (that is, older than) or equal to the specified ID.",
+      "required": false,
+      "type": "integer"
+    },
+    "include_entities": {
+      "description": "The entities node will be omitted when set to false .",
+      "required": false,
+      "type": "boolean"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ResponseErrors.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ResponseErrors.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ResponseErrors.json
new file mode 100644
index 0000000..363ac36
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ResponseErrors.json
@@ -0,0 +1,27 @@
+{
+  "$schema": "http://json-schema.org/draft-03/schema",
+  "$license": [
+    "http://www.apache.org/licenses/LICENSE-2.0"
+  ],
+  "id": "#",
+  "javaType" : "org.apache.streams.twitter.api.ResponseErrors",
+  "javaInterfaces": ["java.io.Serializable"],
+  "properties": {
+    "errors": {
+      "description": "When the Twitter API returns error messages, it does so in JSON format.",
+      "required": false,
+      "type": "array",
+      "items": {
+        "type": "object",
+        "properties": {
+          "code": {
+            "type": "integer"
+          },
+          "message": {
+            "type": "string"
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesHomeTimelineRequest.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesHomeTimelineRequest.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesHomeTimelineRequest.json
new file mode 100644
index 0000000..c92e33f
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesHomeTimelineRequest.json
@@ -0,0 +1,42 @@
+{
+  "$schema": "http://json-schema.org/draft-03/schema",
+  "$license": [
+    "http://www.apache.org/licenses/LICENSE-2.0"
+  ],
+  "id": "#",
+  "javaType" : "org.apache.streams.twitter.api.StatusesHomeTimelineRequest",
+  "javaInterfaces": ["java.io.Serializable"],
+  "description": "https://api.twitter.com/1.1/statuses/home_timeline.json",
+  "properties": {
+    "count": {
+      "description": "Specifies the number of records to retrieve. Must be less than or equal to 200. Defaults to 20. The value of count is best thought of as a limit to the number of tweets to return because suspended or deleted content is removed after the count has been applied.",
+      "required": false,
+      "type": "integer"
+    },
+    "since_id": {
+      "description": "Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available.",
+      "required": false,
+      "type": "integer"
+    },
+    "max_id": {
+      "description": "Returns results with an ID less than (that is, older than) or equal to the specified ID.",
+      "required": false,
+      "type": "integer"
+    },
+    "trim_user": {
+      "description": "When set to either true , t or 1 , each Tweet returned in a timeline will include a user object including only the status authors numerical ID. Omit this parameter to receive the complete user object.",
+      "required": false,
+      "type": "boolean"
+    },
+    "exclude_replies": {
+      "description": "This parameter will prevent replies from appearing in the returned timeline. Using exclude_replies with the count parameter will mean you will receive up-to count tweets — this is because the count parameter retrieves that many Tweets before filtering out retweets and replies. This parameter is only supported for JSON and XML responses.",
+      "required": false,
+      "type": "boolean"
+    },
+    "include_entities": {
+      "description": "The entities node will not be included when set to false.",
+      "required": false,
+      "type": "boolean"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesMentionsTimelineRequest.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesMentionsTimelineRequest.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesMentionsTimelineRequest.json
new file mode 100644
index 0000000..2ccb65a
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesMentionsTimelineRequest.json
@@ -0,0 +1,37 @@
+{
+  "$schema": "http://json-schema.org/draft-03/schema",
+  "$license": [
+    "http://www.apache.org/licenses/LICENSE-2.0"
+  ],
+  "id": "#",
+  "javaType" : "org.apache.streams.twitter.api.StatusesMentionsTimelineRequest",
+  "javaInterfaces": ["java.io.Serializable"],
+  "description": "https://api.twitter.com/1.1/statuses/mentions_timeline.json",
+  "properties": {
+    "count": {
+      "description": "Specifies the number of records to retrieve. Must be less than or equal to 200. Defaults to 20. The value of count is best thought of as a limit to the number of tweets to return because suspended or deleted content is removed after the count has been applied.",
+      "required": false,
+      "type": "integer"
+    },
+    "since_id": {
+      "description": "Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available.",
+      "required": false,
+      "type": "integer"
+    },
+    "max_id": {
+      "description": "Returns results with an ID less than (that is, older than) or equal to the specified ID.",
+      "required": false,
+      "type": "integer"
+    },
+    "trim_user": {
+      "description": "When set to either true , t or 1 , each Tweet returned in a timeline will include a user object including only the status authors numerical ID. Omit this parameter to receive the complete user object.",
+      "required": false,
+      "type": "boolean"
+    },
+    "include_entities": {
+      "description": "The entities node will not be included when set to false.",
+      "required": false,
+      "type": "boolean"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesShowRequest.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesShowRequest.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesShowRequest.json
index 8794973..45278d9 100644
--- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesShowRequest.json
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/StatusesShowRequest.json
@@ -5,7 +5,10 @@
   ],
   "id": "#",
   "javaType" : "org.apache.streams.twitter.api.StatusesShowRequest",
-  "javaInterfaces": ["java.io.Serializable"],
+  "javaInterfaces": [
+    "java.io.Serializable",
+    "org.apache.streams.twitter.api.Statuses.StatusesShowRequestAnnotations"
+  ],
   "description": "https://dev.twitter.com/rest/reference/get/statuses/show/id",
   "properties": {
     "id": {

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/UsersLookupRequest.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/UsersLookupRequest.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/UsersLookupRequest.json
index 0d75a9e..3f37ae5 100644
--- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/UsersLookupRequest.json
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/UsersLookupRequest.json
@@ -5,7 +5,9 @@
   ],
   "id": "#",
   "javaType" : "org.apache.streams.twitter.api.UsersLookupRequest",
-  "javaInterfaces": ["java.io.Serializable"],
+  "javaInterfaces": [
+    "java.io.Serializable"
+  ],
   "description": "https://dev.twitter.com/rest/reference/get/users/lookup",
   "properties": {
     "user_id": {

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/AccountSettings.json
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/AccountSettings.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/AccountSettings.json
new file mode 100644
index 0000000..1f47385
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/AccountSettings.json
@@ -0,0 +1,111 @@
+{
+  "$schema": "http://json-schema.org/draft-03/schema",
+  "$license": [
+    "http://www.apache.org/licenses/LICENSE-2.0"
+  ],
+  "id": "#",
+  "javaType": "org.apache.streams.twitter.api.AccountSettings",
+  "javaInterfaces": [
+    "java.io.Serializable"
+  ],
+  "description": "https://dev.twitter.com/rest/reference/get/account/settings",
+  "properties": {
+    "always_use_https": {
+      "type": "boolean"
+    },
+    "discoverable_by_email": {
+      "type": "boolean"
+    },
+    "geo_enabled": {
+      "type": "boolean"
+    },
+    "language": {
+      "type": "string"
+    },
+    "language": {
+      "type": "string"
+    },
+    "protected": {
+      "type": "boolean"
+    },
+    "screen_name": {
+      "type": "string"
+    },
+    "show_all_inline_media": {
+      "type": "boolean"
+    },
+    "sleep_time": {
+      "type": "object",
+      "properties": {
+        "enabled": {
+          "type": "boolean"
+        },
+        "end_time": {
+          "type": "string",
+          "format": "date-time"
+        },
+        "start_time": {
+          "type": "string",
+          "format": "date-time"
+        }
+      }
+    },
+    "time_zone": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "tzinfo_name": {
+          "type": "string"
+        },
+        "utc_offset": {
+          "type": "integer"
+        }
+      }
+    },
+    "trend_location": {
+      "type": "array",
+      "items": {
+        "type": "object",
+        "properties": {
+          "country": {
+            "type": "string"
+          },
+          "countryCode": {
+            "type": "string"
+          },
+          "name": {
+            "type": "string"
+          },
+          "parentid": {
+            "type": "integer"
+          },
+          "placeType": {
+            "type": "object",
+            "properties": {
+              "code": {
+                "type": "integer"
+              },
+              "name": {
+                "type": "string"
+              }
+            }
+          },
+          "url": {
+            "type": "string"
+          },
+          "woeid": {
+            "type": "integer"
+          }
+        }
+      }
+    },
+    "use_cookie_personalization": {
+      "type": "boolean"
+    },
+    "allow_contributor_request": {
+      "type": "string"
+    }
+  }
+}
\ No newline at end of file


Mime
View raw message