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