package negocio;

import interfaz.Principal;

import java.io.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.w3c.dom.*;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

import persistencia.UtilidadHibernate;

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;



public class claseXML {
	
 //IMPORTAR XML	
 public static boolean CrearXML(String path, Plantilla plant, boolean es_desarrollador, Principal principal) {
	  Session sesion = UtilidadHibernate.getSessionFactory().openSession();
	  int tipo_arquitectura = -1;;
  try {
	  DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	  DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
	  Document doc = dBuilder.parse(new File(path));
	  doc.getDocumentElement().normalize();

	  if ((doc.getDocumentElement().getNodeName()).equals("Arquitectura_plantilla"))
		  tipo_arquitectura = 0;
	  else if((doc.getDocumentElement().getNodeName()).equals("Arquitectura_proyecto"))
		  tipo_arquitectura = 1;
	  
	  //System.out.println("El elemento raiz es: " + doc.getDocumentElement().getNodeName());
	  NodeList listaPlantillas = doc.getElementsByTagName("Plantilla");

	  for (int i = 0; i < listaPlantillas.getLength(); i ++) {

	    Node p = listaPlantillas.item(i);

	    if (p.getNodeType() == Node.ELEMENT_NODE) {

            Element elemento = (Element) p;

            sesion = UtilidadHibernate.getSessionFactory().openSession();
			
            Transaction tx = sesion.beginTransaction();

            Calendar c1 = Calendar.getInstance();
            Calendar c2 = new GregorianCalendar();
            String dia = Integer.toString(c1.get(Calendar.DATE));
            String mes = Integer.toString(c1.get(Calendar.MONTH)+1);
            String annio = Integer.toString(c1.get(Calendar.YEAR));
            
            Plantilla plantilla = new Plantilla();
            String id_plantilla_inicial = getTagValue("id_plantilla", elemento);
            /*String nombre_inicial = getTagValue("nombre", elemento);
            String descripcion_inicial = getTagValue("descripcion", elemento);*/
            
            plantilla.setNombre(getTagValue("nombre", elemento)+"[i]");
            plantilla.setDescripcion(getTagValue("descripcion", elemento)+"\n\nImport date: "+dia+"/"+mes+"/"+annio+" - " +c1.getTime().getHours()+":"+c1.getTime().getMinutes()+" h");

            //FICHERO CON ARQUITECTURA FRAMEWORK Y EN MODO DESARROLLADOR = OK
	        if (tipo_arquitectura==0 && es_desarrollador){
	            sesion.save(plantilla);
	            
	            Integer ultimo_id_plantilla = plantilla.getIdPlantilla();
	            
	            tx.commit();
            }
	        //FICHERO CON ARQUITECTURA FRAMEWORK Y EN MODO IMPLANTADOR = NO OK
            else if (tipo_arquitectura==0 && !es_desarrollador){
            	if (principal.idioma.equals("español"))
            		throw new Exception ("Error, el formato xml es de tipo plantilla/marco.\nDebe importarlo desde el modo desarrollador.");
            	else
            		throw new Exception ("Error, xml file format is framework type.\nYou must import it from developer mode.");
            }
	        //FICHERO CON ARQUITECTURA PROYECTO Y EN MODO DESARROLLADOR = NO OK
            else if (tipo_arquitectura==1 && es_desarrollador){
            	if (principal.idioma.equals("español"))
            		throw new Exception ("Error, el formato xml es de tipo proyecto.\nDebes importarlo desde el modo implantador.");
            	else
            		throw new Exception ("Error, xml file format is project type.\nYou must import it from implanter mode.");
            }

            //Creamos listas para almacenar valores temporales.
            ArrayList<FaseBloque> listaFaseBloque = new ArrayList<FaseBloque>();
            ArrayList<VistaBloque> listaVistaBloque = new ArrayList<VistaBloque>();
            ArrayList<BloqueConstructivo> listaBloqueAntes = new ArrayList<BloqueConstructivo>();
            ArrayList<BloqueConstructivo> listaBloqueDespues = new ArrayList<BloqueConstructivo>();
            ArrayList<SeleccionComponenteListaBloque> listaSeleccionBloques = new ArrayList<SeleccionComponenteListaBloque>();
           
            //MODO DESARROLLADOR
            if (tipo_arquitectura==0){
	            //BLOQUE CONSTRUCTIVO
	            NodeList listaBloques = doc.getElementsByTagName("Bloque_constructivo");
	            for (int j = 0; j < listaBloques.getLength(); j ++) {
	
	        	    Node b = listaBloques.item(j);
	
	        	    if (b.getNodeType() == Node.ELEMENT_NODE) {
	        	    	
	        	    	Element elemento2 = (Element) b;
	        	    	BloqueConstructivo bloque = new BloqueConstructivo();
	        	    	
	        	    	if (getTagValue("id_plantilla", elemento2).equals(id_plantilla_inicial.toString())){
	        	    		String id_bloque_inicial = getTagValue("id_bloque", elemento2);
	        	    		bloque.setNombre(getTagValue("nombre", elemento2));
	        	            bloque.setTipo(Integer.parseInt((getTagValue("tipo", elemento2))));    
	        	            bloque.setFaseModoGuiado(Integer.parseInt((getTagValue("fase_modo_guiado", elemento2))));
	        	            bloque.setPlantilla(plantilla);
	        	            
	        	            BloqueConstructivo b_aux = new BloqueConstructivo();
	        	            b_aux.setIdBloque(Integer.parseInt(id_bloque_inicial));
	        	            b_aux.setFaseModoGuiado(bloque.getFaseModoGuiado());
	        	            listaBloqueAntes.add(b_aux);
	        	            
	        	            tx = sesion.beginTransaction();
	        	            sesion.save(bloque);
	        	            tx.commit();
	        	            
	        	            listaBloqueDespues.add(bloque);
	    
	        	            //FASE BLOQUE
	        	            NodeList listaFaseBloques = doc.getElementsByTagName("Fase_bloque");
	        	            for (int k = 0; k < listaFaseBloques.getLength(); k ++) {
	
	        	        	    Node bl = listaFaseBloques.item(k);
	
	        	        	    if (bl.getNodeType() == Node.ELEMENT_NODE) {
	        	        	    	
	        	        	    	Element elemento3 = (Element) bl;
	        	        	    	FaseBloque faseBloque = new FaseBloque();
	        	        	    	
	        	        	    	if (getTagValue("id_bloque", elemento3).equals(id_bloque_inicial.toString())){
	        	        	    		String id = getTagValue("id_fase_plantilla", elemento3);
	        	        	    		FasePlantilla fp = new FasePlantilla();
	        	        	    		fp.setIdFasePlantilla(Integer.parseInt(id));
	        	        	    		faseBloque.setFasePlantilla(fp);
	        	        	    		faseBloque.setBloqueConstructivo(bloque);
	        	        	    		String id_f = getTagValue("id_fase_bloque", elemento3);
	        	        	    		faseBloque.setIdFaseBloque(Integer.parseInt(id_f));
	        	        	    		/*if (bloque.getFaseModoGuiado() == faseBloque.getIdFaseBloque())
	        	        	    			bloque.setFaseModoGuiado(faseModoGuiado)*/
	        	        	            
	        	        	            
	        	        	            /*tx = sesion.beginTransaction();
	        	        	            sesion.save(bloque);
	        	        	            tx.commit();*/
	        	        	            
	        	        	            listaFaseBloque.add(faseBloque);
	        	        	            
	        	        	    	}
	        	        	    }
	        	            }
	        	            
	        	            //VISTA BLOQUE
	        	            NodeList listaVistaBloques = doc.getElementsByTagName("Vista_bloque");
	        	            for (int k = 0; k < listaVistaBloques.getLength(); k ++) {
	
	        	        	    Node bl = listaVistaBloques.item(k);
	
	        	        	    if (bl.getNodeType() == Node.ELEMENT_NODE) {
	        	        	    	
	        	        	    	Element elemento3 = (Element) bl;
	        	        	    	VistaBloque vistaBloque = new VistaBloque();
	        	        	    	
	        	        	    	if (getTagValue("id_bloque", elemento3).equals(id_bloque_inicial.toString())){
	        	        	    		String id = getTagValue("id_vista_plantilla", elemento3);
	        	        	    		VistaPlantilla vp = new VistaPlantilla();
	        	        	    		vp.setIdVistaPlantilla(Integer.parseInt(id));
	        	        	    		vistaBloque.setVistaPlantilla(vp);
	        	        	    		vistaBloque.setBloqueConstructivo(bloque);    
	        	        	            
	        	        	            
	        	        	            /*tx = sesion.beginTransaction();
	        	        	            sesion.save(bloque);
	        	        	            tx.commit();*/
	        	        	            
	        	        	            listaVistaBloque.add(vistaBloque);
	        	        	            
	        	        	    	}
	        	        	    }
	        	            }
	        	            
							//COMPONENTE_BLOQUE
	        	            NodeList listaComponenteBloques = doc.getElementsByTagName("Componente_bloque");
	        	            for (int k = 0; k < listaComponenteBloques.getLength(); k ++) {
	
	        	        	    Node bl = listaComponenteBloques.item(k);
	
	        	        	    if (bl.getNodeType() == Node.ELEMENT_NODE) {
	        	        	    	
	        	        	    	Element elemento3 = (Element) bl;
	        	        	    	ComponenteBloque componenteBloque = new ComponenteBloque();
	        	        	    	
	        	        	    	if (getTagValue("id_bloque", elemento3).equals(id_bloque_inicial.toString())){
	        	        	    		String id_componente_bloque_inicial = getTagValue("id_componente_bloque", elemento3);
	        	        	    		componenteBloque.setNombre((getTagValue("nombre", elemento3)));
	        	        	    		componenteBloque.setTipo(Integer.parseInt((getTagValue("tipo", elemento3))));
	        	        	    		componenteBloque.setPosicion(Integer.parseInt((getTagValue("posicion", elemento3))));
	        	        	    		componenteBloque.setOrden(Integer.parseInt((getTagValue("orden", elemento3))));
	        	        	    		if ((getTagValue("cardinalidad_lista", elemento3).equals("null")))
	        	        	    			componenteBloque.setCardinalidadLista(null);
	        	        	    		else
	        	        	    			componenteBloque.setCardinalidadLista(Integer.parseInt((getTagValue("cardinalidad_lista", elemento3))));
	        	        	    		componenteBloque.setBloqueConstructivo(bloque);    
	        	        	            
	        	        	            
	        	        	            tx = sesion.beginTransaction();
	        	        	            sesion.save(componenteBloque);
	        	        	            tx.commit();
	        	        	            
	        	        	            
	        	        	            
	        	        	            //SELECCION_COMPONENTE_LISTA_BLOQUE
	        	        	            NodeList listaSeleccionComponente = doc.getElementsByTagName("Seleccion_componente_lista_bloque");
	        	        	            for (int l = 0; l < listaSeleccionComponente.getLength(); l ++) {
	
	        	        	        	    Node bls = listaSeleccionComponente.item(l);
	
	        	        	        	    if (bls.getNodeType() == Node.ELEMENT_NODE) {
	        	        	        	    	
	        	        	        	    	Element elemento4 = (Element) bls;
	        	        	        	    	SeleccionComponenteListaBloque seleccion_componente = new SeleccionComponenteListaBloque();
	        	        	        	    	
	        	        	        	    	if (getTagValue("id_componente_bloque", elemento4).equals(id_componente_bloque_inicial.toString())){
	        	        	        	    		
	        	        	        	    		seleccion_componente.setComponenteBloque(componenteBloque);
	        	        	        	    		String id = getTagValue("id_bloque", elemento4);
	        	        	        	    		BloqueConstructivo bloc = new BloqueConstructivo();
	        	        	        	    		bloc.setIdBloque((Integer.parseInt(id)));
	        	        	        	    		seleccion_componente.setBloqueConstructivo(bloc);
	
	        	        	        	            /*tx = sesion.beginTransaction();
	        	        	        	            sesion.save(seleccion_componente);
	        	        	        	            tx.commit();*/
	        	        	        	    		listaSeleccionBloques.add(seleccion_componente);
	        	        	        	            
	        	        	        	    		/*//ALMACENO TODOS LOS BLOQUES EN UNA LISTA
	        	        	        	            NodeList listaBloques_aux = doc.getElementsByTagName("Bloque_constructivo");
	        	        	        	            for (int ind = 0; ind < listaBloques_aux.getLength(); ind ++) {
	
	        	        	        	        	    Node aux = listaBloques_aux.item(ind);
	
	        	        	        	        	    if (b.getNodeType() == Node.ELEMENT_NODE) {
	        	        	        	        	    	
	        	        	        	        	    	
	        	        	        	        	    	Element elemento_aux = (Element) aux;
	        	        	        	        	    	BloqueConstructivo bloque_aux = new BloqueConstructivo();
	        	        	        	        	    	
	        	        	        	        	    	if (getTagValue("id_plantilla", elemento2).equals(id_plantilla_inicial.toString())){
	        	        	        	        	    		String id_bloque_inicial_aux = getTagValue("id_bloque", elemento_aux);
	        	        	        	        	    		
	        	   
	        	        	        	        	            
	        	        	        	        	            BloqueConstructivo b_aux2 = new BloqueConstructivo();
	        	        	        	        	            b_aux2.setIdBloque(Integer.parseInt(id_bloque_inicial));
	        	        	        	        	            listaBloqueAntes.add(b_aux);
	        	        	        	        	            
	        	        	        	        	            tx = sesion.beginTransaction();
	        	        	        	        	            sesion.save(bloque);
	        	        	        	        	            tx.commit();
	        	        	        	        	            
	        	        	        	        	            listaBloqueDespues.add(bloque);
	        	        	        	        	    	}
	        	        	        	        	    }
	        	        	        	            }*/
	        	        	        	    		
	        	        	        	    		/*for (int m = 0; m <listaBloqueAntes.size(); m++){
	        	        	        	            	
	        	        	        	            	if (listaBloqueAntes.get(m).getIdBloque() == seleccion_componente.getBloqueConstructivo().getIdBloque()){
	        	        	        	            		seleccion_componente.setBloqueConstructivo(listaBloqueDespues.get(m));
	        	        	        	            		tx = sesion.beginTransaction();
	        	        	                	            sesion.save(seleccion_componente);
	        	        	                	            tx.commit();
	        	        	        	            	}
	        	        	        	            }*/
	        	        	        	            
	        	        	        	            //listaVistaBloque.add(vistaBloque);
	        	        	        	            
	        	        	        	    	}
	        	        	        	    }
	        	        	            }
	        	        	            
	        	        	            //listaVistaBloque.add(vistaBloque);
	        	        	            
	        	        	    	}
	        	        	    }
	        	            }
	        	            
	        	    	}
	        	    }
	            }
	            
	            for (int m = 0; m <listaBloqueAntes.size(); m++){
	            	
	            	for (int n = 0; n < listaSeleccionBloques.size(); n++){
	            		if (listaBloqueAntes.get(m).getIdBloque() == listaSeleccionBloques.get(n).getBloqueConstructivo().getIdBloque()){
	            			listaSeleccionBloques.get(n).setBloqueConstructivo(listaBloqueDespues.get(m));
		            		tx = sesion.beginTransaction();
		    	            sesion.save(listaSeleccionBloques.get(n));
		    	            tx.commit();
	            		}
	            	}
	            }
	            
	            
	            //VISTA PLANTILLA
	            NodeList listaVistaPlantilla = doc.getElementsByTagName("Vista_plantilla");
	            for (int j = 0; j < listaVistaPlantilla.getLength(); j ++) {
	
	        	    Node b = listaVistaPlantilla.item(j);
	
	        	    if (b.getNodeType() == Node.ELEMENT_NODE) {
	        	    	
	        	    	Element elemento2 = (Element) b;
	        	    	VistaPlantilla vistaP = new VistaPlantilla();
	        	    	String id_vistaP_inicial = getTagValue("id_vista_plantilla", elemento2);
	        	    	
	        	    	if (getTagValue("id_plantilla", elemento2).equals(id_plantilla_inicial.toString())){
	        	    		vistaP.setNombre(getTagValue("nombre", elemento2));
	        	    		vistaP.setPlantilla(plantilla);
	        	            
	        	            
	        	            tx = sesion.beginTransaction();
	        	            sesion.save(vistaP);
	        	            tx.commit();
	        	            
	        	            for (int k = 0; k <listaVistaBloque.size(); k++){
	        	            	
	        	            	if (listaVistaBloque.get(k).getVistaPlantilla().getIdVistaPlantilla() == Integer.parseInt(id_vistaP_inicial.toString())){
	        	            		listaVistaBloque.get(k).setVistaPlantilla(vistaP);
	        	            		tx = sesion.beginTransaction();
	                	            sesion.save(listaVistaBloque.get(k));
	                	            tx.commit();
	        	            	}
	        	            }
	        	            
	        	    	}
	        	    }
	            }
	            
	            ArrayList<FaseBloque> listaFaseBloqueAntes = new ArrayList<FaseBloque>();
	            ArrayList<FaseBloque> listaFaseBloqueDespues = new ArrayList<FaseBloque>();
	            //FASE PLANTILLA
	            NodeList listaFasePlantilla = doc.getElementsByTagName("Fase_plantilla");
	            for (int j = 0; j < listaFasePlantilla.getLength(); j ++) {
	
	        	    Node b = listaFasePlantilla.item(j);
	
	        	    if (b.getNodeType() == Node.ELEMENT_NODE) {
	        	    	
	        	    	Element elemento2 = (Element) b;
	        	    	FasePlantilla faseP = new FasePlantilla();
	        	    	String id_faseP_inicial = getTagValue("id_fase_plantilla", elemento2);
	        	    	
	        	    	if (getTagValue("id_plantilla", elemento2).equals(id_plantilla_inicial.toString())){
	        	    		faseP.setNombre(getTagValue("nombre", elemento2));
	        	    		faseP.setOrden(Integer.parseInt((getTagValue("orden", elemento2))));
	        	    		faseP.setPlantilla(plantilla);
	        	            
	
	        	            tx = sesion.beginTransaction();
	        	            sesion.save(faseP);
	        	            tx.commit();
	        	            
	        	            for (int k = 0; k <listaFaseBloque.size(); k++){
	        	            	
	        	            	if (listaFaseBloque.get(k).getFasePlantilla().getIdFasePlantilla() == Integer.parseInt(id_faseP_inicial.toString())){
	        	            		listaFaseBloque.get(k).setFasePlantilla(faseP);
	        	            		
	        	            		FaseBloque fas = new FaseBloque();
	        	            		fas.setIdFaseBloque(listaFaseBloque.get(k).getIdFaseBloque());
	        	            		listaFaseBloqueAntes.add(fas);
	        	            		
	        	            		tx = sesion.beginTransaction();
	                	            sesion.save(listaFaseBloque.get(k));
	                	            tx.commit();
	                	            
	                	            listaFaseBloqueDespues.add(listaFaseBloque.get(k));
	                	            
	                	            /*for (int l = 0; l < listaBloqueDespues.size(); l++){
	        	            			
	                	            	if (listaBloqueAntes.get(l).getFaseModoGuiado() == fase_anterior.getIdFaseBloque()){
	                	            		listaBloqueDespues.get(l).setFaseModoGuiado(listaFaseBloque.get(k).getIdFaseBloque());
	                	            		
	                	            		sesion.update(listaBloqueDespues.get(l));
	                	            	}
	                	            	//listaBloqueDespues.get(l).setFaseModoGuiado(listaFaseBloque.get(k).getIdFaseBloque());
	        	            			
	        	            		}*/
	        	            	}
	        	            }
	        	            
	        	    	}
	        	    }
	            }
	            
	            for (int l = 0; l < listaBloqueDespues.size(); l++){
	    			
	            	for (int m = 0; m < listaFaseBloque.size(); m++){
	            		if (listaBloqueAntes.get(l).getFaseModoGuiado() == listaFaseBloqueAntes.get(m).getIdFaseBloque()){
		            		listaBloqueDespues.get(l).setFaseModoGuiado(listaFaseBloqueDespues.get(m).getIdFaseBloque());
		            		
		            		tx = sesion.beginTransaction();
		            		sesion.update(listaBloqueDespues.get(l));
		            		tx.commit();
		            	}
	            	}
		            	
	            	//listaBloqueDespues.get(l).setFaseModoGuiado(listaFaseBloque.get(k).getIdFaseBloque());
	    			
	    		}
            }
            
            //MODO IMPLANTADOR
            if(tipo_arquitectura==1){
	            //PROYECTO
	            NodeList listaProyectos = doc.getElementsByTagName("Proyecto");
	            for (int j = 0; j < listaProyectos.getLength(); j ++) {
	
	        	    Node pr = listaProyectos.item(j);
	
	        	    if (pr.getNodeType() == Node.ELEMENT_NODE) {
	        	    	
	        	    	Element elemento2 = (Element) pr;
	        	    	Proyecto proyecto = new Proyecto();
	        	    	
	        	    	if (getTagValue("id_plantilla", elemento2).equals(id_plantilla_inicial.toString())){
	        	    		String id_proyecto_inicial = getTagValue("id_proyecto", elemento2);
	        	    		//proyecto.setNombre(getTagValue("nombre", elemento2));
	        	    		//proyecto.setDescripcion(getTagValue("descripcion", elemento2));
	        	    		proyecto.setNombre(getTagValue("nombre", elemento2)+"[i]");
	        	    		proyecto.setDescripcion(getTagValue("descripcion", elemento2)+"\n\nImport date: "+dia+"/"+mes+"/"+annio+" - " +c1.getTime().getHours()+":"+c1.getTime().getMinutes()+" h");
	        	    		proyecto.setPlantilla(plant);
	        	            
	        	            Proyecto pr_aux = new Proyecto();
	        	            pr_aux.setIdProyecto(Integer.parseInt(id_proyecto_inicial));
	        	            //listaProyectosAntes.add(pr_aux);
	        	            
	        	            tx = sesion.beginTransaction();
	        	            sesion.save(proyecto);
	        	            tx.commit();
	        	            
	        	            //listaProyectosDespues.add(proyecto);
	        	            
	        	            
	        	            ArrayList<Instancia> listaInstanciasAntes = new ArrayList<Instancia>();
	        	            ArrayList<Instancia> listaInstanciasDespues = new ArrayList<Instancia>();
	        	            ArrayList<ContenidoLista> listaContenidoLista_aux = new ArrayList<ContenidoLista>();
	        	            
	        	            //INSTANCIA
	                        NodeList listaInstancias = doc.getElementsByTagName("Instancia");
	                        for (int k = 0; k < listaInstancias.getLength(); k ++) {
	
	                    	    Node ins = listaInstancias.item(k);
	
	                    	    if (ins.getNodeType() == Node.ELEMENT_NODE) {
	                    	    	
	                    	    	Element elemento3 = (Element) ins;
	                    	    	Instancia instancia = new Instancia();
	                    	    	
	                    	    	if (getTagValue("id_proyecto", elemento3).equals(id_proyecto_inicial.toString())){
	                    	    		String id_instancia_inicial = getTagValue("id_instancia", elemento3);
	                    	    		instancia.setNombre(getTagValue("nombre", elemento3));
	                    	    		
	                    	    		String id_bloque = getTagValue("id_bloque", elemento3);
	                    	    		BloqueConstructivo bloque = new BloqueConstructivo();
	                    	    		bloque.setIdBloque(Integer.parseInt(id_bloque));
	                    	    		
	                    	    		instancia.setBloqueConstructivo(bloque);
	                    	    		instancia.setProyecto(proyecto);
	                    	            
	                    	            Instancia ins_aux = new Instancia();
	                    	            ins_aux.setIdInstancia(Integer.parseInt(id_instancia_inicial));
	                    	            listaInstanciasAntes.add(ins_aux);
	                    	            
	                    	            
	                    	            tx = sesion.beginTransaction();
	                    	            sesion.save(instancia);
	                    	            tx.commit();
	                    	            
	                    	            
	                    	            
	                    	            
	                    	            listaInstanciasDespues.add(instancia);
	                    	            
	                    	            //COMPONENTE INSTANCIA
	                                    NodeList listaComponenteInstancias = doc.getElementsByTagName("Componente_instancia");
	                                    for (int l = 0; l < listaComponenteInstancias.getLength(); l ++) {
	
	                                	    Node c_ins = listaComponenteInstancias.item(l);
	
	                                	    if (c_ins.getNodeType() == Node.ELEMENT_NODE) {
	                                	    	
	                                	    	Element elemento4 = (Element) c_ins;
	                                	    	ComponenteInstancia componente_instancia = new ComponenteInstancia();
	                                	    	
	                                	    	if (getTagValue("id_instancia", elemento4).equals(id_instancia_inicial.toString())){
	                                	    		String id_componente_instancia_inicial = getTagValue("id_componente_instancia", elemento4);
	                                	    		
	                                	    		if (!getTagValue("texto", elemento4).equals("null"))
	                                	    			componente_instancia.setTexto(getTagValue("texto", elemento4));
	                                	    		else
	                                	    			componente_instancia.setTexto(null);
	                                	    		
	                                	    		if (!getTagValue("checkbox", elemento4).equals("null"))
	                                	    			componente_instancia.setCheckbox(Integer.parseInt(getTagValue("checkbox", elemento4)));
	                                	    		else
	                                	    			componente_instancia.setCheckbox(0);
	                                	    		
	                                	    		if (!getTagValue("fecha", elemento4).equals("null"))
	                                	    			componente_instancia.setFecha(getTagValue("fecha", elemento4));
	                                	    		else
	                                	    			componente_instancia.setFecha(null);
	                                	    		
	                                	    		if (!getTagValue("portafolio", elemento4).equals("null"))
	                                	    			componente_instancia.setPortafolio(getTagValue("portafolio", elemento4));
	                                	    		else
	                                	    			componente_instancia.setPortafolio(null);
	                                	    		
	                                	    		//Calcular componente bloque
	                                	    		String id_componente_bloque = getTagValue("id_componente_bloque", elemento4);
	                                	    		ComponenteBloque componente_bloque = new ComponenteBloque();
	                                	    		componente_bloque.setIdComponenteBloque(Integer.parseInt(id_componente_bloque));
	                                	    		
	                                	    		componente_instancia.setComponenteBloque(componente_bloque);
	                                	    		componente_instancia.setInstancia(instancia);
	                                	    		
	                                	    		if (!getTagValue("modelo_madurez_puntuacion", elemento4).equals("null"))
	                                	    			componente_instancia.setModeloMadurezPuntuacion(Integer.parseInt(getTagValue("modelo_madurez_puntuacion", elemento4)));
	                                	    		else
	                                	    			componente_instancia.setModeloMadurezPuntuacion(0);
	                                	    		

	                                	    		if (!getTagValue("modelo_madurez_media_parcial", elemento4).equals("null"))
	                                	    			componente_instancia.setModeloMadurezMediaParcial(Float.parseFloat(getTagValue("modelo_madurez_media_parcial", elemento4)));
	                                	    		else
	                                	    			componente_instancia.setModeloMadurezMediaParcial(0f);
	                                	    		
	                                	    		if (!getTagValue("modelo_madurez_media_global", elemento4).equals("null"))
	                                	    			componente_instancia.setModeloMadurezMediaGlobal(Float.parseFloat(getTagValue("modelo_madurez_media_global", elemento4)));
	                                	    		else
	                                	    			componente_instancia.setModeloMadurezMediaGlobal(0f);
	                                	    		
	                                	    		if (!getTagValue("fecha_modelo_madurez", elemento4).equals("null"))
	                                	    			componente_instancia.setFechaModeloMadurez(getTagValue("fecha_modelo_madurez", elemento4));
	                                	    		else
	                                	    			componente_instancia.setFechaModeloMadurez(null);
	                                	    		
	                                	            
	                                	            ComponenteInstancia c_ins_aux = new ComponenteInstancia();
	                                	            c_ins_aux.setIdComponenteInstancia(Integer.parseInt(id_componente_instancia_inicial));
	                                	            //listaProyectosAntes.add(pr_aux);
	                                	            
	                                	            tx = sesion.beginTransaction();
	                                	            sesion.save(componente_instancia);
	                                	            tx.commit();
	                                	            
	                                	            //listaProyectosDespues.add(proyecto);
	                                	            
	                                	            //CONTENIDO_LISTA
	                                                NodeList listaContenidoLista = doc.getElementsByTagName("Contenido_lista");
	                                                for (int m = 0; m < listaContenidoLista.getLength(); m ++) {
	
	                                            	    Node c_lista = listaContenidoLista.item(m);
	
	                                            	    if (c_lista.getNodeType() == Node.ELEMENT_NODE) {
	                                            	    	
	                                            	    	Element elemento5 = (Element) c_lista;
	                                            	    	ContenidoLista contenido_lista = new ContenidoLista();
	                                            	    	
	                                            	    	if (getTagValue("id_componente_instancia", elemento5).equals(id_componente_instancia_inicial.toString())){
	                                            	    		String id_contenido_lista = getTagValue("id_contenido_lista", elemento5);
	                                            	    		contenido_lista.setComponenteInstancia(componente_instancia);
	                                            	    		
	                                            	    		String id_instancia = getTagValue("id_instancia", elemento5);
	                    	        	        	    		Instancia i_ = new Instancia();
	                    	        	        	    		i_.setIdInstancia((Integer.parseInt(id_instancia)));
	                    	        	        	    		contenido_lista.setInstancia(i_);
	
	                    	        	        	    		listaContenidoLista_aux.add(contenido_lista);
	                                            	    	}
	                                            	    }
	                                                }
	                                	            
	                                	    	}
	                                	    }
	                                    }
	                    	            
	                    	    	}
	                    	    }
	                        }
	                        
	                        for (int m = 0; m <listaInstanciasAntes.size(); m++){
	                        	
	                        	for (int n = 0; n < listaContenidoLista_aux.size(); n++){
	                        		if (listaInstanciasAntes.get(m).getIdInstancia() == listaContenidoLista_aux.get(n).getInstancia().getIdInstancia()){
	                        			listaContenidoLista_aux.get(n).setInstancia(listaInstanciasDespues.get(m));
	            	            		tx = sesion.beginTransaction();
	            	    	            sesion.save(listaContenidoLista_aux.get(n));
	            	    	            tx.commit();
	                        		}
	                        	}
	                        }
	        	    	}
	        	    }
	        	    
	        	  
	        	    
	            }
            }
            
            
	    }
    }
	  sesion.close();
	  return false;
  }
  catch (Exception e) {
	    e.printStackTrace();
		JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
	    return true;
  }

 }

