[ 
https://issues.apache.org/jira/browse/STREAMS-508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16052982#comment-16052982
 ] 

ASF GitHub Bot commented on STREAMS-508:
----------------------------------------

Github user jfrazee commented on a diff in the pull request:

    https://github.com/apache/incubator-streams/pull/368#discussion_r122575906
  
    --- Diff: 
streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/TwitterRetryHandler.java
 ---
    @@ -22,141 +22,68 @@
     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;
     
     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();
    --- End diff --
    
    Probably should use the `LOGGER` here.


> Utilize new third-party rest proxy capability in provider-twitter
> -----------------------------------------------------------------
>
>                 Key: STREAMS-508
>                 URL: https://issues.apache.org/jira/browse/STREAMS-508
>             Project: Streams
>          Issue Type: Improvement
>            Reporter: Steve Blackmon
>            Assignee: Steve Blackmon
>   Original Estimate: 4h
>  Remaining Estimate: 4h
>
> Requires upgrade juneau dependency to 6.2.1 



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to