01: /***
02: * jwma Java WebMail
03: * Copyright (c) 2000-2003 jwma team
04: *
05: * jwma is free software; you can distribute and use this source
06: * under the terms of the BSD-style license received along with
07: * the distribution.
08: ***/package dtw.webmail.util;
09:
10: import java.io.*;
11:
12: import org.apache.oro.text.regex.*;
13: import org.apache.log4j.Logger;
14:
15: import net.wimpi.text.*;
16: import net.wimpi.text.std.*;
17:
18: public class PlainTextUrl extends AbstractProcessor {
19:
20: //logging
21: private static Logger log = Logger.getLogger(PlainTextUrl.class);
22:
23: private Pattern m_MatchPattern = null;
24: private ResourcePool m_ResourcePool = null;
25:
26: public PlainTextUrl() {
27: try {
28: //prepare pattern
29: m_MatchPattern = new Perl5Compiler().compile(URL_PATTERN);
30:
31: //get resourcepool
32: m_ResourcePool = ProcessingKernel.getReference()
33: .getResourcePool("patternmatchers");
34: } catch (Exception ex) {
35: throw new RuntimeException("Failed to construct processor.");
36: }
37: }//constructor
38:
39: public String getName() {
40: return "plaintexturl";
41: }//getName
42:
43: public String process(String str) {
44:
45: StringBuffer strbuf = new StringBuffer(str);
46: //parse for urls and make them clickable
47: int relinsertend = 0;
48: int relinsertbegin = 0;
49: int corr = 0;
50: ProcessingResource resource = m_ResourcePool.leaseResource();
51: PatternMatcher matcher = ((PatternMatchingResource) resource)
52: .getPatternMatcher();
53: try {
54: PatternMatcherInput input = new PatternMatcherInput(str);
55:
56: // Loop until there are no more matches left.
57: while (matcher.contains(input, m_MatchPattern)) {
58: // Since we're still in the loop,
59: //fetch match that was found.
60: MatchResult result = matcher.getMatch();
61: //extracted url
62: String url = result.toString();
63: //now we got to work on the buffer
64: relinsertend = (result.endOffset(0)) + corr;
65: relinsertbegin = (result.beginOffset(0)) + corr;
66: corr = corr + 4 + 25 + url.length();
67: strbuf.insert(relinsertend, "</a>");
68: strbuf.insert(relinsertbegin, "<a href='" + url
69: + "' target='_top'>");
70: }
71: } finally {
72: m_ResourcePool.releaseResource(resource);
73: }
74: return strbuf.toString();
75: }//process
76:
77: public InputStream process(InputStream in) throws IOException {
78:
79: ByteArrayOutputStream bout = new ByteArrayOutputStream(in
80: .available());
81:
82: byte[] buffer = new byte[8192];
83: int amount = 0;
84: while ((amount = in.read(buffer)) >= 0) {
85: bout.write(buffer, 0, amount);
86: }
87: return new ByteArrayInputStream(process(bout.toString())
88: .getBytes());
89: }//process
90:
91: private static final String URL_PATTERN = "(\\S)+://(\\S)+";
92:
93: }//class PlainTextUrl
|