You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by vi...@apache.org on 2006/09/12 17:11:03 UTC
svn commit: r442614 - in /james/server/trunk/src/java/org/apache/james:
transport/mailets/ util/mailet/
Author: vincenzo
Date: Tue Sep 12 08:11:02 2006
New Revision: 442614
URL: http://svn.apache.org/viewvc?view=rev&rev=442614
Log:
Fixing tabs to spaces.
Modified:
james/server/trunk/src/java/org/apache/james/transport/mailets/OnlyText.java
james/server/trunk/src/java/org/apache/james/transport/mailets/ReplaceContent.java
james/server/trunk/src/java/org/apache/james/transport/mailets/UnwrapText.java
james/server/trunk/src/java/org/apache/james/transport/mailets/WrapText.java
james/server/trunk/src/java/org/apache/james/util/mailet/FlowedMessageUtils.java
james/server/trunk/src/java/org/apache/james/util/mailet/StringUtils.java
Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/OnlyText.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/OnlyText.java?view=diff&rev=442614&r1=442613&r2=442614
==============================================================================
--- james/server/trunk/src/java/org/apache/james/transport/mailets/OnlyText.java (original)
+++ james/server/trunk/src/java/org/apache/james/transport/mailets/OnlyText.java Tue Sep 12 08:11:02 2006
@@ -22,263 +22,263 @@
* - text/* as is.</p>
*/
public class OnlyText extends GenericMailet {
- private static final String PARAMETER_NAME_NOTEXT_PROCESSOR = "NoTextProcessor";
-
- private String optionsNotextProcessor = null;
- private final HashMap charMap = new HashMap();
-
- /**
- * returns a String describing this mailet.
- *
- * @return A desciption of this mailet
- */
- public String getMailetInfo() {
- return "OnlyText";
- }
-
- public void init() throws MailetException {
- optionsNotextProcessor = getInitParameter(PARAMETER_NAME_NOTEXT_PROCESSOR);
- initEntityTable();
- }
-
- private int[] process(Mail mail, Multipart mp, int found, int htmlPart, int stringPart) throws MessagingException, IOException {
- for (int i = 0; found < 0 && i < mp.getCount(); i++) {
- Object content = null;
- try {
- content = mp.getBodyPart(i).getContent();
- } catch (java.io.UnsupportedEncodingException e) {
- log("Caught error [" + e.getMessage() + "] in a text/plain part, skipping...");
- }
- if (content != null) {
- if (mp.getBodyPart(i).isMimeType("text/plain")) {
- setContentFromPart(mail.getMessage(), mp.getBodyPart(i), null, false);
- found = 1;
- }
- else if (htmlPart == -1 && mp.getBodyPart(i).isMimeType("text/html"))
- htmlPart = i;
-
- else if (stringPart == -1 && content instanceof String)
- stringPart = i;
-
- else if (content instanceof Multipart) {
- int[] res = process(mail, (Multipart) content, found, htmlPart, stringPart);
- found = res[0];
- htmlPart = res[1];
- stringPart = res[2];
- }
- }
- }
-
- return new int[] {found, htmlPart, stringPart};
-
- }
-
- public void service(Mail mail) throws MailetException {
- try {
- Object content = mail.getMessage().getContent();
- if (content instanceof Multipart) {
- Multipart mp = (Multipart) content;
-
- int found = -1;
- int htmlPart = -1;
- int stringPart = -1;
- int[] res = process(mail, (Multipart) content, found, htmlPart, stringPart);
- found = res[0];
- htmlPart = res[1];
- stringPart = res[2];
-
- if (found < 0 && htmlPart != -1) {
- setContentFromPart(mail.getMessage(), mp.getBodyPart(htmlPart), html2Text((String) mp.getBodyPart(htmlPart).getContent()), true);
- found = 1;
- }
-
- if (found < 0 && stringPart != -1) {
- setContentFromPart(mail.getMessage(), mp.getBodyPart(htmlPart), null, false);
- found = 1;
- }
-
-
- if (found < 0 && optionsNotextProcessor != null) mail.setState(optionsNotextProcessor);
-
- }
-
- else if (!(content instanceof String) && optionsNotextProcessor != null) mail.setState(optionsNotextProcessor);
-
- else if (mail.getMessage().isMimeType("text/html")) {
- setContentFromPart(mail.getMessage(), mail.getMessage(), html2Text((String) mail.getMessage().getContent()), true);
- }
-
- } catch (IOException e) {
- throw new MailetException("Failed fetching text part", e);
-
- } catch (MessagingException e) {
- throw new MailetException("Failed fetching text part", e);
- }
- }
-
- private static void setContentFromPart(Message m, Part p, String newText, boolean setTextPlain) throws MessagingException, IOException {
- String contentType = p.getContentType();
- if (setTextPlain) {
- ContentType ct = new ContentType(contentType);
- ct.setPrimaryType("text");
- ct.setSubType("plain");
- contentType = ct.toString();
- }
- m.setContent(newText != null ? newText : p.getContent(), contentType);
- String[] h = p.getHeader("Content-Transfer-Encoding");
- if (h != null && h.length > 0) m.setHeader("Content-Transfer-Encoding", h[0]);
- m.saveChanges();
- }
-
- public String html2Text(String html) {
- return decodeEntities(html
- .replaceAll("\\<([bB][rR]|[dD][lL])[ ]*[/]*[ ]*\\>", "\n")
- .replaceAll("\\</([pP]|[hH]5|[dD][tT]|[dD][dD]|[dD][iI][vV])[ ]*\\>", "\n")
- .replaceAll("\\<[lL][iI][ ]*[/]*[ ]*\\>", "\n* ")
- .replaceAll("\\<[dD][dD][ ]*[/]*[ ]*\\>", " - ")
- .replaceAll("\\<.*?\\>", ""));
- }
-
- public String decodeEntities(String data) {
- StringBuffer buffer = new StringBuffer();
- StringBuffer res = new StringBuffer();
- int lastAmp = -1;
- for (int i = 0; i < data.length(); i++) {
- char c = data.charAt(i);
-
- if (c == '&' && lastAmp == -1) lastAmp = buffer.length();
- else if (c == ';' && (lastAmp > -1)) { // && (lastAmp > (buffer.length() - 7))) { // max: &#xxxx;
- if (charMap.containsKey(buffer.toString())) res.append((String) charMap.get(buffer.toString()));
- else res.append("&" + buffer.toString() + ";");
- lastAmp = -1;
- buffer = new StringBuffer();
- }
- else if (lastAmp == -1) res.append(c);
- else buffer.append(c);
- }
- return res.toString();
- }
-
- private final void initEntityTable() {
- for (int index = 11; index < 32; index++) charMap.put("#0" + index, String.valueOf((char) index));
- for (int index = 32; index < 128; index++) charMap.put("#" + index, String.valueOf((char) index));
- for (int index = 128; index < 256; index++) charMap.put("#" + index, String.valueOf((char) index));
-
- // una buona tabella è qui
- // http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
-
- charMap.put("#09", "\t");
- charMap.put("#10", "\n");
- charMap.put("#13", "\r");
- charMap.put("#60", "<");
- charMap.put("#62", ">");
-
- charMap.put("lt", "<");
- charMap.put("gt", ">");
- charMap.put("amp", "&");
- charMap.put("nbsp", " ");
- charMap.put("quot", "\"");
-
- charMap.put("iexcl", "\u00A1");
- charMap.put("cent", "\u00A2");
- charMap.put("pound", "\u00A3");
- charMap.put("curren", "\u00A4");
- charMap.put("yen", "\u00A5");
- charMap.put("brvbar", "\u00A6");
- charMap.put("sect", "\u00A7");
- charMap.put("uml", "\u00A8");
- charMap.put("copy", "\u00A9");
- charMap.put("ordf", "\u00AA");
- charMap.put("laquo", "\u00AB");
- charMap.put("not", "\u00AC");
- charMap.put("shy", "\u00AD");
- charMap.put("reg", "\u00AE");
- charMap.put("macr", "\u00AF");
- charMap.put("deg", "\u00B0");
- charMap.put("plusmn", "\u00B1");
- charMap.put("sup2", "\u00B2");
- charMap.put("sup3", "\u00B3");
-
- charMap.put("acute", "\u00B4");
- charMap.put("micro", "\u00B5");
- charMap.put("para", "\u00B6");
- charMap.put("middot", "\u00B7");
- charMap.put("cedil", "\u00B8");
- charMap.put("sup1", "\u00B9");
- charMap.put("ordm", "\u00BA");
- charMap.put("raquo", "\u00BB");
- charMap.put("frac14", "\u00BC");
- charMap.put("frac12", "\u00BD");
- charMap.put("frac34", "\u00BE");
- charMap.put("iquest", "\u00BF");
-
- charMap.put("Agrave", "\u00C0");
- charMap.put("Aacute", "\u00C1");
- charMap.put("Acirc", "\u00C2");
- charMap.put("Atilde", "\u00C3");
- charMap.put("Auml", "\u00C4");
- charMap.put("Aring", "\u00C5");
- charMap.put("AElig", "\u00C6");
- charMap.put("Ccedil", "\u00C7");
- charMap.put("Egrave", "\u00C8");
- charMap.put("Eacute", "\u00C9");
- charMap.put("Ecirc", "\u00CA");
- charMap.put("Euml", "\u00CB");
- charMap.put("Igrave", "\u00CC");
- charMap.put("Iacute", "\u00CD");
- charMap.put("Icirc", "\u00CE");
- charMap.put("Iuml", "\u00CF");
-
- charMap.put("ETH", "\u00D0");
- charMap.put("Ntilde", "\u00D1");
- charMap.put("Ograve", "\u00D2");
- charMap.put("Oacute", "\u00D3");
- charMap.put("Ocirc", "\u00D4");
- charMap.put("Otilde", "\u00D5");
- charMap.put("Ouml", "\u00D6");
- charMap.put("times", "\u00D7");
- charMap.put("Oslash", "\u00D8");
- charMap.put("Ugrave", "\u00D9");
- charMap.put("Uacute", "\u00DA");
- charMap.put("Ucirc", "\u00DB");
- charMap.put("Uuml", "\u00DC");
- charMap.put("Yacute", "\u00DD");
- charMap.put("THORN", "\u00DE");
- charMap.put("szlig", "\u00DF");
-
- charMap.put("agrave", "\u00E0");
- charMap.put("aacute", "\u00E1");
- charMap.put("acirc", "\u00E2");
- charMap.put("atilde", "\u00E3");
- charMap.put("auml", "\u00E4");
- charMap.put("aring", "\u00E5");
- charMap.put("aelig", "\u00E6");
- charMap.put("ccedil", "\u00E7");
- charMap.put("egrave", "\u00E8");
- charMap.put("eacute", "\u00E9");
- charMap.put("ecirc", "\u00EA");
- charMap.put("euml", "\u00EB");
- charMap.put("igrave", "\u00EC");
- charMap.put("iacute", "\u00ED");
- charMap.put("icirc", "\u00EE");
- charMap.put("iuml", "\u00EF");
-
- charMap.put("eth", "\u00F0");
- charMap.put("ntilde", "\u00F1");
- charMap.put("ograve", "\u00F2");
- charMap.put("oacute", "\u00F3");
- charMap.put("ocirc", "\u00F4");
- charMap.put("otilde", "\u00F5");
- charMap.put("ouml", "\u00F6");
- charMap.put("divid", "\u00F7");
- charMap.put("oslash", "\u00F8");
- charMap.put("ugrave", "\u00F9");
- charMap.put("uacute", "\u00FA");
- charMap.put("ucirc", "\u00FB");
- charMap.put("uuml", "\u00FC");
- charMap.put("yacute", "\u00FD");
- charMap.put("thorn", "\u00FE");
- charMap.put("yuml", "\u00FF");
- charMap.put("euro", "\u0080");
- }
+ private static final String PARAMETER_NAME_NOTEXT_PROCESSOR = "NoTextProcessor";
+
+ private String optionsNotextProcessor = null;
+ private final HashMap charMap = new HashMap();
+
+ /**
+ * returns a String describing this mailet.
+ *
+ * @return A desciption of this mailet
+ */
+ public String getMailetInfo() {
+ return "OnlyText";
+ }
+
+ public void init() throws MailetException {
+ optionsNotextProcessor = getInitParameter(PARAMETER_NAME_NOTEXT_PROCESSOR);
+ initEntityTable();
+ }
+
+ private int[] process(Mail mail, Multipart mp, int found, int htmlPart, int stringPart) throws MessagingException, IOException {
+ for (int i = 0; found < 0 && i < mp.getCount(); i++) {
+ Object content = null;
+ try {
+ content = mp.getBodyPart(i).getContent();
+ } catch (java.io.UnsupportedEncodingException e) {
+ log("Caught error [" + e.getMessage() + "] in a text/plain part, skipping...");
+ }
+ if (content != null) {
+ if (mp.getBodyPart(i).isMimeType("text/plain")) {
+ setContentFromPart(mail.getMessage(), mp.getBodyPart(i), null, false);
+ found = 1;
+ }
+ else if (htmlPart == -1 && mp.getBodyPart(i).isMimeType("text/html"))
+ htmlPart = i;
+
+ else if (stringPart == -1 && content instanceof String)
+ stringPart = i;
+
+ else if (content instanceof Multipart) {
+ int[] res = process(mail, (Multipart) content, found, htmlPart, stringPart);
+ found = res[0];
+ htmlPart = res[1];
+ stringPart = res[2];
+ }
+ }
+ }
+
+ return new int[] {found, htmlPart, stringPart};
+
+ }
+
+ public void service(Mail mail) throws MailetException {
+ try {
+ Object content = mail.getMessage().getContent();
+ if (content instanceof Multipart) {
+ Multipart mp = (Multipart) content;
+
+ int found = -1;
+ int htmlPart = -1;
+ int stringPart = -1;
+ int[] res = process(mail, (Multipart) content, found, htmlPart, stringPart);
+ found = res[0];
+ htmlPart = res[1];
+ stringPart = res[2];
+
+ if (found < 0 && htmlPart != -1) {
+ setContentFromPart(mail.getMessage(), mp.getBodyPart(htmlPart), html2Text((String) mp.getBodyPart(htmlPart).getContent()), true);
+ found = 1;
+ }
+
+ if (found < 0 && stringPart != -1) {
+ setContentFromPart(mail.getMessage(), mp.getBodyPart(htmlPart), null, false);
+ found = 1;
+ }
+
+
+ if (found < 0 && optionsNotextProcessor != null) mail.setState(optionsNotextProcessor);
+
+ }
+
+ else if (!(content instanceof String) && optionsNotextProcessor != null) mail.setState(optionsNotextProcessor);
+
+ else if (mail.getMessage().isMimeType("text/html")) {
+ setContentFromPart(mail.getMessage(), mail.getMessage(), html2Text((String) mail.getMessage().getContent()), true);
+ }
+
+ } catch (IOException e) {
+ throw new MailetException("Failed fetching text part", e);
+
+ } catch (MessagingException e) {
+ throw new MailetException("Failed fetching text part", e);
+ }
+ }
+
+ private static void setContentFromPart(Message m, Part p, String newText, boolean setTextPlain) throws MessagingException, IOException {
+ String contentType = p.getContentType();
+ if (setTextPlain) {
+ ContentType ct = new ContentType(contentType);
+ ct.setPrimaryType("text");
+ ct.setSubType("plain");
+ contentType = ct.toString();
+ }
+ m.setContent(newText != null ? newText : p.getContent(), contentType);
+ String[] h = p.getHeader("Content-Transfer-Encoding");
+ if (h != null && h.length > 0) m.setHeader("Content-Transfer-Encoding", h[0]);
+ m.saveChanges();
+ }
+
+ public String html2Text(String html) {
+ return decodeEntities(html
+ .replaceAll("\\<([bB][rR]|[dD][lL])[ ]*[/]*[ ]*\\>", "\n")
+ .replaceAll("\\</([pP]|[hH]5|[dD][tT]|[dD][dD]|[dD][iI][vV])[ ]*\\>", "\n")
+ .replaceAll("\\<[lL][iI][ ]*[/]*[ ]*\\>", "\n* ")
+ .replaceAll("\\<[dD][dD][ ]*[/]*[ ]*\\>", " - ")
+ .replaceAll("\\<.*?\\>", ""));
+ }
+
+ public String decodeEntities(String data) {
+ StringBuffer buffer = new StringBuffer();
+ StringBuffer res = new StringBuffer();
+ int lastAmp = -1;
+ for (int i = 0; i < data.length(); i++) {
+ char c = data.charAt(i);
+
+ if (c == '&' && lastAmp == -1) lastAmp = buffer.length();
+ else if (c == ';' && (lastAmp > -1)) { // && (lastAmp > (buffer.length() - 7))) { // max: &#xxxx;
+ if (charMap.containsKey(buffer.toString())) res.append((String) charMap.get(buffer.toString()));
+ else res.append("&" + buffer.toString() + ";");
+ lastAmp = -1;
+ buffer = new StringBuffer();
+ }
+ else if (lastAmp == -1) res.append(c);
+ else buffer.append(c);
+ }
+ return res.toString();
+ }
+
+ private final void initEntityTable() {
+ for (int index = 11; index < 32; index++) charMap.put("#0" + index, String.valueOf((char) index));
+ for (int index = 32; index < 128; index++) charMap.put("#" + index, String.valueOf((char) index));
+ for (int index = 128; index < 256; index++) charMap.put("#" + index, String.valueOf((char) index));
+
+ // una buona tabella è qui
+ // http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
+
+ charMap.put("#09", "\t");
+ charMap.put("#10", "\n");
+ charMap.put("#13", "\r");
+ charMap.put("#60", "<");
+ charMap.put("#62", ">");
+
+ charMap.put("lt", "<");
+ charMap.put("gt", ">");
+ charMap.put("amp", "&");
+ charMap.put("nbsp", " ");
+ charMap.put("quot", "\"");
+
+ charMap.put("iexcl", "\u00A1");
+ charMap.put("cent", "\u00A2");
+ charMap.put("pound", "\u00A3");
+ charMap.put("curren", "\u00A4");
+ charMap.put("yen", "\u00A5");
+ charMap.put("brvbar", "\u00A6");
+ charMap.put("sect", "\u00A7");
+ charMap.put("uml", "\u00A8");
+ charMap.put("copy", "\u00A9");
+ charMap.put("ordf", "\u00AA");
+ charMap.put("laquo", "\u00AB");
+ charMap.put("not", "\u00AC");
+ charMap.put("shy", "\u00AD");
+ charMap.put("reg", "\u00AE");
+ charMap.put("macr", "\u00AF");
+ charMap.put("deg", "\u00B0");
+ charMap.put("plusmn", "\u00B1");
+ charMap.put("sup2", "\u00B2");
+ charMap.put("sup3", "\u00B3");
+
+ charMap.put("acute", "\u00B4");
+ charMap.put("micro", "\u00B5");
+ charMap.put("para", "\u00B6");
+ charMap.put("middot", "\u00B7");
+ charMap.put("cedil", "\u00B8");
+ charMap.put("sup1", "\u00B9");
+ charMap.put("ordm", "\u00BA");
+ charMap.put("raquo", "\u00BB");
+ charMap.put("frac14", "\u00BC");
+ charMap.put("frac12", "\u00BD");
+ charMap.put("frac34", "\u00BE");
+ charMap.put("iquest", "\u00BF");
+
+ charMap.put("Agrave", "\u00C0");
+ charMap.put("Aacute", "\u00C1");
+ charMap.put("Acirc", "\u00C2");
+ charMap.put("Atilde", "\u00C3");
+ charMap.put("Auml", "\u00C4");
+ charMap.put("Aring", "\u00C5");
+ charMap.put("AElig", "\u00C6");
+ charMap.put("Ccedil", "\u00C7");
+ charMap.put("Egrave", "\u00C8");
+ charMap.put("Eacute", "\u00C9");
+ charMap.put("Ecirc", "\u00CA");
+ charMap.put("Euml", "\u00CB");
+ charMap.put("Igrave", "\u00CC");
+ charMap.put("Iacute", "\u00CD");
+ charMap.put("Icirc", "\u00CE");
+ charMap.put("Iuml", "\u00CF");
+
+ charMap.put("ETH", "\u00D0");
+ charMap.put("Ntilde", "\u00D1");
+ charMap.put("Ograve", "\u00D2");
+ charMap.put("Oacute", "\u00D3");
+ charMap.put("Ocirc", "\u00D4");
+ charMap.put("Otilde", "\u00D5");
+ charMap.put("Ouml", "\u00D6");
+ charMap.put("times", "\u00D7");
+ charMap.put("Oslash", "\u00D8");
+ charMap.put("Ugrave", "\u00D9");
+ charMap.put("Uacute", "\u00DA");
+ charMap.put("Ucirc", "\u00DB");
+ charMap.put("Uuml", "\u00DC");
+ charMap.put("Yacute", "\u00DD");
+ charMap.put("THORN", "\u00DE");
+ charMap.put("szlig", "\u00DF");
+
+ charMap.put("agrave", "\u00E0");
+ charMap.put("aacute", "\u00E1");
+ charMap.put("acirc", "\u00E2");
+ charMap.put("atilde", "\u00E3");
+ charMap.put("auml", "\u00E4");
+ charMap.put("aring", "\u00E5");
+ charMap.put("aelig", "\u00E6");
+ charMap.put("ccedil", "\u00E7");
+ charMap.put("egrave", "\u00E8");
+ charMap.put("eacute", "\u00E9");
+ charMap.put("ecirc", "\u00EA");
+ charMap.put("euml", "\u00EB");
+ charMap.put("igrave", "\u00EC");
+ charMap.put("iacute", "\u00ED");
+ charMap.put("icirc", "\u00EE");
+ charMap.put("iuml", "\u00EF");
+
+ charMap.put("eth", "\u00F0");
+ charMap.put("ntilde", "\u00F1");
+ charMap.put("ograve", "\u00F2");
+ charMap.put("oacute", "\u00F3");
+ charMap.put("ocirc", "\u00F4");
+ charMap.put("otilde", "\u00F5");
+ charMap.put("ouml", "\u00F6");
+ charMap.put("divid", "\u00F7");
+ charMap.put("oslash", "\u00F8");
+ charMap.put("ugrave", "\u00F9");
+ charMap.put("uacute", "\u00FA");
+ charMap.put("ucirc", "\u00FB");
+ charMap.put("uuml", "\u00FC");
+ charMap.put("yacute", "\u00FD");
+ charMap.put("thorn", "\u00FE");
+ charMap.put("yuml", "\u00FF");
+ charMap.put("euro", "\u0080");
+ }
}
Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/ReplaceContent.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/ReplaceContent.java?view=diff&rev=442614&r1=442613&r2=442614
==============================================================================
--- james/server/trunk/src/java/org/apache/james/transport/mailets/ReplaceContent.java (original)
+++ james/server/trunk/src/java/org/apache/james/transport/mailets/ReplaceContent.java Tue Sep 12 08:11:02 2006
@@ -57,263 +57,263 @@
* be escaped.
*/
public class ReplaceContent extends GenericMailet {
- private static final String PARAMETER_NAME_SUBJECT_PATTERN = "subjectPattern";
- private static final String PARAMETER_NAME_BODY_PATTERN = "bodyPattern";
- private static final String PARAMETER_NAME_SUBJECT_PATTERNFILE = "subjectPatternFile";
- private static final String PARAMETER_NAME_BODY_PATTERNFILE = "bodyPatternFile";
- private static final String PARAMETER_NAME_CHARSET = "charset";
-
- public static final int FLAG_REPEAT = 1;
-
- private Pattern[] subjectPatterns;
- private String[] subjectSubstitutions;
- private Integer[] subjectFlags;
- private Pattern[] bodyPatterns;
- private String[] bodySubstitutions;
- private Integer[] bodyFlags;
- private String charset;
- private int debug = 0;
-
- /**
- * returns a String describing this mailet.
- *
- * @return A desciption of this mailet
- */
- public String getMailetInfo() {
- return "ReplaceContent";
- }
+ private static final String PARAMETER_NAME_SUBJECT_PATTERN = "subjectPattern";
+ private static final String PARAMETER_NAME_BODY_PATTERN = "bodyPattern";
+ private static final String PARAMETER_NAME_SUBJECT_PATTERNFILE = "subjectPatternFile";
+ private static final String PARAMETER_NAME_BODY_PATTERNFILE = "bodyPatternFile";
+ private static final String PARAMETER_NAME_CHARSET = "charset";
+
+ public static final int FLAG_REPEAT = 1;
+
+ private Pattern[] subjectPatterns;
+ private String[] subjectSubstitutions;
+ private Integer[] subjectFlags;
+ private Pattern[] bodyPatterns;
+ private String[] bodySubstitutions;
+ private Integer[] bodyFlags;
+ private String charset;
+ private int debug = 0;
+
+ /**
+ * returns a String describing this mailet.
+ *
+ * @return A desciption of this mailet
+ */
+ public String getMailetInfo() {
+ return "ReplaceContent";
+ }
- /**
- * @return an array containing Pattern and Substitution of the input stream
- * @throws MailetException
- */
- protected static Object[] getPattern(String line) throws MailetException {
- String[] pieces = StringUtils.split(line, "/");
- if (pieces.length < 3) throw new MailetException("Invalid expression: " + line);
- int options = 0;
- //if (pieces[2].indexOf('x') >= 0) options += Pattern.EXTENDED;
- if (pieces[2].indexOf('i') >= 0) options += Pattern.CASE_INSENSITIVE;
- if (pieces[2].indexOf('m') >= 0) options += Pattern.MULTILINE;
- if (pieces[2].indexOf('s') >= 0) options += Pattern.DOTALL;
-
- int flags = 0;
- if (pieces[2].indexOf('r') >= 0) flags += FLAG_REPEAT;
-
- if (pieces[1].indexOf("\\r") >= 0) pieces[1] = pieces[1].replaceAll("\\\\r", "\r");
- if (pieces[1].indexOf("\\n") >= 0) pieces[1] = pieces[1].replaceAll("\\\\n", "\n");
- if (pieces[1].indexOf("\\t") >= 0) pieces[1] = pieces[1].replaceAll("\\\\t", "\t");
-
- return new Object[] {Pattern.compile(pieces[0], options), pieces[1] , new Integer(flags)};
- }
-
- protected static List[] getPatternsFromString(String pattern) throws MailetException {
- pattern = pattern.trim();
- if (pattern.length() < 2 && !pattern.startsWith("/") && !pattern.endsWith("/")) throw new MailetException("Invalid parameter value: " + PARAMETER_NAME_SUBJECT_PATTERN);
- pattern = pattern.substring(1, pattern.length() - 1);
- String[] patternArray = StringUtils.split(pattern, "/,/");
-
- List patterns = new ArrayList();
- List substitutions = new ArrayList();
- List flags = new ArrayList();
- for (int i = 0; i < patternArray.length; i++) {
- Object[] o = getPattern(patternArray[i]);
- patterns.add(o[0]);
- substitutions.add(o[1]);
- flags.add(o[2]);
- }
-
- return new List[] {patterns, substitutions, flags};
- }
+ /**
+ * @return an array containing Pattern and Substitution of the input stream
+ * @throws MailetException
+ */
+ protected static Object[] getPattern(String line) throws MailetException {
+ String[] pieces = StringUtils.split(line, "/");
+ if (pieces.length < 3) throw new MailetException("Invalid expression: " + line);
+ int options = 0;
+ //if (pieces[2].indexOf('x') >= 0) options += Pattern.EXTENDED;
+ if (pieces[2].indexOf('i') >= 0) options += Pattern.CASE_INSENSITIVE;
+ if (pieces[2].indexOf('m') >= 0) options += Pattern.MULTILINE;
+ if (pieces[2].indexOf('s') >= 0) options += Pattern.DOTALL;
+
+ int flags = 0;
+ if (pieces[2].indexOf('r') >= 0) flags += FLAG_REPEAT;
+
+ if (pieces[1].indexOf("\\r") >= 0) pieces[1] = pieces[1].replaceAll("\\\\r", "\r");
+ if (pieces[1].indexOf("\\n") >= 0) pieces[1] = pieces[1].replaceAll("\\\\n", "\n");
+ if (pieces[1].indexOf("\\t") >= 0) pieces[1] = pieces[1].replaceAll("\\\\t", "\t");
+
+ return new Object[] {Pattern.compile(pieces[0], options), pieces[1] , new Integer(flags)};
+ }
+
+ protected static List[] getPatternsFromString(String pattern) throws MailetException {
+ pattern = pattern.trim();
+ if (pattern.length() < 2 && !pattern.startsWith("/") && !pattern.endsWith("/")) throw new MailetException("Invalid parameter value: " + PARAMETER_NAME_SUBJECT_PATTERN);
+ pattern = pattern.substring(1, pattern.length() - 1);
+ String[] patternArray = StringUtils.split(pattern, "/,/");
+
+ List patterns = new ArrayList();
+ List substitutions = new ArrayList();
+ List flags = new ArrayList();
+ for (int i = 0; i < patternArray.length; i++) {
+ Object[] o = getPattern(patternArray[i]);
+ patterns.add(o[0]);
+ substitutions.add(o[1]);
+ flags.add(o[2]);
+ }
+
+ return new List[] {patterns, substitutions, flags};
+ }
- protected static List[] getPatternsFromStream(InputStream stream, String charset) throws MailetException, IOException {
- List patterns = new ArrayList();
- List substitutions = new ArrayList();
- List flags = new ArrayList();
- BufferedReader reader = new BufferedReader(charset != null ? new InputStreamReader(stream, charset) : new InputStreamReader(stream));
- //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("q:\\correzioniout"), "utf-8"));
-
- String line;
- while ((line = reader.readLine()) != null) {
- line = line.trim();
- if (line.length() > 0 && !line.startsWith("#")) {
- if (line.length() < 2 && !line.startsWith("/") && !line.endsWith("/")) throw new MailetException("Invalid expression: " + line);
- Object[] o = getPattern(line.substring(1, line.length() - 1));
- patterns.add(o[0]);
- substitutions.add(o[1]);
- flags.add(o[2]);
- }
- }
- reader.close();
- return new List[] {patterns, substitutions, flags};
- }
-
- /**
- * @param filepar File path list (or resources if the path starts with #) comma separated
- */
- private List[] getPatternsFromFileList(String filepar) throws MailetException, IOException {
- List patterns = new ArrayList();
- List substitutions = new ArrayList();
- List flags = new ArrayList();
- String[] files = filepar.split(",");
- for (int i = 0; i < files.length; i++) {
- files[i] = files[i].trim();
- if (debug > 0) log("Loading patterns from: " + files[i]);
- String charset = null;
- int pc = files[i].lastIndexOf('?');
- if (pc >= 0) {
- charset = files[i].substring(pc + 1);
- files[i] = files[i].substring(0, pc);
- }
- InputStream is = null;
- if (files[i].startsWith("#")) is = getClass().getResourceAsStream(files[i].substring(1));
- else {
- File f = new File(files[i]);
- if (f.isFile()) is = new FileInputStream(f);
- }
- if (is != null) {
- List[] o = getPatternsFromStream(is, charset);
- patterns.addAll(o[0]);
- substitutions.addAll(o[1]);
- flags.addAll(o[2]);
- is.close();
- }
- }
- return new List[] {patterns, substitutions, flags};
- }
-
- protected static String applyPatterns(Pattern[] patterns, String[] substitutions, Integer[] pflags, String text, int debug, GenericMailet logOwner) {
- for (int i = 0; i < patterns.length; i ++) {
- int flags = pflags[i].intValue();
- boolean changed = false;
- do {
- changed = false;
- String replaced = patterns[i].matcher(text).replaceAll(substitutions[i]);
- if (!replaced.equals(text)) {
- if (debug > 0) logOwner.log("Subject rule match: " + patterns[i].pattern());
- text = replaced;
- changed = true;
- }
- } while ((flags & FLAG_REPEAT) > 0 && changed);
- }
-
- return text;
- }
-
+ protected static List[] getPatternsFromStream(InputStream stream, String charset) throws MailetException, IOException {
+ List patterns = new ArrayList();
+ List substitutions = new ArrayList();
+ List flags = new ArrayList();
+ BufferedReader reader = new BufferedReader(charset != null ? new InputStreamReader(stream, charset) : new InputStreamReader(stream));
+ //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("q:\\correzioniout"), "utf-8"));
+
+ String line;
+ while ((line = reader.readLine()) != null) {
+ line = line.trim();
+ if (line.length() > 0 && !line.startsWith("#")) {
+ if (line.length() < 2 && !line.startsWith("/") && !line.endsWith("/")) throw new MailetException("Invalid expression: " + line);
+ Object[] o = getPattern(line.substring(1, line.length() - 1));
+ patterns.add(o[0]);
+ substitutions.add(o[1]);
+ flags.add(o[2]);
+ }
+ }
+ reader.close();
+ return new List[] {patterns, substitutions, flags};
+ }
+
+ /**
+ * @param filepar File path list (or resources if the path starts with #) comma separated
+ */
+ private List[] getPatternsFromFileList(String filepar) throws MailetException, IOException {
+ List patterns = new ArrayList();
+ List substitutions = new ArrayList();
+ List flags = new ArrayList();
+ String[] files = filepar.split(",");
+ for (int i = 0; i < files.length; i++) {
+ files[i] = files[i].trim();
+ if (debug > 0) log("Loading patterns from: " + files[i]);
+ String charset = null;
+ int pc = files[i].lastIndexOf('?');
+ if (pc >= 0) {
+ charset = files[i].substring(pc + 1);
+ files[i] = files[i].substring(0, pc);
+ }
+ InputStream is = null;
+ if (files[i].startsWith("#")) is = getClass().getResourceAsStream(files[i].substring(1));
+ else {
+ File f = new File(files[i]);
+ if (f.isFile()) is = new FileInputStream(f);
+ }
+ if (is != null) {
+ List[] o = getPatternsFromStream(is, charset);
+ patterns.addAll(o[0]);
+ substitutions.addAll(o[1]);
+ flags.addAll(o[2]);
+ is.close();
+ }
+ }
+ return new List[] {patterns, substitutions, flags};
+ }
+
+ protected static String applyPatterns(Pattern[] patterns, String[] substitutions, Integer[] pflags, String text, int debug, GenericMailet logOwner) {
+ for (int i = 0; i < patterns.length; i ++) {
+ int flags = pflags[i].intValue();
+ boolean changed = false;
+ do {
+ changed = false;
+ String replaced = patterns[i].matcher(text).replaceAll(substitutions[i]);
+ if (!replaced.equals(text)) {
+ if (debug > 0) logOwner.log("Subject rule match: " + patterns[i].pattern());
+ text = replaced;
+ changed = true;
+ }
+ } while ((flags & FLAG_REPEAT) > 0 && changed);
+ }
+
+ return text;
+ }
+
- public void init() throws MailetException {
- charset = getInitParameter(PARAMETER_NAME_CHARSET);
- debug = Integer.parseInt(getInitParameter("debug", "0"));
- }
-
- private void initPatterns() throws MailetException {
- try {
- List bodyPatternsList = new ArrayList();
- List bodySubstitutionsList = new ArrayList();
- List bodyFlagsList = new ArrayList();
- List subjectPatternsList = new ArrayList();
- List subjectSubstitutionsList = new ArrayList();
- List subjectFlagsList = new ArrayList();
+ public void init() throws MailetException {
+ charset = getInitParameter(PARAMETER_NAME_CHARSET);
+ debug = Integer.parseInt(getInitParameter("debug", "0"));
+ }
+
+ private void initPatterns() throws MailetException {
+ try {
+ List bodyPatternsList = new ArrayList();
+ List bodySubstitutionsList = new ArrayList();
+ List bodyFlagsList = new ArrayList();
+ List subjectPatternsList = new ArrayList();
+ List subjectSubstitutionsList = new ArrayList();
+ List subjectFlagsList = new ArrayList();
- String pattern = getInitParameter(PARAMETER_NAME_SUBJECT_PATTERN);
- if (pattern != null) {
- List[] o = getPatternsFromString(pattern);
- subjectPatternsList.addAll(o[0]);
- subjectSubstitutionsList.addAll(o[1]);
- subjectFlagsList.addAll(o[2]);
- }
-
- pattern = getInitParameter(PARAMETER_NAME_BODY_PATTERN);
- if (pattern != null) {
- List[] o = getPatternsFromString(pattern);
- bodyPatternsList.addAll(o[0]);
- bodySubstitutionsList.addAll(o[1]);
- bodyFlagsList.addAll(o[2]);
- }
-
- String filepar = getInitParameter(PARAMETER_NAME_SUBJECT_PATTERNFILE);
- if (filepar != null) {
- List[] o = getPatternsFromFileList(filepar);
- subjectPatternsList.addAll(o[0]);
- subjectSubstitutionsList.addAll(o[1]);
- subjectFlagsList.addAll(o[2]);
- }
-
- filepar = getInitParameter(PARAMETER_NAME_BODY_PATTERNFILE);
- if (filepar != null) {
- List[] o = getPatternsFromFileList(filepar);
- bodyPatternsList.addAll(o[0]);
- bodySubstitutionsList.addAll(o[1]);
- bodyFlagsList.addAll(o[2]);
- }
-
- subjectPatterns = (Pattern[]) subjectPatternsList.toArray(new Pattern[0]);
- subjectSubstitutions = (String[]) subjectSubstitutionsList.toArray(new String[0]);
- subjectFlags = (Integer[]) subjectFlagsList.toArray(new Integer[0]);
- bodyPatterns = (Pattern[]) bodyPatternsList.toArray(new Pattern[0]);
- bodySubstitutions = (String[]) bodySubstitutionsList.toArray(new String[0]);
- bodyFlags = (Integer[]) bodyFlagsList.toArray(new Integer[0]);
-
- } catch (FileNotFoundException e) {
- throw new MailetException("Failed initialization", e);
-
- } catch (MailetException e) {
- throw new MailetException("Failed initialization", e);
-
- } catch (IOException e) {
- throw new MailetException("Failed initialization", e);
-
- }
- }
+ String pattern = getInitParameter(PARAMETER_NAME_SUBJECT_PATTERN);
+ if (pattern != null) {
+ List[] o = getPatternsFromString(pattern);
+ subjectPatternsList.addAll(o[0]);
+ subjectSubstitutionsList.addAll(o[1]);
+ subjectFlagsList.addAll(o[2]);
+ }
+
+ pattern = getInitParameter(PARAMETER_NAME_BODY_PATTERN);
+ if (pattern != null) {
+ List[] o = getPatternsFromString(pattern);
+ bodyPatternsList.addAll(o[0]);
+ bodySubstitutionsList.addAll(o[1]);
+ bodyFlagsList.addAll(o[2]);
+ }
+
+ String filepar = getInitParameter(PARAMETER_NAME_SUBJECT_PATTERNFILE);
+ if (filepar != null) {
+ List[] o = getPatternsFromFileList(filepar);
+ subjectPatternsList.addAll(o[0]);
+ subjectSubstitutionsList.addAll(o[1]);
+ subjectFlagsList.addAll(o[2]);
+ }
+
+ filepar = getInitParameter(PARAMETER_NAME_BODY_PATTERNFILE);
+ if (filepar != null) {
+ List[] o = getPatternsFromFileList(filepar);
+ bodyPatternsList.addAll(o[0]);
+ bodySubstitutionsList.addAll(o[1]);
+ bodyFlagsList.addAll(o[2]);
+ }
+
+ subjectPatterns = (Pattern[]) subjectPatternsList.toArray(new Pattern[0]);
+ subjectSubstitutions = (String[]) subjectSubstitutionsList.toArray(new String[0]);
+ subjectFlags = (Integer[]) subjectFlagsList.toArray(new Integer[0]);
+ bodyPatterns = (Pattern[]) bodyPatternsList.toArray(new Pattern[0]);
+ bodySubstitutions = (String[]) bodySubstitutionsList.toArray(new String[0]);
+ bodyFlags = (Integer[]) bodyFlagsList.toArray(new Integer[0]);
+
+ } catch (FileNotFoundException e) {
+ throw new MailetException("Failed initialization", e);
+
+ } catch (MailetException e) {
+ throw new MailetException("Failed initialization", e);
+
+ } catch (IOException e) {
+ throw new MailetException("Failed initialization", e);
+
+ }
+ }
- public void service(Mail mail) throws MailetException {
- initPatterns();
-
- try {
- boolean mod = false;
- boolean contentChanged = false;
-
- if (subjectPatterns != null && subjectPatterns.length > 0) {
- String subject = mail.getMessage().getSubject();
- if (subject == null) subject = "";
- subject = applyPatterns(subjectPatterns, subjectSubstitutions, subjectFlags, subject, debug, this);
- if (charset != null) mail.getMessage().setSubject(subject, charset);
- else mail.getMessage().setSubject(subject);
- mod = true;
- }
-
- if (bodyPatterns != null && bodyPatterns.length > 0) {
- Object bodyObj = mail.getMessage().getContent();
- if (bodyObj == null) bodyObj = "";
- if (bodyObj instanceof String) {
- String body = (String) bodyObj;
- body = applyPatterns(bodyPatterns, bodySubstitutions, bodyFlags, body, debug, this);
- String contentType = mail.getMessage().getContentType();
- if (charset != null) {
- ContentType ct = new ContentType(contentType);
- ct.setParameter("charset", charset);
- contentType = ct.toString();
- }
- mail.getMessage().setContent(body, contentType);
- mod = true;
- contentChanged = true;
- }
- }
-
- if (charset != null && !contentChanged) {
- ContentType ct = new ContentType(mail.getMessage().getContentType());
- ct.setParameter("charset", charset);
- String contentType = mail.getMessage().getContentType();
- mail.getMessage().setContent(mail.getMessage().getContent(), contentType);
- }
-
- if (mod) mail.getMessage().saveChanges();
-
- } catch (MessagingException e) {
- throw new MailetException("Error in replace", e);
-
- } catch (IOException e) {
- throw new MailetException("Error in replace", e);
- }
- }
+ public void service(Mail mail) throws MailetException {
+ initPatterns();
+
+ try {
+ boolean mod = false;
+ boolean contentChanged = false;
+
+ if (subjectPatterns != null && subjectPatterns.length > 0) {
+ String subject = mail.getMessage().getSubject();
+ if (subject == null) subject = "";
+ subject = applyPatterns(subjectPatterns, subjectSubstitutions, subjectFlags, subject, debug, this);
+ if (charset != null) mail.getMessage().setSubject(subject, charset);
+ else mail.getMessage().setSubject(subject);
+ mod = true;
+ }
+
+ if (bodyPatterns != null && bodyPatterns.length > 0) {
+ Object bodyObj = mail.getMessage().getContent();
+ if (bodyObj == null) bodyObj = "";
+ if (bodyObj instanceof String) {
+ String body = (String) bodyObj;
+ body = applyPatterns(bodyPatterns, bodySubstitutions, bodyFlags, body, debug, this);
+ String contentType = mail.getMessage().getContentType();
+ if (charset != null) {
+ ContentType ct = new ContentType(contentType);
+ ct.setParameter("charset", charset);
+ contentType = ct.toString();
+ }
+ mail.getMessage().setContent(body, contentType);
+ mod = true;
+ contentChanged = true;
+ }
+ }
+
+ if (charset != null && !contentChanged) {
+ ContentType ct = new ContentType(mail.getMessage().getContentType());
+ ct.setParameter("charset", charset);
+ String contentType = mail.getMessage().getContentType();
+ mail.getMessage().setContent(mail.getMessage().getContent(), contentType);
+ }
+
+ if (mod) mail.getMessage().saveChanges();
+
+ } catch (MessagingException e) {
+ throw new MailetException("Error in replace", e);
+
+ } catch (IOException e) {
+ throw new MailetException("Error in replace", e);
+ }
+ }
}
Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/UnwrapText.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/UnwrapText.java?view=diff&rev=442614&r1=442613&r2=442614
==============================================================================
--- james/server/trunk/src/java/org/apache/james/transport/mailets/UnwrapText.java (original)
+++ james/server/trunk/src/java/org/apache/james/transport/mailets/UnwrapText.java Tue Sep 12 08:11:02 2006
@@ -31,117 +31,117 @@
* quotewidth = -10
*/
public class UnwrapText extends GenericMailet {
- public final static String PARAMETER_NAME_QUOTEWIDTH = "quotewidth";
-
- private int quotewidth;
-
- /**
- * returns a String describing this mailet.
- *
- * @return A desciption of this mailet
- */
- public String getMailetInfo() {
- return "UnwrapText";
- }
+ public final static String PARAMETER_NAME_QUOTEWIDTH = "quotewidth";
+
+ private int quotewidth;
+
+ /**
+ * returns a String describing this mailet.
+ *
+ * @return A desciption of this mailet
+ */
+ public String getMailetInfo() {
+ return "UnwrapText";
+ }
- public void init() throws MailetException {
- quotewidth = Integer.parseInt(getInitParameter(PARAMETER_NAME_QUOTEWIDTH, "-10"));
- }
+ public void init() throws MailetException {
+ quotewidth = Integer.parseInt(getInitParameter(PARAMETER_NAME_QUOTEWIDTH, "-10"));
+ }
- public void service(Mail mail) throws MailetException {
- try {
- // TODO replace non standard quotes (at least "> " with ">", otherwise the widely used "> > >" will not work.
-
- if (FlowedMessageUtils.isFlowedTextMessage(mail.getMessage()))
- FlowedMessageUtils.deflowMessage(mail.getMessage());
-
- else {
- Object o = mail.getMessage().getContent();
- if (o instanceof String) {
- String unwrapped = unwrap((String) o, quotewidth);
- mail.getMessage().setContent(unwrapped, mail.getMessage().getContentType());
- mail.getMessage().saveChanges();
- }
- }
-
- } catch (MessagingException e) {
- throw new MailetException("Could not unwrap message", e);
-
- } catch (IOException e) {
- throw new MailetException("Could not unwrap message", e);
- }
-
- }
-
- public static String unwrap(String text) {
- return unwrap(text, - 10);
- }
+ public void service(Mail mail) throws MailetException {
+ try {
+ // TODO replace non standard quotes (at least "> " with ">", otherwise the widely used "> > >" will not work.
+
+ if (FlowedMessageUtils.isFlowedTextMessage(mail.getMessage()))
+ FlowedMessageUtils.deflowMessage(mail.getMessage());
+
+ else {
+ Object o = mail.getMessage().getContent();
+ if (o instanceof String) {
+ String unwrapped = unwrap((String) o, quotewidth);
+ mail.getMessage().setContent(unwrapped, mail.getMessage().getContentType());
+ mail.getMessage().saveChanges();
+ }
+ }
+
+ } catch (MessagingException e) {
+ throw new MailetException("Could not unwrap message", e);
+
+ } catch (IOException e) {
+ throw new MailetException("Could not unwrap message", e);
+ }
+
+ }
+
+ public static String unwrap(String text) {
+ return unwrap(text, - 10);
+ }
- public static String unwrap(String text, int qwidth) {
- String[] lines = text.split("\r\n|\n", -1);
-
- //P1: Manage spaces without trims
- Pattern p1 = Pattern.compile("([> ]*)(.*[^ .?!][ ]*)$", 0);
-
- //P2: Quotation char at the begin of a line and the first word starts with a lowercase char or a number. The word ends with a space, a tab or a lineend.
- Pattern p2 = Pattern.compile("^([> ]*)(([a-zèéàùìò][^ \t\r\n]*|[0-9][0-9,.]*)([ \t].*$|$))", 0);
-
- // Width computation
- int width = 0;
- for (int i = 0; i < lines.length - 1; i++) {
- String l = lines[i].trim();
- if (l.length() > width) width = l.length();
- }
-
- if (width < 40) return text;
- if (qwidth < 0) qwidth = width - qwidth;
-
- StringBuffer result = new StringBuffer();
- int prevWrapped = 0;
- for (int i = 0; i < lines.length; i++) {
- if (prevWrapped != 0) {
- if (prevWrapped > 0 ) {
- if (result.charAt(result.length() - 1) != ' ') result.append(" ");
- }
- else result.append("\r\n");
- }
- String l = lines[i];
- Matcher m1 = p1.matcher(l);
- Matcher m2 = i < lines.length - 1 ? p2.matcher(lines[i + 1]) : null;
- boolean b;
- int w;
- // if patterns match, the quote level are identical and if the line length added to the length of the following word is greater than width then it is a wrapped line.
- if (m1.matches() && i < lines.length - 1 && m2.matches() && (
- // The following line has the same quoting of the previous.
- ((b = m1.group(1).trim().equals(m2.group(1).trim())) && l.length() + m2.group(3).length() + 1 > width)
- ||
- // The following line has no quoting (while the previous yes)
- (!b && m2.group(1).trim().equals("") && (w = l.length() + m2.group(2).trim().length() + 1) > width && w <= qwidth)
- )) {
-
- if (b) {
- if (prevWrapped > 0 && m1.groupCount() >= 2) result.append(m1.group(2));
- else result.append(l);
- prevWrapped = 1;
-
- } else {
- lines[i + 1] = l + (l.charAt(l.length() - 1) != ' ' ? " " : "") + m2.group(2).trim();
- // Revert the previous append
- if (prevWrapped != 0) {
- if (prevWrapped > 0) result.deleteCharAt(result.length() - 1);
- else result.delete(result.length() - 2, result.length());
- }
- }
-
- } else {
- Matcher m3 = p2.matcher(l);
- if (prevWrapped > 0 && m3.matches()) result.append(m3.group(2));
- else result.append(lines[i]);
- prevWrapped = -1;
- }
- }
-
- return result.toString();
- }
-
+ public static String unwrap(String text, int qwidth) {
+ String[] lines = text.split("\r\n|\n", -1);
+
+ //P1: Manage spaces without trims
+ Pattern p1 = Pattern.compile("([> ]*)(.*[^ .?!][ ]*)$", 0);
+
+ //P2: Quotation char at the begin of a line and the first word starts with a lowercase char or a number. The word ends with a space, a tab or a lineend.
+ Pattern p2 = Pattern.compile("^([> ]*)(([a-zèéàùìò][^ \t\r\n]*|[0-9][0-9,.]*)([ \t].*$|$))", 0);
+
+ // Width computation
+ int width = 0;
+ for (int i = 0; i < lines.length - 1; i++) {
+ String l = lines[i].trim();
+ if (l.length() > width) width = l.length();
+ }
+
+ if (width < 40) return text;
+ if (qwidth < 0) qwidth = width - qwidth;
+
+ StringBuffer result = new StringBuffer();
+ int prevWrapped = 0;
+ for (int i = 0; i < lines.length; i++) {
+ if (prevWrapped != 0) {
+ if (prevWrapped > 0 ) {
+ if (result.charAt(result.length() - 1) != ' ') result.append(" ");
+ }
+ else result.append("\r\n");
+ }
+ String l = lines[i];
+ Matcher m1 = p1.matcher(l);
+ Matcher m2 = i < lines.length - 1 ? p2.matcher(lines[i + 1]) : null;
+ boolean b;
+ int w;
+ // if patterns match, the quote level are identical and if the line length added to the length of the following word is greater than width then it is a wrapped line.
+ if (m1.matches() && i < lines.length - 1 && m2.matches() && (
+ // The following line has the same quoting of the previous.
+ ((b = m1.group(1).trim().equals(m2.group(1).trim())) && l.length() + m2.group(3).length() + 1 > width)
+ ||
+ // The following line has no quoting (while the previous yes)
+ (!b && m2.group(1).trim().equals("") && (w = l.length() + m2.group(2).trim().length() + 1) > width && w <= qwidth)
+ )) {
+
+ if (b) {
+ if (prevWrapped > 0 && m1.groupCount() >= 2) result.append(m1.group(2));
+ else result.append(l);
+ prevWrapped = 1;
+
+ } else {
+ lines[i + 1] = l + (l.charAt(l.length() - 1) != ' ' ? " " : "") + m2.group(2).trim();
+ // Revert the previous append
+ if (prevWrapped != 0) {
+ if (prevWrapped > 0) result.deleteCharAt(result.length() - 1);
+ else result.delete(result.length() - 2, result.length());
+ }
+ }
+
+ } else {
+ Matcher m3 = p2.matcher(l);
+ if (prevWrapped > 0 && m3.matches()) result.append(m3.group(2));
+ else result.append(lines[i]);
+ prevWrapped = -1;
+ }
+ }
+
+ return result.toString();
+ }
+
}
Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/WrapText.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/WrapText.java?view=diff&rev=442614&r1=442613&r2=442614
==============================================================================
--- james/server/trunk/src/java/org/apache/james/transport/mailets/WrapText.java (original)
+++ james/server/trunk/src/java/org/apache/james/transport/mailets/WrapText.java Tue Sep 12 08:11:02 2006
@@ -13,44 +13,44 @@
* Convert a message to format=flowed
*/
public class WrapText extends GenericMailet {
- private static final String PARAMETER_NAME_FLOWED_DELSP = "delsp";
- private static final String PARAMETER_NAME_WIDTH = "width";
-
- private boolean optionFlowedDelsp = false;
- private int optionWidth = FlowedMessageUtils.RFC2646_WIDTH;
-
- /**
- * returns a String describing this mailet.
- *
- * @return A desciption of this mailet
- */
- public String getMailetInfo() {
- return "WrapText";
- }
+ private static final String PARAMETER_NAME_FLOWED_DELSP = "delsp";
+ private static final String PARAMETER_NAME_WIDTH = "width";
+
+ private boolean optionFlowedDelsp = false;
+ private int optionWidth = FlowedMessageUtils.RFC2646_WIDTH;
+
+ /**
+ * returns a String describing this mailet.
+ *
+ * @return A desciption of this mailet
+ */
+ public String getMailetInfo() {
+ return "WrapText";
+ }
- private static boolean getBooleanParameter(String v, boolean def) {
- return def ?
- !(v != null && (v.equalsIgnoreCase("false") || v.equalsIgnoreCase("no"))) :
- v != null && (v.equalsIgnoreCase("true") || v.equalsIgnoreCase("yes")) ;
- }
-
- public void init() throws MailetException {
- optionFlowedDelsp = getBooleanParameter(getInitParameter(PARAMETER_NAME_FLOWED_DELSP), optionFlowedDelsp);
- optionWidth = Integer.parseInt(getInitParameter(PARAMETER_NAME_WIDTH, "" + optionWidth));
- }
+ private static boolean getBooleanParameter(String v, boolean def) {
+ return def ?
+ !(v != null && (v.equalsIgnoreCase("false") || v.equalsIgnoreCase("no"))) :
+ v != null && (v.equalsIgnoreCase("true") || v.equalsIgnoreCase("yes")) ;
+ }
+
+ public void init() throws MailetException {
+ optionFlowedDelsp = getBooleanParameter(getInitParameter(PARAMETER_NAME_FLOWED_DELSP), optionFlowedDelsp);
+ optionWidth = Integer.parseInt(getInitParameter(PARAMETER_NAME_WIDTH, "" + optionWidth));
+ }
- public void service(Mail mail) throws MailetException {
- // TODO We could even manage the flow when the message is quoted-printable
-
- try {
- FlowedMessageUtils.flowMessage(mail.getMessage(), optionFlowedDelsp, optionWidth);
-
- } catch (MessagingException e) {
- throw new MailetException("Could not wrap message", e);
-
- } catch (IOException e) {
- throw new MailetException("Could not wrap message", e);
- }
-
- }
+ public void service(Mail mail) throws MailetException {
+ // TODO We could even manage the flow when the message is quoted-printable
+
+ try {
+ FlowedMessageUtils.flowMessage(mail.getMessage(), optionFlowedDelsp, optionWidth);
+
+ } catch (MessagingException e) {
+ throw new MailetException("Could not wrap message", e);
+
+ } catch (IOException e) {
+ throw new MailetException("Could not wrap message", e);
+ }
+
+ }
}
Modified: james/server/trunk/src/java/org/apache/james/util/mailet/FlowedMessageUtils.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/util/mailet/FlowedMessageUtils.java?view=diff&rev=442614&r1=442613&r2=442614
==============================================================================
--- james/server/trunk/src/java/org/apache/james/util/mailet/FlowedMessageUtils.java (original)
+++ james/server/trunk/src/java/org/apache/james/util/mailet/FlowedMessageUtils.java Tue Sep 12 08:11:02 2006
@@ -25,257 +25,257 @@
* the original (lines with hard breaks will be trimmed)
*/
public final class FlowedMessageUtils {
- public static final char RFC2646_SPACE = ' ';
- public static final char RFC2646_QUOTE = '>';
- public static final String RFC2646_SIGNATURE = "-- ";
- public static final String RFC2646_CRLF = "\r\n";
- public static final String RFC2646_FROM = "From ";
- public static final int RFC2646_WIDTH = 78;
-
+ public static final char RFC2646_SPACE = ' ';
+ public static final char RFC2646_QUOTE = '>';
+ public static final String RFC2646_SIGNATURE = "-- ";
+ public static final String RFC2646_CRLF = "\r\n";
+ public static final String RFC2646_FROM = "From ";
+ public static final int RFC2646_WIDTH = 78;
+
private FlowedMessageUtils() {
// this class cannot be instantiated
}
- /**
- * Decodes a text previously wrapped using "format=flowed"
- */
- public static String deflow(String text, boolean delSp) {
- String[] lines = text.split("\r\n|\n", -1);
- StringBuffer result = null;
- StringBuffer resultLine = new StringBuffer();
- int resultLineQuoteDepth = 0;
- boolean resultLineFlowed = false;
- // One more cycle, to close the last line
- for (int i = 0; i <= lines.length; i++) {
- String line = i < lines.length ? lines[i] : null;
- int actualQuoteDepth = 0;
-
- if (line != null && line.length() > 0) {
- if (line.equals(RFC2646_SIGNATURE))
- // signature handling (the previous line is not flowed)
- resultLineFlowed = false;
-
- else if (line.charAt(0) == RFC2646_QUOTE) {
- // Quote
- actualQuoteDepth = 1;
- while (actualQuoteDepth < line.length() && line.charAt(actualQuoteDepth) == RFC2646_QUOTE) actualQuoteDepth ++;
- // if quote-depth changes wrt the previous line then this is not flowed
- if (resultLineQuoteDepth != actualQuoteDepth) resultLineFlowed = false;
- line = line.substring(actualQuoteDepth);
-
- } else {
- // id quote-depth changes wrt the first line then this is not flowed
- if (resultLineQuoteDepth > 0) resultLineFlowed = false;
- }
-
- if (line.length() > 0 && line.charAt(0) == RFC2646_SPACE)
- // Line space-stuffed
- line = line.substring(1);
-
- // if the previous was the last then it was not flowed
- } else if (line == null) resultLineFlowed = false;
+ /**
+ * Decodes a text previously wrapped using "format=flowed"
+ */
+ public static String deflow(String text, boolean delSp) {
+ String[] lines = text.split("\r\n|\n", -1);
+ StringBuffer result = null;
+ StringBuffer resultLine = new StringBuffer();
+ int resultLineQuoteDepth = 0;
+ boolean resultLineFlowed = false;
+ // One more cycle, to close the last line
+ for (int i = 0; i <= lines.length; i++) {
+ String line = i < lines.length ? lines[i] : null;
+ int actualQuoteDepth = 0;
+
+ if (line != null && line.length() > 0) {
+ if (line.equals(RFC2646_SIGNATURE))
+ // signature handling (the previous line is not flowed)
+ resultLineFlowed = false;
+
+ else if (line.charAt(0) == RFC2646_QUOTE) {
+ // Quote
+ actualQuoteDepth = 1;
+ while (actualQuoteDepth < line.length() && line.charAt(actualQuoteDepth) == RFC2646_QUOTE) actualQuoteDepth ++;
+ // if quote-depth changes wrt the previous line then this is not flowed
+ if (resultLineQuoteDepth != actualQuoteDepth) resultLineFlowed = false;
+ line = line.substring(actualQuoteDepth);
+
+ } else {
+ // id quote-depth changes wrt the first line then this is not flowed
+ if (resultLineQuoteDepth > 0) resultLineFlowed = false;
+ }
+
+ if (line.length() > 0 && line.charAt(0) == RFC2646_SPACE)
+ // Line space-stuffed
+ line = line.substring(1);
+
+ // if the previous was the last then it was not flowed
+ } else if (line == null) resultLineFlowed = false;
// Add the PREVIOUS line.
// This often will find the flow looking for a space as the last char of the line.
// With quote changes or signatures it could be the followinf line to void the flow.
- if (!resultLineFlowed && i > 0) {
- if (resultLineQuoteDepth > 0) resultLine.insert(0, RFC2646_SPACE);
- for (int j = 0; j < resultLineQuoteDepth; j++) resultLine.insert(0, RFC2646_QUOTE);
- if (result == null) result = new StringBuffer();
- else result.append(RFC2646_CRLF);
- result.append(resultLine.toString());
- resultLine = new StringBuffer();
- resultLineFlowed = false;
- }
- resultLineQuoteDepth = actualQuoteDepth;
-
- if (line != null) {
- if (!line.equals(RFC2646_SIGNATURE) && line.endsWith("" + RFC2646_SPACE) && i < lines.length - 1) {
- // Line flowed (NOTE: for the split operation the line having i == lines.length is the last that does not end with RFC2646_CRLF)
- if (delSp) line = line.substring(0, line.length() - 1);
- resultLineFlowed = true;
- }
-
- else resultLineFlowed = false;
-
- resultLine.append(line);
- }
- }
-
- return result.toString();
- }
-
- /**
- * Obtains the content of the encoded message, if previously encoded as format=flowed.
- */
- public static String deflow(Message m) throws IOException, MessagingException {
- ContentType ct = new ContentType(m.getContentType());
- String format = ct.getParameter("format");
- if (ct.getBaseType().equals("text/plain") && format != null && format.equalsIgnoreCase("flowed")) {
- String delSp = ct.getParameter("delsp");
- return deflow((String) m.getContent(), delSp != null && delSp.equalsIgnoreCase("yes"));
-
- } else if (ct.getPrimaryType().equals("text")) return (String) m.getContent();
-
- else return null;
- }
-
- /**
- * If the message is formad=flowed set the encoded version as message content
- */
- public static void deflowMessage(Message m) throws MessagingException, IOException {
- ContentType ct = new ContentType(m.getContentType());
- String format = ct.getParameter("format");
- if (ct.getBaseType().equals("text/plain") && format != null && format.equalsIgnoreCase("flowed")) {
- String delSp = ct.getParameter("delsp");
- String deflowed = deflow((String) m.getContent(), delSp != null && delSp.equalsIgnoreCase("yes"));
-
- ct.getParameterList().remove("format");
- ct.getParameterList().remove("delsp");
-
- if (ct.toString().indexOf("flowed") >= 0)
- System.out.println("\n\n*************************\n* ERROR!!! FlowedMessageUtils dind't remove the flowed correctly!\n******************\n\n" + ct.toString() + " \n " + ct.toString() + "\n");
-
- m.setContent(deflowed, ct.toString());
- m.saveChanges();
- }
- }
-
-
- /**
- * Encode a text (using standard with)
- */
- public static String flow(String text, boolean delSp) {
- return flow(text, delSp, RFC2646_WIDTH);
- }
+ if (!resultLineFlowed && i > 0) {
+ if (resultLineQuoteDepth > 0) resultLine.insert(0, RFC2646_SPACE);
+ for (int j = 0; j < resultLineQuoteDepth; j++) resultLine.insert(0, RFC2646_QUOTE);
+ if (result == null) result = new StringBuffer();
+ else result.append(RFC2646_CRLF);
+ result.append(resultLine.toString());
+ resultLine = new StringBuffer();
+ resultLineFlowed = false;
+ }
+ resultLineQuoteDepth = actualQuoteDepth;
+
+ if (line != null) {
+ if (!line.equals(RFC2646_SIGNATURE) && line.endsWith("" + RFC2646_SPACE) && i < lines.length - 1) {
+ // Line flowed (NOTE: for the split operation the line having i == lines.length is the last that does not end with RFC2646_CRLF)
+ if (delSp) line = line.substring(0, line.length() - 1);
+ resultLineFlowed = true;
+ }
+
+ else resultLineFlowed = false;
+
+ resultLine.append(line);
+ }
+ }
+
+ return result.toString();
+ }
+
+ /**
+ * Obtains the content of the encoded message, if previously encoded as format=flowed.
+ */
+ public static String deflow(Message m) throws IOException, MessagingException {
+ ContentType ct = new ContentType(m.getContentType());
+ String format = ct.getParameter("format");
+ if (ct.getBaseType().equals("text/plain") && format != null && format.equalsIgnoreCase("flowed")) {
+ String delSp = ct.getParameter("delsp");
+ return deflow((String) m.getContent(), delSp != null && delSp.equalsIgnoreCase("yes"));
+
+ } else if (ct.getPrimaryType().equals("text")) return (String) m.getContent();
+
+ else return null;
+ }
+
+ /**
+ * If the message is formad=flowed set the encoded version as message content
+ */
+ public static void deflowMessage(Message m) throws MessagingException, IOException {
+ ContentType ct = new ContentType(m.getContentType());
+ String format = ct.getParameter("format");
+ if (ct.getBaseType().equals("text/plain") && format != null && format.equalsIgnoreCase("flowed")) {
+ String delSp = ct.getParameter("delsp");
+ String deflowed = deflow((String) m.getContent(), delSp != null && delSp.equalsIgnoreCase("yes"));
+
+ ct.getParameterList().remove("format");
+ ct.getParameterList().remove("delsp");
+
+ if (ct.toString().indexOf("flowed") >= 0)
+ System.out.println("\n\n*************************\n* ERROR!!! FlowedMessageUtils dind't remove the flowed correctly!\n******************\n\n" + ct.toString() + " \n " + ct.toString() + "\n");
+
+ m.setContent(deflowed, ct.toString());
+ m.saveChanges();
+ }
+ }
+
+
+ /**
+ * Encode a text (using standard with)
+ */
+ public static String flow(String text, boolean delSp) {
+ return flow(text, delSp, RFC2646_WIDTH);
+ }
- /**
- * Decode a text
- */
- public static String flow(String text, boolean delSp, int width) {
- StringBuffer result = new StringBuffer();
- String[] lines = text.split("\r\n|\n", -1);
- for (int i = 0; i < lines.length; i ++) {
- String line = lines[i];
- boolean notempty = line.length() > 0;
-
- int quoteDepth = 0;
- while (quoteDepth < line.length() && line.charAt(quoteDepth) == RFC2646_QUOTE) quoteDepth ++;
- if (quoteDepth > 0) {
- if (quoteDepth + 1 < line.length() && line.charAt(quoteDepth) == RFC2646_SPACE) line = line.substring(quoteDepth + 1);
- else line = line.substring(quoteDepth);
- }
-
- while (notempty) {
- int extra = 0;
- if (quoteDepth == 0) {
- if (line.startsWith("" + RFC2646_SPACE) || line.startsWith("" + RFC2646_QUOTE) || line.startsWith(RFC2646_FROM)) {
- line = "" + RFC2646_SPACE + line;
- extra = 1;
- }
- } else {
- line = RFC2646_SPACE + line;
- for (int j = 0; j < quoteDepth; j++) line = "" + RFC2646_QUOTE + line;
- extra = quoteDepth + 1;
- }
-
- int j = width - 1;
- if (j >= line.length()) j = line.length() - 1;
- else {
- while (j >= extra && ((delSp && isAlphaChar(text, j)) || (!delSp && line.charAt(j) != RFC2646_SPACE))) j --;
- if (j < extra) {
- // Not able to cut a word: skip to word end even if greater than the max width
- j = width - 1;
- while (j < line.length() - 1 && ((delSp && isAlphaChar(text, j)) || (!delSp && line.charAt(j) != RFC2646_SPACE))) j ++;
- }
- }
-
- result.append(line.substring(0, j + 1));
- if (j < line.length() - 1) {
- if (delSp) result.append(RFC2646_SPACE);
- result.append(RFC2646_CRLF);
- }
-
- line = line.substring(j + 1);
- notempty = line.length() > 0;
- }
-
- if (i < lines.length - 1) {
- // NOTE: Have to trim the spaces before, otherwise it won't recognize soft-break from hard break.
- // Deflow of flowed message will not be identical to the original.
- while (result.length() > 0 && result.charAt(result.length() - 1) == RFC2646_SPACE) result.deleteCharAt(result.length() - 1);
- result.append(RFC2646_CRLF);
- }
- }
-
- return result.toString();
- }
-
- /**
- * Encode the input text and sets it as the new message content
- */
- public static void setFlowedContent(Message m, String text, boolean delSp) throws MessagingException {
- setFlowedContent(m, text, delSp, RFC2646_WIDTH, true, null);
- }
-
- /**
- * Encode the input text and sets it as the new message content
- */
- public static void setFlowedContent(Message m, String text, boolean delSp, int width, boolean preserveCharset, String charset) throws MessagingException {
- String coded = flow(text, delSp, width);
- if (preserveCharset) {
- ContentType ct = new ContentType(m.getContentType());
- charset = ct.getParameter("charset");
- }
- ContentType ct = new ContentType();
- ct.setPrimaryType("text");
- ct.setSubType("plain");
- if (charset != null) ct.setParameter("charset", charset);
- ct.setParameter("format", "flowed");
- if (delSp) ct.setParameter("delsp", "yes");
- m.setContent(coded, ct.toString());
- m.saveChanges();
- }
-
- /**
- * Encode the message content (if text/plain).
- */
- public static void flowMessage(Message m, boolean delSp) throws MessagingException, IOException {
- flowMessage(m, delSp, RFC2646_WIDTH);
- }
+ /**
+ * Decode a text
+ */
+ public static String flow(String text, boolean delSp, int width) {
+ StringBuffer result = new StringBuffer();
+ String[] lines = text.split("\r\n|\n", -1);
+ for (int i = 0; i < lines.length; i ++) {
+ String line = lines[i];
+ boolean notempty = line.length() > 0;
+
+ int quoteDepth = 0;
+ while (quoteDepth < line.length() && line.charAt(quoteDepth) == RFC2646_QUOTE) quoteDepth ++;
+ if (quoteDepth > 0) {
+ if (quoteDepth + 1 < line.length() && line.charAt(quoteDepth) == RFC2646_SPACE) line = line.substring(quoteDepth + 1);
+ else line = line.substring(quoteDepth);
+ }
+
+ while (notempty) {
+ int extra = 0;
+ if (quoteDepth == 0) {
+ if (line.startsWith("" + RFC2646_SPACE) || line.startsWith("" + RFC2646_QUOTE) || line.startsWith(RFC2646_FROM)) {
+ line = "" + RFC2646_SPACE + line;
+ extra = 1;
+ }
+ } else {
+ line = RFC2646_SPACE + line;
+ for (int j = 0; j < quoteDepth; j++) line = "" + RFC2646_QUOTE + line;
+ extra = quoteDepth + 1;
+ }
+
+ int j = width - 1;
+ if (j >= line.length()) j = line.length() - 1;
+ else {
+ while (j >= extra && ((delSp && isAlphaChar(text, j)) || (!delSp && line.charAt(j) != RFC2646_SPACE))) j --;
+ if (j < extra) {
+ // Not able to cut a word: skip to word end even if greater than the max width
+ j = width - 1;
+ while (j < line.length() - 1 && ((delSp && isAlphaChar(text, j)) || (!delSp && line.charAt(j) != RFC2646_SPACE))) j ++;
+ }
+ }
+
+ result.append(line.substring(0, j + 1));
+ if (j < line.length() - 1) {
+ if (delSp) result.append(RFC2646_SPACE);
+ result.append(RFC2646_CRLF);
+ }
+
+ line = line.substring(j + 1);
+ notempty = line.length() > 0;
+ }
+
+ if (i < lines.length - 1) {
+ // NOTE: Have to trim the spaces before, otherwise it won't recognize soft-break from hard break.
+ // Deflow of flowed message will not be identical to the original.
+ while (result.length() > 0 && result.charAt(result.length() - 1) == RFC2646_SPACE) result.deleteCharAt(result.length() - 1);
+ result.append(RFC2646_CRLF);
+ }
+ }
+
+ return result.toString();
+ }
+
+ /**
+ * Encode the input text and sets it as the new message content
+ */
+ public static void setFlowedContent(Message m, String text, boolean delSp) throws MessagingException {
+ setFlowedContent(m, text, delSp, RFC2646_WIDTH, true, null);
+ }
+
+ /**
+ * Encode the input text and sets it as the new message content
+ */
+ public static void setFlowedContent(Message m, String text, boolean delSp, int width, boolean preserveCharset, String charset) throws MessagingException {
+ String coded = flow(text, delSp, width);
+ if (preserveCharset) {
+ ContentType ct = new ContentType(m.getContentType());
+ charset = ct.getParameter("charset");
+ }
+ ContentType ct = new ContentType();
+ ct.setPrimaryType("text");
+ ct.setSubType("plain");
+ if (charset != null) ct.setParameter("charset", charset);
+ ct.setParameter("format", "flowed");
+ if (delSp) ct.setParameter("delsp", "yes");
+ m.setContent(coded, ct.toString());
+ m.saveChanges();
+ }
+
+ /**
+ * Encode the message content (if text/plain).
+ */
+ public static void flowMessage(Message m, boolean delSp) throws MessagingException, IOException {
+ flowMessage(m, delSp, RFC2646_WIDTH);
+ }
- /**
- * Encode the message content (if text/plain).
- */
- public static void flowMessage(Message m, boolean delSp, int width) throws MessagingException, IOException {
- ContentType ct = new ContentType(m.getContentType());
- if (!ct.getBaseType().equals("text/plain")) return;
- String format = ct.getParameter("format");
- String text = format != null && format.equals("flowed") ? deflow(m) : (String) m.getContent();
- String coded = flow(text, delSp, width);
- ct.setParameter("format", "flowed");
- if (delSp) ct.setParameter("delsp", "yes");
- m.setContent(coded, ct.toString());
- m.saveChanges();
- }
-
- /**
- * Check wether the char is part of a word
- * <p>RFC assert a word cannot be splitted (even if the length is greater than the maximum length)
- */
- public static boolean isAlphaChar(String text, int index) {
- // Note: a list of chars is available here:
- // http://www.zvon.org/tmRFC/RFC2646/Output/index.html
- char c = text.charAt(index);
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9');
- }
+ /**
+ * Encode the message content (if text/plain).
+ */
+ public static void flowMessage(Message m, boolean delSp, int width) throws MessagingException, IOException {
+ ContentType ct = new ContentType(m.getContentType());
+ if (!ct.getBaseType().equals("text/plain")) return;
+ String format = ct.getParameter("format");
+ String text = format != null && format.equals("flowed") ? deflow(m) : (String) m.getContent();
+ String coded = flow(text, delSp, width);
+ ct.setParameter("format", "flowed");
+ if (delSp) ct.setParameter("delsp", "yes");
+ m.setContent(coded, ct.toString());
+ m.saveChanges();
+ }
+
+ /**
+ * Check wether the char is part of a word
+ * <p>RFC assert a word cannot be splitted (even if the length is greater than the maximum length)
+ */
+ public static boolean isAlphaChar(String text, int index) {
+ // Note: a list of chars is available here:
+ // http://www.zvon.org/tmRFC/RFC2646/Output/index.html
+ char c = text.charAt(index);
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9');
+ }
- /**
- * Check wether the input message is formad=flowed
- */
- public static boolean isFlowedTextMessage(Message m) throws MessagingException {
- ContentType ct = new ContentType(m.getContentType());
- String format = ct.getParameter("format");
- return ct.getBaseType().equals("text/plain") && format != null && format.equalsIgnoreCase("flowed");
- }
+ /**
+ * Check wether the input message is formad=flowed
+ */
+ public static boolean isFlowedTextMessage(Message m) throws MessagingException {
+ ContentType ct = new ContentType(m.getContentType());
+ String format = ct.getParameter("format");
+ return ct.getBaseType().equals("text/plain") && format != null && format.equalsIgnoreCase("flowed");
+ }
}
Modified: james/server/trunk/src/java/org/apache/james/util/mailet/StringUtils.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/util/mailet/StringUtils.java?view=diff&rev=442614&r1=442613&r2=442614
==============================================================================
--- james/server/trunk/src/java/org/apache/james/util/mailet/StringUtils.java (original)
+++ james/server/trunk/src/java/org/apache/james/util/mailet/StringUtils.java Tue Sep 12 08:11:02 2006
@@ -10,66 +10,66 @@
// make this class non instantiable
}
- /**
- * Split a string given a pattern (regex), considering escapes
- * <p> E.g: considering a pattern "," we have:
- * one,two,three => {one},{two},{three}
- * one\,two\\,three => {one,two\\},{three}
- *
- * NOTE: Untested with pattern regex as pattern and untested for escape chars in text or pattern.
- */
- public static String[] split(String text, String pattern) {
- String[] array = text.split(pattern, -1);
- ArrayList list = new ArrayList();
- for (int i = 0; i < array.length; i++) {
- boolean escaped = false;
- if (i > 0 && array[i - 1].endsWith("\\")) {
- // When the number of trailing "\" is odd then there was no separator and this pattern is part of
- // the previous match.
- int depth = 1;
- while (depth < array[i-1].length() && array[i-1].charAt(array[i-1].length() - 1 - depth) == '\\') depth ++;
- escaped = depth % 2 == 1;
- }
- if (!escaped) list.add(array[i]);
- else {
- String prev = (String) list.remove(list.size() - 1);
- list.add(prev.substring(0, prev.length() - 1) + pattern + array[i]);
- }
- }
- return (String[]) list.toArray(new String[0]);
- }
+ /**
+ * Split a string given a pattern (regex), considering escapes
+ * <p> E.g: considering a pattern "," we have:
+ * one,two,three => {one},{two},{three}
+ * one\,two\\,three => {one,two\\},{three}
+ *
+ * NOTE: Untested with pattern regex as pattern and untested for escape chars in text or pattern.
+ */
+ public static String[] split(String text, String pattern) {
+ String[] array = text.split(pattern, -1);
+ ArrayList list = new ArrayList();
+ for (int i = 0; i < array.length; i++) {
+ boolean escaped = false;
+ if (i > 0 && array[i - 1].endsWith("\\")) {
+ // When the number of trailing "\" is odd then there was no separator and this pattern is part of
+ // the previous match.
+ int depth = 1;
+ while (depth < array[i-1].length() && array[i-1].charAt(array[i-1].length() - 1 - depth) == '\\') depth ++;
+ escaped = depth % 2 == 1;
+ }
+ if (!escaped) list.add(array[i]);
+ else {
+ String prev = (String) list.remove(list.size() - 1);
+ list.add(prev.substring(0, prev.length() - 1) + pattern + array[i]);
+ }
+ }
+ return (String[]) list.toArray(new String[0]);
+ }
- public static String md5(java.lang.String message) {
- try {
- MessageDigest md = MessageDigest.getInstance("MD5");
- StringBuffer sb = new StringBuffer();
- byte buf[] = message.getBytes();
- byte[] md5 = md.digest(buf);
- //System.out.println(message);
- for (int i = 0; i < md5.length; i++) {
- String tmpStr = "0" + Integer.toHexString((0xff & md5[i]));
- sb.append(tmpStr.substring(tmpStr.length() - 2));
- }
- return sb.toString();
-
- } catch (NoSuchAlgorithmException e) {
- return null;
- }
- }
+ public static String md5(java.lang.String message) {
+ try {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ StringBuffer sb = new StringBuffer();
+ byte buf[] = message.getBytes();
+ byte[] md5 = md.digest(buf);
+ //System.out.println(message);
+ for (int i = 0; i < md5.length; i++) {
+ String tmpStr = "0" + Integer.toHexString((0xff & md5[i]));
+ sb.append(tmpStr.substring(tmpStr.length() - 2));
+ }
+ return sb.toString();
+
+ } catch (NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
- public static String capitalizeWords(String data) {
- if (data==null) return null;
- StringBuffer res = new StringBuffer();
- char ch;
- char prevCh = '.';
- for ( int i = 0; i < data.length(); i++ ) {
- ch = data.charAt(i);
- if ( Character.isLetter(ch)) {
- if (!Character.isLetter(prevCh) ) res.append( Character.toUpperCase(ch) );
- else res.append( Character.toLowerCase(ch) );
- } else res.append( ch );
- prevCh = ch;
- }
- return res.toString();
- }
+ public static String capitalizeWords(String data) {
+ if (data==null) return null;
+ StringBuffer res = new StringBuffer();
+ char ch;
+ char prevCh = '.';
+ for ( int i = 0; i < data.length(); i++ ) {
+ ch = data.charAt(i);
+ if ( Character.isLetter(ch)) {
+ if (!Character.isLetter(prevCh) ) res.append( Character.toUpperCase(ch) );
+ else res.append( Character.toLowerCase(ch) );
+ } else res.append( ch );
+ prevCh = ch;
+ }
+ return res.toString();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
Re: svn commit: r442614 - in /james/server/trunk/src/java/org/apache/james:
transport/mailets/ util/mailet/
Posted by Stefano Bagnara <ap...@bago.org>.
Thank you!
I think my eclipse is configured the right way, but maybe it doesn't
reformat imported code.
Stefano
vincenzo@apache.org wrote:
> Author: vincenzo
> Date: Tue Sep 12 08:11:02 2006
> New Revision: 442614
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=442614
> Log:
> Fixing tabs to spaces.
>
> Modified:
> james/server/trunk/src/java/org/apache/james/transport/mailets/OnlyText.java
> james/server/trunk/src/java/org/apache/james/transport/mailets/ReplaceContent.java
> james/server/trunk/src/java/org/apache/james/transport/mailets/UnwrapText.java
> james/server/trunk/src/java/org/apache/james/transport/mailets/WrapText.java
> james/server/trunk/src/java/org/apache/james/util/mailet/FlowedMessageUtils.java
> james/server/trunk/src/java/org/apache/james/util/mailet/StringUtils.java
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org