code: protected void readContributor(Revision rev, String str) throws IOException, ArticleReaderException
  	{
  		char[] contrChars = str.toCharArray();
  		int size;
  
  		StringBuilder buffer = null;
  		this.keywords.reset();
  
  		for(char curChar:contrChars){
  
  			if (buffer != null) {
  				buffer.append(curChar);
  			}
  
  			if (this.keywords.check(curChar)) {
  
  				switch (this.keywords.getValue()) {
  
  					case KEY_START_ID:
  					case KEY_START_IP:
  					case KEY_START_USERNAME:
  						buffer = new StringBuilder();
  						break;
  
  					case KEY_END_IP:
  						size = buffer.length();
  						buffer.delete(size
  								- WikipediaXMLKeys.KEY_END_IP.getKeyword()
  										.length(), size);
  						// escape id string
  						rev.setContributorName(SQLEscape.escape(buffer.toString()));
  						rev.setContributorIsRegistered(false);
  						buffer = null;
  						break;
  
  					case KEY_END_USERNAME:
  						size = buffer.length();
  						buffer.delete(size
  								- WikipediaXMLKeys.KEY_END_USERNAME.getKeyword()
  										.length(), size);
  						// escape id string
  						rev.setContributorName(SQLEscape.escape(buffer.toString()));
  						rev.setContributorIsRegistered(true);
  						buffer = null;
  						break;
  
  					case KEY_END_ID:
  						size = buffer.length();
  						buffer.delete(size
  								- WikipediaXMLKeys.KEY_END_ID.getKeyword()
  										.length(), size);
  						String id = buffer.toString();
  						if(!id.isEmpty()){
  							rev.setContributorId(Integer.parseInt(buffer.toString()));
  						}
  						buffer = null;
  						break;
  				}
  			}
  		}
  	}
docs: Parses the content within the contributor tags and adds the
  parsed info to the provided revision object.
  
  @param rev the revision object to store the parsed info in
  @param str the contributor data to be parsed
  @throws IOException
  @throws ArticleReaderException