Update of /var/cvs/src/org/mmbase/util/transformers
In directory james.mmbase.org:/tmp/cvs-serv1656

Modified Files:
        ChunkedTransformer.java LinkFinder.java RegexpReplacer.java 
        RegexpReplacerFactory.java ResourceBundleReplacerFactory.java 
Log Message:
Fixed MMB-1568 


See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/util/transformers
See also: http://www.mmbase.org/jira/browse/MMB-1568


Index: ChunkedTransformer.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/transformers/ChunkedTransformer.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- ChunkedTransformer.java     18 Mar 2008 16:13:41 -0000      1.14
+++ ChunkedTransformer.java     23 Jul 2008 22:21:04 -0000      1.15
@@ -26,7 +26,7 @@
  * @since MMBase-1.8
  */
 
-public abstract class ChunkedTransformer extends ConfigurableReaderTransformer 
implements CharTransformer {
+public abstract class ChunkedTransformer<P> extends 
ConfigurableReaderTransformer implements CharTransformer {
     private static final Logger log = 
Logging.getLoggerInstance(ChunkedTransformer.class);
 
     /**
@@ -54,29 +54,29 @@
      */
     public final static int ENTIRE    = 5;
 
+    // about 3 bits used now.
 
     /**
      * If this is added to the config-int, then only the first match of any 
one pattern should be used.
      */
-    public final static int REPLACE_FIRST = 100;
+    public final static int ONLY_USE_FIRST_MATCHING_PATTERN = 1 << 5;
+
     /**
      * If this is added to the config-int, then only the first match of all 
patterns should be used.
      */
-    public final static int REPLACE_FIRST_ALL = 200;
+    public final static int ONLY_REPLACE_FIRST_MATCH        = 1 << 6;
 
 
-    protected boolean replaceFirst    = false;
-    protected boolean replaceFirstAll = false;
+    protected boolean onlyFirstPattern    = false;
+    protected boolean onlyFirstMatch      = false;
 
     public void configure(int i) {
-        if (i >= REPLACE_FIRST_ALL) {
-            replaceFirstAll = true;
-            i -= REPLACE_FIRST_ALL;
-        }
-        if (i >= REPLACE_FIRST) {
-            replaceFirst = true;
-            i -= REPLACE_FIRST;
-        }
+        onlyFirstMatch = ((i & ONLY_REPLACE_FIRST_MATCH) > 0);
+        onlyFirstPattern = ((i & ONLY_USE_FIRST_MATCHING_PATTERN) > 0);
+        // set corresponding bits to 0, they will not be needed any more.
+        i &= ~ONLY_USE_FIRST_MATCHING_PATTERN;
+        i &= ~ONLY_REPLACE_FIRST_MATCH;
+
         super.configure(i);
     }
 
@@ -90,10 +90,7 @@
 
     protected class Status {
         int replaced = 0;
-        Set<Object> used = null;
-        {
-            if (replaceFirstAll) used = new HashSet<Object>();
-        }
+        final Set<P> used = onlyFirstMatch ? new HashSet<P>() : null;
     }
     protected Status newStatus() {
         return new Status();
@@ -156,7 +153,7 @@
      * Whether still to do replacing, given status.
      */
     protected boolean replace(Status status) {
-        return !replaceFirst || status.replaced == 0;
+        return ! onlyFirstMatch || status.replaced == 0;
     }
 
     public Writer transformXmlTextWords(Reader r, Writer w)  {
@@ -194,8 +191,6 @@
             // write last word
             if (replace(status)) {
                 if (translating) replaceWord(word, w, status);
-            } else {
-                w.write(word.toString());
             }
             if (log.isDebugEnabled()) {
                 log.debug("Finished  replacing. Replaced " + status.replaced + 
" words");
@@ -223,6 +218,7 @@
                 if (c == '<') {  // don't do it in existing tags and attributes
                     translating = false;
                     replace(xmltext.toString(), w, status);
+                    xmltext.setLength(0);
                     w.write(c);
                 } else if (c == '>') {
                     translating = true;
@@ -237,8 +233,6 @@
             // write last word
             if (replace(status)) {
                 if (translating) replace(xmltext.toString(), w, status);
-            } else {
-                w.write(xmltext.toString());
             }
             log.debug("Finished  replacing. Replaced " + status.replaced + " 
words");
         } catch (java.io.IOException e) {
@@ -305,14 +299,16 @@
         StringWriter sw = new StringWriter();
         Status status = newStatus();
         try {
-            while (true) {
-                int c = r.read();
-                if (c == -1) break;
-                sw.write(c);
+            BufferedReader br = new BufferedReader(r);
+            char[] buf = new char[200];
+            int n = br.read(buf, 0, buf.length);
+            while (n > 0) {
+                sw.write(buf, 0, n);
+                n = br.read(buf, 0, buf.length);
             }
             replace(sw.toString(), w, status);
         } catch (java.io.IOException e) {
-            log.error(e.toString());
+            log.error(e.getMessage(), e);
         }
 
         return w;


Index: LinkFinder.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/transformers/LinkFinder.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- LinkFinder.java     24 Feb 2007 21:57:50 -0000      1.10
+++ LinkFinder.java     23 Jul 2008 22:21:04 -0000      1.11
@@ -33,6 +33,7 @@
 
     public LinkFinder() {
         super(XMLTEXT_WORDS);
+        onlyFirstPattern = true;
     }
 
 


Index: RegexpReplacer.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/transformers/RegexpReplacer.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- RegexpReplacer.java 18 Mar 2008 16:31:20 -0000      1.21
+++ RegexpReplacer.java 23 Jul 2008 22:21:04 -0000      1.22
@@ -29,7 +29,7 @@
  * @since MMBase-1.8
  */
 
-public class RegexpReplacer extends ChunkedTransformer {
+public class RegexpReplacer extends ChunkedTransformer<Pattern> {
     private static final Logger log = 
Logging.getLoggerInstance(RegexpReplacer.class);
 
     /**
@@ -40,11 +40,11 @@
     /**
      * The regexps for the unextended RegexpReplacer
      */
-    protected static final Collection<Entry<Pattern,String>> regexps = new 
ArrayList<Entry<Pattern,String>>();
+    protected static final Collection<Entry<Pattern, String>> regexps = new 
ArrayList<Entry<Pattern, String>>();
 
     protected static abstract class PatternWatcher extends ResourceWatcher {
-        protected Collection<Entry<Pattern,String>> patterns;
-        PatternWatcher(Collection<Entry<Pattern,String>> p) {
+        protected Collection<Entry<Pattern, String>> patterns;
+        PatternWatcher(Collection<Entry<Pattern, String>> p) {
             patterns = p;
         }
     }
@@ -164,15 +164,44 @@
         }
     }
 
+    private class Chunk {
+        String string;
+        boolean replaced = false;
+        Chunk(String s) {
+            string = s;
+        }
+        Chunk(String s, boolean r) {
+            string = s; replaced = r;
+        }
+        public String toString() { return "'" + string + "'" + (replaced ? "." 
: ""); }
+
+    }
+
+    @Override
     protected boolean replace(String string, Writer w, Status status) throws 
IOException {
-        Iterator<Entry<Pattern,String>> i  = getPatterns().iterator();
 
-        boolean r = false;
-        while (i.hasNext()) {
-            Entry<Pattern,String> entry = i.next();
+        boolean r = false; // result value
+
+        List<Chunk> chunks = new LinkedList<Chunk>();
+        chunks.add(new Chunk(string));
+        System.out.println("STARTING " + onlyFirstPattern);
+
+        for (Map.Entry<Pattern, String> entry : getPatterns()) {
             Pattern p = entry.getKey();
-            if (replaceFirstAll && status.used.contains(p)) continue;
-            Matcher m = p.matcher(string);
+
+            System.out.println("now " + p + " on " + chunks + " " + 
status.used);
+
+            if (onlyFirstMatch && status.used.contains(p)) continue;
+
+
+            for (int i = 0; i < chunks.size(); i++) {
+                if (onlyFirstPattern && chunks.get(i).replaced) {
+                    System.out.println("skipping " + p + " on " + 
chunks.get(i).string);
+                    continue;
+                } else {
+                    System.out.println("now " + p + " on " + 
chunks.get(i).string);
+                }
+                Matcher m = p.matcher(chunks.get(i).string);
             String replacement = entry.getValue();
             boolean result = false;
             if (to == ChunkedTransformer.XMLTEXT_WORDS || to == 
ChunkedTransformer.WORDS) {
@@ -186,22 +215,42 @@
                 do {
                     status.replaced++;
                     m.appendReplacement(sb, replacement);
-                    if (replaceFirst || replaceFirstAll ||
+                        if (onlyFirstMatch || onlyFirstPattern ||
                         to == ChunkedTransformer.XMLTEXT_WORDS ||
                         to == ChunkedTransformer.WORDS) break;
                     result = m.find();
                 } while (result);
+
+                    if (onlyFirstPattern) {
+                        // make a new chunk.
+                        int s = m.start();
+                        if (s > 0) {
+                            chunks.add(i, new Chunk(sb.toString().substring(0, 
s)));
+                            sb.delete(0, s);
+                            i++;
+                        }
+                        chunks.set(i, new Chunk(sb.toString(), true));
+                        sb.setLength(0);
                 m.appendTail(sb);
-                if (replaceFirstAll) status.used.add(p);
-                string = sb.toString();
-                if (replaceFirst ||
+                        chunks.add(i + 1, new Chunk(sb.toString()));
+                        System.out.println("replaced c:" + chunks + " used 
pattern " + p + " ");
+                    } else {
+                        m.appendTail(sb);
+                        chunks.set(i, new Chunk(sb.toString()));
+                    }
+                    if (onlyFirstMatch ||
                     to == ChunkedTransformer.XMLTEXT_WORDS ||
-                    to == ChunkedTransformer.WORDS) break;
+                        to == ChunkedTransformer.WORDS) {
+                        // next pattern
+                        break;
             }
-
         }
-
-        w.write(string);
+            }
+        }
+        System.out.println("Ready " + chunks);
+        for (Chunk s : chunks) {
+            w.write(s.string);
+        }
         return r;
 
     }
@@ -213,6 +262,22 @@
         return getEncoding() + " " + getPatterns();
     }
 
+    public static void main(String[] arg) {
+        StringBuffer b = new StringBuffer();
+        Pattern p = Pattern.compile(arg[0]);
+        String input = arg[1];
+        Matcher m = p.matcher(input);
+        while (m.find()) {
+            b.append("'");
+            m.appendReplacement(b, m.group().toUpperCase());
+            b.append("'");
+            System.out.println("s: " + m.start() + " e: " + m.end() + "g: " + 
m.group());
+        }
+        b.append("X");
+        m.appendTail(b);
+        System.out.println("buf : " + b);
+    }
+
 
 
 }


Index: RegexpReplacerFactory.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/transformers/RegexpReplacerFactory.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- RegexpReplacerFactory.java  18 Mar 2008 15:10:53 -0000      1.15
+++ RegexpReplacerFactory.java  23 Jul 2008 22:21:04 -0000      1.16
@@ -23,6 +23,7 @@
  *
  * @author Michiel Meeuwissen
  * @since MMBase-1.8
+ * @version $Id: RegexpReplacerFactory.java,v 1.16 2008/07/23 22:21:04 michiel 
Exp $
  */
 
 public class RegexpReplacerFactory implements 
ParameterizedTransformerFactory<CharTransformer> {
@@ -31,9 +32,10 @@
     protected static final Parameter<Collection> PATTERNS =
         new Parameter<Collection>("patterns", Collection.class, 
Collections.emptyList());
     protected static final Parameter<String> MODE = new 
Parameter<String>("mode", String.class, "WORDS");
-    protected static final Parameter<String> REPLACE_FIRST = new 
Parameter<String>("replacefirst", String.class);
+    protected static final Parameter<String> FIRST_MATCH = new 
Parameter<String>("onlyFirstMatch", String.class);
+    protected static final Parameter<String> FIRST_PATTERN = new 
Parameter<String>("onlyFirstPattern", String.class);
 
-    protected static final Parameter[] PARAMS = new Parameter[] { PATTERNS, 
MODE, REPLACE_FIRST };
+    protected static final Parameter[] PARAMS = new Parameter[] { PATTERNS, 
MODE, FIRST_MATCH, FIRST_PATTERN };
 
     public Parameters createParameters() {
         return new Parameters(PARAMS);
@@ -60,13 +62,13 @@
         Config c = trans.transformers().get("REGEXPS_" + mode.toUpperCase());
         if (c == null) c = trans.transformers().get(mode);
         if (c == null) throw new IllegalArgumentException("" + mode + " cannot 
be found in " + trans.transformers());
-        String firstParam = parameters.get(REPLACE_FIRST);
-        boolean replaceFirst = "true".equals(firstParam);
-        boolean replaceFirstAll = "all".equals(firstParam);
-        trans.configure(c.config +
-                        (replaceFirst ? ChunkedTransformer.REPLACE_FIRST : 0) +
-                        (replaceFirstAll ? 
ChunkedTransformer.REPLACE_FIRST_ALL : 0)
-                        );
+        boolean firstMatch = "true".equals(parameters.get(FIRST_MATCH));
+        boolean firstPattern = "true".equals(parameters.get(FIRST_PATTERN));
+        int i =  c.config +
+            (firstMatch ? ChunkedTransformer.ONLY_REPLACE_FIRST_MATCH : 0) +
+            (firstPattern ? ChunkedTransformer.ONLY_USE_FIRST_MATCHING_PATTERN 
: 0);
+        trans.configure(i);
+
         return trans;
     }
 


Index: ResourceBundleReplacerFactory.java
===================================================================
RCS file: 
/var/cvs/src/org/mmbase/util/transformers/ResourceBundleReplacerFactory.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- ResourceBundleReplacerFactory.java  3 Feb 2008 17:33:56 -0000       1.7
+++ ResourceBundleReplacerFactory.java  23 Jul 2008 22:21:04 -0000      1.8
@@ -24,7 +24,7 @@
  *
  * @author Michiel Meeuwissen
  * @since MMBase-1.8
- * @version $Id: ResourceBundleReplacerFactory.java,v 1.7 2008/02/03 17:33:56 
nklasens Exp $
+ * @version $Id: ResourceBundleReplacerFactory.java,v 1.8 2008/07/23 22:21:04 
michiel Exp $
  */
 
 public class ResourceBundleReplacerFactory implements 
ParameterizedTransformerFactory<CharTransformer> {
@@ -65,14 +65,14 @@
         this.name = name;
     }
     protected boolean replace(final String word, final Writer w, final Status 
status) throws IOException  {
-         if (replaceFirstAll && status.used.contains(word)) {
+         if (onlyFirstPattern && status.used.contains(word)) {
             w.write(word);
             return false;
         }
         try {
             w.write("" + bundle.getObject(word));
             status.replaced++;
-            if (replaceFirstAll) status.used.add(word);
+            if (onlyFirstMatch) status.used.add(word);
             return true;
         } catch (MissingResourceException mre) {
             w.write(word);
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to