]> source.dussan.org Git - sonarqube.git/commitdiff
[SONAR-1875] Improve CodeReaderFilter with channel capabilities
authorbellingard <bellingard@gmail.com>
Tue, 19 Oct 2010 13:32:35 +0000 (13:32 +0000)
committerbellingard <bellingard@gmail.com>
Tue, 19 Oct 2010 13:32:35 +0000 (13:32 +0000)
http://jira.codehaus.org/browse/SONAR-1875

sonar-channel/src/main/java/org/sonar/channel/ChannelCodeReaderFilter.java
sonar-channel/src/main/java/org/sonar/channel/CodeBuffer.java
sonar-channel/src/main/java/org/sonar/channel/CodeReaderFilter.java
sonar-channel/src/test/java/org/sonar/channel/CodeBufferTest.java

index 0834a52850eea0871d9d90f9bc95424003330fd0..c68265a1d33fe44fd18a3fece06488207cf7a682 100644 (file)
@@ -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;
         }
index fcddb8d827fab4ea0e467f144d3ac69f5ab14f2e..d308a48104acd57a736f443826e9ffa51cea1cf2 100644 (file)
@@ -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);
index da5a1dcb4f3b2144971f87877e29024a9d8843c5..7b5106b153fcdece13768a55d3ca318a5534aac5 100644 (file)
@@ -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>
index 3807951eee0809ae290127fe251227026ae1a2e0..ab1183806c0a2348e95f30c93a6911ba7b5d9731 100644 (file)
@@ -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 = "*";