/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.lucene.benchmark.byTask.feeds;

import java.io.IOException;

/** Creates the same document each time {@link #getNextDocData(DocData)} is called. */
public class SingleDocSource extends ContentSource {

  private int docID = 0;

  static final String DOC_TEXT =
      "Well, this is just some plain text we use for creating the "
          + "test documents. It used to be a text from an online collection "
          + "devoted to first aid, but if there was there an (online) lawyers "
          + "first aid collection with legal advices, \"it\" might have quite "
          + "probably advised one not to include \"it\"'s text or the text of "
          + "any other online collection in one's code, unless one has money "
          + "that one don't need and one is happy to donate for lawyers "
          + "charity. Anyhow at some point, rechecking the usage of this text, "
          + "it became uncertain that this text is free to use, because "
          + "the web site in the disclaimer of he eBook containing that text "
          + "was not responding anymore, and at the same time, in projGut, "
          + "searching for first aid no longer found that eBook as well. "
          + "So here we are, with a perhaps much less interesting "
          + "text for the test, but oh much much safer. ";

  // return a new docid
  private synchronized int newdocid() throws NoMoreDataException {
    if (docID > 0 && !forever) {
      throw new NoMoreDataException();
    }
    return docID++;
  }

  @Override
  public void close() throws IOException {}

  @Override
  public DocData getNextDocData(DocData docData) throws NoMoreDataException {
    int id = newdocid();
    addBytes(DOC_TEXT.length());
    docData.clear();
    docData.setName("doc" + id);
    docData.setBody(DOC_TEXT);
    return docData;
  }

  @Override
  public synchronized void resetInputs() throws IOException {
    super.resetInputs();
    docID = 0;
  }
}
