/******************************************************************************* * Copyright (c) 2007 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.seam.internal.core; import java.util.List; import java.util.Properties; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.project.ext.IValueInfo; import org.jboss.tools.common.model.project.ext.event.Change; import org.jboss.tools.common.xml.XMLUtilities; import org.jboss.tools.seam.core.ISeamElement; import org.jboss.tools.seam.core.ISeamProperty; import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration; import org.jboss.tools.seam.core.event.ISeamValue; import org.w3c.dom.Element; public class SeamProperty extends AbstractSeamDeclaration implements ISeamProperty { protected ISeamValue value; public SeamProperty() {} public ISeamValue getValue() { return value; } public void setValue(ISeamValue value) { this.value = value; if(value != null) adopt((SeamObject)value); } public int getLength() { IValueInfo info = attributes.get(ISeamXmlComponentDeclaration.NAME); if(info != null) return info.getLength(); return 0; } public int getStartPosition() { IValueInfo info = attributes.get(ISeamXmlComponentDeclaration.NAME); if(info != null) return info.getStartPosition(); return 0; } @Override public List<Change> merge(ISeamElement s) { List<Change> changes = super.merge(s); SeamProperty d = (SeamProperty)s; if(!stringsEqual(name, d.name)) { changes = Change.addChange(changes, new Change(this, "name", name, d.name)); //$NON-NLS-1$ name = d.name; } if(value == null) { if(d.value != null) { setValue(d.value); changes = Change.addChange(changes, new Change(this, SeamXMLConstants.ATTR_VALUE, null, value)); } } else if(d.value == null) { if(value != null) { changes = Change.addChange(changes, new Change(this, SeamXMLConstants.ATTR_VALUE, value, null)); } value = null; } else if(!value.getClass().getName().equals(d.value.getClass().getName())) { Object old = value; setValue(d.value); changes = Change.addChange(changes, new Change(this, SeamXMLConstants.ATTR_VALUE, old, value)); } else { List<Change> cs = ((SeamObject)value).merge((SeamObject)d.value); if(cs != null && !cs.isEmpty()) { Change c = new Change(this, SeamXMLConstants.ATTR_VALUE, value, value); c.addChildren(cs); changes = Change.addChange(changes, c); } } return changes; } boolean stringsEqual(String s1, String s2) { return s1 == null ? s2 == null : s1.equals(s2); } public SeamProperty clone() throws CloneNotSupportedException { SeamProperty c = (SeamProperty)super.clone(); c.value = value == null ? null : value.clone(); return c; } public String getXMLName() { return SeamXMLConstants.TAG_PROPERTY; } public Element toXML(Element parent, Properties context) { Element element = super.toXML(parent, context); XModelObject old = pushModelObject(context); if(value instanceof SeamObject) { SeamObject o = (SeamObject)value; o.toXML(element, context); } popModelObject(context, old); return element; } public void loadXML(Element element, Properties context) { super.loadXML(element, context); XModelObject old = pushModelObject(context); Element c = XMLUtilities.getUniqueChild(element, SeamXMLConstants.TAG_VALUE); if(c != null) { SeamObject v = null; String cls = c.getAttribute(SeamXMLConstants.ATTR_CLASS); if(SeamXMLConstants.CLS_MAP.equals(cls)) { v = new SeamValueMap(); } else if(SeamXMLConstants.CLS_LIST.equals(cls)) { v = new SeamValueList(); } else { v = new SeamValueString(); } if(v != null) { v.loadXML(c, context); setValue((ISeamValue)v); } } popModelObject(context, old); } }