// package org.javatrainer; // Jeff: Not needed package esse; /** * @author Anika Sindhwani, with the design and help from Jeff Offutt * Date: August, 2013 * Version 2 */ import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.*; //import java.sql.*; //import javax.servlet.*; //import javax.servlet.http.*; import javax.servlet.ServletException; // import javax.servlet.annotation.WebServlet; // Jeff: Doesn't compile import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; //import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Servlet implementation class StarRating */ // @WebServlet("/ProjectList") // Jeff: Our compiler doesn't support this. public class StarRating extends HttpServlet { // private static final long serialVersionUID = 1L; // Jeff: Not needed /** * @see HttpServlet#doGet (HttpServletRequest request, HttpServletResponse response) */ protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String servletPath = "/expProj/"; // Anika (Jeff: This is not used) // String webServerPath = "/"; // Anika String webServerPath = "http://cs.gmu.edu/~offutt/esse/"; // Jeff // String xmlPath = "c:/eclipse/"; // Anika String xmlPath = "/var/www/CS/webapps/offutt/WEB-INF/data/esse/"; // Jeff // String codeFilePath = "c:/eclipse/Projects/" + fileName + "/"; // Anika String codeFilePath = webServerPath + "Projects/"; // Jeff String fileName = request.getParameter ("name"); String fileLanguage = request.getParameter ("language").toLowerCase(); // Open the XML file and create list of elements File fXmlFile = new File (xmlPath + "projectList.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse (fXmlFile); //get elements from XML doc.getDocumentElement().normalize(); String responseXML = new String(); NodeList nodes = doc.getElementsByTagName ("project"); for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item (i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; //checks data to update the right xml tags String fileNameFromXML = element.getElementsByTagName ("name").item(0).getTextContent(); String fileLanguageFromXML = element.getElementsByTagName ("language").item(0).getTextContent().toLowerCase(); if ((!fileNameFromXML.equals (fileName)) || (!fileLanguageFromXML.equals (fileLanguage))) { continue; } //increase numberOfRatings by 1 int numberOfRatings = Integer.parseInt (element.getElementsByTagName ("numberOfRatings").item(0).getTextContent()); numberOfRatings ++; // Update the number of rankings element.getElementsByTagName ("numberOfRatings").item(0).setTextContent (Integer.toString (numberOfRatings)); //Update the total of all rankings int totalStars = Integer.parseInt (element.getElementsByTagName ("totalStars").item(0).getTextContent()); int newRatingFromUser = Integer.parseInt (request.getParameter ("rating")); totalStars += newRatingFromUser; String newTotalStars = Integer.toString (totalStars); element.getElementsByTagName ("totalStars").item(0).setTextContent (newTotalStars); float Average = (float) totalStars / (float) numberOfRatings; String newAverage = String.format ("%1.1f",Average); // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource (doc); StreamResult result = new StreamResult (new File (xmlPath + "projectList.xml")); transformer.transform (source, result); response.setContentType ("text/xml"); PrintWriter out = response.getWriter(); // prepare the response in XML format responseXML = ""; responseXML += ""; responseXML += "" + newAverage + ""; responseXML += " " + numberOfRatings + ""; responseXML += ""; out.write (responseXML); out.close(); } // end if (node.getNodeType() == Node.ELEMENT_NODE) } // end for } catch (Exception e) { e.printStackTrace(); } } }