PageRenderTime 24ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/src/main/groovy/org/jenkinsci/plugins/pollmailboxtrigger/mail/utils/Stringify.java

https://gitlab.com/github-cloud-corp/poll-mailbox-trigger-plugin
Java | 405 lines | 215 code | 35 blank | 155 comment | 58 complexity | cbb424768319dd92cbe5bbda383c5ecf MD5 | raw file
  1. package org.jenkinsci.plugins.pollmailboxtrigger.mail.utils;
  2. import org.apache.commons.lang.StringUtils;
  3. import javax.mail.Address;
  4. import javax.mail.Flags;
  5. import javax.mail.Folder;
  6. import javax.mail.Header;
  7. import javax.mail.MessagingException;
  8. import javax.mail.Multipart;
  9. import javax.mail.Part;
  10. import javax.mail.internet.InternetAddress;
  11. import java.io.IOException;
  12. import java.io.PrintWriter;
  13. import java.io.StringWriter;
  14. import java.text.SimpleDateFormat;
  15. import java.util.ArrayList;
  16. import java.util.Arrays;
  17. import java.util.Date;
  18. import java.util.Enumeration;
  19. import java.util.Iterator;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Set;
  23. import static javax.mail.Flags.Flag.ANSWERED;
  24. import static javax.mail.Flags.Flag.DELETED;
  25. import static javax.mail.Flags.Flag.DRAFT;
  26. import static javax.mail.Flags.Flag.FLAGGED;
  27. import static javax.mail.Flags.Flag.RECENT;
  28. import static javax.mail.Flags.Flag.SEEN;
  29. import static javax.mail.Flags.Flag.USER;
  30. /**
  31. * @author Nick Grealy
  32. */
  33. public abstract class Stringify {
  34. public static final String DATE_FORMAT_TEXT = "yyyy-MM-dd'T'HH:mm'Z'";
  35. /**
  36. * Converts the given object to a {@link String}.
  37. *
  38. * @param t the object to convert to a String.
  39. * @return a String
  40. */
  41. public static String stringify(final Throwable t) {
  42. StringWriter sw = new StringWriter();
  43. PrintWriter pw = new PrintWriter(sw);
  44. t.printStackTrace(pw);
  45. return sw.toString();
  46. }
  47. /**
  48. * Converts the given object to a {@link String}.
  49. *
  50. * @param message the object to convert to a String.
  51. * @return a String
  52. */
  53. public static String stringify(final String message) {
  54. return message;
  55. }
  56. /**
  57. * Converts the given object to a {@link String}.
  58. *
  59. * @param array the object to convert to a String.
  60. * @param <A> the type of the array
  61. * @return a String
  62. */
  63. public static <A extends Object> String stringify(final A[] array) {
  64. return stringify(array, null);
  65. }
  66. /**
  67. * Converts the given object to a {@link String}.
  68. *
  69. * @param array the object to convert to a String.
  70. * @param delimiter a delimiter.
  71. * @param <A>
  72. * @return a String
  73. */
  74. public static <A extends Object> String stringify(final A[] array, final String delimiter) {
  75. return stringify(Arrays.asList(array), delimiter);
  76. }
  77. /**
  78. * Converts the given object to a {@link String}.
  79. *
  80. * @param list the object to convert to a String.
  81. * @return a String
  82. */
  83. public static String stringify(final List list) {
  84. return stringify(list.iterator(), null);
  85. }
  86. /**
  87. * Converts the given object to a {@link String}.
  88. *
  89. * @param list the object to convert to a String.
  90. * @param delimiter a delimiter.
  91. * @return a String
  92. */
  93. public static String stringify(final List list, final String delimiter) {
  94. return stringify(list.iterator(), delimiter);
  95. }
  96. /**
  97. * Converts the given object to a {@link String}.
  98. *
  99. * @param list the object to convert to a String.
  100. * @return a String
  101. */
  102. public static String stringify(final Set list) {
  103. return stringify(list.iterator(), null);
  104. }
  105. /**
  106. * Converts the given object to a {@link String}.
  107. *
  108. * @param list the object to convert to a String.
  109. * @param delimiter a delimiter.
  110. * @return a String
  111. */
  112. public static String stringify(final Set list, final String delimiter) {
  113. return stringify(list.iterator(), delimiter);
  114. }
  115. /**
  116. * Converts the given object to a {@link String}.
  117. *
  118. * @param iterator the object to convert to a String.
  119. * @param pDelimiter a delimiter.
  120. * @return a String
  121. */
  122. public static String stringify(final Iterator iterator, final String pDelimiter) {
  123. String delimiter = pDelimiter;
  124. if (delimiter == null) {
  125. delimiter = ", ";
  126. }
  127. StringBuilder sb = new StringBuilder();
  128. while (iterator.hasNext()) {
  129. try {
  130. sb.append(stringify(iterator.next()));
  131. } catch (Exception e) {
  132. throw new RuntimeException(e);
  133. }
  134. if (iterator.hasNext()) {
  135. sb.append(delimiter);
  136. }
  137. }
  138. return sb.toString();
  139. }
  140. /**
  141. * Converts the given object to a {@link String}.
  142. *
  143. * @param iterator the object to convert to a String.
  144. * @param pKeyValueDelimiter a delimiter.
  145. * @param pDelimiter a delimiter.
  146. * @return a String
  147. */
  148. public static String stringify(final Iterator<? extends Map.Entry<?, ?>> iterator, final String pKeyValueDelimiter, final String pDelimiter) {
  149. String keyValueDelimiter = pKeyValueDelimiter;
  150. String delimiter = pDelimiter;
  151. if (keyValueDelimiter == null) {
  152. keyValueDelimiter = "=";
  153. }
  154. if (delimiter == null) {
  155. delimiter = ", ";
  156. }
  157. StringBuilder sb = new StringBuilder();
  158. while (iterator.hasNext()) {
  159. try {
  160. sb.append(stringify(iterator.next(), keyValueDelimiter));
  161. } catch (Exception e) {
  162. throw new RuntimeException(e);
  163. }
  164. if (iterator.hasNext()) {
  165. sb.append(delimiter);
  166. }
  167. }
  168. return sb.toString();
  169. }
  170. /**
  171. * Converts the given object to a {@link String}.
  172. *
  173. * @param date the object to convert to a String.
  174. * @return a String
  175. */
  176. public static String stringify(final Date date) {
  177. if (date == null) {
  178. return "null";
  179. }
  180. return new SimpleDateFormat(DATE_FORMAT_TEXT).format(date);
  181. }
  182. /**
  183. * Converts the given object to a {@link String}.
  184. *
  185. * @param messageNumber the object to convert to a String.
  186. * @return a String
  187. */
  188. public static String stringify(final int messageNumber) {
  189. return String.valueOf(messageNumber);
  190. }
  191. /**
  192. * Converts the given object to a {@link String}.
  193. *
  194. * @param allHeaders the object to convert to a String.
  195. * @return a String
  196. */
  197. public static String stringify(final Enumeration allHeaders) {
  198. if (allHeaders == null) {
  199. return "null";
  200. }
  201. List<Object> list = new ArrayList<Object>();
  202. while (allHeaders.hasMoreElements()) {
  203. list.add(allHeaders.nextElement());
  204. }
  205. return stringify(list);
  206. }
  207. /**
  208. * Converts the given object to a {@link String}.
  209. *
  210. * @param content the object to convert to a String.
  211. * @return a String
  212. */
  213. public static String stringify(final Map content) {
  214. return stringify(content, null, null);
  215. }
  216. /**
  217. * Converts the given object to a {@link String}.
  218. *
  219. * @param content the object to convert to a String.
  220. * @param keyValueDelimiter a delimiter.
  221. * @param delimiter a delimiter.
  222. * @return a String
  223. */
  224. public static String stringify(final Map<?, ?> content, final String keyValueDelimiter, final String delimiter) {
  225. Set<? extends Map.Entry<?, ?>> entries = content.entrySet();
  226. Iterator<? extends Map.Entry<?, ?>> iterator = entries.iterator();
  227. return stringify(iterator, keyValueDelimiter, delimiter);
  228. }
  229. /**
  230. * Converts the given object to a {@link String}.
  231. *
  232. * @param content the object to convert to a String.
  233. * @param keyValueDelimiter a delimiter.
  234. * @return a String
  235. */
  236. public static String stringify(final Map.Entry content, final String keyValueDelimiter) {
  237. return content.getKey() + keyValueDelimiter + content.getValue();
  238. }
  239. /**
  240. * Converts the given object to a {@link String}.
  241. *
  242. * @param content the object to convert to a String.
  243. * @return a String
  244. */
  245. public static String stringify(final Object content) {
  246. if (content instanceof Header) {
  247. return stringify((Header) content);
  248. } else if (content instanceof Part) {
  249. return stringify((Part) content);
  250. } else if (content instanceof Map) {
  251. return stringify((Map) content);
  252. } else if (content instanceof Flags.Flag) {
  253. return stringify((Flags.Flag) content);
  254. }
  255. return content == null ? "null" : content.toString();
  256. }
  257. /* javax.mail */
  258. public static final String TEXT_WILDCARD = "text/*", TEXT_HTML = "text/html", TEXT_PLAIN = "text/plain",
  259. MULTIPART_WILDCARD = "multipart/*", MULTIPART_ALTERNATIVE = "multipart/alternative", NEWLINE = "\n",
  260. BLANK = "";
  261. /**
  262. * Converts the given object to a {@link String}.
  263. *
  264. * @param content the object to convert to a String.
  265. * @return a String
  266. */
  267. public static String stringify(final Header content) {
  268. return content.getName() + "=" + content.getValue();
  269. }
  270. /**
  271. * Converts the given object to a {@link String}.
  272. *
  273. * @param addresses the object to convert to a String.
  274. * @return a String
  275. */
  276. public static String stringify(final Address[] addresses) {
  277. List<String> parsed = new ArrayList<String>();
  278. for (Address addr : addresses) {
  279. if (addr instanceof InternetAddress) {
  280. parsed.add(((InternetAddress) addr).getAddress());
  281. } else {
  282. parsed.add(addr.toString());
  283. }
  284. }
  285. return StringUtils.join(parsed, ",");
  286. }
  287. /**
  288. * Get text from all parts of the email.
  289. * Loosely based on <a href="http://www.oracle.com/technetwork/java/javamail/faq/index.html#mainbody">oracle.com</a>.
  290. *
  291. * @param part - the mail part to convert to string.
  292. * @return a String
  293. */
  294. public static String stringify(final Part part) {
  295. try {
  296. return stringify(new StringBuilder(), part);
  297. } catch (Exception e) {
  298. throw new RuntimeException(e);
  299. }
  300. }
  301. private static String stringify(final StringBuilder builder, final Part part) throws MessagingException, IOException {
  302. final Object content = part.getContent();
  303. if (content == null) {
  304. return "null";
  305. }
  306. if (part.isMimeType(TEXT_WILDCARD) && content instanceof String) {
  307. builder.append(NEWLINE + content);
  308. }
  309. if (part.isMimeType(MULTIPART_WILDCARD) && content instanceof Multipart) {
  310. Multipart mp = (Multipart) content;
  311. // iterate backwards through the parts... should be html first (muddled with html tags), plain text (pure) last
  312. for (int i = mp.getCount() - 1; i >= 0; i--) {
  313. stringify(builder, mp.getBodyPart(i));
  314. }
  315. }
  316. return builder.toString();
  317. }
  318. /**
  319. * Converts the given object to a {@link String}.
  320. *
  321. * @param flags the object to convert to a String.
  322. * @return a String
  323. */
  324. public static String stringify(final Flags flags) {
  325. if (flags == null) {
  326. return "null";
  327. }
  328. List<Object> tmp = new ArrayList<Object>();
  329. tmp.addAll(Arrays.asList(flags.getSystemFlags()));
  330. tmp.addAll(Arrays.asList(flags.getUserFlags()));
  331. return stringify(tmp);
  332. }
  333. /**
  334. * Converts the given object to a {@link String}.
  335. *
  336. * @param flag the object to convert to a String.
  337. * @return a String
  338. */
  339. public static String stringify(final Flags.Flag flag) {
  340. if (flag == SEEN) {
  341. return "SEEN";
  342. } else if (flag == ANSWERED) {
  343. return "ANSWERED";
  344. } else if (flag == DELETED) {
  345. return "DELETED";
  346. } else if (flag == DRAFT) {
  347. return "DRAFT";
  348. } else if (flag == FLAGGED) {
  349. return "FLAGGED";
  350. } else if (flag == RECENT) {
  351. return "RECENT";
  352. } else if (flag == USER) {
  353. return "USER";
  354. } else {
  355. return "";
  356. }
  357. }
  358. /**
  359. * Converts the given object to a {@link String}.
  360. *
  361. * @param folder the object to convert to a String.
  362. * @return a String
  363. */
  364. public static String stringify(final Folder folder) {
  365. if (folder == null) {
  366. return "null";
  367. }
  368. return folder.getFullName();
  369. }
  370. }