 private static String getTagValue(String sTag, Element eElement)
 {
	  NodeList nlList= eElement.getElementsByTagName(sTag).item(0).getChildNodes();
	  Node nValue = (Node) nlList.item(0);

	  return nValue.getNodeValue();
 
 }
 
 //EXPORTAR A DOCUMENTO XML
 public static void GenerarXML(Plantilla p, Proyecto pr, String path, boolean es_desarrollador) {

	 try{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	    
	    DocumentBuilder builder = factory.newDocumentBuilder();
	    DOMImplementation implementation = builder.getDOMImplementation();
	    Document document;
	    if(es_desarrollador)
	    	document = implementation.createDocument(null, "Arquitectura_plantilla", null);
	    else
	    	document = implementation.createDocument(null, "Arquitectura_proyecto", null);
	    

	    Session session = UtilidadHibernate.getSessionFactory().openSession();
	    
	    //PLANTILLA
	    List messages = session.createQuery("from Plantilla where id_plantilla = '"+p.getIdPlantilla()+"'").list();
		//System.out.println("Número de elementos: " + messages.size());
		for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
			Plantilla plantilla = (Plantilla) iter.next();
			
			Element raiz = document.createElement("Plantilla");  // creamos el elemento raiz
		    Element elemento = document.createElement("id_plantilla"); //creamos un nuevo elemento
		    Element elemento2 = document.createElement("nombre");
		    Element elemento3 = document.createElement("descripcion");
			
		    //Leemos el contenido de la base de datos
			Integer id_plantilla = plantilla.getIdPlantilla();
			Text text = document.createTextNode(id_plantilla.toString());
			Text text2 = document.createTextNode(plantilla.getNombre());
			Text text3 = document.createTextNode(plantilla.getDescripcion());
			
			//Pegamos el elemento hijo a la raiz
			raiz.appendChild(elemento);
		    raiz.appendChild(elemento2);
		    raiz.appendChild(elemento3);
		    
		    //Pegamos el contenido a los elementos
		    elemento.appendChild(text); //
		    elemento2.appendChild(text2);
		    elemento3.appendChild(text3);
		    
		    //Insertamos el raíz
		    document.getDocumentElement().appendChild(raiz);
		}
		
		if (es_desarrollador){
			//BLOQUE_CONSTRUCTIVO
			ArrayList<BloqueConstructivo> lista_bloques = new ArrayList<BloqueConstructivo>();
			
			messages = session.createQuery("from BloqueConstructivo where id_plantilla = '"+p.getIdPlantilla()+"'").list();
			//System.out.println("Número de elementos: " + messages.size());
			for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
				BloqueConstructivo bloque = (BloqueConstructivo) iter.next();
				lista_bloques.add(bloque);
				
				Element raiz = document.createElement("Bloque_constructivo");  // creamos el elemento raiz
			    Element elemento = document.createElement("id_bloque"); //creamos un nuevo elemento
			    Element elemento2 = document.createElement("nombre");
			    Element elemento3 = document.createElement("tipo");
			    Element elemento4 = document.createElement("fase_modo_guiado");
			    Element elemento5 = document.createElement("id_plantilla");
	
				
			    //Leemos el contenido de la base de datos
				Integer id_bloque = bloque.getIdBloque();
				Text text = document.createTextNode(id_bloque.toString());
				Text text2 = document.createTextNode(bloque.getNombre());
				Text text3 = document.createTextNode(bloque.getTipo().toString());
				Text text4 = document.createTextNode(bloque.getFaseModoGuiado().toString());
				Integer id_plantilla = bloque.getPlantilla().getIdPlantilla();
				Text text5 = document.createTextNode(id_plantilla.toString());
				
				//Pegamos el elemento hijo a la raiz
				raiz.appendChild(elemento);
			    raiz.appendChild(elemento2);
			    raiz.appendChild(elemento3);
			    raiz.appendChild(elemento4);
			    raiz.appendChild(elemento5);
			    
			    //Pegamos el contenido a los elementos
			    elemento.appendChild(text); //
			    elemento2.appendChild(text2);
			    elemento3.appendChild(text3);
			    elemento4.appendChild(text4);
			    elemento5.appendChild(text5);
			    
			    //Insertamos el raíz
			    document.getDocumentElement().appendChild(raiz);
			    
			}
			
			//VISTA_BLOQUE
		    for (int i = 0; i<lista_bloques.size(); i++){
		    	BloqueConstructivo bloque_ = lista_bloques.get(i);
		    	
			    List messages_vista_bloque = session.createQuery("from VistaBloque where id_bloque = '"+bloque_.getIdBloque()+"'").list();
				//System.out.println("Número de elementos: " + messages.size());
				for ( Iterator iter_vista_bloque = messages_vista_bloque.iterator(); iter_vista_bloque.hasNext(); ) {
					VistaBloque vista_bloque = (VistaBloque) iter_vista_bloque.next();
					
					Element raiz_vista_bloque = document.createElement("Vista_bloque");  // creamos el elemento raiz
				    Element elemento_vista_bloque = document.createElement("id_vista_bloque"); //creamos un nuevo elemento
				    Element elemento2_vista_bloque = document.createElement("id_vista_plantilla");
				    Element elemento3_vista_bloque = document.createElement("id_bloque");
					
				    //Leemos el contenido de la base de datos
					Integer id_vista_bloque = vista_bloque.getIdVistaBloque();
					Text text_vista_bloque = document.createTextNode(id_vista_bloque.toString());
					Integer id_vista_plantilla = vista_bloque.getVistaPlantilla().getIdVistaPlantilla();
					Text text2_vista_bloque = document.createTextNode(id_vista_plantilla.toString());
					Integer id_bloque_vista_bloque = vista_bloque.getBloqueConstructivo().getIdBloque();
					Text text3_vista_bloque = document.createTextNode(id_bloque_vista_bloque.toString());
					
					//Pegamos el elemento hijo a la raiz
					raiz_vista_bloque.appendChild(elemento_vista_bloque);
					raiz_vista_bloque.appendChild(elemento2_vista_bloque);
					raiz_vista_bloque.appendChild(elemento3_vista_bloque);
				    
				    //Pegamos el contenido a los elementos
					elemento_vista_bloque.appendChild(text_vista_bloque); //
					elemento2_vista_bloque.appendChild(text2_vista_bloque);
					elemento3_vista_bloque.appendChild(text3_vista_bloque);
				    
				    //Insertamos el raíz
				    document.getDocumentElement().appendChild(raiz_vista_bloque);
				}
		    	
		    }
			    
		    //FASE_BLOQUE
		    for (int i = 0; i<lista_bloques.size(); i++){
		    	BloqueConstructivo bloque_ = lista_bloques.get(i);	
				
			    List messages_fase_bloque = session.createQuery("from FaseBloque where id_bloque = '"+bloque_.getIdBloque()+"'").list();
				//System.out.println("Número de elementos: " + messages.size());
				for ( Iterator iter_fase_bloque = messages_fase_bloque.iterator(); iter_fase_bloque.hasNext(); ) {
					FaseBloque fase_bloque = (FaseBloque) iter_fase_bloque.next();
					
					Element raiz_fase_bloque = document.createElement("Fase_bloque");  // creamos el elemento raiz
				    Element elemento_fase_bloque = document.createElement("id_fase_bloque"); //creamos un nuevo elemento
				    Element elemento2_fase_bloque = document.createElement("id_fase_plantilla");
				    Element elemento3_fase_bloque = document.createElement("id_bloque");
					
				    //Leemos el contenido de la base de datos
					Integer id_fase_bloque = fase_bloque.getIdFaseBloque();
					Text text_fase_bloque = document.createTextNode(id_fase_bloque.toString());
					Integer id_fase_plantilla = fase_bloque.getFasePlantilla().getIdFasePlantilla();
					Text text2_fase_bloque = document.createTextNode(id_fase_plantilla.toString());
					Integer id_bloque_fase_bloque = fase_bloque.getBloqueConstructivo().getIdBloque();
					Text text3_fase_bloque = document.createTextNode(id_bloque_fase_bloque.toString());
					
					//Pegamos el elemento hijo a la raiz
					raiz_fase_bloque.appendChild(elemento_fase_bloque);
					raiz_fase_bloque.appendChild(elemento2_fase_bloque);
					raiz_fase_bloque.appendChild(elemento3_fase_bloque);
				    
				    //Pegamos el contenido a los elementos
				    elemento_fase_bloque.appendChild(text_fase_bloque); //
				    elemento2_fase_bloque.appendChild(text2_fase_bloque);
				    elemento3_fase_bloque.appendChild(text3_fase_bloque);
				    
				    //Insertamos el raíz
				    document.getDocumentElement().appendChild(raiz_fase_bloque);
				}
		    }
			
		    //COMPONENTE_BLOQUE
		    ArrayList<ComponenteBloque> lista_componentes_bloque = new ArrayList<ComponenteBloque>();
		    for (int i = 0; i<lista_bloques.size(); i++){
		    	BloqueConstructivo bloque_ = lista_bloques.get(i);
				
			    List messages_componente_bloque = session.createQuery("from ComponenteBloque where id_bloque = '"+bloque_.getIdBloque()+"'").list();
				//System.out.println("Número de elementos: " + messages.size());
				for ( Iterator iter_componente_bloque = messages_componente_bloque.iterator(); iter_componente_bloque.hasNext(); ) {
					ComponenteBloque componenteBloque = (ComponenteBloque) iter_componente_bloque.next();
					lista_componentes_bloque.add(componenteBloque);
					
					Element raiz_componente_bloque = document.createElement("Componente_bloque");  // creamos el elemento raiz
				    Element elemento_componente_bloque = document.createElement("id_componente_bloque"); //creamos un nuevo elemento
				    Element elemento2_componente_bloque = document.createElement("nombre");
				    Element elemento3_componente_bloque = document.createElement("tipo");
				    Element elemento4_componente_bloque = document.createElement("posicion");
				    Element elemento5_componente_bloque = document.createElement("orden");
				    Element elemento6_componente_bloque = document.createElement("cardinalidad_lista");
				    Element elemento7_componente_bloque = document.createElement("id_bloque");
					
				    //Leemos el contenido de la base de datos
					Integer id_componente_bloque = componenteBloque.getIdComponenteBloque();
					Text text_componente_bloque = document.createTextNode(id_componente_bloque.toString());
					Text text2_componente_bloque = document.createTextNode(componenteBloque.getNombre());
					Text text3_componente_bloque = document.createTextNode(componenteBloque.getTipo().toString());
					Text text4_componente_bloque = document.createTextNode(componenteBloque.getPosicion().toString());
					Text text5_componente_bloque = document.createTextNode(componenteBloque.getOrden().toString());
					Text text6_componente_bloque;
					if (componenteBloque.getCardinalidadLista()==null)
						text6_componente_bloque = document.createTextNode("null");
					else
						text6_componente_bloque = document.createTextNode(componenteBloque.getCardinalidadLista().toString());
					Integer id_bloque_componente_bloque = componenteBloque.getBloqueConstructivo().getIdBloque();
					Text text7_componente_bloque = document.createTextNode(id_bloque_componente_bloque.toString());
					
					//Pegamos el elemento hijo a la raiz
					raiz_componente_bloque.appendChild(elemento_componente_bloque);
					raiz_componente_bloque.appendChild(elemento2_componente_bloque);
					raiz_componente_bloque.appendChild(elemento3_componente_bloque);
					raiz_componente_bloque.appendChild(elemento4_componente_bloque);
					raiz_componente_bloque.appendChild(elemento5_componente_bloque);
					raiz_componente_bloque.appendChild(elemento6_componente_bloque);
					raiz_componente_bloque.appendChild(elemento7_componente_bloque);
				    
				    //Pegamos el contenido a los elementos
					elemento_componente_bloque.appendChild(text_componente_bloque); //
					elemento2_componente_bloque.appendChild(text2_componente_bloque);
					elemento3_componente_bloque.appendChild(text3_componente_bloque);
					elemento4_componente_bloque.appendChild(text4_componente_bloque);
					elemento5_componente_bloque.appendChild(text5_componente_bloque);
					elemento6_componente_bloque.appendChild(text6_componente_bloque);
					elemento7_componente_bloque.appendChild(text7_componente_bloque);
				    
				    //Insertamos el raíz
				    document.getDocumentElement().appendChild(raiz_componente_bloque);
				}
			}
				
		    //SELECCIÓN_COMPONENTE_LISTA_BLOQUE
			for (int i = 0; i<lista_componentes_bloque.size(); i++){
			    ComponenteBloque componenteBloque_ = lista_componentes_bloque.get(i);
			    
			    List messages_seleccion = session.createQuery("from SeleccionComponenteListaBloque where id_componente_bloque = '"+componenteBloque_.getIdComponenteBloque()+"'").list();
				//System.out.println("Número de elementos: " + messages.size());
				for ( Iterator iter_seleccion = messages_seleccion.iterator(); iter_seleccion.hasNext(); ) {
					SeleccionComponenteListaBloque selección_componente = (SeleccionComponenteListaBloque) iter_seleccion.next();
					
					Element raiz_seleccion = document.createElement("Seleccion_componente_lista_bloque");  // creamos el elemento raiz
				    Element elemento_seleccion = document.createElement("id_seleccion_componente_lista_bloque"); //creamos un nuevo elemento
				    Element elemento2_seleccion = document.createElement("id_componente_bloque");
				    Element elemento3_seleccion = document.createElement("id_bloque");
					
				    //Leemos el contenido de la base de datos
					Integer id_seleccion_componente_lista_bloque = selección_componente.getIdSeleccionComponenteListaBloque();
					Text text_seleccion = document.createTextNode(id_seleccion_componente_lista_bloque.toString());
					Integer id_componente_bloque_seleccion = selección_componente.getComponenteBloque().getIdComponenteBloque();
					Text text2_seleccion = document.createTextNode(id_componente_bloque_seleccion.toString());
					Integer id_bloque_seleccion = selección_componente.getBloqueConstructivo().getIdBloque();
					Text text3_seleccion = document.createTextNode(id_bloque_seleccion.toString());
					
					//Pegamos el elemento hijo a la raiz
					raiz_seleccion.appendChild(elemento_seleccion);
				    raiz_seleccion.appendChild(elemento2_seleccion);
				    raiz_seleccion.appendChild(elemento3_seleccion);
				    
				    //Pegamos el contenido a los elementos
				    elemento_seleccion.appendChild(text_seleccion); //
				    elemento2_seleccion.appendChild(text2_seleccion);
				    elemento3_seleccion.appendChild(text3_seleccion);
				    
				    //Insertamos el raíz
				    document.getDocumentElement().appendChild(raiz_seleccion);
				}
			}
			
			
			//VISTA_PLANTILLA
		    messages = session.createQuery("from VistaPlantilla where id_plantilla = '"+p.getIdPlantilla()+"'").list();
			//System.out.println("Número de elementos: " + messages.size());
			for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
				VistaPlantilla vista = (VistaPlantilla) iter.next();
				
				Element raiz = document.createElement("Vista_plantilla");  // creamos el elemento raiz
			    Element elemento = document.createElement("id_vista_plantilla"); //creamos un nuevo elemento
			    Element elemento2 = document.createElement("nombre");
			    Element elemento3 = document.createElement("id_plantilla");
				
			    //Leemos el contenido de la base de datos
				Integer id_vistas_plantilla = vista.getIdVistaPlantilla();
				Text text = document.createTextNode(id_vistas_plantilla.toString());
				Text text2 = document.createTextNode(vista.getNombre());
				Integer id_plantilla = vista.getPlantilla().getIdPlantilla();
				Text text3 = document.createTextNode(id_plantilla.toString());
				
				//Pegamos el elemento hijo a la raiz
				raiz.appendChild(elemento);
			    raiz.appendChild(elemento2);
			    raiz.appendChild(elemento3);
			    
			    //Pegamos el contenido a los elementos
			    elemento.appendChild(text); //
			    elemento2.appendChild(text2);
			    elemento3.appendChild(text3);
			    
			    //Insertamos el raíz
			    document.getDocumentElement().appendChild(raiz);
			}
			
