PageRenderTime 22ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/ManejadorBD/src/es/auto/DBManager/DBManager.java

http://projectautoescuela.googlecode.com/
Java | 335 lines | 264 code | 52 blank | 19 comment | 19 complexity | 69d315d982853cee200bb4aad1b1b708 MD5 | raw file
  1. package es.auto.DBManager;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.awt.image.BufferedImage;
  5. import java.io.ByteArrayInputStream;
  6. import java.io.ByteArrayOutputStream;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.sql.Connection;
  11. import java.sql.DriverManager;
  12. import java.sql.PreparedStatement;
  13. import java.sql.ResultSet;
  14. import java.sql.SQLException;
  15. import java.sql.Statement;
  16. import java.util.Iterator;
  17. import java.util.List;
  18. import java.util.StringTokenizer;
  19. import javax.imageio.ImageIO;
  20. import javax.swing.ImageIcon;
  21. import es.auto.cipher.CipherManager;
  22. import es.auto.data.Permiso;
  23. import es.auto.data.Pregunta;
  24. import es.auto.data.Test;
  25. public class DBManager{
  26. private Connection conn;
  27. private Statement stat;
  28. public DBManager() throws ClassNotFoundException{
  29. Class.forName("org.sqlite.JDBC");
  30. }
  31. public void connect(String dbName) throws SQLException{
  32. File f = new File(dbName);
  33. if (f.exists()){
  34. System.out.println("Base de datos ya existente: se procede a borrarla y crear una nueva...");
  35. f.delete();
  36. }
  37. conn = DriverManager.getConnection("jdbc:sqlite:"+dbName);
  38. stat = conn.createStatement();
  39. }
  40. public void disconnect() throws SQLException{
  41. conn.close();
  42. }
  43. public void createTables() throws SQLException {
  44. stat.execute("CREATE TABLE \"auto_user\" ("+
  45. "\"user_id\" integer NOT NULL PRIMARY KEY,"+
  46. "\"nombre\" varchar(30) NOT NULL,"+
  47. "\"fecha\" date DEFAULT CURRENT_DATE NOT NULL);");
  48. stat.execute("CREATE TABLE \"auto_permiso\" ("+
  49. "\"permiso_id\" integer NOT NULL PRIMARY KEY,"+
  50. "\"nombre\" varchar(30) NOT NULL,"+
  51. "\"descripcion\" text NOT NULL,"+
  52. "\"fecha\" date DEFAULT CURRENT_DATE NOT NULL);");
  53. stat.execute("CREATE TABLE \"auto_test\" ("+
  54. "\"test_id\" integer NOT NULL PRIMARY KEY,"+
  55. "\"test_num\" integer NOT NULL,"+
  56. "\"permiso_id\" integer NOT NULL REFERENCES \"auto_permiso\" (\"permiso_id\"),"+
  57. "\"creador_id\" integer NOT NULL REFERENCES \"auto_user\" (\"user_id\"),"+
  58. "\"fecha\" date DEFAULT CURRENT_DATE NOT NULL,"+
  59. "UNIQUE(test_num,permiso_id));");
  60. stat.execute("CREATE TABLE \"auto_pregunta\" ("+
  61. "\"pregunta_id\" integer NOT NULL PRIMARY KEY,"+
  62. "\"numero\" integer NOT NULL,"+
  63. "\"test_id\" integer NOT NULL REFERENCES \"auto_test\" (\"test_id\"),"+
  64. "\"texto\" text NOT NULL,"+
  65. "\"fecha\" date DEFAULT CURRENT_DATE NOT NULL,"+
  66. "\"imagen\" BLOB NOT NULL,"+
  67. "UNIQUE(\"numero\",\"test_id\"));");
  68. stat.execute("CREATE TABLE \"auto_respuesta\" ("+
  69. "\"respuesta_id\" integer NOT NULL PRIMARY KEY,"+
  70. "\"orden\" integer NOT NULL,"+
  71. "\"pregunta_id\" integer NOT NULL REFERENCES \"auto_pregunta\" (\"pregunta_id\"),"+
  72. "\"texto\" text NOT NULL,"+
  73. "\"correcta\" bool NOT NULL DEFAULT false,"+
  74. "\"fecha\" date DEFAULT CURRENT_DATE NOT NULL,"+
  75. "UNIQUE(orden,pregunta_id));");
  76. }
  77. public void insertUsuarios() throws SQLException{
  78. stat.executeUpdate("insert into auto_user (user_id,nombre,fecha) values (1, 'root', CURRENT_DATE);");
  79. }
  80. public void insertPermisos() throws SQLException{
  81. //strftime(\"%d/%m/%Y\",'now','localtime')
  82. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (1, '"+Permiso.TipoPermiso.AM+"', 'Permiso AM');");
  83. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (2, '"+Permiso.TipoPermiso.A1+"', 'Permiso A1');");
  84. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (3, '"+Permiso.TipoPermiso.A2+"', 'Permiso A2');");
  85. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (4, '"+Permiso.TipoPermiso.A+"', 'Permiso A');");
  86. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (5, '"+Permiso.TipoPermiso.B+"', 'Permiso B');");
  87. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (6, '"+Permiso.TipoPermiso.BE+"', 'Permiso BE');");
  88. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (7, '"+Permiso.TipoPermiso.C1+"', 'Permiso C1');");
  89. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (8, '"+Permiso.TipoPermiso.C1E+"', 'Permiso C1E');");
  90. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (9, '"+Permiso.TipoPermiso.C+"', 'Permiso C');");
  91. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (10, '"+Permiso.TipoPermiso.CE+"', 'Permiso CE');");
  92. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (11, '"+Permiso.TipoPermiso.D1+"', 'Permiso D1');");
  93. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (12, '"+Permiso.TipoPermiso.D1E+"', 'Permiso D1E');");
  94. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (13, '"+Permiso.TipoPermiso.D+"', 'Permiso D');");
  95. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (14, '"+Permiso.TipoPermiso.DE+"', 'Permiso DE');");
  96. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (15, '"+Permiso.TipoPermiso.E+"', 'Permiso E');");
  97. stat.executeUpdate("insert into auto_permiso (permiso_id,nombre,descripcion) values (16, '"+Permiso.TipoPermiso.BTP+"', 'Permiso BTP');");
  98. }
  99. /**
  100. * Inserta en la BD la información de todos los TESTS proveniente de la lista con todos los Permisos
  101. * @param listaPermisos Lista de permisos, los cuales contienen cada uno una lista de TESTs
  102. * @throws SQLException
  103. */
  104. public void insertTests(List<Permiso> listaPermisos) throws SQLException{
  105. int testID=1;
  106. Permiso p;
  107. StringTokenizer idPermiso;
  108. Iterator<Integer> iteradorConjuntoDeTests;
  109. Integer numTest;
  110. Iterator<Permiso> iter = listaPermisos.iterator();
  111. while (iter.hasNext()){ // Para cada permiso
  112. p = iter.next();
  113. iteradorConjuntoDeTests = p.getTests().keySet().iterator();
  114. while (iteradorConjuntoDeTests.hasNext()){ // Para cada test del permiso p
  115. numTest = iteradorConjuntoDeTests.next();
  116. idPermiso = new StringTokenizer(getSelectResult("auto_permiso", "UPPER(nombre)='"+p.getPermiso()+"'"));
  117. stat.executeUpdate("insert into auto_test (test_id,test_num,permiso_id,creador_id) values ("+testID+","+p.getTests().get(numTest).getNumeroDeTest()+","+idPermiso.nextToken()+", 1);");
  118. testID++;
  119. }
  120. }
  121. }
  122. public void insertPreguntasYrespuestas(List<Permiso> listaPermisos, boolean cifrar) throws SQLException{
  123. String letras = "ABC";
  124. int preguntaID=1, respuestaID=1;
  125. int preguntaOrden=1, respuestaOrden=1;
  126. Permiso permiso;
  127. Test test;
  128. Pregunta pregunta;
  129. Iterator<Integer> iteradorConjuntoDeTests,iteradorConjuntoDePreguntas;
  130. String idTest;
  131. byte[] foto;
  132. String lineaTemporal = null;
  133. Iterator<Permiso> iter = listaPermisos.iterator();
  134. while (iter.hasNext()){ // Para cada permiso
  135. permiso = iter.next(); //Obtengo el permiso
  136. iteradorConjuntoDeTests = permiso.getTests().keySet().iterator();
  137. while (iteradorConjuntoDeTests.hasNext()){ // Para cada test del permiso p
  138. test = permiso.getTests().get(iteradorConjuntoDeTests.next()); // Obtengo el test
  139. preguntaOrden=1;
  140. iteradorConjuntoDePreguntas = test.getPreguntas().keySet().iterator();
  141. while (iteradorConjuntoDePreguntas.hasNext()){ // Para cada pregunta del test t del permiso p
  142. pregunta = test.getPreguntas().get(iteradorConjuntoDePreguntas.next()); // Obtengo la pregunta
  143. // Obtener el id del Test
  144. ResultSet rs = stat.executeQuery("select T.test_id from auto_permiso P, auto_test T where (T.permiso_id=P.permiso_id) AND (P.nombre='"+permiso.getPermiso().toString()+"') AND (T.test_num="+test.getNumeroDeTest()+")");
  145. idTest = (rsToString(rs));
  146. rs.close();
  147. //Obtener foto
  148. foto = getImageAsByteArray(toBufferedImage(loadImageFromPath(pregunta.getFotoPath())));
  149. if (cifrar){
  150. lineaTemporal = CipherManager.getEncodedWithMD5(pregunta.getPregunta());
  151. }else{
  152. lineaTemporal = pregunta.getPregunta();
  153. }
  154. //System.out.println("Permiso: "+permiso.getPermiso()+" Test: "+test.getNumeroDeTest()+" -> insert into auto_pregunta (id,orden,test_id,texto) values ("+preguntaID+","+preguntaOrden+","+idTest+",'"+lineaTemporal+"');");
  155. PreparedStatement ps = conn.prepareStatement("insert into auto_pregunta (pregunta_id,numero,test_id,texto,imagen) values ("+preguntaID+","+preguntaOrden+","+idTest+",'"+lineaTemporal+"',?);");
  156. ps.setBytes(1, foto);
  157. ps.executeUpdate();
  158. ps.close();
  159. respuestaOrden=1;
  160. for( char c = letras.charAt(0); c<= letras.charAt(pregunta.getRespuestas().size()-1); c++){ // Para cada respuesta que exista
  161. if (cifrar){
  162. lineaTemporal = CipherManager.getEncodedWithMD5(pregunta.getRespuestas().get(c));
  163. }else{
  164. lineaTemporal = pregunta.getRespuestas().get(c);
  165. }
  166. //System.out.println("insert into auto_respuesta (id,orden,pregunta_id,texto,correcta) values ("+respuestaID+","+respuestaOrden+","+preguntaID+",'"+lineaTemporal+"','"+new Integer(respuestaOrden).equals(letras.indexOf(pregunta.getCorrecta()))+"');");
  167. stat.executeUpdate("insert into auto_respuesta (respuesta_id,orden,pregunta_id,texto,correcta) values ("+respuestaID+","+respuestaOrden+","+preguntaID+",'"+lineaTemporal+"','"+new Integer(respuestaOrden).equals(letras.indexOf(pregunta.getCorrecta()))+"');");
  168. respuestaID++;
  169. respuestaOrden++;
  170. }
  171. preguntaID++;
  172. preguntaOrden++;
  173. }
  174. }
  175. }
  176. }
  177. public String getSelectResult(String tablename, String whereCondition) throws SQLException{
  178. String out = "";
  179. ResultSet rs = null;
  180. if (whereCondition==null){
  181. rs = stat.executeQuery("select * from "+tablename+";");
  182. }else{
  183. rs = stat.executeQuery("select * from "+tablename+" where "+whereCondition+";");
  184. }
  185. out = rsToString(rs);
  186. return out;
  187. }
  188. public BufferedImage getImage(int id){
  189. ResultSet rs;
  190. BufferedImage image = null;
  191. try {
  192. rs = stat.executeQuery("SELECT imagen FROM auto_pregunta WHERE pregunta_id="+id);
  193. byte[] bytes = rs.getBytes("imagen");
  194. InputStream in = new ByteArrayInputStream(bytes);
  195. image = ImageIO.read(in);
  196. in.close();
  197. } catch (SQLException e) {
  198. e.printStackTrace();
  199. } catch (IOException e) {
  200. e.printStackTrace();
  201. }
  202. return image;
  203. }
  204. public int getSize(){
  205. ResultSet rs;
  206. int result = 0;
  207. try {
  208. rs = stat.executeQuery("SELECT count(*) FROM auto_pregunta");
  209. result = rs.getInt(1);
  210. } catch (SQLException e) {
  211. e.printStackTrace();
  212. }
  213. return result;
  214. }
  215. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  216. // //
  217. // FUNCIONES PRIVADAS //
  218. // //
  219. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  220. private String rsToString(ResultSet rs) throws SQLException{
  221. String out = "";
  222. while (rs.next()) { //mientras existan tuplas
  223. int i = 1;
  224. while(true){
  225. try{
  226. out = out + rs.getString(i)+" ";
  227. i++;
  228. }catch (SQLException e){
  229. i=1;
  230. out = out + "\n";
  231. break;
  232. }
  233. }
  234. }
  235. if ((out!=null) && (!out.equals("")) && (out.charAt(out.length()-1)=='\n')){
  236. out = out.substring(0, out.length()-1);
  237. if(out.charAt(out.length()-1)==' '){
  238. out = out.substring(0, out.length()-1);
  239. }
  240. }
  241. rs.close();
  242. return out;
  243. }
  244. private byte[] getImageAsByteArray(BufferedImage image) {
  245. if (image!=null) {
  246. byte[] imageBytes;
  247. ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
  248. try {
  249. ImageIO.write(image, "jpg", baos);
  250. } catch (IOException e) {
  251. e.printStackTrace();
  252. }
  253. imageBytes = baos.toByteArray();
  254. image.flush();
  255. image = null;
  256. return imageBytes;
  257. } else {
  258. System.out.println("Error : image is null");
  259. byte[] imageNullBytes = new byte[0];
  260. return imageNullBytes;
  261. }
  262. }
  263. private BufferedImage toBufferedImage(Image image) {
  264. /* miramos uqe la imagen no sea ya una instancia de BufferedImage */
  265. if( image instanceof BufferedImage ) {
  266. /*no hay que hacer nada */
  267. return( (BufferedImage)image );
  268. } else {
  269. /* nos aseguramos que la imagen está totalmente cargada */
  270. image = new ImageIcon(image).getImage();
  271. /* creamos la nueva imagen */
  272. BufferedImage bufferedImage = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB );
  273. Graphics g = bufferedImage.createGraphics();
  274. g.drawImage(image,0,0,null);
  275. g.dispose();
  276. image = null;
  277. return( bufferedImage );
  278. }
  279. }
  280. private Image loadImageFromPath(String imagePath){
  281. return java.awt.Toolkit.getDefaultToolkit().getImage(imagePath);
  282. }
  283. }