/* * Created on May 18, 2006 */ package org.openedit.xml; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.openedit.Data; import com.openedit.util.PathUtilities; public class XmlFile implements Data { protected long fieldLastModified = -1; protected String fieldPath; protected String fieldId; protected String fieldElementName; protected Element fieldRoot; protected List fieldAttributes; protected boolean fieldExist; public String getPath() { return fieldPath; } public void setPath(String inFile) { fieldPath = inFile; } public String getId() { return fieldId; } public void setId(String inId) { fieldId = inId; } public long getLastModified() { return fieldLastModified; } public void setLastModified(long inLastModified) { fieldLastModified = inLastModified; } public Element getRoot() { return fieldRoot; } public void setRoot(Element inRoot) { fieldRoot = inRoot; } public List getElements() { return getRoot().elements(); } public List getAttributes() { //this is a list of attributes as defined by the action that created us if (fieldAttributes == null) { fieldAttributes = new ArrayList(); } return fieldAttributes; } public void setAttributes(List inAttributes) { fieldAttributes = inAttributes; } public Element getElement(String inName) { return getRoot().element(inName); } public Element getElementById(String inEid) { if( inEid == null) { return null; } for (Iterator iter = getElements().iterator(); iter.hasNext();) { Element element = (Element) iter.next(); String id = element.attributeValue("id"); if ( inEid.equals(id)) { return element; } } return null; } public void deleteElement(Element inEid) { getRoot().remove(inEid); } /* * TODO: Get rid of this idea. * This returns the lowest natural number that could function as a unique * top level id for this file. */ protected Integer findUniqueId() { //log.info("do not use this method"); Set set = new HashSet(); for (Iterator iterator = getRoot().elementIterator(); iterator.hasNext();) { Element element = (Element) iterator.next(); try { int idAsNum = Integer.parseInt(element.attributeValue("id")); set.add(new Integer(idAsNum)); } catch (NumberFormatException e) { } } for (int i = 1; i < set.size() + 1; i++) { if (!set.contains(Integer.valueOf(i))) { return Integer.valueOf(i); } } return new Integer(set.size() + 1); } /** * Should not use this since we cant decide how it should default * @return */ public Element addNewElement() { if( getRoot() == null) { setRoot(DocumentHelper.createElement(getElementName())); } Element child = getRoot().addElement(getElementName()); child.addAttribute("id", "" + findUniqueId() ); child.setText("New"); return child; } public Element createElement() { Element child = DocumentHelper.createElement(getElementName()); //child.addAttribute("id", "" + findUniqueId() ); return child; } public String getElementName() { if (fieldElementName == null) { fieldElementName = "data"; } return fieldElementName; } public void setElementName(String inElementName) { fieldElementName = inElementName; } public boolean isExist() { return fieldExist; } public void setExist(boolean inExist) { fieldExist = inExist; } public Iterator getElements(String inName) { return getRoot().elementIterator(inName); } /** * Gets the text for row based on the id attribute lower case */ public String get(String inId) { Element prop = getElementById(inId); if (prop != null) { return prop.getText(); } String text = getRoot().attributeValue(inId); return text; } public List keys() { List list = new ArrayList(size()); for (Iterator iter = getElements().iterator(); iter.hasNext();) { Element prop = (Element)iter.next(); list.add(prop.attributeValue("id")); } return list; } public int size() { return getElements().size(); } public void add(String inId, String inText) { Element child = addNewElement(); child.addAttribute("id", inId); child.setText(inText); } public void add(Element inChild) { getRoot().add(inChild); } public void clear() { if( getRoot() != null) { setRoot(DocumentHelper.createElement(getRoot().getName())); } } public String getName() { return PathUtilities.extractPageName(getPath()); } public Map getProperties() { // TODO Auto-generated method stub return null; } public String getSourcePath() { // TODO Auto-generated method stub return getPath(); } public void setName(String inName) { } public void setProperty(String inId, String inValue) { getRoot().addAttribute(inId, inValue); } public void setSourcePath(String inSourcepath) { setPath(inSourcepath); } public void setProperties(Map<String,String> inProperties) { for (Iterator iterator = inProperties.entrySet().iterator(); iterator.hasNext();) { String key = (String) iterator.next(); setProperty(key, inProperties.get(key)); } } public void setValues(String inKey, Collection<String> inValues) { StringBuffer values = new StringBuffer(); for (Iterator iterator = inValues.iterator(); iterator.hasNext();) { String detail = (String) iterator.next(); values.append(detail); if( iterator.hasNext()) { values.append(" | "); } } setProperty(inKey,values.toString()); } }