Bläddra i källkod

[SONAR-1875] Improve CodeReaderFilter with channel capabilities

http://jira.codehaus.org/browse/SONAR-1875
tags/2.6
bellingard 13 år sedan
förälder
incheckning
a7c59030be

+ 14
- 6
sonar-channel/src/main/java/org/sonar/channel/ChannelCodeReaderFilter.java Visa fil

@@ -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;
}

+ 7
- 7
sonar-channel/src/main/java/org/sonar/channel/CodeBuffer.java Visa fil

@@ -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);

+ 29
- 1
sonar-channel/src/main/java/org/sonar/channel/CodeReaderFilter.java Visa fil

@@ -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>

+ 3
- 3
sonar-channel/src/test/java/org/sonar/channel/CodeBufferTest.java Visa fil

@@ -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 = "*";

Laddar…
Avbryt
Spara