PageRenderTime 3ms CodeModel.GetById 427ms app.highlight 142ms RepoModel.GetById 73ms app.codeStats 1ms

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