/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.forms; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import org.eclipse.ui.IMemento; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author AU */ public class MementoDOM implements IMemento { private Element element; private static final String ID = "id"; //$NON-NLS-1$ private static final String MEMENTO = "Memento"; //$NON-NLS-1$ private static final String TYPE = "type"; //$NON-NLS-1$ private Hashtable hash = new Hashtable(); private MementoDOM() {} private MementoDOM(Element owner, String type) { element = owner.getOwnerDocument().createElement(MEMENTO); element.setAttribute(TYPE, type); owner.appendChild(element); } public MementoDOM(Node node) { this.element = (Element)node; } private IMemento getMemento(Node node) { if (node==null) return null; IMemento memento = (IMemento)hash.get(node); if (memento==null) { memento = new MementoDOM(node); hash.put(node, memento); } return memento; } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#createChild(java.lang.String) */ public IMemento createChild(String type) { return new MementoDOM(element, type); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#createChild(java.lang.String, java.lang.String) */ public IMemento createChild(String type, String id) { MementoDOM newMemento = new MementoDOM(element, type); newMemento.setID(id); return newMemento; } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#getChild(java.lang.String) */ public IMemento getChild(String type) { NodeList nl = element.getChildNodes(); Node node; for (int i=0; i<nl.getLength(); ++i) { node = nl.item(i); if ((node instanceof Element) && (type.equals(((Element)node).getAttribute(TYPE)))) return getMemento(node); } return null; } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#getChildren(java.lang.String) */ public IMemento[] getChildren(String type) { NodeList nl = element.getElementsByTagName(type); ArrayList list = new ArrayList(); Node node; for (int i=0; i<nl.getLength(); ++i) { node = nl.item(i); if ((node instanceof Element) && (type.equals(((Element)node).getAttribute(TYPE)))) list.add(getMemento(node)); } return (IMemento[])list.toArray(new IMemento[list.size()]); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#getFloat(java.lang.String) */ public Float getFloat(String key) { return new Float(element.getAttribute(key)); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#getID() */ public String getID() { return element.getAttribute(ID); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#getInteger(java.lang.String) */ public Integer getInteger(String key) { return Integer.valueOf(element.getAttribute(key)); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#getString(java.lang.String) */ public String getString(String key) { return element.getAttribute(key); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#getTextData() */ public String getTextData() { return element.getNodeValue(); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#putFloat(java.lang.String, float) */ public void putFloat(String key, float value) { element.setAttribute(key, ""+value); //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#putInteger(java.lang.String, int) */ public void putInteger(String key, int value) { element.setAttribute(key, ""+value); //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#putMemento(org.eclipse.ui.IMemento) */ public void putMemento(IMemento memento) { element.appendChild(((MementoDOM)memento).getElement()); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#putString(java.lang.String, java.lang.String) */ public void putString(String key, String value) { element.setAttribute(key, value); } /* (non-Javadoc) * @see org.eclipse.ui.IMemento#putTextData(java.lang.String) */ public void putTextData(String data) { element.setNodeValue(data); } public void setID(String id) { element.setAttribute(ID, id); } private Element getElement() { return element; } public String[] getAttributeKeys() { NamedNodeMap map = element.getAttributes(); int size = map.getLength(); String[] attributes = new String[size]; for (int i = 0; i < size; i++) { Node node = map.item(i); attributes[i] = node.getNodeName(); } return attributes; } public Boolean getBoolean(String key) { String attr = getString(key); if (attr == null) { return null; } return Boolean.valueOf(attr); } public void putBoolean(String key, boolean value) { putString(key, value ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ } public String getType() { return getString(TYPE); } /** * Returns all children of this node. * Required by IMemento since Eclipse 3.8 */ public IMemento[] getChildren() { List<IMemento> result = new ArrayList<IMemento>(); NodeList nl = element.getChildNodes(); for (int i=0; i<nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { IMemento memento = getMemento(node); result.add(memento); } } return result.toArray(new IMemento[result.size()]); } }