import java.io.*; import mixer.*; import java.sql.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class booking extends HttpServlet{ String html = null; String[] hours = {"08-09", "09-10", "10-11", "11-12", "12-13","13-14", "14-15", "15-16", "16-17"}; String[] rooms = {"Python", "Ruby", "Java", "Perl", "Erlang", "Pascal", "Cobol", "Basic"}; //En hashmap med hjŠlpelement. Enda syftet med dessa Šr att rŠkna ut hur mŒnga tabellceller en bokning upptar. HashMap helper = new HashMap(20); Connection con = null; //PreparedStatement anvŠnds fšr att fŒ bŠttre optimering och slippa sql-injection. PreparedStatement bookStatement = null; PreparedStatement dayBookingsQuery = null; PreparedStatement activeBookingsQuery = null; public void init() throws ServletException{ try{ String url = "jdbc:mysql://localhost/booking"; Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection(url, "josef", "cotaidis"); bookStatement = con.prepareStatement("INSERT INTO roombooking (sdate, edate, room, comment, uid) values (?, ?, ?, ?, ?);"); dayBookingsQuery = con.prepareStatement("SELECT * FROM roombooking WHERE sdate >= ? AND edate <= ? ORDER BY sdate, room;"); activeBookingsQuery = con.prepareStatement("SELECT * FROM roombooking WHERE sdate >= ? AND uid = ? ORDER BY sdate;"); }catch(ClassNotFoundException cnfe){ log("Couldn't load database driver: " + cnfe.getMessage()); }catch(SQLException sqle){ log("SQLException caught: " + sqle.getMessage()); } if (html == null) { //LŠser in htmltexten i variabeln html html = Mixer.getContent(new File(getServletContext().getRealPath("/WEB-INF/classes/booking.html"))); } } public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{ HttpSession session = req.getSession(); Object done = session.getAttribute("logon.isDone"); if (done == null) { //Om sessionen saknar logon.isDone attributet, sparar vi tillfŠlligt undan adressen vi vill gŒ till och anropar servlet/login. session.setAttribute("login.target", HttpUtils.getRequestURL(req).toString() + (req.getQueryString() == null?"":"?" + req.getQueryString())); res.sendRedirect("/booking/servlet/login"); return; } //Skapar en Mixer av htmlkoden dvs parsar den. Mixer mix = new Mixer(html); GregorianCalendar cal = null; GregorianCalendar tmpCal = null; String date = null; //Om servlet/booking inte har nŒgot attribut skapar vi en Calendar fšr att ta reda pŒ dagens datum. if (req.getParameter("ar") == null) cal = (GregorianCalendar)Calendar.getInstance(); else //Annars skapar vi en Calendar men med kŠnt datum. cal = new GregorianCalendar(parseNumber(req.getParameter("ar")), parseNumber(req.getParameter("manad")) -1, parseNumber(req.getParameter("dag"))); date = String.format("%1$tY-%1$tm-%1$td", cal); //Gšr om datumet till ett databasvŠnligt format. java.sql.Timestamp from = java.sql.Timestamp.valueOf(date + " 08:00:00"); java.sql.Timestamp to = java.sql.Timestamp.valueOf(date + " 17:00:00"); ResultSet rs = null; try{ //Ta fram alla bokningar innom det specifika tidsintervallet frŒn databasen. dayBookingsQuery.setTimestamp(1, from); dayBookingsQuery.setTimestamp(2, to); rs = dayBookingsQuery.executeQuery(); }catch(SQLException sqle){ log("SQLException caught: " + sqle.getMessage()); } res.setContentType("text/html"); PrintWriter out = res.getWriter(); try{ mix.add("===today===", getDay(cal.get(Calendar.DAY_OF_WEEK))); }catch(Exception e){ e.getMessage(); } //Ta fram nŠsta och fšregŒende dags datum. tmpCal = (GregorianCalendar)cal.clone(); tmpCal.add(Calendar.DAY_OF_MONTH, -1); mix.add("===prev===", "?ar="+tmpCal.get(Calendar.YEAR)+"&manad="+(tmpCal.get(Calendar.MONTH) + 1)+"&dag="+tmpCal.get(Calendar.DAY_OF_MONTH)); tmpCal.add(Calendar.DAY_OF_MONTH, 2); mix.add("===next===", "?ar="+tmpCal.get(Calendar.YEAR)+"&manad="+(tmpCal.get(Calendar.MONTH)+ 1)+"&dag="+tmpCal.get(Calendar.DAY_OF_MONTH)); mix.add("===date===", date); //RŠkna ut bredden pŒ varje cell mix.add("===width1===", "width=\""+100/(rooms.length+1)+"%\""); for (int i = 0; i < rooms.length; i++){ mix.add("===width2===", "width=\""+100/(rooms.length+1)+"%\""); mix.add("", "===room===", rooms[i]); } //Fyll helper med HelpElement. for (int i = 0; i < rooms.length; i++) helper.put(rooms[i], new HelpElement(0)); for (int i = 0; i < hours.length; i++){ try{ //Sparar undan information om tabellcellerna i hjŠlpelementen. while (rs.next() && rs.getTimestamp("sdate").getHours() == i + 8) helper.get(rs.getString("room")).set((rs.getTimestamp("edate").getHours() - rs.getTimestamp("sdate").getHours()) * -1, rs.getString("comment"), rs.getString("bid")); //GŒr ett steg tillbaka om vi passerar ett visst klockslag i whileloopen. rs.previous(); }catch(SQLException sqle){ log("SQLException caught: " + sqle.getMessage()); } mix.add("", "===hour===", hours[i]); String tmp = ""; //HŠr ritas tabellen/schemat upp en rad i taget, notera att det finns lite htmlkod inbŠddad pga begrŠnsningar i Mixerklassen fšr just den hŠr uppgiften. for (int j = 0; j < rooms.length; j++){ if (helper.get(rooms[j]).get() == 0) //Om det inte finns nŒgon bokning fšr rum X fšr tid Y ska rutan vara tom. tmp = tmp + " "; else{ //Information om bokningen behšver endast skrivas ut en gŒng per cell. Fšr att kunna veta att det Šr fšrsta gŒngen vi behandlar en bokning ger vi den ett negativt vŠrde som vi sedan gšr om till positivt. if (helper.get(rooms[j]).get() < 0){ helper.get(rooms[j]).set(helper.get(rooms[j]).get() * -1); tmp = tmp + "" + helper.get(rooms[j]).getString()+ ""; helper.get(rooms[j]).decrese(); }else{ //Efter att vi negerat den Šr det bara att subtrahera med ett. helper.get(rooms[j]).decrese(); } } } //Vi skriver ut tmp-variabeln mix.add("", "===bookings===", tmp); } String usrname = (String) session.getAttribute("logon.username"); mix.add("===user===", usrname); rs = null; try{ //Ta fram alla bokningar frŒn dagens datum och frammŒt, fšr den inloggade anvŠndaren. activeBookingsQuery.setTimestamp(1, java.sql.Timestamp.valueOf(String.format("%1$tY-%1$tm-%1$td 08:00:00", Calendar.getInstance()))); activeBookingsQuery.setInt(2, ((Integer)req.getSession().getAttribute("logon.isDone")).intValue()); rs = activeBookingsQuery.executeQuery(); String bookDate = null; if (rs.next()){ rs.previous(); //Skriv ut informationen. while (rs.next()){ bookDate = rs.getTimestamp("sdate").toString().substring(0, 10); mix.add("", "===r===", ""+rs.getString("room")); mix.add("", "===ddate===", "?ar=" + bookDate.substring(0, 4) + "&manad=" + bookDate.substring(5, 7) + "&dag=" + parseNumber(bookDate.substring(8, 10))); mix.add("", "===d===", bookDate); mix.add("", "===st===", parseNumber(rs.getTimestamp("sdate").getHours())+":00"); mix.add("", "===sl===", parseNumber(rs.getTimestamp("edate").getHours())+":00"); mix.add("", "===b===", rs.getInt("bid")+""); mix.add("", "===qs===", "&ar="+cal.get(Calendar.YEAR)+"&manad="+(cal.get(Calendar.MONTH) + 1)+"&dag="+cal.get(Calendar.DAY_OF_MONTH)); } }else{ mix.removeHTML(""); mix.removeHTML(""); } }catch(SQLException sqle){ log("SQLException caught: " + sqle.getMessage()); } for (int i = 0; i < rooms.length; i++){ mix.add("", "===number===", rooms[i]); mix.add("", "===roomnumber===", rooms[i]); } for (int i = 8; i <= 17; i++){ mix.add("", "===fromhour===", "" + i); mix.add("", "===fromhournumber===", "kl: " + parseNumber(i)); } for (int i = 8; i <= 17; i++){ mix.add("", "===tohour===", "" + i); mix.add("", "===tohournumber===", "kl: " + parseNumber(i)); } mix.add("===hiddenvalue===", date); mix.add("===hiddenar===", ""+parseNumber(date.substring(0, 4))); mix.add("===hiddenmanad===", ""+parseNumber(date.substring(5, 7))); mix.add("===hiddendag===", parseNumber(date.substring(8, 10))+""); out.println(mix.getMix()); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{ HttpSession session = req.getSession(); Object done = session.getAttribute("logon.isDone"); if (done == null) { //session.setAttribute("login.target", HttpUtils.getRequestURL(req).toString()); res.sendRedirect("/booking/servlet/login"); return; } java.sql.Timestamp from = java.sql.Timestamp.valueOf(req.getParameter("hidden") +" " + req.getParameter("fran") + ":00:00"); java.sql.Timestamp to = java.sql.Timestamp.valueOf(req.getParameter("hidden")+ " " + req.getParameter("till") + ":00:00"); try{ bookStatement.setTimestamp(1, from); bookStatement.setTimestamp(2, to); bookStatement.setString(3, req.getParameter("grupprum")); bookStatement.setString(4, ("".equals(req.getParameter("comment"))?(String)session.getAttribute("logon.username"):req.getParameter("comment"))); bookStatement.setInt(5, ((Integer)session.getAttribute("logon.isDone")).intValue()); bookStatement.executeUpdate(); }catch(SQLException sqle){ log("SQLException caught: " + sqle.getMessage()); } doGet(req, res); } public void destroy(){ try{ con.close(); }catch(SQLException sqle){ log("SQLException caught: " + sqle.getMessage()); } } public int parseNumber(String str){ int tmp = 0; if (str.startsWith("0")) tmp = Integer.parseInt(str.substring(1)); else tmp = Integer.parseInt(str); return tmp; } public String parseNumber(int num){ String tmp = null; if (num < 10) tmp = "0" + Integer.toString(num); else tmp = Integer.toString(num); return tmp; } public String getDay(int day) throws Exception{ String sweDay = null; switch (day){ case 1: sweDay = "Sšndag"; break; case 2: sweDay = "MŒndag"; break; case 3: sweDay = "Tisdag"; break; case 4: sweDay = "Onsdag"; break; case 5: sweDay = "Torsdag"; break; case 6: sweDay = "Fredag"; break; case 7: sweDay = "Lšrdag"; break; default: throw new Exception("Bad day number!"); } return sweDay; } }