package com.twitter; import java.text.Normalizer; /** * A class for validating Tweet texts. */ public class Validator { private static final int MAX_TWEET_LENGTH = 140; private int shortUrlLength = 22; private int shortUrlLengthHttps = 23; private final Extractor extractor = new Extractor(); public int getTweetLength(String text) { text = Normalizer.normalize(text, Normalizer.Form.NFC); int length = text.codePointCount(0, text.length()); for (Extractor.Entity urlEntity : extractor .extractURLsWithIndices(text)) { length += urlEntity.start - urlEntity.end; length += urlEntity.value.toLowerCase().startsWith("https://") ? shortUrlLengthHttps : shortUrlLength; } return length; } public boolean isValidTweet(String text) { return isValidTweet(text, MAX_TWEET_LENGTH); } public boolean isValidTweet(String text, int maxLength) { if (text == null || text.isEmpty()) { return false; } for (char c : text.toCharArray()) { if (c == '\uFFFE' || c == '\uuFEFF' || // BOM c == '\uFFFF' || // Special (c >= '\u202A' && c <= '\u202E')) { // Direction change return false; } } return getTweetLength(text) <= maxLength; } }