code: public void processDocument(BufferedReader document, Wordsi wordsi) {
          Queue<String> prevWords = new ArrayDeque<String>();
          Queue<String> nextWords = new ArrayDeque<String>();
  
          Iterator<String> it = IteratorFactory.tokenizeOrdered(document);
  
          // Skip empty documents.
          if (!it.hasNext())
              return;
  
          String instanceId = it.next();
  
          // Fill up the words after the context so that when the real processing
          // starts, the context is fully prepared.
          for (int i = 0 ; it.hasNext(); ++i) {
              String term = it.next();
              if (term.equals(separator))
                  break;
              prevWords.offer(term.intern());
          }
  
          // Eliminate the first set of words that we don't want to inspect.
          while (prevWords.size() > windowSize)
              prevWords.remove();
  
          // It's possible that the SenseEval/SemEval parser failed to find the
          // focus word.  For these cases, skip the context.
          if (!it.hasNext())
              return;
  
          String focusWord = it.next().intern();
  
          // Extract the set of words to consider after the focus word.
          while (it.hasNext() && nextWords.size() < windowSize)
              nextWords.offer(it.next().intern());
  
          // Create the context vector and have wordsi handle it.
          SparseDoubleVector contextVector = generator.generateContext(
                  prevWords, nextWords);
          wordsi.handleContextVector(focusWord, instanceId, contextVector);
      }
docs: {@inheritDoc}