Eu tenho um servlet que faz o upload de arquivos para um local e uma classe que faz a indexação de arquivos e a minha dúvida é a seguinte:
Como eu faço para chamar essa classe que faz a indexação logo após o upload do arquivo.
Eu não tenho experiência com java web e gostaria de uma ajuda.
Obrigado!
servlet que faz o uload
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private final String UPLOAD_DIRECTORY = "C:\\Users\\ACER\\Desktop\\trabalho\\upload";
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (ServletFileUpload.isMultipartContent(request)) {
try {
String fname = null;
String fsize = null;
String ftype = null;
List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : multiparts) {
if (!item.isFormField()) {
fname = new File(item.getName()).getName();
fsize = new Long(item.getSize()).toString();
ftype = item.getContentType();
item.write(new File(UPLOAD_DIRECTORY + File.separator + fname));
}
}
// File uploaded successfully
request.setAttribute("message", "File Uploaded Successfully");
request.setAttribute("name", fname);
request.setAttribute("size", fsize);
request.setAttribute("type", ftype);
} catch (Exception ex) {
request.setAttribute("message", "File Upload Failed due to " + ex);
}
} else {
request.setAttribute("message", "Sorry this Servlet only handles file upload request");
}
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
}
classe java que faz a indexação
public class Indexador {
private static Logger logger = Logger.getLogger(Indexador.class);
// {1} Diretório que irá guardar o índice;
private String diretorioDosIndices = System.getProperty("user.home")
+ "/lucene/indice-lucene-web";
// {2} Diretório que contém os documentos que serão indexados;
private String diretorioParaIndexar = System.getProperty("user.home")
+ "/lucene/indexador-web";
// {3} IndexWriter: cria e mantém o índice;
private IndexWriter writer;
// {4} Biblioteca que extrai texto de diversos formatos conhecidos;
private Tika tika;
public void indexaArquivosDoDiretorio() {
try {
File diretorio = new File(diretorioDosIndices);
apagaIndices(diretorio);
// {5} Directory: representa o diretório do índice;
Directory d = new SimpleFSDirectory(diretorio);
logger.info("Diretorio do indice: " + diretorioDosIndices);
// {6} Analyser/StandardAnalyser: fazem o pré-processamento do texto;
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_48);
// {7} IndexWriterConfig: configurações para criação do índice;
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_48,
analyzer);
// {8} Inicializa o IndexWriter para gravação;
writer = new IndexWriter(d, config);
long inicio = System.currentTimeMillis();
indexaArquivosDoDiretorio(new File(diretorioParaIndexar));
// {12}
writer.commit();
writer.close();
long fim = System.currentTimeMillis();
logger.info("Tempo para indexar: " + ((fim - inicio) / 1000) + "s");
} catch (IOException e) {
logger.error(e);
}
}
private void apagaIndices(File diretorio) {
if (diretorio.exists()) {
File arquivos[] = diretorio.listFiles();
for (File arquivo : arquivos) {
arquivo.delete();
}
}
}
public void indexaArquivosDoDiretorio(File raiz) {
FilenameFilter filtro = new FilenameFilter() {
public boolean accept(File arquivo, String nome) {
if (nome.toLowerCase().endsWith(".pdf")
|| nome.toLowerCase().endsWith(".odt")
|| nome.toLowerCase().endsWith(".doc")
|| nome.toLowerCase().endsWith(".docx")
|| nome.toLowerCase().endsWith(".ppt")
|| nome.toLowerCase().endsWith(".pptx")
|| nome.toLowerCase().endsWith(".xls")
|| nome.toLowerCase().endsWith(".txt")
|| nome.toLowerCase().endsWith(".rtf")) {
return true;
}
return false;
}
};
for (File arquivo : raiz.listFiles(filtro)) {
if (arquivo.isFile()) {
StringBuffer msg = new StringBuffer();
msg.append("Indexando o arquivo ");
msg.append(arquivo.getAbsoluteFile());
msg.append(", ");
msg.append(arquivo.length() / 1000);
msg.append("kb");
logger.info(msg);
try {
// {9} Extrai o conteúdo do arquivo com o Tika;
String textoExtraido = getTika().parseToString(arquivo);
indexaArquivo(arquivo, textoExtraido);
} catch (Exception e) {
logger.error(e);
}
} else {
indexaArquivosDoDiretorio(arquivo);
}
}
}
private void indexaArquivo(File arquivo, String textoExtraido) {
SimpleDateFormat formatador = new SimpleDateFormat("yyyyMMdd");
String ultimaModificacao = formatador.format(arquivo.lastModified());
// {10} Monta um Document para indexação
// Field.Store.YES: armazena uma cópia do texto no índice, aumentando muito o seu tamanho;
// Field.Index.ANALYZED: utilizado quando o campo é de texto livre;
// Field.Index.NOT_ANALYZED: utilizado quando o campo é um ID, data ou númerico.
Document documento = new Document();
documento.add(new TextField("UltimaModificacao", ultimaModificacao,
Store.YES));
documento.add(new TextField("Caminho", arquivo.getAbsolutePath(),
Store.YES));
documento.add(new TextField("Texto", textoExtraido, Store.YES));
try {
// {11} Adiciona o Document no índice, mas este só estará disponível para consulta após o commit.
getWriter().addDocument(documento);
} catch (IOException e) {
logger.error(e);
}
}
public Tika getTika() {
if (tika == null) {
tika = new Tika();
}
return tika;
}
public IndexWriter getWriter() {
return writer;
}
public static void main(String[] args) {
Indexador indexador = new Indexador();
indexador.indexaArquivosDoDiretorio();
}
}