// Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.resources;

import java.io.InputStream;

import opennlp.tools.util.model.BaseModel;

import uk.gov.dstl.baleen.exceptions.BaleenException;
import uk.gov.dstl.baleen.uima.BaleenResource;

/**
 * Shared resource object for loading and accessing OpenNLP models. loadModel(...) must be called
 * once to initialize the resource, but any subsequent calls to the method will be ignored.
 */
public class SharedOpenNLPModel extends BaleenResource {
  private BaseModel model;

  /**
   * Load model into the resource, if it hasn't already been loaded. If it has already been loaded,
   * then the method returns. We don't initialize the model in doInitialize because there is no nice
   * way of specifying the model parameters
   *
   * @param modelClazz The model class to use when loading the file, e.g. TokenizerModel
   * @param model The model to load
   * @throws BaleenException
   */
  public void loadModel(Class<? extends BaseModel> modelClazz, InputStream model)
      throws BaleenException {
    if (this.model != null) {
      return;
    }

    try {
      this.model = modelClazz.getDeclaredConstructor(InputStream.class).newInstance(model);
    } catch (Exception e) {
      throw new BaleenException("Unable to construct model", e);
    }
  }

  @Override
  protected void doDestroy() {
    model = null;
  }

  /** Get the OpenNLP model held by this resource */
  public BaseModel getModel() {
    return model;
  }
}
