package bluej.collect;

import java.io.IOException;
import java.io.StringReader;

import bluej.parser.lexer.JavaLexer;
import bluej.parser.lexer.JavaTokenTypes;
import bluej.parser.lexer.LocatableToken;
import bluej.utility.Debug;
import bluej.utility.Utility;
import nu.xom.Builder;
import nu.xom.Element;
import nu.xom.Node;
import nu.xom.ParsingException;
import nu.xom.Text;
import threadchecker.OnThread;
import threadchecker.Tag;


@OnThread(Tag.FXPlatform)
class CodeAnonymiser
{       
public static String anonymise(String sourceCode)
   {
      if (sourceCode.startsWith("<?xml"))
      return anonymiseStride(sourceCode);
       
      else{ return anonymiseJava(sourceCode);
         }     
      }

   
   private static String anonymiseStride(String sourceCode)
   {        
      try
       {            
         Element topLevel = new Element(new Builder().build(new StringReader(sourceCode)).getRootElement());

           
         for (int i = 0; i < topLevel.getChildElements().size(); i++)
           {
            Element sub = topLevel.getChildElements().get(i);
            if (sub.getLocalName().equals("javadoc"))
               {                    
               
               for (int j = 0; j < sub.getChildCount(); j++)
                   {
                  Node childofJavadoc = sub.getChild(j);
                  if (childofJavadoc instanceof Text)
                       {
                     Text text = (Text)childofJavadoc;
                     text.setValue(replaceWords(text.getValue()));                         
                     }                     
                  }                 
               }             
            }

         return Utility.serialiseCodeToString(topLevel);         
         }
       
      catch (ParsingException | IOException e)
       {
         Debug.reportError(e);
           
         
         return sourceCode;         
         }     
      }

   
   private static String anonymiseJava(String sourceCode)
   {        
      StringBuilder result = new StringBuilder();
        
       
      int importOrPackageLine;
        
       
      JavaLexer lexer = new JavaLexer(new StringReader(sourceCode));
      lexer.setGenerateWhitespaceTokens(true);
        
       
      importOrPackageLine = -1;
       
      for (LocatableToken token = lexer.nextToken(); token.getType() != JavaTokenTypes.EOF; token = lexer.nextToken())
       {   
         switch (token.getType())
           {            
            case JavaTokenTypes.ML_COMMENT:
           
            case JavaTokenTypes.SL_COMMENT:
            result.append(replaceWords(token.getText()));
               
            break;
           
            case JavaTokenTypes.WHITESPACE:
            result.append(token.getText());
               
            break;
           
            case JavaTokenTypes.LITERAL_import:
           
            case JavaTokenTypes.LITERAL_package:
               
            
            
            importOrPackageLine = token.getLine();
            result.append(token.getText());
               
            break;
           
            default:
            if (token.getLine() == importOrPackageLine)
               {
               result.append(token.getText());                 
               }
               

            else
               {                    
               
               result.append(sourceCode.substring(token.getPosition()));
                   
               
               return result.toString();                 
               }
               
            break;             
            }         
         }
        
      return result.toString();     
      }

   
   private static String replaceWords(String substring)
   {        
      StringBuilder s = new StringBuilder(substring.length());
       
      int i = 0;
      while (i < substring.length())
       {
         int codePoint = substring.codePointAt(i);
            
         if (Character.isLetterOrDigit(codePoint))
           {
            s.append("#");             
            }
           

         else
           {
            s.appendCodePoint(codePoint);             
            }
         i += Character.charCount(codePoint);         
         }
      return s.toString();     
      } 
   }

.   - CodeAnonymiser
.   anonymise
.   anonymiseStride
.   anonymiseJava
.   replaceWords




165 neLoCode + 0 LoComm