KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > util > transformers > GoogleHighlighterFactory


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.util.transformers;
11
12 import java.util.*;
13 import java.util.regex.Pattern JavaDoc;
14 import java.net.URL JavaDoc;
15
16 import org.mmbase.util.Entry;
17
18 import org.mmbase.util.functions.*;
19 import org.mmbase.util.logging.*;
20
21 /**
22  * An example for parameterized transformers. The Google highlighter transformers have a REQUEST
23  * parameter, which are used to explore the 'Referer' HTTP header and highlight the google search
24  * words.
25  * This can be used in taglib e.g. by <mm:content postprocessor="google" expires="0" />
26  *
27  * Because you need expires=0, you need be reluctant to use this, because this means that your page
28  * cannot be cached in front-proxies. Perhaps it is better to find some client-side solution.
29  *
30  * It produces instances of extensions of {@link RegexpReplacer}
31  *
32  * @author Michiel Meeuwissen
33  * @since MMBase-1.8
34  */

35
36 public class GoogleHighlighterFactory implements ParameterizedTransformerFactory {
37     private static final Logger log = Logging.getLoggerInstance(GoogleHighlighterFactory.class);
38
39     private static final Parameter[] PARAM = new Parameter[] {
40         new Parameter("format", String JavaDoc.class, "<span class=\"google\">$1</span>"),
41         new Parameter("host", String JavaDoc.class, "google"),
42         Parameter.REQUEST,
43     };
44
45     public Transformer createTransformer(final Parameters parameters) {
46         parameters.checkRequiredParameters();
47         if (log.isDebugEnabled()) {
48             log.debug("Creating transformer, with " + parameters);
49         }
50         URL JavaDoc referrer;
51         String JavaDoc referer = ((javax.servlet.http.HttpServletRequest JavaDoc) parameters.get(Parameter.REQUEST)).getHeader("Referer");
52         if (referer == null) return CopyCharTransformer.INSTANCE;
53
54         try {
55             referrer = new URL JavaDoc(referer);
56         } catch (java.net.MalformedURLException JavaDoc mfue) {
57             log.warn(mfue.getMessage() + " for '" + referer + "'", mfue);
58             return CopyCharTransformer.INSTANCE;
59         }
60         log.debug("Using referrer " + referrer);
61         if (referrer.getHost().indexOf((String JavaDoc) parameters.get("host")) == -1) { // did not refer
62
// from google
63
log.debug("Wrong host, returning COPY");
64             return CopyCharTransformer.INSTANCE;
65         }
66         String JavaDoc queryString = referrer.getQuery();
67         if (queryString == null) {
68             // odd
69
log.debug("No query, returning COPY");
70             return CopyCharTransformer.INSTANCE;
71         }
72         String JavaDoc[] query = queryString.split("&");
73
74         String JavaDoc s = null;
75         for (int i = 0; i < query.length; i++) {
76             String JavaDoc q = query[i];
77             if (q.startsWith("q=")) {
78                 try {
79                     s = java.net.URLDecoder.decode(q.substring(2), "UTF-8");
80                 } catch (java.io.UnsupportedEncodingException JavaDoc uee) { // cannot happen
81
s = q.substring(2);
82                 }
83                 break;
84             }
85         }
86         if (s == null) {
87             // odd
88
log.debug("No search, returning COPY");
89             return CopyCharTransformer.INSTANCE;
90         }
91         final String JavaDoc search = s;
92         log.debug("Using search " + search);
93
94         RegexpReplacer trans = new RegexpReplacer() {
95                 private Collection patterns = new ArrayList();
96                 {
97                     Pattern JavaDoc p = Pattern.compile("(" + search.replace('+', '|') + ")");
98                     patterns.add(new Entry(p, parameters.get("format")));
99                 }
100                 public Collection getPatterns() {
101                     return patterns;
102                 }
103             };
104         if (log.isDebugEnabled()) {
105             log.debug("Using google transformer " + trans);
106         }
107         return trans;
108
109     }
110     public Parameters createParameters() {
111         return new Parameters(PARAM);
112     }
113
114 }
115
Popular Tags