2017-06-23 19:21:56 -04:00
|
|
|
/* Copyright (c) 2017 Christopher Cromer
|
|
|
|
* Copyright (c) 2017 Carlos Faúndez
|
|
|
|
*
|
|
|
|
* This file is part of mt. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution.
|
|
|
|
* This file may not be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
2017-07-03 20:46:11 -04:00
|
|
|
package cl.cromer.mt;
|
2017-06-23 19:21:56 -04:00
|
|
|
|
|
|
|
import org.w3c.dom.Document;
|
2017-07-06 11:59:51 -04:00
|
|
|
import org.w3c.dom.NodeList;
|
2017-06-23 19:21:56 -04:00
|
|
|
|
2017-07-06 11:59:51 -04:00
|
|
|
import javax.print.Doc;
|
2017-06-28 23:54:27 -04:00
|
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
|
|
import java.io.*;
|
|
|
|
|
2017-06-23 19:21:56 -04:00
|
|
|
/**
|
2017-07-06 11:59:51 -04:00
|
|
|
* Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase_.dtd
|
2017-06-23 19:21:56 -04:00
|
|
|
*/
|
|
|
|
class LeerXML {
|
|
|
|
/**
|
2017-06-24 22:10:58 -04:00
|
|
|
* El metodo va a verificar que el archivo existe y que contiene XML valido. Si es valido devuelve el documento.
|
2017-06-23 19:21:56 -04:00
|
|
|
*
|
|
|
|
* @param archivo Es el archivo a abrir.
|
2017-06-24 22:10:58 -04:00
|
|
|
*
|
|
|
|
* @return Devuelve un document de XML o null si hay algun error.
|
2017-06-23 19:21:56 -04:00
|
|
|
*/
|
2017-06-24 22:10:58 -04:00
|
|
|
Document leerArchivo(File archivo) {
|
2017-06-28 23:54:27 -04:00
|
|
|
if (archivo == null) {
|
2017-06-28 10:09:44 -04:00
|
|
|
return null;
|
|
|
|
}
|
2017-06-28 23:54:27 -04:00
|
|
|
if (!archivo.exists()) {
|
|
|
|
MT.mostrarMensaje("Error", "Archivo " + archivo.getName() + " no existe!");
|
2017-06-24 12:45:22 -04:00
|
|
|
return null;
|
|
|
|
}
|
2017-07-03 18:08:53 -04:00
|
|
|
Document dc = createDocument(archivo);
|
2017-07-04 23:34:45 -04:00
|
|
|
if (dc == null) {
|
2017-07-03 18:08:53 -04:00
|
|
|
return validarXML(archivo);
|
|
|
|
}
|
|
|
|
return dc;
|
2017-06-24 12:45:22 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-06-24 22:10:58 -04:00
|
|
|
* Crear un documento de XML
|
|
|
|
*
|
|
|
|
* @param archivo Es el archivo XML
|
2017-06-24 12:45:22 -04:00
|
|
|
*
|
2017-06-24 22:10:58 -04:00
|
|
|
* @return Retorna un document del XML o null si hay algun error.
|
2017-06-24 12:45:22 -04:00
|
|
|
*/
|
2017-06-24 22:10:58 -04:00
|
|
|
private Document createDocument(File archivo) {
|
2017-06-28 23:54:27 -04:00
|
|
|
Document documento;
|
2017-06-23 19:21:56 -04:00
|
|
|
try {
|
|
|
|
if (!archivo.exists()) {
|
2017-06-28 23:54:27 -04:00
|
|
|
MT.mostrarMensaje("Error", "Archivo " + archivo.getName() + " no existe!");
|
2017-06-23 19:21:56 -04:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
2017-06-24 12:45:22 -04:00
|
|
|
dbf.setValidating(true);
|
2017-06-23 19:21:56 -04:00
|
|
|
dbf.setNamespaceAware(true);
|
|
|
|
|
|
|
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
2017-06-28 23:54:27 -04:00
|
|
|
documento = db.parse(archivo);
|
|
|
|
documento.getDocumentElement().normalize();
|
2017-07-06 11:59:51 -04:00
|
|
|
if(validarEtiquetas(documento)){
|
|
|
|
return documento;
|
|
|
|
}
|
|
|
|
return null;
|
2017-06-23 19:21:56 -04:00
|
|
|
}
|
2017-06-24 22:10:58 -04:00
|
|
|
catch (Exception e) {
|
|
|
|
if (e.getMessage().contains(".dtd")) {
|
2017-06-24 12:45:22 -04:00
|
|
|
return validarXML(archivo);
|
|
|
|
}
|
2017-07-03 21:41:26 -04:00
|
|
|
MT.mostrarMensaje("Error", "El archivo " + archivo.getName() + " no contiene xml valido!");
|
2017-06-23 19:21:56 -04:00
|
|
|
System.out.println(e.getMessage());
|
|
|
|
e.printStackTrace();
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-06-24 22:10:58 -04:00
|
|
|
* Este metodo se usa para validar el XML.
|
|
|
|
*
|
|
|
|
* @param original es el archivo original del XML
|
2017-06-24 12:45:22 -04:00
|
|
|
*
|
2017-06-24 22:14:06 -04:00
|
|
|
* @return Retorna un document de un XML arreglado, null si el xml no es coherente a lo que se pide
|
2017-06-23 19:21:56 -04:00
|
|
|
*/
|
2017-06-24 22:10:58 -04:00
|
|
|
private Document validarXML(File original) {
|
2017-06-24 12:45:22 -04:00
|
|
|
File temp = fixXML(original);
|
2017-06-24 22:10:58 -04:00
|
|
|
if (temp == null) {
|
|
|
|
return null;
|
|
|
|
}
|
2017-06-28 23:54:27 -04:00
|
|
|
Document documento = createDocument(temp);
|
2017-06-24 22:10:58 -04:00
|
|
|
if (!temp.delete()) {
|
2017-06-28 23:54:27 -04:00
|
|
|
MT.mostrarMensaje("Error", "No se puede borrar el archivo " + temp.getName());
|
2017-06-24 22:10:58 -04:00
|
|
|
}
|
2017-06-28 23:54:27 -04:00
|
|
|
if (documento != null) {
|
|
|
|
return documento;
|
2017-06-24 22:10:58 -04:00
|
|
|
}
|
2017-06-24 12:45:22 -04:00
|
|
|
return null;
|
|
|
|
}
|
2017-06-23 19:21:56 -04:00
|
|
|
|
2017-06-24 12:45:22 -04:00
|
|
|
/**
|
2017-06-24 22:14:06 -04:00
|
|
|
* Arreglar el archivo de XML si no es valido.
|
2017-06-24 12:45:22 -04:00
|
|
|
*
|
2017-06-24 22:14:06 -04:00
|
|
|
* @param original Es el archivo XML sin cambios
|
2017-06-24 22:10:58 -04:00
|
|
|
*
|
2017-06-24 22:14:06 -04:00
|
|
|
* @return un file de XML adaptado para ser validado
|
2017-06-24 12:45:22 -04:00
|
|
|
*/
|
2017-06-24 22:10:58 -04:00
|
|
|
private File fixXML(File original) {
|
|
|
|
String aux;
|
2017-06-24 12:45:22 -04:00
|
|
|
File temp;
|
2017-06-24 22:10:58 -04:00
|
|
|
try {
|
2017-06-24 12:45:22 -04:00
|
|
|
temp = new File("temp.xml");
|
|
|
|
BufferedReader br = new BufferedReader(new FileReader(original));
|
|
|
|
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
|
2017-06-24 22:10:58 -04:00
|
|
|
if ((aux = br.readLine()).startsWith("<?xml")) {
|
2017-07-06 11:59:51 -04:00
|
|
|
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase_.dtd\">");
|
2017-06-24 22:10:58 -04:00
|
|
|
}
|
|
|
|
else {
|
2017-07-06 11:59:51 -04:00
|
|
|
bw.write("<!DOCTYPE root SYSTEM \"mtbase_.dtd\">\n" + aux);
|
2017-06-24 12:45:22 -04:00
|
|
|
}
|
2017-06-24 22:10:58 -04:00
|
|
|
for (aux = ""; aux != null; aux = br.readLine()) {
|
|
|
|
if (!aux.startsWith("<!DOCTYPE")) {
|
|
|
|
bw.write(aux + "\n");
|
|
|
|
}
|
2017-06-24 12:45:22 -04:00
|
|
|
}
|
|
|
|
bw.close();
|
2017-06-24 22:10:58 -04:00
|
|
|
}
|
|
|
|
catch (Exception e) {
|
|
|
|
return null;
|
|
|
|
}
|
2017-06-24 12:45:22 -04:00
|
|
|
return temp;
|
|
|
|
}
|
2017-07-06 11:59:51 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Valida las etiquetas en el XML
|
|
|
|
*
|
|
|
|
* @param document XML a analizar
|
|
|
|
*
|
|
|
|
* @return Verdadero si esta correcto, caso contrario falso
|
|
|
|
*/
|
|
|
|
private boolean validarEtiquetas(Document document) {
|
|
|
|
NodeList etiquetas = document.getElementsByTagName("*");
|
|
|
|
for (int i = 0; i < etiquetas.getLength(); i++) {
|
|
|
|
switch (etiquetas.item(i).getNodeName()) {
|
|
|
|
case "root":
|
|
|
|
break;
|
|
|
|
case "transicion":
|
|
|
|
break;
|
|
|
|
case "qi":
|
|
|
|
break;
|
|
|
|
case "si":
|
|
|
|
break;
|
|
|
|
case "qj":
|
|
|
|
break;
|
|
|
|
case "sj":
|
|
|
|
break;
|
|
|
|
case "movimiento":
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2017-06-23 19:21:56 -04:00
|
|
|
}
|