diff options
author | Vitaly Takmazov | 2018-11-08 21:38:27 +0300 |
---|---|---|
committer | Vitaly Takmazov | 2018-11-08 21:38:27 +0300 |
commit | 7aaa3f9a29c280f01c677c918932620be45cdbd7 (patch) | |
tree | 39947b2c889afd08f9c73ba54fab91159d2af258 /juick-common/src/main/java/com/juick/util | |
parent | 3ea9770d0d43fbe45449ac4531ec4b0a374d98ea (diff) |
Merge everything into single Spring Boot application
Diffstat (limited to 'juick-common/src/main/java/com/juick/util')
5 files changed, 0 insertions, 547 deletions
diff --git a/juick-common/src/main/java/com/juick/util/DateFormatter.java b/juick-common/src/main/java/com/juick/util/DateFormatter.java deleted file mode 100644 index 8f569562..00000000 --- a/juick-common/src/main/java/com/juick/util/DateFormatter.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2008-2017, Juick - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package com.juick.util; - -import org.apache.commons.lang3.StringUtils; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Locale; - -/** - * Created by aalexeev on 12/7/16. - */ -public class DateFormatter { - private final DateTimeFormatter formatter; - - public DateFormatter(String pattern) { - formatter = DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH); - } - - public String format(final Instant ts) { - if (ts == null) - return null; - - ZonedDateTime ldt = ZonedDateTime.ofInstant(ts, ZoneOffset.UTC); - - return ldt.format(formatter); - } - - - public Instant parse(final String v) { - if (StringUtils.isBlank(v)) - return null; - - ZonedDateTime ldt = ZonedDateTime.parse(v, formatter); - - return ldt.toInstant(); - } -} diff --git a/juick-common/src/main/java/com/juick/util/DateFormattersHolder.java b/juick-common/src/main/java/com/juick/util/DateFormattersHolder.java deleted file mode 100644 index 8292e68e..00000000 --- a/juick-common/src/main/java/com/juick/util/DateFormattersHolder.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2008-2017, Juick - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package com.juick.util; - -/** - * Created by aalexeev on 12/7/16. - */ -public class DateFormattersHolder { - - private DateFormattersHolder() { - throw new IllegalStateException(); - } - - private static volatile DateFormatter messageFormatter; - - public static DateFormatter getMessageFormatterInstance() { - DateFormatter localInstance = messageFormatter; - - if (localInstance == null) { - synchronized (DateFormatter.class) { - localInstance = messageFormatter; - - if (localInstance == null) - messageFormatter = localInstance = new DateFormatter("yyyy-MM-dd HH:mm:ss"); - } - } - return localInstance; - } - - private static volatile DateFormatter rssFormatter; - - public static DateFormatter getRssFormatterInstance() { - DateFormatter localInstance = rssFormatter; - - if (localInstance == null) { - synchronized (DateFormatter.class) { - localInstance = rssFormatter; - - if (localInstance == null) - rssFormatter = localInstance = new DateFormatter("EEE, d MMM yyyy HH:mm:ss"); - } - } - return localInstance; - } - - private static volatile DateFormatter httpDateFormatter; - - public static DateFormatter getHttpDateFormatter() { - DateFormatter localInstance = httpDateFormatter; - if (localInstance == null) { - synchronized (DateFormatter.class) { - localInstance = httpDateFormatter; - if (localInstance == null) { - httpDateFormatter = localInstance = new DateFormatter("EEE, dd MMM yyyy HH:mm:ss O"); - } - } - } - return localInstance; - } -} diff --git a/juick-common/src/main/java/com/juick/util/MessageUtils.java b/juick-common/src/main/java/com/juick/util/MessageUtils.java deleted file mode 100644 index fd357c32..00000000 --- a/juick-common/src/main/java/com/juick/util/MessageUtils.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright (C) 2008-2017, Juick - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package com.juick.util; - -import com.juick.Message; -import com.juick.Tag; -import com.juick.User; -import org.apache.commons.codec.CharEncoding; -import org.apache.commons.lang3.StringUtils; -import org.springframework.web.util.UriComponentsBuilder; - -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -/** - * Created by aalexeev on 11/13/16. - */ -public class MessageUtils { - private MessageUtils() { - throw new IllegalStateException(); - } - - public static String formatQuote(final String quote) { - String result = quote; - - if (quote != null) { - if (quote.length() > 50) { - result = ">" + quote.substring(0, 47).replace('\n', ' ') + "...\n"; - } else if (!quote.isEmpty()) { - result = ">" + quote.replace('\n', ' ') + "\n"; - } - } - - return result; - } - - private final static String urlWhiteSpacePrefix = "((?<=\\s)|(?<=\\A))"; - - private final static String urlRegex = "((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\n\\\"]+)/?[^\\]\\s\\n\\\"\\>]*)"; - - private final static String urlWithWhitespacesRegex = - urlWhiteSpacePrefix + urlRegex; - - private final static Pattern regexLinks2 = Pattern.compile("((?<=\\s)|(?<=\\A))([\\[\\{]|<)((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\\"\\)\\!]+)/?(?:[^\\]\\}](?<!>))*)([\\]\\}]|>)"); - - private final static String replyNumberRegex = "((?<=\\s)|(?<=\\A))\\/(\\d+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))"; - - private final static String usernameRegex = "((?<=\\s)|(?<=\\A))@([\\w\\-]{2,16})((?=\\s)|(?=\\Z)|(?=\\p{Punct}))"; - private final static Pattern usernamePattern = Pattern.compile(usernameRegex); - - private final static String jidRegex = "((?<=\\s)|(?<=\\A))@([\\w\\-\\.]+@[\\w\\-\\.]+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))"; - private final static Pattern jidPattern = Pattern.compile(jidRegex); - - public static String formatMessageCode(String msg) { - msg = msg.replaceAll("&", "&"); - msg = msg.replaceAll("<", "<"); - msg = msg.replaceAll(">", ">"); - - // http://juick.com/last?page=2 - // <a href="http://juick.com/last?page=2" rel="nofollow">http://juick.com/last?page=2</a> - msg = msg.replaceAll(urlWithWhitespacesRegex, "$1<a href=\"$2\" rel=\"nofollow\">$2</a>"); - - // (http://juick.com/last?page=2) - // (<a href="http://juick.com/last?page=2" rel="nofollow">http://juick.com/last?page=2</a>) - Matcher m = regexLinks2.matcher(msg); - StringBuffer sb = new StringBuffer(); - while (m.find()) { - String url = m.group(3).replace(" ", "%20").replaceAll("\\s+", StringUtils.EMPTY); - m.appendReplacement(sb, "$1$2<a href=\"" + url + "\" rel=\"nofollow\">" + url + "</a>$5"); - } - m.appendTail(sb); - msg = sb.toString(); - - return "<pre>" + msg + "</pre>"; - } - - public static String formatMessage(String msg) { - msg = msg.replaceAll("&", "&"); - msg = msg.replaceAll("<", "<"); - msg = msg.replaceAll(">", ">"); - - // -- - // — - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))\\-\\-?((?=\\s)|(?=\\Z))", "$1—$2"); - - // http://juick.com/last?page=2 - // <a href="http://juick.com/last?page=2" rel="nofollow">juick.com</a> - msg = msg.replaceAll(urlWithWhitespacesRegex, "$1<a href=\"$2\" rel=\"nofollow\">$3</a>"); - - // [link text][http://juick.com/last?page=2] - // <a href="http://juick.com/last?page=2" rel="nofollow">link text</a> - msg = msg.replaceAll("\\[([^\\]]+)\\]\\[((?:ht|f)tps?://[^\\]]+)\\]", "<a href=\"$2\" rel=\"nofollow\">$1</a>"); - msg = msg.replaceAll("\\[([^\\]]+)\\]\\(((?:ht|f)tps?://[^\\)]+)\\)", "<a href=\"$2\" rel=\"nofollow\">$1</a>"); - - // #12345 - // <a href="http://juick.com/12345">#12345</a> - msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))#(\\d+)((?=\\s)|(?=\\Z)|(?=\\))|(?=\\.)|(?=\\,))", "$1<a href=\"https://juick.com/m/$2\">#$2</a>$3"); - - // #12345/65 - // <a href="http://juick.com/12345#65">#12345/65</a> - msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))#(\\d+)/(\\d+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1<a href=\"https://juick.com/m/$2#$3\">#$2/$3</a>$4"); - - // *bold* - // <b>bold</b> - msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))\\*([^\\*\\n<>]+)\\*((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1<b>$2</b>$3"); - - // /italic/ - // <i>italic</i> - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))/([^\\/\\n<>]+)/((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1<i>$2</i>$3"); - - // _underline_ - // <span class="u">underline</span> - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))_([^\\_\\n<>]+)_((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1<span class=\"u\">$2</span>$3"); - - // /12 - // <a href="#12">/12</a> - msg = msg.replaceAll(replyNumberRegex, "$1<a href=\"#$2\">/$2</a>$3"); - - // @username@jabber.org - // <a href="http://juick.com/username@jabber.org/">@username@jabber.org</a> - msg = msg.replaceAll(jidRegex, "$1<a href=\"https://juick.com/$2/\">@$2</a>$3"); - - // @username - // <a href="http://juick.com/username/">@username</a> - msg = msg.replaceAll(usernameRegex, "$1<a href=\"https://juick.com/$2/\">@$2</a>$3"); - - // (http://juick.com/last?page=2) - // (<a href="http://juick.com/last?page=2" rel="nofollow">juick.com</a>) - Matcher m = regexLinks2.matcher(msg); - StringBuffer sb = new StringBuffer(); - while (m.find()) { - String url = m.group(3).replace(" ", "%20").replaceAll("\\s+", StringUtils.EMPTY); - m.appendReplacement(sb, "$1$2<a href=\"" + url + "\" rel=\"nofollow\">$4</a>$5"); - } - m.appendTail(sb); - msg = sb.toString(); - - // > citate - msg = msg.replaceAll("(?:(?<=\\n)|(?<=\\A))> *(.*)?(\\n|(?=\\Z))", "<q>$1</q>"); - msg = msg.replaceAll("</q><q>", "\n"); - - msg = msg.replaceAll("\n", "<br/>\n"); - return msg; - } - - public static String formatHtml(Message jmsg) { - StringBuilder sb = new StringBuilder(); - boolean isReply = jmsg.getRid() > 0; - String title = isReply ? "<b>Reply by @" : "<b>@"; - String subtitle = isReply ? "<blockquote>" + jmsg.getReplyQuote() + "</blockquote>" : "<i>" + getTagsString(jmsg) + "</i>"; - boolean isCode = jmsg.getTags().stream().anyMatch(t -> t.getName().equals("code")); - - sb.append(title).append(jmsg.getUser().getName()).append(":</b></br/>") - .append(subtitle).append("<br/>") - .append(isCode ? formatMessageCode(StringUtils.defaultString(jmsg.getText())) - : formatMessage(StringUtils.defaultString(jmsg.getText()))).append("<br />"); - if (StringUtils.isNotEmpty(jmsg.getAttachmentType())) { - // FIXME: attachment does not serialized to xml - if (jmsg.getAttachment() == null) { - if (jmsg.getRid() > 0) { - sb.append(String.format("<img src=\"http://i.juick.com/photos-1024/%d-%d.%s\" />", jmsg.getMid(), - jmsg.getRid(), jmsg.getAttachmentType())); - } else { - sb.append(String.format("<img src=\"http://i.juick.com/photos-1024/%d.%s\" />", jmsg.getMid(), - jmsg.getAttachmentType())); - } - } else { - sb.append("<img src=\"").append(jmsg.getAttachment().getMedium().getUrl()).append("\" />"); - } - } - return sb.toString(); - } - - public static String getMessageHashTags(final Message jmsg) { - StringBuilder hashtags = new StringBuilder(); - for (Tag tag : jmsg.getTags()) { - hashtags.append("#").append(tag).append(" "); - } - return hashtags.toString(); - } - public static String getMarkdownTags(final Message jmsg) { - return jmsg.getTags().stream().map(t -> String.format("[%s](http://juick.com/tag/%s)", t.getName(), percentEncode(t.getName()))) - .collect(Collectors.joining(", ")); - } - - public static String getMarkdownUser(final User user) { - return String.format("[%s](https://juick.com/%s/)", user.getName(), user.getName()); - } - - // TODO: check if it is really needed - public static String percentEncode(final String s) { - String ret = StringUtils.EMPTY; - try { - ret = URLEncoder.encode(s, CharEncoding.UTF_8).replace("+", "%20").replace("*", "%2A").replace("%7E", "~"); - } catch (UnsupportedEncodingException e) { - } - return ret; - } - public static String formatMarkdownText(final Message msg) { - String s = StringUtils.defaultString(msg.getText()).replaceAll(replyNumberRegex, String.format("$1[/$2](https://juick.com/m/%d#$2)$3", msg.getMid())); - return escapeMarkdown(s); - } - public static String escapeMarkdown(final String s) { - return s.replace("_", "\\_").replace("*", "\\*") - .replace("`", "\\`"); - } - public static String attachmentUrl(final Message jmsg) { - if (StringUtils.isEmpty(jmsg.getAttachmentType())) { - return StringUtils.EMPTY; - } - // FIXME: attachment does not serialized to xml - if (jmsg.getAttachment() == null) { - if (jmsg.getRid() > 0) { - return String.format("http://i.juick.com/photos-1024/%d-%d.%s", jmsg.getMid(), - jmsg.getRid(), jmsg.getAttachmentType()); - } else { - return String.format("http://i.juick.com/photos-1024/%d.%s", jmsg.getMid(), - jmsg.getAttachmentType()); - } - } else { - return jmsg.getAttachment().getMedium().getUrl(); - } - } - public static boolean replyStartsWithQuote(Message msg) { - return msg.getRid() > 0 && StringUtils.defaultString(msg.getText()).startsWith(">"); - } - public static List<Tag> parseTags(String strTags) { - List<Tag> tags = new ArrayList<>(); - if (StringUtils.isNotEmpty(strTags)) { - Set<Tag> tagSet = new TreeSet<>(tags); - for (String str : strTags.split(" ")) { - Tag tag = new Tag(str); - if (!tagSet.contains(tag)) { - tags.add(tag); - tagSet.add(tag); - } - } - } - return tags; - } - public static String getTagsString(Message msg) { - StringBuilder builder = new StringBuilder(); - List<Tag> tags = msg.getTags(); - if (!tags.isEmpty()) { - for (Tag Tag : tags) - builder.append(" *").append(Tag.getName()); - - if (msg.FriendsOnly) - builder.append(" *friends"); - - if (msg.getPrivacy() == -2) - builder.append(" *private"); - else if (msg.getPrivacy() == -1) - builder.append(" *friends"); - else if (msg.getPrivacy() == 2) - builder.append(" *public"); - - if (msg.ReadOnly) - builder.append(" *readonly"); - } - return builder.toString(); - } - public static boolean isPM(Message message) { - return message.getMid() == 0; - } - public static boolean isReply(Message message) { - return message.getRid() > 0; - } - - public static String stripNonSafeUrls(String input) { - // strip login urls - try { - Matcher urlMatcher = Pattern.compile(MessageUtils.urlRegex).matcher(input); - while (urlMatcher.find()) { - URI uri = URI.create(urlMatcher.group(0)); - if (uri.getHost().equals("juick.com")) { - UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUri(uri); - uriComponentsBuilder.replaceQueryParam("hash"); - input = input.replace(urlMatcher.group(0), uriComponentsBuilder.build().toUriString()); - } - } - } catch (IllegalArgumentException | NullPointerException e) { - return input; - } - return input; - } - private static List<String> collectMatches(Pattern pattern, String input) { - Matcher matcher = pattern.matcher(input); - List<String> result = new ArrayList<>(); - while (matcher.find()) { - result.add(matcher.group()); - } - return result; - } - public static List<String> getMentions(Message msg) { - return collectMatches(usernamePattern, msg.getText()); - } - public static List<String> getGlobalMentions(Message msg) { - return collectMatches(jidPattern, msg.getText()); - } -} diff --git a/juick-common/src/main/java/com/juick/util/PrettyTimeFormatter.java b/juick-common/src/main/java/com/juick/util/PrettyTimeFormatter.java deleted file mode 100644 index 383f4d9a..00000000 --- a/juick-common/src/main/java/com/juick/util/PrettyTimeFormatter.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2008-2017, Juick - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package com.juick.util; - -import org.ocpsoft.prettytime.PrettyTime; - -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.Locale; -import java.util.Map; - -/** - * Created by vitalyster on 04.05.2017. - */ -public class PrettyTimeFormatter { - private static final int MAX_CACHE_SIZE = 20; - - // Cache PrettyTime per locale. LRU cache to prevent memory leak. - private static final Map<Locale, PrettyTime> PRETTY_TIME_LOCALE_MAP = - new LinkedHashMap<Locale, PrettyTime>(MAX_CACHE_SIZE + 1, 1.1F, true) - { - @Override - protected boolean removeEldestEntry(Map.Entry<Locale, PrettyTime> eldest) - { - return size() > MAX_CACHE_SIZE; - } - }; - - public String format(final Locale locale, final Date value) - { - PrettyTime prettyTime; - - synchronized (PRETTY_TIME_LOCALE_MAP) { - prettyTime = PRETTY_TIME_LOCALE_MAP.computeIfAbsent(locale, PrettyTime::new); - } - return prettyTime.format(value); - } -} diff --git a/juick-common/src/main/java/com/juick/util/StreamUtils.java b/juick-common/src/main/java/com/juick/util/StreamUtils.java deleted file mode 100644 index 576107af..00000000 --- a/juick-common/src/main/java/com/juick/util/StreamUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.juick.util; - -import java.util.Spliterator; -import java.util.Spliterators; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -/** - * @deprecated switch to JDK9+ Stream API when possible - */ -@Deprecated -public class StreamUtils { - private static <T> Spliterator<T> takeWhile( - Spliterator<T> splitr, Predicate<? super T> predicate) { - return new Spliterators.AbstractSpliterator<T>(splitr.estimateSize(), 0) { - boolean stillGoing = true; - @Override public boolean tryAdvance(Consumer<? super T> consumer) { - if (stillGoing) { - boolean hadNext = splitr.tryAdvance(elem -> { - if (predicate.test(elem)) { - consumer.accept(elem); - } else { - stillGoing = false; - } - }); - return hadNext && stillGoing; - } - return false; - } - }; - } - - public static <T> Stream<T> takeWhile(Stream<T> stream, Predicate<? super T> predicate) { - return StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false); - } -} |