/******************************************************************************* * Copyright (c) 2008 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.configuration.editors.xml; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jboss.tools.smooks.configuration.editors.IXMLStructuredObject; import org.w3c.dom.Attr; import org.w3c.dom.Element; /** * @author Dart Peng * @Date Jul 25, 2008 */ public class TagObject extends AbstractXMLObject { protected List<TagPropertyObject> properties = new ArrayList<TagPropertyObject>(); public List<TagPropertyObject> getProperties() { return properties; } public void setProperties(List<TagPropertyObject> properties) { this.properties = properties; } public void addProperty(TagPropertyObject pro) { this.getProperties().add(pro); if (pro != null) pro.setParent(this); Attr attribute = pro.getReferenceAttibute(); Element parentElement = getReferenceElement(); if (attribute != null && parentElement != null) { if (attribute.getParentNode() == parentElement) { return; } parentElement.setAttributeNode(attribute); } } public void removeProperty(TagPropertyObject pro) { this.getProperties().remove(pro); if (pro != null) pro.setParent(null); Attr attribute = pro.getReferenceAttibute(); Element parentElement = getReferenceElement(); if (attribute != null && parentElement != null) { parentElement.removeAttributeNode(attribute); } } public void addChildTag(TagObject tag) { this.getXMLNodeChildren().add(tag); if (tag != null) tag.setParent(this); Element childElement = tag.getReferenceElement(); Element parentElement = getReferenceElement(); if (childElement != null && parentElement != null) { if (childElement.getParentNode() == parentElement) { return; } parentElement.appendChild(childElement); } } public void removeChildTag(TagObject tag) { this.getXMLNodeChildren().remove(tag); if (tag != null) tag.setParent(null); Element childElement = tag.getReferenceElement(); Element parentElement = getReferenceElement(); if (childElement != null && parentElement != null) { parentElement.removeChild(childElement); } } @Override public List<IXMLStructuredObject> getChildren() { List<IXMLStructuredObject> all = new ArrayList<IXMLStructuredObject>(); List<AbstractXMLObject> tags = this.getXMLNodeChildren(); List<TagPropertyObject> properties = this.getProperties(); all.addAll(properties); all.addAll(tags); return all; } public String toString() { String blankString = ""; //$NON-NLS-1$ int deep = -1; AbstractXMLObject parent = this; while (parent != null && !(parent instanceof TagList)) { deep++; parent = parent.getParent(); } for (int i = 0; i < deep; i++) { blankString = blankString + "\t"; //$NON-NLS-1$ } StringBuffer propertyesBuffer = new StringBuffer(); for (Iterator<?> iterator = properties.iterator(); iterator.hasNext();) { TagPropertyObject pro = (TagPropertyObject) iterator.next(); propertyesBuffer.append(" " + pro.getName() + "=\"\""); //$NON-NLS-1$ //$NON-NLS-2$ } StringBuffer buffer = null; if (propertyesBuffer.length() == 0) { buffer = new StringBuffer(blankString + "<" + getName() + ">"); //$NON-NLS-1$ //$NON-NLS-2$ } else { buffer = new StringBuffer(blankString + "<" + getName() + propertyesBuffer.toString() + ">"); //$NON-NLS-1$ //$NON-NLS-2$ } List<?> l = getXMLNodeChildren(); if (!l.isEmpty()) { buffer.append("\n"); //$NON-NLS-1$ } for (Iterator<?> iterator = l.iterator(); iterator.hasNext();) { TagObject tag = (TagObject) iterator.next(); buffer.append(tag.toString()); if (iterator.hasNext()) buffer.append("\n"); //$NON-NLS-1$ } if (l.isEmpty()) { buffer.append("</" + getName() + ">"); //$NON-NLS-1$ //$NON-NLS-2$ } else { buffer.append("\n" + blankString + "</" + getName() + ">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } return buffer.toString(); } }