			//FASE_PLANTILLA
		    messages = session.createQuery("from FasePlantilla where id_plantilla = '"+p.getIdPlantilla()+"'").list();
			//System.out.println("Número de elementos: " + messages.size());
			for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
				FasePlantilla fase = (FasePlantilla) iter.next();
				
				Element raiz = document.createElement("Fase_plantilla");  // creamos el elemento raiz
			    Element elemento = document.createElement("id_fase_plantilla"); //creamos un nuevo elemento
			    Element elemento2 = document.createElement("nombre");
			    Element elemento3 = document.createElement("orden");
			    Element elemento4 = document.createElement("id_plantilla");
				
			    //Leemos el contenido de la base de datos
				Integer id_fase_plantilla = fase.getIdFasePlantilla();
				Text text = document.createTextNode(id_fase_plantilla.toString());
				Text text2 = document.createTextNode(fase.getNombre());
				Text text3 = document.createTextNode(fase.getOrden().toString());
				Integer id_plantilla = fase.getPlantilla().getIdPlantilla();
				Text text4 = document.createTextNode(id_plantilla.toString());
				
				//Pegamos el elemento hijo a la raiz
				raiz.appendChild(elemento);
			    raiz.appendChild(elemento2);
			    raiz.appendChild(elemento3);
			    raiz.appendChild(elemento4);
			    
