· 7 years ago · Sep 05, 2018, 02:34 AM
1/**
2* Datenbankinterface
3* @author Sven Kreiter
4* @version 1.0
5*/
6
7package edu.hm.cc.rest.model;
8
9import java.sql.SQLException;
10import javax.naming.*;
11import javax.sql.*;
12import java.sql.*;
13import java.util.ArrayList;
14import java.util.Calendar;
15import java.util.Date;
16
17
18/**
19 *
20 * Klasse um Client Nachrichten zu speichern und abzufragen.
21 * @author Sven Kreiter
22 *
23 */
24public class DBInterface
25{
26
27 /**
28 * Speichert eine CLient Nachricht in der Datenbank
29 * @param mesg
30 * @return bei erfolgreicher Speicherung der Nachricht true, ansonsten false
31 */
32 public boolean saveMessage(HumanMessage mesg)
33 {
34 String author = mesg.getAuthor();
35 String message = mesg.getMessage();
36
37 Connection conn = this.getDBConnection();
38
39 try {
40 //Schreibt die Informationen aus dem HumanMessage Objekt in die Datenbank
41 //Um SQL-Injection vorzubeugen werden PreparedStatements verwendet
42 PreparedStatement preparedStatement = conn.prepareStatement("INSERT INTO messages (author, message, timestamp) VALUES (?, ?, ?)");
43 preparedStatement.setString(1, author);
44 preparedStatement.setString(2, message);
45
46 Timestamp currentTimestamp = this.getCurrentTimestamp();
47 preparedStatement.setTimestamp(3, currentTimestamp);
48
49 preparedStatement.executeUpdate();
50
51 conn.close();
52
53 } catch (SQLException e) {
54 e.printStackTrace();
55 return false;
56 }
57
58 return true;
59 }
60
61
62 /**
63 *
64 * @param keyword Das Suchwort, welches in der Nachricht vorkommen soll
65 * @param amount Die Anzahl an Nachrichten die zurück geliefert werden sollen
66 * @param startId ID der Nachricht ab der gesucht wird
67 * @return ArrayList mit bestimmter Anzahl an Nachrichten
68 */
69 public ArrayList<HumanMessage> getMessages(String keyword, int amount, int startId)
70 {
71 ArrayList<HumanMessage> messages = new ArrayList<HumanMessage>();
72
73 Connection conn = this.getDBConnection();
74 try {
75 ResultSet rst = null;
76 //Beim ersten Aufruf werden die neusten Nachrichten zurück geliefert
77 if(startId == -1)
78 {
79 String sql = "SELECT id,author,message,timestamp FROM messages WHERE messages LIKE ? ORDER BY timestamp DESC LIMIT 0, ?";
80
81 PreparedStatement preparedStatement = conn.prepareStatement(sql);
82 preparedStatement.setString(1, "%" + keyword + "%");
83 preparedStatement.setInt(2, amount);
84
85 rst = preparedStatement.executeQuery();
86 }
87 //Ansonsten werden alle älteren Nachrichten ab einer bestimmten ID zurück geliefert
88 else {
89 String sql = "SELECT timestamp FROM messages WHERE id = ?";
90 PreparedStatement preparedStatement = conn.prepareStatement(sql);
91 preparedStatement.setInt(1,startId);
92
93 rst = preparedStatement.executeQuery();
94
95 Timestamp messageTimestamp = null;
96 while (rst.next()){
97 messageTimestamp = rst.getTimestamp(1);
98 }
99
100 sql = "SELECT id,author,message,timestamp FROM messages WHERE timestamp < ? AND message LIKE ? ORDER BY timestamp DESC LIMIT 0, ?";
101 preparedStatement = conn.prepareStatement(sql);
102 preparedStatement.setTimestamp(1, messageTimestamp);
103 //Das Suchwort kann in jeglicher Form in der Nachricht vorkommen, dafür die Wildcards '%'
104 preparedStatement.setString(2, "%" + keyword + "%");
105 preparedStatement.setInt(3, amount);
106
107 rst = preparedStatement.executeQuery();
108 }
109
110 //hier wird das Ergebnis durchlaufen und in einer Array-list gespeichert, die zurück gegeben wird
111 while(rst.next())
112 {
113 int id = rst.getInt(1);
114 String author = rst.getString(2);
115 String mesg = rst.getString(3);
116 Timestamp timestamp = rst.getTimestamp(4);
117
118 HumanMessage tempMesg = new HumanMessage(author, mesg);
119 tempMesg.setTimestamp(timestamp);
120 tempMesg.setId(id);
121
122 messages.add(tempMesg);
123 }
124 conn.close();
125
126 } catch (SQLException e) {
127 e.printStackTrace();
128 }
129
130 return messages;
131 }
132
133 /**
134 *
135 * @return Momentanen Zeitstempel
136 */
137 private Timestamp getCurrentTimestamp()
138 {
139 Calendar calendar = Calendar.getInstance();
140 Date now = calendar.getTime();
141 Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime());
142
143 return currentTimestamp;
144 }
145
146 /**
147 * Es wird eine Verbindung zu der Datenbank erzeugt, mit der SQL-Queries ausführen kann
148 * @return Datenbank-Connection
149 */
150 private Connection getDBConnection()
151 {
152 Connection conn;
153 try
154 {
155 //JNDI Initial context
156 Context initCtx = new InitialContext();
157 //DataSource wird von DB angefordert
158 Context envCtx = (Context) initCtx.lookup("java:comp/env");
159 DataSource ds = (DataSource)envCtx.lookup("jdbc/rest");
160 conn = ds.getConnection();
161 return conn;
162 }
163 catch (Exception e)
164 {
165 conn = null;
166 }
167
168 return conn;
169 }
170
171 public void resetTable()
172 {
173 this.deleteTable();
174 this.createTable();
175 }
176
177 private void createTable()
178 {
179 String sql = "CREATE TABLE IF NOT EXISTS 'messages'"+
180 "('id' int(11) NOT NULL AUTO_INCREMENT," +
181 "'author' varchar(150) NOT NULL,"+
182 "'message' text NOT NULL,"+
183 "'timestamp' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,"+
184 "PRIMARY KEY ('id')"+
185 ") ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;";
186
187 Connection conn = this.getDBConnection();
188 try {
189 PreparedStatement preparedStatement = conn.prepareStatement(sql);
190 preparedStatement.executeQuery();
191 conn.close();
192 } catch (SQLException e) {
193 e.printStackTrace();
194 }
195 return;
196 }
197
198 private void deleteTable()
199 {
200
201 String sql = "DROP TABLE messages";
202
203 Connection conn = this.getDBConnection();
204 try {
205 PreparedStatement preparedStatement = conn.prepareStatement(sql);
206 preparedStatement.executeQuery();
207 conn.close();
208 } catch (SQLException e) {
209 e.printStackTrace();
210 }
211 return;
212 }
213
214
215
216
217}