/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package controller;
import domain.Diagram;
import domain.Report;
import compareAlgorithm.CompareDiagrams;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import repository.DiagramDAO;
import repository.ReportDAO;
/**
*
* @author Pratham
*/
/**
* Information class that contains all the features of one Compare
* @ doc author Rui Hou
*/
@WebServlet(name = "Compare", urlPatterns = { "/Compare" })
public class Compare extends HttpServlet {
private int diagramID1;
private int diagramID2;
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
this.diagramID1 = Integer.parseInt(request.getParameter("file1"));
this.diagramID2 = Integer.parseInt(request.getParameter("file2"));
Diagram diagram1 = DiagramDAO.getDiagram(this.diagramID1);
Diagram diagram2 = DiagramDAO.getDiagram(this.diagramID2);
CompareDiagrams compareObj = new CompareDiagrams(
context.getRealPath(diagram1.getFilePath()),
context.getRealPath(diagram2.getFilePath()),
context.getRealPath("/reports/"));
try {
String path = compareObj.process();
this.saveReport(path);
// this.showPdf(path, request, response);
request.setAttribute("reportPath", path);
request.setAttribute("path1",
"uploads/" + diagram1.getDiagramName());
request.setAttribute("path2",
"uploads/" + diagram2.getDiagramName());
request.setAttribute("val1", diagram1.getDiagramId());
request.setAttribute("val2", diagram2.getDiagramId());
RequestDispatcher dispatcher = request
.getRequestDispatcher("WEB-INF/JSP/promote.jsp");
dispatcher.forward(request, response);
} catch (Exception ex) {
Logger.getLogger(Compare.class.getName()).log(Level.SEVERE, null,
ex);
}
}
// <editor-fold defaultstate="collapsed"
// desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
/**
*
* @param path
* the path which the report file was set
*/
private void saveReport(String path) {
Report reportObj = new Report();
reportObj.setDiagramA(this.diagramID1);
reportObj.setDiagramB(this.diagramID2);
reportObj.setReportFilePath(path);
ReportDAO.addReport(reportObj);
}
/**
* @throws IOException
* if an I/O error occurs
*/
public void showPdf(String fileName, HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "inline;attachment;filename="
+ fileName);
ByteArrayOutputStream baos = getByteArrayOutputStream(fileName);
response.setContentLength(baos.size());
ServletOutputStream sos = response.getOutputStream();
baos.writeTo(sos);
sos.flush();
}
/**
* @throws IOException
* if an I/O error occurs
*/
public ByteArrayOutputStream getByteArrayOutputStream(String fileName)
throws IOException {
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum); // no doubt here is 0
// Writes len bytes from the specified byte array starting at
// offset off to this byte array output stream.
System.out.println("read " + readNum + " bytes,");
}
} catch (IOException ex) {
ex.printStackTrace();
}
return bos;
}
}