You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streams.apache.org by sb...@apache.org on 2017/06/21 03:30:01 UTC

[1/4] incubator-streams git commit: resolves STREAMS-508

Repository: incubator-streams
Updated Branches:
  refs/heads/master c8e56dc55 -> bd91d2687


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterIT.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterIT.java b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterIT.java
new file mode 100644
index 0000000..15b01d6
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterIT.java
@@ -0,0 +1,226 @@
+/*
+ * 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.test.api;
+
+import org.apache.streams.config.ComponentConfigurator;
+import org.apache.streams.config.StreamsConfiguration;
+import org.apache.streams.config.StreamsConfigurator;
+import org.apache.streams.twitter.TwitterConfiguration;
+import org.apache.streams.twitter.api.Account;
+import org.apache.streams.twitter.api.AccountSettings;
+import org.apache.streams.twitter.api.Favorites;
+import org.apache.streams.twitter.api.FavoritesListRequest;
+import org.apache.streams.twitter.api.Followers;
+import org.apache.streams.twitter.api.FollowersIdsRequest;
+import org.apache.streams.twitter.api.FollowersIdsResponse;
+import org.apache.streams.twitter.api.FollowersListRequest;
+import org.apache.streams.twitter.api.FollowersListResponse;
+import org.apache.streams.twitter.api.Friends;
+import org.apache.streams.twitter.api.FriendsIdsRequest;
+import org.apache.streams.twitter.api.FriendsIdsResponse;
+import org.apache.streams.twitter.api.FriendsListRequest;
+import org.apache.streams.twitter.api.FriendsListResponse;
+import org.apache.streams.twitter.api.Statuses;
+import org.apache.streams.twitter.api.StatusesHomeTimelineRequest;
+import org.apache.streams.twitter.api.StatusesLookupRequest;
+import org.apache.streams.twitter.api.StatusesMentionsTimelineRequest;
+import org.apache.streams.twitter.api.StatusesShowRequest;
+import org.apache.streams.twitter.api.Twitter;
+import org.apache.streams.twitter.api.Users;
+import org.apache.streams.twitter.api.UsersLookupRequest;
+import org.apache.streams.twitter.api.UsersShowRequest;
+import org.apache.streams.twitter.pojo.Tweet;
+import org.apache.streams.twitter.pojo.User;
+
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import org.apache.juneau.remoteable.RemoteMethod;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static java.util.Objects.nonNull;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Integration Tests for all implemented Twitter endpoints.
+ */
+public class TwitterIT {
+
+  private static final Logger LOGGER = LoggerFactory.getLogger(TwitterIT.class);
+
+  private static Config application = ConfigFactory.parseResources("TwitterIT.conf").withFallback(ConfigFactory.load());
+  private static StreamsConfiguration streamsConfiguration = StreamsConfigurator.detectConfiguration(application);
+  private static TwitterConfiguration config = new ComponentConfigurator<>(TwitterConfiguration.class).detectConfiguration(application, "twitter");
+
+  private static User user;
+  private static AccountSettings settings;
+  private static List<Tweet> statusesHomeTimeline;
+
+  @Test(groups = {"Account","AccountVerifyCredentials"})
+  public void testVerifyCredentials() throws Exception {
+    Account account = Twitter.getInstance(config);
+    nonNull(account);
+    User user = account.verifyCredentials();
+    nonNull(user);
+    nonNull(user.getCreatedAt());
+    TwitterIT.user = user;
+  }
+
+  @Test(dependsOnGroups = {"AccountVerifyCredentials"}, groups = {"Account"})
+  public void testAccountSettings() throws Exception {
+    Account account = Twitter.getInstance(config);
+    nonNull(account);
+    AccountSettings settings = account.settings();
+    nonNull(settings);
+    nonNull(settings.getScreenName());
+    assertEquals(settings.getScreenName(), user.getScreenName());
+    TwitterIT.settings = settings;
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Favorites"})
+  public void testFavoritesList() throws Exception {
+    Favorites favorites = Twitter.getInstance(config);
+    nonNull(favorites);
+    List<Tweet> favoritesTweetList = favorites.list(new FavoritesListRequest().withScreenName(user.getScreenName()));
+    nonNull(favoritesTweetList);
+    assertThat("favoritesTweetList.size() > 0", favoritesTweetList.size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Followers"})
+  public void testFollowersList() throws Exception {
+    Followers followers = Twitter.getInstance(config);
+    nonNull(followers);
+    FollowersListRequest followersListRequest = new FollowersListRequest();
+    followersListRequest.setId(user.getId());
+    FollowersListResponse followersListResponse = followers.list(followersListRequest);
+    nonNull(followersListResponse);
+    assertThat("followersListResponse.getUsers().size() > 0", followersListResponse.getUsers().size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Followers"})
+  public void testFollowersIds() throws Exception {
+    Followers followers = Twitter.getInstance(config);
+    nonNull(followers);
+    FollowersIdsRequest followersIdsRequest = new FollowersIdsRequest();
+    followersIdsRequest.setId(user.getId());
+    FollowersIdsResponse followersIdsResponse = followers.ids(followersIdsRequest);
+    nonNull(followersIdsResponse);
+    assertThat("followersIdsResponse.getUsers().size() > 0", followersIdsResponse.getIds().size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Friends"})
+  public void testFriendsList() throws Exception {
+    Friends friends = Twitter.getInstance(config);
+    nonNull(friends);
+    FriendsListRequest friendsListRequest = (FriendsListRequest) (new FriendsListRequest().withId(user.getId()));
+    FriendsListResponse friendsListResponse = friends.list(friendsListRequest);
+    nonNull(friendsListResponse);
+    assertThat("friendsListResponse.getUsers().size() > 0", friendsListResponse.getUsers().size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Friends"})
+  public void testFriendsIds() throws Exception {
+    Friends friends = Twitter.getInstance(config);
+    nonNull(friends);
+    FriendsIdsRequest friendsIdsRequest = (FriendsIdsRequest)new FriendsIdsRequest().withId(user.getId());
+    FriendsIdsResponse friendsIdsResponse = friends.ids(friendsIdsRequest);
+    nonNull(friendsIdsResponse);
+    assertThat("friendsIdsResponse.getUsers().size() > 0", friendsIdsResponse.getIds().size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Statuses","StatusesHomeTimeline"})
+  public void testStatusesHomeTimeline() throws Exception {
+    Statuses statuses = Twitter.getInstance(config);
+    nonNull(statuses);
+    StatusesHomeTimelineRequest statusesHomeTimelineRequest = new StatusesHomeTimelineRequest();
+    List<Tweet> statusesHomeTimeline = statuses.homeTimeline(statusesHomeTimelineRequest);
+    nonNull(statusesHomeTimeline);
+    assertThat("statusesHomeTimeline.size() > 0", statusesHomeTimeline.size() > 0);
+    this.statusesHomeTimeline = statusesHomeTimeline;
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Statuses"})
+  public void testStatusesMentionsTimeline() throws Exception {
+    Statuses statuses = Twitter.getInstance(config);
+    nonNull(statuses);
+    StatusesMentionsTimelineRequest statusesMentionsTimelineRequest = new StatusesMentionsTimelineRequest();
+    List<Tweet> statusesMentionsTimeline = statuses.mentionsTimeline(statusesMentionsTimelineRequest);
+    nonNull(statusesMentionsTimeline);
+    assertThat("statusesMentionsTimeline.size() > 0", statusesMentionsTimeline.size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account","StatusesHomeTimeline"}, groups = {"Statuses"})
+  public void testStatusesLookup() throws Exception {
+    Statuses statuses = Twitter.getInstance(config);
+    nonNull(statuses);
+    StatusesLookupRequest statusesLookupRequest = new StatusesLookupRequest();
+    statusesLookupRequest.setId(statusesHomeTimeline.stream().map(tweet -> tweet.getId()).collect(Collectors.toList()));
+    List<Tweet> statusesLookup = statuses.lookup(statusesLookupRequest);
+    nonNull(statusesLookup);
+    assertThat("statusesLookup.size() > 0", statusesLookup.size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Statuses"})
+  public void testStatusesShow() throws Exception {
+    Statuses statuses = Twitter.getInstance(config);
+    nonNull(statuses);
+    StatusesShowRequest statusesShowRequest = new StatusesShowRequest();
+    statusesShowRequest.setId(user.getStatus().getId());
+    Tweet statusesShow = statuses.show(statusesShowRequest);
+    nonNull(statusesShow);
+    nonNull(statusesShow.getCreatedAt());
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Users"})
+  public void testUsersShow() throws Exception {
+    Users users = Twitter.getInstance(config);
+    nonNull(users);
+    User showUser = users.show(new UsersShowRequest().withScreenName(user.getScreenName()));
+    nonNull(showUser);
+    assertEquals( user.getId(), showUser.getId());
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Users"})
+  public void testUsersLookupById() throws Exception {
+    Users users = Twitter.getInstance(config);
+    nonNull(users);
+    UsersLookupRequest usersLookupRequest = new UsersLookupRequest();
+    usersLookupRequest.setUserId(statusesHomeTimeline.stream().map(tweet -> tweet.getUser().getId()).collect(Collectors.toList()));
+    List<User> lookupUserById = users.lookup(usersLookupRequest);
+    nonNull(lookupUserById);
+    assertThat("lookupUserById.size() > 0", lookupUserById.size() > 0);
+  }
+
+  @Test(dependsOnGroups = {"Account"}, groups = {"Users"})
+  public void testUsersLookupByScreenName() throws Exception {
+    Users users = Twitter.getInstance(config);
+    nonNull(users);
+    UsersLookupRequest usersLookupRequest = new UsersLookupRequest();
+    usersLookupRequest.setScreenName(statusesHomeTimeline.stream().map(tweet -> tweet.getUser().getScreenName()).collect(Collectors.toList()));
+    List<User> lookupUserByScreenName = users.lookup(usersLookupRequest);
+    nonNull(lookupUserByScreenName);
+    assertThat("lookupUserByScreenName.size() > 0", lookupUserByScreenName.size() > 0);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterOAuthRequestInterceptorTest.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterOAuthRequestInterceptorTest.java b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterOAuthRequestInterceptorTest.java
index 536fb5e..9d3ad4f 100644
--- a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterOAuthRequestInterceptorTest.java
+++ b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/api/TwitterOAuthRequestInterceptorTest.java
@@ -1,3 +1,21 @@
+/*
+ * 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.test.api;
 
 import org.apache.streams.twitter.TwitterOAuthConfiguration;
@@ -23,7 +41,7 @@ import static org.apache.streams.twitter.api.TwitterOAuthRequestInterceptor.enco
 import static org.junit.Assert.assertEquals;
 
 /**
- * Created by sblackmon on 3/26/17.
+ * Unit Tests for twitter request signing.
  */
 public class TwitterOAuthRequestInterceptorTest {
 

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/test/resources/TwitterIT.conf
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/resources/TwitterIT.conf b/streams-contrib/streams-provider-twitter/src/test/resources/TwitterIT.conf
new file mode 100644
index 0000000..af88ba9
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/test/resources/TwitterIT.conf
@@ -0,0 +1,20 @@
+# 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
+# with the License.  You may obtain a copy of the License at
+#
+#   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.
+twitter {
+  retrySleepMs = 100
+  retryMax = 1
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/af636824/streams-contrib/streams-provider-twitter/src/test/resources/TwitterUserInformationProviderIT.conf
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/resources/TwitterUserInformationProviderIT.conf b/streams-contrib/streams-provider-twitter/src/test/resources/TwitterUserInformationProviderIT.conf
index 3054b9d..f6949cf 100644
--- a/streams-contrib/streams-provider-twitter/src/test/resources/TwitterUserInformationProviderIT.conf
+++ b/streams-contrib/streams-provider-twitter/src/test/resources/TwitterUserInformationProviderIT.conf
@@ -14,7 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
 twitter.info = [
   3424266646
   3277467241


[4/4] incubator-streams git commit: PR feedback

Posted by sb...@apache.org.
PR feedback


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

Branch: refs/heads/master
Commit: bd91d2687fa76fea10c33d73d72c595bde6a656a
Parents: b1c540d
Author: Steve Blackmon <sb...@apache.org>
Authored: Tue Jun 20 21:40:55 2017 -0500
Committer: Steve Blackmon <sb...@apache.org>
Committed: Tue Jun 20 21:40:55 2017 -0500

----------------------------------------------------------------------
 .../main/java/org/apache/streams/twitter/api/Account.java    | 3 ++-
 .../main/java/org/apache/streams/twitter/api/Followers.java  | 4 ++--
 .../main/java/org/apache/streams/twitter/api/Friends.java    | 4 ++--
 .../main/java/org/apache/streams/twitter/api/Statuses.java   | 2 +-
 .../main/java/org/apache/streams/twitter/api/Twitter.java    | 1 -
 .../org/apache/streams/twitter/api/TwitterRetryHandler.java  | 8 ++++----
 .../src/main/java/org/apache/streams/twitter/api/Users.java  | 4 ++--
 .../apache/streams/twitter/api/AccountSettingsResponse.json  | 3 ---
 8 files changed, 13 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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
index f031514..dfe0c4e 100644
--- 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
@@ -26,6 +26,7 @@ import org.apache.juneau.remoteable.Remoteable;
 import java.util.List;
 
 /**
+ * Interface for /account methods.
  */
 @Remoteable(path = "https://api.twitter.com/1.1/account")
 public interface Account {
@@ -41,7 +42,7 @@ public interface Account {
   public AccountSettings settings();
 
   /**
-   * Returns settings (including current trend, geo and sleep time information) for the authenticating user.
+   * Returns user credentials 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>

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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 41dfbde..8c2698b 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
@@ -38,7 +38,7 @@ public interface Followers {
    * Returns a cursored collection of user IDs for every user following the specified user.
    *
    * @param parameters {@link org.apache.streams.twitter.api.FollowersIdsRequest}
-   * @return List < Tweet >
+   * @return FollowersIdsResponse
    * @see <a href="https://dev.twitter.com/rest/reference/get/followers/ids">https://dev.twitter.com/rest/reference/get/followers/ids</a>
    *
    */
@@ -49,7 +49,7 @@ public interface Followers {
    * Returns a cursored collection of user objects for users following the specified user.
    *
    * @param parameters {@link org.apache.streams.twitter.api.FollowersListRequest}
-   * @return List < Tweet >
+   * @return FollowersListResponse
    * @see <a href="https://dev.twitter.com/rest/reference/get/followers/list">https://dev.twitter.com/rest/reference/get/followers/list</a>
    *
    */

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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 dbe5e49..7f75603 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
@@ -38,7 +38,7 @@ public interface Friends {
    * Returns a cursored collection of user IDs for every user the specified user is following.
    *
    * @param parameters {@link org.apache.streams.twitter.api.FriendsIdsRequest}
-   * @return List<Tweet>
+   * @return FriendsIdsResponse
    * @see <a href="https://dev.twitter.com/rest/reference/get/friends/ids">https://dev.twitter.com/rest/reference/get/friends/ids</a>
    *
    */
@@ -49,7 +49,7 @@ public interface Friends {
    * Returns a cursored collection of user objects for every user the specified user is following.
    *
    * @param parameters {@link org.apache.streams.twitter.api.FriendsListRequest}
-   * @return List<Tweet>
+   * @return FriendsListResponse
    * @see <a href="https://dev.twitter.com/rest/reference/get/friends/list">https://dev.twitter.com/rest/reference/get/friends/list</a>
    *
    */

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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 e0177d9..65f3882 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
@@ -79,7 +79,7 @@ public interface Statuses {
    * Returns a single Tweet, specified by the id parameter. The Tweet’s author will also be embedded within the Tweet.
    *
    * @param parameters {@link org.apache.streams.twitter.api.StatusesShowRequest}
-   * @return List<Tweet>
+   * @return Tweet
    * @see <a href="https://dev.twitter.com/rest/reference/get/statuses/show/id">https://dev.twitter.com/rest/reference/get/statuses/show/id</a>
    *
    */

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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 85150d8..db300b1 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
@@ -130,7 +130,6 @@ public class Twitter implements Account, Favorites, Followers, Friends, Statuses
     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");

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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 27e2827..d068b47 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
@@ -78,10 +78,10 @@ public class TwitterRetryHandler extends RetryOn {
         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();
+      } catch (IOException ex) {
+        LOGGER.error("IOException", ex);
+      } catch (ParseException ex) {
+        LOGGER.error("ParseException", ex);
       }
     }
     return responseErrors;

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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 cc58dd7..a7b1a8f 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
@@ -41,7 +41,7 @@ public interface Users {
    * Returns fully-hydrated user objects for up to 100 users per request, as specified by comma-separated values passed to the user_id and/or screen_name parameters.
    *
    * @param parameters {@link org.apache.streams.twitter.api.UsersLookupRequest}
-   * @return List<Tweet>
+   * @return List<User>
    * @see <a href="https://dev.twitter.com/rest/reference/get/users/lookup">https://dev.twitter.com/rest/reference/get/users/lookup</a>
    *
    */
@@ -52,7 +52,7 @@ public interface Users {
    * 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.
    *
    * @param parameters {@link org.apache.streams.twitter.api.UsersShowRequest}
-   * @return List<Tweet>
+   * @return List<User>
    * @see <a href="https://dev.twitter.com/rest/reference/get/users/show">https://dev.twitter.com/rest/reference/get/users/show</a>
    *
    */

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/bd91d268/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
index 760d2b5..1b6ce36 100644
--- 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
@@ -22,9 +22,6 @@
     "language": {
       "type": "string"
     },
-    "language": {
-      "type": "string"
-    },
     "protected": {
       "type": "boolean"
     },


[2/4] incubator-streams git commit: resolves STREAMS-508

Posted by sb...@apache.org.
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 <sb...@apache.org>
Authored: Sat Jun 10 14:55:22 2017 -0500
Committer: Steve Blackmon <sb...@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


[3/4] incubator-streams git commit: update for juneau 6.3.0-incubating

Posted by sb...@apache.org.
update for juneau 6.3.0-incubating


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

Branch: refs/heads/master
Commit: b1c540d0aa73b6e3741218bcadf86be0ad34bca2
Parents: af63682
Author: Steve Blackmon @steveblackmon <sb...@apache.org>
Authored: Tue Jun 20 17:01:14 2017 -0500
Committer: Steve Blackmon @steveblackmon <sb...@apache.org>
Committed: Tue Jun 20 17:01:14 2017 -0500

----------------------------------------------------------------------
 pom.xml                                                            | 2 +-
 .../src/main/java/org/apache/streams/juneau/ListSerializer.java    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/b1c540d0/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 96f1e5d..b655934 100644
--- a/pom.xml
+++ b/pom.xml
@@ -332,7 +332,7 @@
         <jackson-xml-databind.version>0.6.2</jackson-xml-databind.version>
         <aalto.version>1.0.0</aalto.version>
         <joda-time.version>2.9.4</joda-time.version>
-        <juneau.version>6.2.1-incubating-SNAPSHOT</juneau.version>
+        <juneau.version>6.3.0-incubating</juneau.version>
         <rave.version>0.22</rave.version>
         <datastax.version>1.0.3</datastax.version>
         <jsonschema2pojo.version>0.4.10</jsonschema2pojo.version>

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/b1c540d0/streams-pojo/src/main/java/org/apache/streams/juneau/ListSerializer.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/juneau/ListSerializer.java b/streams-pojo/src/main/java/org/apache/streams/juneau/ListSerializer.java
index b85e49f..0429087 100644
--- a/streams-pojo/src/main/java/org/apache/streams/juneau/ListSerializer.java
+++ b/streams-pojo/src/main/java/org/apache/streams/juneau/ListSerializer.java
@@ -19,8 +19,8 @@
 package org.apache.streams.juneau;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.juneau.PartType;
 import org.apache.juneau.serializer.PartSerializer;
-import org.apache.juneau.serializer.PartType;
 
 import java.util.List;