package org.honours.greenstone; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.log4j.Logger; import org.expeditee.items.Text; import org.greenstone.gsdl3.util.GSXML; import org.greenstone.gsdl3.util.XMLConverter; import org.w3c.dom.*; public class ArchiveFileEditor { static Logger logger = Logger.getLogger(org.honours.greenstone.ArchiveFileEditor.class.getName()); private XMLConverter _xmlConverter; private Document _document; private String _archiveDocFile; public ArchiveFileEditor(String docXML){ _xmlConverter = new XMLConverter(); _archiveDocFile = docXML; _document = _xmlConverter.getDOM(new File(_archiveDocFile)); } public void editArchiveDocFile(Text text){ try{ String newText = text.getText(); String data = (text.getData() != null) ? text.getData().get(0) : ""; if(data.equals("")) return; NodeList nl = _document.getDocumentElement().getElementsByTagName("Description"); Element description = (Element)nl.item(0); nl = description.getChildNodes(); boolean found = false; for(int i = 0; i < nl.getLength(); i++){ Node node = nl.item(i); if(node.getNodeType() == Node.ELEMENT_NODE){ Element e = (Element)node; String originalText = e.getTextContent(); if(e.getTagName().equals("Metadata") && e.getAttribute("name").equals(data)){ if(!originalText.equals(newText)){ GSXML.setNodeText(e, newText); } found = true; } } } if(!found){ System.err.println("Create a new metadata"); Element newElem = _document.createElement("Metadata"); newElem.setAttribute("name",data); newElem.setTextContent(newText); description.appendChild(newElem); description.appendChild(_document.createTextNode("\n\t")); found = true; } }catch(Exception e){ e.printStackTrace(); } } /** * Write out new stuff to doc.xml */ public void write(){ try{ TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); //generating string from xml tree. StringWriter sw = new StringWriter(); StreamResult result = new StreamResult(sw); DOMSource source = new DOMSource(_document); trans.transform(source,result); String xmlString = sw.toString(); //Saving XML content back to doc.xml file //System.err.println(_archiveDocFile); OutputStream os = new FileOutputStream(_archiveDocFile); byte[] buf = xmlString.getBytes(); for(int i = 0; i < buf.length; i++) os.write(buf[i]); os.close(); buf = null; }catch(Exception e){ e.printStackTrace(); return; } } }