/*
ListFieldProperty.java
(c) 2010-2016 Edward Swartz
All rights reserved. This program and the accompanying materials
are 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
*/
package ejs.base.properties;
import java.util.LinkedList;
import java.util.List;
import org.w3c.dom.Element;
import ejs.base.utils.XMLUtils;
/**
* @author ejs
*
*/
public class ListFieldProperty extends FieldProperty {
private final String elementName;
private IClassPropertyFactory elementFactory;
public ListFieldProperty(String name, Object obj, String fieldName,
String elementName) {
super(name, obj, fieldName);
this.elementName = elementName;
}
public ListFieldProperty(Object obj, String fieldName,
String elementName) {
this(fieldName, obj, fieldName, elementName);
}
/* (non-Javadoc)
*
*/
@Override
public void saveChildState(Element element, Object value,
String propertyName) {
List<?> list = (List<?>)value;
if (list == null || list.isEmpty())
return;
Element listEl = element.getOwnerDocument().createElement(propertyName);
element.appendChild(listEl);
for (Object el : list) {
if (el instanceof IXMLPersistable) {
Element child = listEl.getOwnerDocument().createElement(elementName);
listEl.appendChild(child);
((IXMLPersistable)el).saveState(child);
String id = elementFactory.getId(el);
if (id != null) {
child.setAttribute("id", id);
}
} else if (el instanceof IPropertyProvider) {
Element child = listEl.getOwnerDocument().createElement(elementName);
listEl.appendChild(child);
((IPropertyProvider)el).getPropertySource().saveState(child);
String id = elementFactory.getId(el);
if (id != null) {
child.setAttribute("id", id);
}
//((IPropertyProvider)el).getPropertySource().saveState(child);
}
}
}
/* (non-Javadoc)
*
*/
@SuppressWarnings("unchecked")
@Override
public void loadChildState(Element parent, Object obj, String propertyName) {
Element[] elements = XMLUtils.getChildElementsNamed(parent, elementName);
for (Element element : elements) {
String id = element.getAttribute("id");
Object value = elementFactory.create(id);
if (value instanceof IXMLPersistable)
((IXMLPersistable) value).loadState(element);
else if (value instanceof IPropertyProvider)
((IPropertyProvider) value).getPropertySource().loadState(element);
if (value != null)
((List<Object>)obj).add(value);
}
//setValue(obj);
}
public IClassPropertyFactory getElementClassFactory() {
return elementFactory;
}
public void setElementClassFactory(IClassPropertyFactory elementFactory) {
this.elementFactory = elementFactory;
}
/**
* @return
*/
@SuppressWarnings("unchecked")
public List<Object> getList() {
List<Object> list = (List<Object>)getValue();
if (list == null) {
list = new LinkedList<Object>();
setValue(list);
}
return list;
}
}