http://jira.codehaus.org/browse/SONAR-1875tags/2.6
@@ -27,17 +27,26 @@ import java.io.Reader; | |||
* declared for the CodeReader. | |||
* | |||
*/ | |||
public final class ChannelCodeReaderFilter<OUTPUT> extends CodeReaderFilter { | |||
public final class ChannelCodeReaderFilter<OUTPUT> extends CodeReaderFilter<OUTPUT> { | |||
@SuppressWarnings("unchecked") | |||
private Channel<OUTPUT>[] channels = new Channel[0]; | |||
private CodeReader internalCodeReader; | |||
private OUTPUT output; | |||
/** | |||
* Creates a CodeReaderFilter that will use the provided Channels to filter the character stream it gets from its reader. | |||
* | |||
* @param channels | |||
* the different channels | |||
*/ | |||
public ChannelCodeReaderFilter(Channel<OUTPUT>... channels) { | |||
super(); | |||
this.channels = channels; | |||
} | |||
/** | |||
* Creates a CodeReaderFilter that will use the provided Channels to filter the character stream it gets from its reader. And optionaly, | |||
* Creates a CodeReaderFilter that will use the provided Channels to filter the character stream it gets from its reader. And optionally, | |||
* it can push token to the provided output object. | |||
* | |||
* @param output | |||
@@ -46,9 +55,8 @@ public final class ChannelCodeReaderFilter<OUTPUT> extends CodeReaderFilter { | |||
* the different channels | |||
*/ | |||
public ChannelCodeReaderFilter(OUTPUT output, Channel<OUTPUT>... channels) { | |||
super(); | |||
super(output); | |||
this.channels = channels; | |||
this.output = output; | |||
} | |||
/** | |||
@@ -72,7 +80,7 @@ public final class ChannelCodeReaderFilter<OUTPUT> extends CodeReaderFilter { | |||
} | |||
boolean consumed = false; | |||
for (Channel<OUTPUT> channel : channels) { | |||
if (channel.consume(internalCodeReader, output)) { | |||
if (channel.consume(internalCodeReader, getOutput())) { | |||
consumed = true; | |||
break; | |||
} |
@@ -51,28 +51,28 @@ public class CodeBuffer implements CharSequence { | |||
private boolean recordingMode = false; | |||
private StringBuilder recordedCharacters = new StringBuilder(); | |||
public CodeBuffer(Reader code, CodeReaderFilter... codeReaderFilters) { | |||
public CodeBuffer(Reader code, CodeReaderFilter<?>... codeReaderFilters) { | |||
this(code, DEFAULT_BUFFER_CAPACITY, codeReaderFilters); | |||
} | |||
private CodeBuffer(Reader initialCodeReader, int bufferCapacity, CodeReaderFilter... codeReaderFilters) { | |||
private CodeBuffer(Reader initialCodeReader, int bufferCapacity, CodeReaderFilter<?>... codeReaderFilters) { | |||
lastChar = -1; | |||
cursor = new Cursor(); | |||
this.bufferCapacity = bufferCapacity; | |||
buffer = new char[bufferCapacity]; | |||
Reader reader = initialCodeReader; | |||
for (CodeReaderFilter codeReaderFilter : codeReaderFilters) { | |||
for (CodeReaderFilter<?> codeReaderFilter : codeReaderFilters) { | |||
reader = new Filter(reader, codeReaderFilter); | |||
} | |||
this.code = reader; | |||
fillBuffer(); | |||
} | |||
public CodeBuffer(String code, CodeReaderFilter... codeReaderFilters) { | |||
public CodeBuffer(String code, CodeReaderFilter<?>... codeReaderFilters) { | |||
this(new StringReader(code), codeReaderFilters); | |||
} | |||
protected CodeBuffer(String code, int bufferCapacity, CodeReaderFilter... codeReaderFilters) { | |||
protected CodeBuffer(String code, int bufferCapacity, CodeReaderFilter<?>... codeReaderFilters) { | |||
this(new StringReader(code), bufferCapacity, codeReaderFilters); | |||
} | |||
@@ -258,9 +258,9 @@ public class CodeBuffer implements CharSequence { | |||
*/ | |||
final class Filter extends FilterReader { | |||
private CodeReaderFilter codeReaderFilter; | |||
private CodeReaderFilter<?> codeReaderFilter; | |||
public Filter(Reader in, CodeReaderFilter codeReaderFilter) { | |||
public Filter(Reader in, CodeReaderFilter<?> codeReaderFilter) { | |||
super(in); | |||
this.codeReaderFilter = codeReaderFilter; | |||
this.codeReaderFilter.setReader(in); |
@@ -33,10 +33,19 @@ import java.io.Reader; | |||
* @see CodeBufferTest#testSeveralCodeReaderFilter() | |||
* | |||
*/ | |||
public abstract class CodeReaderFilter { | |||
public abstract class CodeReaderFilter<OUTPUT> { | |||
private Reader reader; | |||
private OUTPUT output; | |||
public CodeReaderFilter() { | |||
} | |||
public CodeReaderFilter(OUTPUT output) { | |||
this.output = output; | |||
} | |||
/** | |||
* Returns the reader from which this class reads the character stream. | |||
* | |||
@@ -56,6 +65,25 @@ public abstract class CodeReaderFilter { | |||
this.reader = reader; | |||
} | |||
/** | |||
* Returns the output object. | |||
* | |||
* @return the output | |||
*/ | |||
public OUTPUT getOutput() { | |||
return output; | |||
} | |||
/** | |||
* Sets the output object | |||
* | |||
* @param output | |||
* the output to set | |||
*/ | |||
public void setOutput(OUTPUT output) { | |||
this.output = output; | |||
} | |||
/** | |||
* This method implements the filtering logic, that is: | |||
* <ul> |
@@ -178,7 +178,7 @@ public class CodeBufferTest { | |||
public void testChannelCodeReaderFilter() throws Exception { | |||
// create a windowing channel that drops the 2 first characters, keeps 6 characters and drops the rest of the line | |||
@SuppressWarnings({ "rawtypes", "unchecked" }) | |||
CodeBuffer code = new CodeBuffer("0123456789\nABCDEFGHIJ", new ChannelCodeReaderFilter(null, new WindowingChannel())); | |||
CodeBuffer code = new CodeBuffer("0123456789\nABCDEFGHIJ", new ChannelCodeReaderFilter(new Object(), new WindowingChannel())); | |||
// test #charAt | |||
assertEquals('2', code.charAt(0)); | |||
assertEquals('7', code.charAt(5)); | |||
@@ -205,7 +205,7 @@ public class CodeBufferTest { | |||
assertThat(code.pop(), is( -1)); | |||
} | |||
class ReplaceNumbersFilter extends CodeReaderFilter { | |||
class ReplaceNumbersFilter extends CodeReaderFilter<Object> { | |||
private Pattern pattern = Pattern.compile("\\d"); | |||
private String REPLACEMENT = "-"; | |||
@@ -221,7 +221,7 @@ public class CodeBufferTest { | |||
} | |||
} | |||
class ReplaceCharFilter extends CodeReaderFilter { | |||
class ReplaceCharFilter extends CodeReaderFilter<Object> { | |||
private Pattern pattern = Pattern.compile("[a-zA-Z]"); | |||
private String REPLACEMENT = "*"; |