Chamar uma classe java pelo Servlet

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();
    }
}

meuObjetoIndexador.indexaArquivosDoDiretorio();

Instancio dentro do servlet?

Sim, não vejo problema nenhum nisso.