content: package org.apache.solr.analysis;
  
  import org.apache.lucene.analysis.TokenFilter;
  import org.apache.lucene.analysis.TokenStream;
  import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
  import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
  
  import java.io.IOException;
  
  /**
   * TODO: set payloads?
   */
  public final class ResetFilter extends TokenFilter {
  
      private final String incomingType;
      private final Integer posIncrement;
      private final String outgoingType;
      private int numTokens = 0;
  
      private final PositionIncrementAttribute posIncrAtt;
      private final TypeAttribute typeAtt;
      private final CharTermAttribute termAtt;
      private final int lowEnd;
      private final int highEnd;
      private final String prefix;
  
  
      public ResetFilter(TokenStream input, String incomingType,
                         Integer posIncrement, String outgoingType, int[] range,
                         String prefix) {
          super(input);
          posIncrAtt = addAttribute(PositionIncrementAttribute.class);
          typeAtt = addAttribute(TypeAttribute.class);
          termAtt = addAttribute(CharTermAttribute.class);
  
          this.incomingType = incomingType;
          this.posIncrement = posIncrement;
          this.outgoingType = outgoingType;
          this.lowEnd = range[0];
          this.highEnd = range[1];
          this.prefix = prefix;
      }
  
  
      /* (non-Javadoc)
       * @see org.apache.lucene.analysis.TokenStream#incrementToken()
       */
      @Override
      public boolean incrementToken() throws IOException {
  
          if (!input.incrementToken()) return false;
  
  
          if (numTokens >= lowEnd && numTokens <= highEnd) {
  
              //System.out.println(termAtt.toString() + " pos=" + posIncrAtt.getPositionIncrement() + " type=" + typeAtt.type());
              if (incomingType == null) { // null means process all tokens
                  resetAttributes();
              } else if (typeAtt.type().equals(incomingType)) {
                  resetAttributes();
              }
              //System.out.println("   " + termAtt.toString() + " pos=" + posIncrAtt.getPositionIncrement() + " type=" + typeAtt.type());
  
          }
  
          numTokens++;
  
          return true;
      }
  
      private void resetAttributes() {
          if (posIncrement != null) {
              posIncrAtt.setPositionIncrement(posIncrement);
          }
          if (outgoingType != null) {
              typeAtt.setType(outgoingType);
          }
          if (prefix != null) {
              String newValue = prefix + termAtt.toString();
              termAtt.setEmpty().append(newValue);
          }
      }
  
      @Override
      public void reset() throws IOException {
          super.reset();
          numTokens = 0;
      }
  }
  