package org.example;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
import java.util.stream.IntStream;
interface Log {
default void info
(String texto
) { Logger.getLogger(Presentar.class.getSimpleName()).info(texto);
}
default void warn
(String texto
) { Logger.getLogger(Presentar.class.getSimpleName()).info(texto);
}
}
enum BuilderFile {
CREATE,READ;
}
/**
* @author orlando
*/
public class Presentar implements Log {
private static final String PELICULA
= "pelicula"; private static final String TIENDA
= "tienda";
/**
* Ruta por defecto para crear el fichero
*/
private static final Path PATH_DOC_XML_FILE = Paths.get("peliculas.xml");
/**
* Invocar primero si no existe documento
*/
public void crearDocumento() {
/**
* Instanciando Builder para crear Elemento Root e hijos
*/
new Presentar.Builder()
.conDocument(BuilderFile.CREATE)
.conRootElement(TIENDA)
.conId("1")
.createNodeAndChild(PELICULA, "titulo", "Rambo 1")
.conId("2")
.createNodeAndChild(PELICULA, "titulo", "Rambo 2")
.build();
info("Archivo creado correctamente!");
}
public void presentar() {
try {
final NodeList listaPelis = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.
parse(new File("peliculas.xml")) .getElementsByTagName(PELICULA);
for (int i = 0; i < listaPelis.getLength(); i++) {
Node nodo = listaPelis.item(i);
if (nodo.getNodeType() == Node.ELEMENT_NODE) {
NodeList hijos = e.getChildNodes();
for (int j = 0; j < hijos.getLength(); j++) {
Node hijo = hijos.item(j);
if (hijo.getNodeType() == Node.ELEMENT_NODE) {
info(hijo.getNodeName() + ": " + hijo.getTextContent());
}
}
info("----------------------------------------------");
}
}
} catch (ParserConfigurationException
| SAXException
| IOException ex
) { warn(ex.getMessage());
}
}
public void Añadir() {
}
public void modificar
(String nodoModificar,
String nuevoNombre
) { try {
new Presentar.Builder()
.conDocument(BuilderFile.READ)
.modificarChilNode(nodoModificar, nuevoNombre)
.build();
warn(e.getMessage());
}
}
public void eliminar() {
}
/**
* Builder para crear elementos
*/
public static class Builder implements Log {
private Attr attr;
//Primero
public Builder conDocument(BuilderFile builderFile) {
if(builderFile == BuilderFile.CREATE) {
try {
this.document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.newDocument();
} catch (ParserConfigurationException e) {
warn("{} error en createNewDocument()");
}
} else if(builderFile == BuilderFile.READ){
try {
this.document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.parse(PATH_DOC_XML_FILE.toFile());
} catch (ParserConfigurationException e) {
warn("{} error en createNewDocument()");
} catch (SAXException e) {
e.printStackTrace();
e.printStackTrace();
}
}
return this;
}
//Segundo titulo
public Builder conRootElement
(final String nombre
) { this.rootElement = document.createElement(nombre);
document.appendChild(rootElement);
return this;
}
public Builder conId
(final String id
) { this.attr = document.createAttribute("id");
attr.setValue(id);
return this;
}
//Pelicula
public Builder createNodeAndChild
(final String nodeName,
final String title,
final String childName
) { //Node title
final Element nodeTitle
= document.
createElement(nodeName
); rootElement.appendChild(nodeTitle);
nodeTitle.setAttributeNode(this.attr);
//Child title
final Element childNameTitle
= document.
createElement(title
); childNameTitle.appendChild(document.createTextNode(childName));
nodeTitle.appendChild(childNameTitle);
return this;
}
public Builder modificarChilNode
(final String viejoNombre,
final String nuevoNombre
) { //normalizar
document.getDocumentElement().normalize();
//Lista peliculas
final NodeList listaPeliculas = document.getElementsByTagName(PELICULA);
final AtomicBoolean value = new AtomicBoolean(true);
IntStream.range(0, listaPeliculas.getLength())
.boxed()
.parallel()
.forEachOrdered(pelicula -> {
final Node node = listaPeliculas.item(pelicula);
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (element.hasChildNodes()) {
final NodeList childNodes = node.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
final Node child = childNodes.item(j);
if (child.getTextContent().equals(viejoNombre)) {
child.setTextContent(nuevoNombre);
info("Nodo: ".concat(viejoNombre)
.concat(" cambiado por ")
.concat(nuevoNombre));
info("Edición terminada correctamente");
value.set(false);
}
}
}
}
});
if(value.get()) {
warn("No existe el titulo");
}
return this;
}
public Builder build() {
try {
TransformerFactory.newInstance()
.newTransformer()
.transform(new DOMSource(document), new StreamResult(PATH_DOC_XML_FILE.toFile()));
} catch (TransformerException e) {
warn("error al escribir en fichero .xml");
}
return this;
}
}
}
}