private Document buildDoc(EntityBaseBean bean) throws IcatException {
    Map<Field, Integer> stringFields = ei.getStringFields(bean.getClass());
    StringBuilder sb = new StringBuilder();
    for (Entry<Field, Integer> item : stringFields.entrySet()) {
      Field field = item.getKey();
      Method getter = ei.getGetters(bean.getClass()).get(field);
      try {
        String text = (String) getter.invoke(bean);
        if (text != null) {
          if (sb.length() != 0) {
            sb.append(' ');
          }
          sb.append(text);
        }
      } catch (IllegalArgumentException e) {
        throw new IcatException(IcatExceptionType.INTERNAL, e.getMessage());
      } catch (IllegalAccessException e) {
        throw new IcatException(IcatExceptionType.INTERNAL, e.getMessage());
      } catch (InvocationTargetException e) {
        throw new IcatException(IcatExceptionType.INTERNAL, e.getMessage());
      }
    }

    Document doc = new Document();
    String id = bean.getClass().getSimpleName() + ":" + bean.getId();
    doc.add(new StringField("id", id, Store.YES));
    doc.add(new StringField("entity", bean.getClass().getSimpleName(), Store.NO));
    doc.add(new TextField("all", sb.toString(), Store.NO));
    logger.debug("Created document '" + sb.toString() + "' to index for " + id);
    return doc;
  }
  @PostConstruct
  private void init() {

    luceneDirectory = propertyHandler.getLuceneDirectory();
    active = luceneDirectory != null;
    if (active) {
      luceneRefreshSeconds = propertyHandler.getLuceneRefreshSeconds() * 1000L;
      luceneCommitCount = propertyHandler.getLuceneCommitCount();
      ei = EntityInfoHandler.getInstance();

      try {
        directory = FSDirectory.open(new File(luceneDirectory));
        logger.debug("Opened FSDirectory with lockid " + directory.getLockID());
        Analyzer analyzer = new IcatAnalyzer(Version.LUCENE_43);
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, analyzer);
        iwriter = new IndexWriter(directory, config);
        String[] files = directory.listAll();
        if (files.length == 1 && files[0].equals("write.lock")) {
          logger.debug("Directory only has the write.lock file so commit and reopen");
          iwriter.commit();
          iwriter.close();
          iwriter = new IndexWriter(directory, config);
        }

        searcherManager = new SearcherManager(directory, new SearcherFactory());
        isearcher = searcherManager.acquire();
        logger.debug("Got a new IndexSearcher " + isearcher);

        parser = new StandardQueryParser();
        StandardQueryConfigHandler qpConf =
            (StandardQueryConfigHandler) parser.getQueryConfigHandler();
        qpConf.set(ConfigurationKeys.ANALYZER, analyzer);
        qpConf.set(ConfigurationKeys.ALLOW_LEADING_WILDCARD, true);
      } catch (Exception e) {
        StringWriter errors = new StringWriter();
        e.printStackTrace(new PrintWriter(errors));
        logger.fatal(errors.toString());
        if (directory != null) {
          try {
            String lockId = directory.getLockID();
            directory.clearLock(lockId);
            logger.warn("Cleared lock " + lockId);
          } catch (IOException e1) {
            // Ignore
          }
        }
        throw new IllegalStateException(errors.toString());
      }

      timer = new Timer("Lucene");
      timer.schedule(
          new TimerTask() {

            @Override
            public void run() {
              try {
                commit();
              } catch (IcatException e) {
                logger.error(e.getMessage());
              } catch (Throwable t) {
                logger.error(t.getMessage());
              }
            }
          },
          luceneRefreshSeconds,
          luceneRefreshSeconds);

      logger.debug("Created LuceneSingleton");
    }
  }