			    //Pegamos el contenido a los elementos
			    elemento.appendChild(text); //
			    elemento2.appendChild(text2);
			    elemento3.appendChild(text3);
			    elemento4.appendChild(text4);
			    
			    //Insertamos el raíz
			    document.getDocumentElement().appendChild(raiz);
			}
		}
		////////////////////
		//MODO IMPLANTADOR//
		////////////////////
		
		if (!es_desarrollador){
			//PROYECTO
			ArrayList<Proyecto> lista_proyectos = new ArrayList<Proyecto>();
		    List messages_proyecto = session.createQuery("from Proyecto where id_plantilla = '"+p.getIdPlantilla()+"' AND id_proyecto = '"+pr.getIdProyecto()+"'").list();
			
			for ( Iterator iter_proyecto = messages_proyecto.iterator(); iter_proyecto.hasNext(); ) {
				Proyecto proyecto = (Proyecto) iter_proyecto.next();
				lista_proyectos.add(proyecto);
				
				Element raiz_proyecto = document.createElement("Proyecto");  // creamos el elemento raiz
			    Element elemento_proyecto = document.createElement("id_proyecto"); //creamos un nuevo elemento
			    Element elemento2_proyecto = document.createElement("nombre");
			    Element elemento3_proyecto = document.createElement("descripcion");
			    Element elemento4_proyecto = document.createElement("id_plantilla");
				
			    //Leemos el contenido de la base de datos
				Integer id_proyecto = proyecto.getIdProyecto();
				Text text_proyecto = document.createTextNode(id_proyecto.toString());
				Text text2_proyecto = document.createTextNode(proyecto.getNombre());
				Text text3_proyecto = document.createTextNode(proyecto.getDescripcion());
				Integer id_plantilla = proyecto.getPlantilla().getIdPlantilla();
				Text text4_proyecto = document.createTextNode(id_plantilla.toString());
				
				//Pegamos el elemento hijo a la raiz
				raiz_proyecto.appendChild(elemento_proyecto);
			    raiz_proyecto.appendChild(elemento2_proyecto);
			    raiz_proyecto.appendChild(elemento3_proyecto);
			    raiz_proyecto.appendChild(elemento4_proyecto);
			    
			    //Pegamos el contenido a los elementos
			    elemento_proyecto.appendChild(text_proyecto); //
			    elemento2_proyecto.appendChild(text2_proyecto);
			    elemento3_proyecto.appendChild(text3_proyecto);
			    elemento4_proyecto.appendChild(text4_proyecto);
			    
			    //Insertamos el raíz
			    document.getDocumentElement().appendChild(raiz_proyecto);
			}
			
			//INSTANCIA
			ArrayList<Instancia> lista_instancias = new ArrayList<Instancia>();
			
			for (int i = 0; i<lista_proyectos.size(); i++){
		    	Proyecto proyecto_ = lista_proyectos.get(i);
			
			    List messages_instancia = session.createQuery("from Instancia where id_proyecto = '"+proyecto_.getIdProyecto()+"'").list();
				for ( Iterator iter_instancia = messages_instancia.iterator(); iter_instancia.hasNext(); ) {
					Instancia instancia = (Instancia) iter_instancia.next();
					lista_instancias.add(instancia);
					
					Element raiz_instancia = document.createElement("Instancia");  // creamos el elemento raiz
				    Element elemento_instancia = document.createElement("id_instancia"); //creamos un nuevo elemento
				    Element elemento2_instancia = document.createElement("nombre");
				    Element elemento3_instancia = document.createElement("id_bloque");
				    Element elemento4_instancia = document.createElement("id_proyecto");
					
				    //Leemos el contenido de la base de datos
					Integer id_instancia = instancia.getIdInstancia();
					Text text_instancia = document.createTextNode(id_instancia.toString());
					Text text2_instancia = document.createTextNode(instancia.getNombre());
					Integer id_bloque = instancia.getBloqueConstructivo().getIdBloque();
					Text text3_instancia = document.createTextNode(id_bloque.toString());
					Integer id_proyecto = instancia.getProyecto().getIdProyecto();
					Text text4_instancia = document.createTextNode(id_proyecto.toString());
					
					//Pegamos el elemento hijo a la raiz
					raiz_instancia.appendChild(elemento_instancia);
				    raiz_instancia.appendChild(elemento2_instancia);
				    raiz_instancia.appendChild(elemento3_instancia);
				    raiz_instancia.appendChild(elemento4_instancia);
				    
				    //Pegamos el contenido a los elementos
				    elemento_instancia.appendChild(text_instancia); //
				    elemento2_instancia.appendChild(text2_instancia);
				    elemento3_instancia.appendChild(text3_instancia);
				    elemento4_instancia.appendChild(text4_instancia);
				    
				    //Insertamos el raíz
				    document.getDocumentElement().appendChild(raiz_instancia);
				}
			}
			
			//COMPONENTE_INSTANCIA
			ArrayList<ComponenteInstancia> lista_componentes_instancia = new ArrayList<ComponenteInstancia>();
			
			for (int i = 0; i<lista_instancias.size(); i++){
		    	Instancia instancia_ = lista_instancias.get(i);
			
			    List messages_componente_instancia = session.createQuery("from ComponenteInstancia where id_instancia = '"+instancia_.getIdInstancia()+"'").list();
				for ( Iterator iter_componente_instancia = messages_componente_instancia.iterator(); iter_componente_instancia.hasNext(); ) {
					ComponenteInstancia componente_instancia = (ComponenteInstancia) iter_componente_instancia.next();
					lista_componentes_instancia.add(componente_instancia);
					
					Element raiz_componente_instancia = document.createElement("Componente_instancia");  // creamos el elemento raiz
				    Element elemento_componente_instancia = document.createElement("id_componente_instancia"); //creamos un nuevo elemento
				    Element elemento2_componente_instancia = document.createElement("texto");
				    Element elemento3_componente_instancia = document.createElement("checkbox");
				    Element elemento4_componente_instancia = document.createElement("fecha");
				    Element elemento5_componente_instancia = document.createElement("portafolio");
				    Element elemento6_componente_instancia = document.createElement("id_componente_bloque");
				    Element elemento7_componente_instancia = document.createElement("id_instancia");
				    Element elemento8_componente_instancia = document.createElement("modelo_madurez_puntuacion");
				    Element elemento9_componente_instancia = document.createElement("modelo_madurez_media_parcial");
				    Element elemento10_componente_instancia = document.createElement("modelo_madurez_media_global");
				    Element elemento11_componente_instancia = document.createElement("fecha_modelo_madurez");
					
				    
				    //Leemos el contenido de la base de datos
				    
				    //Text
					Integer id_componente_instancia = componente_instancia.getIdComponenteInstancia();
					Text text_componente_instancia = document.createTextNode(id_componente_instancia.toString());
					
					
					//Text 2
					Text text2_componente_instancia;
					if (componente_instancia.getTexto()!=null)
						text2_componente_instancia = document.createTextNode(componente_instancia.getTexto());
					else
						text2_componente_instancia = document.createTextNode("null");
					
					
					//Text 3
					Text text3_componente_instancia;
					if (componente_instancia.getCheckbox()!=null)
						text3_componente_instancia = document.createTextNode(componente_instancia.getCheckbox().toString());
					else
						text3_componente_instancia = document.createTextNode("null");
					
					
					//Text 4
					Text text4_componente_instancia;
					if (componente_instancia.getFecha()!=null)
						text4_componente_instancia = document.createTextNode(componente_instancia.getFecha());
					else
						text4_componente_instancia = document.createTextNode("null");
					
					
					//Text 5
					Text text5_componente_instancia;
					if (componente_instancia.getPortafolio()!=null)
						text5_componente_instancia = document.createTextNode(componente_instancia.getPortafolio());
					else
						text5_componente_instancia = document.createTextNode("null");
					
					
					//Text 6
					Integer id_componente_bloque = componente_instancia.getComponenteBloque().getIdComponenteBloque();
					Text text6_componente_instancia;
					if (id_componente_bloque!=null)
						text6_componente_instancia = document.createTextNode(id_componente_bloque.toString());
					else
						text6_componente_instancia = document.createTextNode("null");
					
					
					//Text 7
					Integer id_instancia = componente_instancia.getInstancia().getIdInstancia();
					Text text7_componente_instancia;
					if (id_componente_bloque!=null)
						text7_componente_instancia = document.createTextNode(id_instancia.toString());
					else
						text7_componente_instancia = document.createTextNode("null");
					
					//Text 8
					Text text8_componente_instancia;
					if (componente_instancia.getModeloMadurezPuntuacion()!=null)
						text8_componente_instancia = document.createTextNode(componente_instancia.getModeloMadurezPuntuacion().toString());
					else
						text8_componente_instancia = document.createTextNode("null");
					
					
					//Text 9
					Text text9_componente_instancia;
					if (componente_instancia.getModeloMadurezMediaParcial()!=null)
						text9_componente_instancia = document.createTextNode(componente_instancia.getModeloMadurezMediaParcial().toString());
					else
						text9_componente_instancia = document.createTextNode("null");
					
					
					//Text 10
					Text text10_componente_instancia;
					if (componente_instancia.getModeloMadurezMediaGlobal()!=null)
						text10_componente_instancia = document.createTextNode(componente_instancia.getModeloMadurezMediaGlobal().toString());
					else
						text10_componente_instancia = document.createTextNode("null");
					
					
					//Text 11
					Text text11_componente_instancia;
					if (componente_instancia.getFechaModeloMadurez()!=null)
						text11_componente_instancia = document.createTextNode(componente_instancia.getFechaModeloMadurez());
					else
						text11_componente_instancia = document.createTextNode("null");
					
					
					//Pegamos el elemento hijo a la raiz
					raiz_componente_instancia.appendChild(elemento_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento2_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento3_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento4_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento5_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento6_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento7_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento8_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento9_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento10_componente_instancia);
				    raiz_componente_instancia.appendChild(elemento11_componente_instancia);
				    
				    //Pegamos el contenido a los elementos
				    elemento_componente_instancia.appendChild(text_componente_instancia); 
				    elemento2_componente_instancia.appendChild(text2_componente_instancia);
				    elemento3_componente_instancia.appendChild(text3_componente_instancia);
				    elemento4_componente_instancia.appendChild(text4_componente_instancia);
				    elemento5_componente_instancia.appendChild(text5_componente_instancia); 
				    elemento6_componente_instancia.appendChild(text6_componente_instancia);
				    elemento7_componente_instancia.appendChild(text7_componente_instancia);
				    elemento8_componente_instancia.appendChild(text8_componente_instancia);
				    elemento9_componente_instancia.appendChild(text9_componente_instancia); 
				    elemento10_componente_instancia.appendChild(text10_componente_instancia);
				    elemento11_componente_instancia.appendChild(text11_componente_instancia);
	
				    
				    //Insertamos el raíz
				    document.getDocumentElement().appendChild(raiz_componente_instancia);
				}
			}
			
			
			//CONTENIDO_LISTA
			for (int i = 0; i<lista_componentes_instancia.size(); i++){
		    	ComponenteInstancia componente_instancia_ = lista_componentes_instancia.get(i);
			
			    List messages_contenido_lista = session.createQuery("from ContenidoLista where id_componente_instancia = '"+componente_instancia_.getIdComponenteInstancia()+"'").list();
				for ( Iterator iter_contenido_lista = messages_contenido_lista.iterator(); iter_contenido_lista.hasNext(); ) {
					ContenidoLista contenido_lista = (ContenidoLista) iter_contenido_lista.next();
					
					
					Element raiz_contenido_lista = document.createElement("Contenido_lista");  // creamos el elemento raiz
				    Element elemento_contenido_lista = document.createElement("id_contenido_lista"); //creamos un nuevo elemento
				    Element elemento2_contenido_lista = document.createElement("id_instancia");
				    Element elemento3_contenido_lista = document.createElement("id_componente_instancia");
					
				    //Leemos el contenido de la base de datos
				    
				    Text text_contenido_lista;
					Integer id_contenido_lista = contenido_lista.getIdContenidoLista();
					if (id_contenido_lista!=null)
						text_contenido_lista = document.createTextNode(id_contenido_lista.toString());
					else
						text_contenido_lista = document.createTextNode("null");
					
					Text text2_contenido_lista;
					Integer id_instancia = contenido_lista.getInstancia().getIdInstancia();
					if (id_instancia!=null)
						text2_contenido_lista = document.createTextNode(id_instancia.toString());
					else
						text2_contenido_lista = document.createTextNode("null");
					
					Text text3_contenido_lista;
					Integer id_componente_instancia = contenido_lista.getComponenteInstancia().getIdComponenteInstancia();
					if (id_componente_instancia!=null)
						text3_contenido_lista = document.createTextNode(id_componente_instancia.toString());
					else
						text3_contenido_lista = document.createTextNode("null");
					
					
					//Pegamos el elemento hijo a la raiz
					raiz_contenido_lista.appendChild(elemento_contenido_lista);
				    raiz_contenido_lista.appendChild(elemento2_contenido_lista);
				    raiz_contenido_lista.appendChild(elemento3_contenido_lista);
	
				    
				    //Pegamos el contenido a los elementos
				    elemento_contenido_lista.appendChild(text_contenido_lista); //
				    elemento2_contenido_lista.appendChild(text2_contenido_lista);
				    elemento3_contenido_lista.appendChild(text3_contenido_lista);
				    
				    
				    //Insertamos el raíz
				    document.getDocumentElement().appendChild(raiz_contenido_lista);
				}
			}
		}
		session.close();
	    
	    Text text4 = document.createTextNode("1"); //Ingresamos la info
	    document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
	    
	    Source source = new DOMSource(document);
	    Result result;
	    if (path.endsWith(".xml"))
	    	result = new StreamResult(new FileOutputStream(path)); //nombre del archivo
	    else
	    	result = new StreamResult(new FileOutputStream(path+".xml")); //nombre del archivo
	    Result console= new StreamResult(System.out);

	    Transformer transformer = TransformerFactory.newInstance().newTransformer();
	    //System.out.println(document);
	    //transformer.transform(source, console);
	    transformer.transform(source, result);

		
  } catch (Exception e) {
	//System.err.println("Error: "+e);  
    e.printStackTrace();
  }

 }

}
