@SuppressWarnings("unchecked")
  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response volumes(
      @QueryParam("categoryId") Long categoryId,
      @QueryParam("page") Integer page,
      @QueryParam("q") String q) {
    Volumes volumes = new Volumes();

    VolumeDAO volumeDAO = DAOFactory.getInstance().getVolumeDAO();
    FullTextSession fts = org.hibernate.search.Search.getFullTextSession(volumeDAO.getSession());

    try {
      Query query = buildLuceneQuery(categoryId, page, q);
      FullTextQuery createFullTextQuery =
          fts.createFullTextQuery(query, com.book.identification.model.Volume.class);
      addPaginationToQuery(createFullTextQuery, page);
      List<Volume> list = createFullTextQuery.list();
      for (Volume volume : list) {
        volume.setPage(page);
        volume.setQ(q);
      }
      volumes.setVolumes(createFullTextQuery.list());
    } catch (ParseException e1) {
      e1.printStackTrace();
    }

    if (volumes.getVolumes().isEmpty()) {
      return Response.ok("volumes : {}").build();
    }

    return Response.ok(volumes).build();
  }
  private Query buildLuceneQuery(Long categoryId, Integer page, String q) throws ParseException {
    StringBuilder query = new StringBuilder();

    QueryParser queryParser =
        new org.apache.lucene.queryParser.QueryParser(
            Version.LUCENE_31, "title", new StandardAnalyzer((Version.LUCENE_31)));
    if (StringUtils.isNotBlank(q)) {
      query.append(buildQuery(q));
    }

    if (categoryId != null) {
      List<Long> childCategories =
          DAOFactory.getInstance().getCategoryDAO().childCategories(categoryId);
      if (StringUtils.isNotBlank(q)) {
        query.append("AND ( " + buildQuery(childCategories) + ")");
      } else {
        query.append(buildQuery(childCategories));
      }

      buildQuery(childCategories);
    }
    if (!StringUtils.isNotBlank(query)) {
      query.append("id:*");
    }
    queryParser.setAllowLeadingWildcard(true);
    return queryParser.parse(query.toString());
  }
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 @Path("reindex/")
 public Response reindex() {
   VolumeDAO volumeDAO = DAOFactory.getInstance().getVolumeDAO();
   FullTextSession fts = org.hibernate.search.Search.getFullTextSession(volumeDAO.getSession());
   try {
     fts.createIndexer().startAndWait();
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
   return Response.ok("reindex").build();
 }
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 @Path("hash/")
 public Response hashing() throws IOException {
   VolumeDAO volumeDAO = DAOFactory.getInstance().getVolumeDAO();
   List<Volume> findAll = volumeDAO.findAll();
   Transaction beginTransaction = volumeDAO.getSession().beginTransaction();
   for (Volume volume : findAll) {
     String fileSHA1 = DigestUtils.shaHex(FileUtils.openInputStream(new File(volume.getPath())));
     volume.setHashSH1(fileSHA1);
   }
   beginTransaction.commit();
   return Response.ok("hashed").build();
 }