Index: lucene/CHANGES.txt
===================================================================
--- lucene/CHANGES.txt	(revision 1462646)
+++ lucene/CHANGES.txt	(working copy)
@@ -85,8 +85,8 @@
 * LUCENE-4820: Add payloads to Analyzing/FuzzySuggester, to record an
   arbitrary byte[] per suggestion (Mike McCandless)
 
-* LUCENE-4816: Passing null as the BreakIterator to PostingsHighlighter
-  now highlights the entire content as a single Passage.  (Robert
+* LUCENE-4816: Add WholeBreakIterator to PostingsHighlighter
+  for treating the entire content as a single Passage.  (Robert
   Muir, Mike McCandless)
 
 * LUCENE-4827: Add additional ctor to PostingsHighlighter PassageScorer
Index: lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java
===================================================================
--- lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java	(revision 1462646)
+++ lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java	(working copy)
@@ -457,7 +457,12 @@
     iw.close();
     
     IndexSearcher searcher = newSearcher(ir);
-    PostingsHighlighter highlighter = new PostingsHighlighter(10000, null);
+    PostingsHighlighter highlighter = new PostingsHighlighter(10000) {
+      @Override
+      protected BreakIterator getBreakIterator(String field) {
+        return new WholeBreakIterator();
+      }
+    };
     Query query = new TermQuery(new Term("body", "test"));
     TopDocs topDocs = searcher.search(query, null, 10, Sort.INDEXORDER);
     assertEquals(1, topDocs.totalHits);
@@ -527,7 +532,7 @@
     
     IndexSearcher searcher = newSearcher(ir);
 
-    PostingsHighlighter highlighter = new PostingsHighlighter(10000, null) {
+    PostingsHighlighter highlighter = new PostingsHighlighter(10000) {
         @Override
         protected String[][] loadFieldValues(IndexSearcher searcher, String[] fields, int[] docids, int maxLength) throws IOException {
           assert fields.length == 1;
@@ -536,6 +541,11 @@
           contents[0][0] = text;
           return contents;
         }
+
+        @Override
+        protected BreakIterator getBreakIterator(String field) {
+          return new WholeBreakIterator();
+        }
       };
 
     Query query = new TermQuery(new Term("body", "test"));
@@ -636,7 +646,12 @@
     iw.close();
     
     IndexSearcher searcher = newSearcher(ir);
-    PostingsHighlighter highlighter = new PostingsHighlighter(10000, null);
+    PostingsHighlighter highlighter = new PostingsHighlighter(10000) {
+      @Override
+      protected BreakIterator getBreakIterator(String field) {
+        return new WholeBreakIterator();
+      }
+    };
     Query query = new TermQuery(new Term("body", "highlighting"));
     int[] docIDs = new int[] {0};
     String snippets[] = highlighter.highlightFields(new String[] {"body"}, query, searcher, docIDs, 2).get("body");
Index: lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighterRanking.java
===================================================================
--- lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighterRanking.java	(revision 1462646)
+++ lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighterRanking.java	(working copy)
@@ -113,8 +113,7 @@
   private void checkQuery(IndexSearcher is, Query query, int doc, int maxTopN) throws IOException {
     for (int n = 1; n < maxTopN; n++) {
       final FakePassageFormatter f1 = new FakePassageFormatter();
-      PostingsHighlighter p1 = new PostingsHighlighter(Integer.MAX_VALUE-1, 
-                                                       BreakIterator.getSentenceInstance(Locale.ROOT)) {
+      PostingsHighlighter p1 = new PostingsHighlighter(Integer.MAX_VALUE-1) {
           @Override
           protected PassageFormatter getFormatter(String field) {
             assertEquals("body", field);
@@ -123,8 +122,7 @@
         };
 
       final FakePassageFormatter f2 = new FakePassageFormatter();
-      PostingsHighlighter p2 = new PostingsHighlighter(Integer.MAX_VALUE-1, 
-                                                       BreakIterator.getSentenceInstance(Locale.ROOT)) {
+      PostingsHighlighter p2 = new PostingsHighlighter(Integer.MAX_VALUE-1) {
           @Override
           protected PassageFormatter getFormatter(String field) {
             assertEquals("body", field);
@@ -269,8 +267,7 @@
     iw.close();
     
     IndexSearcher searcher = newSearcher(ir);
-    PostingsHighlighter highlighter = new PostingsHighlighter(10000, 
-                                                              BreakIterator.getSentenceInstance(Locale.ROOT)) {
+    PostingsHighlighter highlighter = new PostingsHighlighter(10000) {
         @Override
         protected PassageScorer getScorer(String field) {
           return new PassageScorer(1.2f, 0, 87);
@@ -309,8 +306,7 @@
     iw.close();
     
     IndexSearcher searcher = newSearcher(ir);
-    PostingsHighlighter highlighter = new PostingsHighlighter(10000, 
-                                                              BreakIterator.getSentenceInstance(Locale.ROOT)) {
+    PostingsHighlighter highlighter = new PostingsHighlighter(10000) {
         @Override
         protected PassageScorer getScorer(String field) {
           return new PassageScorer(0, 0.75f, 87);
Index: lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java
===================================================================
--- lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java	(revision 1462646)
+++ lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java	(working copy)
@@ -96,7 +96,6 @@
   public static final int DEFAULT_MAX_LENGTH = 10000;
     
   private final int maxLength;
-  private final BreakIterator breakIterator;
 
   /** Set the first time {@link #getFormatter} is called,
    *  and then reused. */
@@ -119,29 +118,21 @@
    * @throws IllegalArgumentException if <code>maxLength</code> is negative or <code>Integer.MAX_VALUE</code>
    */
   public PostingsHighlighter(int maxLength) {
-    this(maxLength, BreakIterator.getSentenceInstance(Locale.ROOT));
-  }
-  
-  /**
-   * Creates a new highlighter with custom parameters.
-   * @param maxLength maximum content size to process.
-   * @param breakIterator used for finding passage
-   *        boundaries; pass null to highlight the entire
-   *        content as a single Passage.
-   * @throws IllegalArgumentException if <code>maxLength</code> is negative or <code>Integer.MAX_VALUE</code>
-   */
-  public PostingsHighlighter(int maxLength, BreakIterator breakIterator) {
     if (maxLength < 0 || maxLength == Integer.MAX_VALUE) {
       // two reasons: no overflow problems in BreakIterator.preceding(offset+1),
       // our sentinel in the offsets queue uses this value to terminate.
       throw new IllegalArgumentException("maxLength must be < Integer.MAX_VALUE");
     }
-    if (breakIterator == null) {
-      breakIterator = new WholeBreakIterator();
-    }
     this.maxLength = maxLength;
-    this.breakIterator = breakIterator;
   }
+  
+  /** Returns the {@link BreakIterator} to use for
+   *  diving text into passages.  This returns 
+   *  {@link BreakIterator#getSentenceInstance(Locale)} by default;
+   *  subclasses can override to customize. */
+  protected BreakIterator getBreakIterator(String field) {
+    return BreakIterator.getSentenceInstance(Locale.ROOT);
+  }
 
   /** Returns the {@link PassageFormatter} to use for
    *  formatting passages into highlighted snippets.  This
@@ -303,8 +294,6 @@
     IndexReaderContext readerContext = reader.getContext();
     List<AtomicReaderContext> leaves = readerContext.leaves();
 
-    BreakIterator bi = (BreakIterator)breakIterator.clone();
-
     // Make our own copy because we sort in-place:
     int[] docids = new int[docidsIn.length];
     System.arraycopy(docidsIn, 0, docids, 0, docidsIn.length);
@@ -330,7 +319,7 @@
       for(Term term : fieldTerms) {
         terms[termUpto++] = term.bytes();
       }
-      Map<Integer,String> fieldHighlights = highlightField(field, contents[i], bi, terms, docids, leaves, maxPassages);
+      Map<Integer,String> fieldHighlights = highlightField(field, contents[i], getBreakIterator(field), terms, docids, leaves, maxPassages);
         
       String[] result = new String[docids.length];
       for (int j = 0; j < docidsIn.length; j++) {
Index: lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/WholeBreakIterator.java
===================================================================
--- lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/WholeBreakIterator.java	(revision 1462646)
+++ lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/WholeBreakIterator.java	(working copy)
@@ -21,7 +21,7 @@
 import java.text.CharacterIterator;
 
 /** Just produces one single fragment for the entire text */
-final class WholeBreakIterator extends BreakIterator {
+public final class WholeBreakIterator extends BreakIterator {
   private CharacterIterator text;
   private int start;
   private int end;
Index: solr/core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java
===================================================================
--- solr/core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java	(revision 1462646)
+++ solr/core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java	(working copy)
@@ -80,7 +80,6 @@
   @Override
   public void init(PluginInfo info) {
     Map<String,String> attributes = info.attributes;
-    BreakIterator breakIterator = BreakIterator.getSentenceInstance(Locale.ROOT);
     
     // scorer parameters: k1/b/pivot
     String k1 = attributes.get("k1");
@@ -127,7 +126,7 @@
     if (attributes.containsKey("maxLength")) {
       maxLength = Integer.parseInt(attributes.get("maxLength"));
     }
-    highlighter = new PostingsHighlighter(maxLength, breakIterator) {
+    highlighter = new PostingsHighlighter(maxLength) {
         @Override
         protected Passage[] getEmptyHighlight(String fieldName, BreakIterator bi, int maxPassages) {
           if (summarizeEmptyBoolean) {
