/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.core.internal.dom;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xmind.core.Core;
import org.xmind.core.IMeta;
import org.xmind.core.IMetaData;
import org.xmind.core.event.CoreEvent;
import org.xmind.core.internal.MetaData;
import org.xmind.core.util.DOMUtils;
/**
* @deprecated
* @author Frank Shaka
*/
public class MetaDataImpl extends MetaData {
private Element implementation;
private MetaImpl ownedMeta;
public MetaDataImpl(Element implementation, MetaImpl ownedMeta) {
this.implementation = implementation;
this.ownedMeta = ownedMeta;
}
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null || !(obj instanceof MetaDataImpl))
return false;
MetaDataImpl that = (MetaDataImpl) obj;
return this.implementation == that.implementation;
}
public int hashCode() {
return implementation.hashCode();
}
public String toString() {
return DOMUtils.toString(implementation);
}
public <T> T getAdapter(Class<T> adapter) {
if (adapter.isAssignableFrom(Element.class))
return adapter.cast(getImplementation());
return super.getAdapter(adapter);
}
public Element getImplementation() {
return implementation;
}
public void addMetaData(IMetaData data) {
Element mdEle = ((MetaDataImpl) data).getImplementation();
implementation.appendChild(mdEle);
}
public void removeMetaData(IMetaData data) {
Element mdEle = ((MetaDataImpl) data).getImplementation();
implementation.removeChild(mdEle);
}
public String getAttribute(String key) {
return DOMUtils.getAttribute(implementation, key);
}
public String getKey() {
return implementation.getTagName();
}
public IMetaData[] getMetaData(String key) {
List<IMetaData> list = new ArrayList<IMetaData>();
Iterator<Element> it = DOMUtils.childElementIterByTag(implementation,
key);
while (it.hasNext()) {
Element mdEle = it.next();
list.add(ownedMeta.getMetaData(mdEle));
}
return list.toArray(new IMetaData[list.size()]);
}
public IMeta getOwnedMeta() {
return ownedMeta;
}
public String getValue() {
return implementation.getTextContent();
}
protected String getKeyPath() {
StringBuilder sb = new StringBuilder(20);
Element e = implementation;
sb.insert(0, e.getTagName());
Node p = e.getParentNode();
Element metaElement = ownedMeta.getMetaElement();
while (p != null && p != e && p != metaElement
&& p instanceof Element) {
e = (Element) p;
sb.insert(0, IMeta.SEP);
sb.insert(0, e.getTagName());
p = e.getParentNode();
}
return sb.toString();
}
public void setAttribute(String key, String value) {
String oldValue = DOMUtils.getAttribute(implementation, key);
DOMUtils.setAttribute(implementation, key, value);
String newValue = DOMUtils.getAttribute(implementation, key);
if (oldValue != newValue
&& (oldValue == null || !oldValue.equals(newValue))) {
CoreEvent event = new CoreEvent(ownedMeta, Core.MetadataAttribute,
getKeyPath(), oldValue, newValue);
event.setData(key);
ownedMeta.getCoreEventSupport().dispatch(ownedMeta, event);
}
}
public void setValue(String value) {
String oldValue = implementation.getTextContent();
implementation.setTextContent(value);
String newValue = implementation.getTextContent();
if (!oldValue.equals(newValue)) {
ownedMeta.getCoreEventSupport().dispatchTargetValueChange(ownedMeta,
Core.Metadata, getKeyPath(), oldValue, newValue);
}
}
}