/**
   * 递归生成所有文件的索引
   *
   * @param filePath
   * @param allFileIndexDocumentList
   */
  private void indexAll(String filePath, List<FileIndexDocument> allFileIndexDocumentList) {

    if (!FileHelper.isDir(filePath)) {

      if (allFileIndexDocumentList != null && allFileIndexDocumentList.size() > 0) {
        createFileIndex(allFileIndexDocumentList);
      }

      return;
    }

    String[] fileList = new File(filePath).list();

    if (fileList != null && fileList.length > 0) {
      int length = fileList.length;

      for (int i = 0; i < length; i++) {
        String fileName = StringClass.getFormatPath(filePath + "/" + fileList[i]);

        if (FileHelper.isDir(fileName)) {
          if (fileIndexAllItem.isIncludeSubDir()) {
            indexAll(fileName, allFileIndexDocumentList);
          }
        } else if (FileHelper.isFile(fileName)) {

          String fileType = RetrievalUtil.getFileType(fileName);

          if (fileType.equals("")) {
            continue;
          }

          if (fileIndexAllItem.getFileTypes() != null
              && fileIndexAllItem.getFileTypes().size() > 0
              && !fileIndexAllItem.getFileTypes().contains(fileType)) {
            continue;
          }

          File file = new File(fileName);

          FileIndexDocument fileIndexDocument =
              new FileIndexDocument(
                  fileIndexAllItem.isFullContentFlag(), fileIndexAllItem.getCharsetName());

          String absolutePath = StringClass.getFormatPath(file.getAbsolutePath());
          String basePath = StringClass.getFormatPath(fileIndexAllItem.getFileBasePath());
          String relativizePath = StringClass.getReplaceString(absolutePath, basePath, "");
          relativizePath = StringClass.getFormatPath("/" + relativizePath);

          fileIndexDocument.setFile(file);
          fileIndexDocument.setFileBasePath(basePath);
          fileIndexDocument.setFileId(relativizePath);

          allFileIndexDocumentList.add(fileIndexDocument);
        }

        if (allFileIndexDocumentList.size() >= fileIndexAllItem.getPageSize()) {
          createFileIndex(allFileIndexDocumentList);
        }
      }
    }

    if (allFileIndexDocumentList.size() >= fileIndexAllItem.getPageSize()) {
      createFileIndex(allFileIndexDocumentList);
    }
  }
  /**
   * 将一个文件列表生成索引
   *
   * @param list
   */
  private void createFileIndex(List<FileIndexDocument> list) {
    int length = list.size();

    indexCount += length;

    boolean debugLogFlag = false;
    if (log.isDebugEnabled()) {
      debugLogFlag = true;
    }

    List<String> deleteFileDocumentIdList = new ArrayList<String>();

    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i < length; i++) {
      FileIndexDocument fileIndexDocument = list.get(i);

      fileIndexDocument.setIndexInfoType(fileIndexAllItem.getIndexInfoType());
      fileIndexDocument.setIndexPathType(fileIndexAllItem.getIndexPathType());

      // 拦截生成文件附加索引内容
      IIndexAllFileInterceptor indexAllFileInterceptor =
          fileIndexAllItem.getIndexAllFileInterceptor();

      if (indexAllFileInterceptor != null) {
        Map<String, Object> addonFileDocuments =
            indexAllFileInterceptor.interceptor(fileIndexDocument);
        Map<String, Object> addonFileDocumentsType = indexAllFileInterceptor.getFieldsType();
        if (addonFileDocuments != null && addonFileDocuments.size() > 0) {
          Object[][] objects = UtilTool.getMapKeyValue(addonFileDocuments);
          int objectlength = objects.length;
          for (int j = 0; j < objectlength; j++) {
            String fieldName = String.valueOf(objects[j][0]);
            String fieldValue = String.valueOf(objects[j][1]);
            String type = "";

            if (addonFileDocumentsType != null) {
              type = String.valueOf(addonFileDocumentsType.get(fieldName));
            }

            RDocItem docItem = new RDocItem();
            docItem.setName(fieldName);
            docItem.setContent(fieldValue);

            if (!type.equals("")) {
              if (type.equalsIgnoreCase(String.valueOf(RetrievalType.RDocItemType.KEYWORD))) {
                fileIndexDocument.addKeyWord(docItem);
              } else if (type.equalsIgnoreCase(String.valueOf(RetrievalType.RDocItemType.DATE))) {
                fileIndexDocument.addDateProperty(docItem);
              } else if (type.equalsIgnoreCase(String.valueOf(RetrievalType.RDocItemType.NUMBER))) {
                fileIndexDocument.addNumberProperty(docItem);
              } else if (type.equalsIgnoreCase(
                  String.valueOf(RetrievalType.RDocItemType.PROPERTY))) {
                fileIndexDocument.addContent(docItem);
              } else {
                fileIndexDocument.addContent(docItem);
              }
            } else {
              fileIndexDocument.addContent(docItem);
            }
          }
        }
      }

      // 判断当前操作时属于更新索引,还是重建索引
      if (fileIndexAllItem.getIndexOperatorType() == RetrievalType.RIndexOperatorType.UPDATE) {

        if (debugLogFlag) {
          stringBuilder.append(
              "批量文件索引["
                  + fileIndexDocument.getIndexPathType()
                  + "]更新:"
                  + fileIndexDocument.getFile().getAbsolutePath()
                  + "\n");
        }

        String existsFileDocumentId =
            StringClass.getString(
                queryFacade.queryFileDocumentIndexIdByFileId(
                    fileIndexAllItem.getIndexPathType(), fileIndexDocument.getFileId()));
        if (existsFileDocumentId.equals("")) {
          list.add(fileIndexDocument);
        } else {
          fileIndexDocument.setId(existsFileDocumentId);
          list.add(fileIndexDocument);

          deleteFileDocumentIdList.add(existsFileDocumentId);
        }
      } else {
        if (debugLogFlag) {
          stringBuilder.append(
              "批量文件索引["
                  + fileIndexDocument.getIndexPathType()
                  + "]新增:"
                  + fileIndexDocument.getFile().getAbsolutePath()
                  + "\n");
        }
      }
    }

    log.debug(stringBuilder);

    if (deleteFileDocumentIdList != null && deleteFileDocumentIdList.size() > 0) {
      docOperatorFacade.delete(fileIndexAllItem.getIndexPathType(), deleteFileDocumentIdList);
    }

    Iterator<FileIndexDocument> it = list.iterator();
    List<FileIndexDocument> theList = new ArrayList<FileIndexDocument>();
    while (it.hasNext()) {
      theList.add(it.next());
      it.remove();
      if (theList.size() >= fileIndexAllItem.getPageSize()) {
        docOperatorFacade.createFileIndexs(theList, fileIndexAllItem.getMaxIndexFileSize());
        theList.clear();
      }
    }
    if (theList.size() > 0) {
      docOperatorFacade.createFileIndexs(theList, fileIndexAllItem.getMaxIndexFileSize());
      theList.clear();
    }
    theList = null;
    list.clear();
  }