package org.jboss.tools.jsf.jsf2.model;
import org.jboss.tools.common.meta.XAttribute;
import org.jboss.tools.common.meta.XModelEntity;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.loaders.impl.SimpleWebFileLoader;
import org.jboss.tools.common.model.util.NamespaceMapping;
import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
import org.jboss.tools.common.xml.XMLUtilities;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class FileCompositeComponentLoader extends SimpleWebFileLoader {
public FileCompositeComponentLoader() {}
protected XModelObjectLoaderUtil createUtil() {
return new FileCompositeComponentUtil();
}
protected boolean isCheckingDTD() {
return false;
}
protected boolean isCheckingSchema() {
return false;
}
protected String loadNamespace(Element element, XModelObject object) {
String version = getMappingVersion(object);
NamespaceMapping namespaceMapping = CompositeComponentNamespaces.getInstance(object.getModel().getMetaData(), version).getNamespaceMapping(element);
object.set(NamespaceMapping.ATTR_NAMESPACE_MAPPING, namespaceMapping.toString()); //$NON-NLS-1$
util.setNamespaceMapping(namespaceMapping);
return super.loadNamespace(element, object);
}
public Element createRootElement(XModelObject object) {
String systemId = object.getAttributeValue("systemId"); //$NON-NLS-1$
String publicId = object.getAttributeValue("publicId"); //$NON-NLS-1$
String rootName = getRootName(object);
Element element = createRootElement(rootName, publicId, systemId);
String version = getMappingVersion(object);
CompositeComponentNamespaces.getInstance(object.getModel().getMetaData(), version).validateNamespaces(object, element);
NamespaceMapping namespaceMapping = NamespaceMapping.load(object);
util.setNamespaceMapping(namespaceMapping);
return element;
}
private String getMappingVersion(XModelObject object) {
String entity = object.getModelEntity().getName();
return (CompositeComponentConstants.ENT_FILE_COMPONENT_22.equals(entity))
? "22" : "20";
}
}
class FileCompositeComponentUtil extends XModelObjectLoaderUtil {
protected boolean isSaveable(XModelEntity entity, String n, String v, String dv) {
if(v == null) return false;
if(v.length() == 0 || v.equals(dv)) {
XAttribute attr = entity.getAttribute(n);
return (attr != null && "always".equals(attr.getProperty("save"))); //$NON-NLS-1$ //$NON-NLS-2$
}
return super.isSaveable(entity, n, v, dv);
}
public void load(Element element, XModelObject o) {
super.load(element, o);
if(o.getModelEntity().getName().startsWith(CompositeComponentConstants.ENT_FILE_COMPONENT)) {
o.setAttributeValue("tag", element.getNodeName());
Element c = XMLUtilities.getUniqueChild(element, "composite:interface");
if(c == null) {
NodeList l = element.getElementsByTagName("composite:interface");
if(l != null && l.getLength() > 0) {
Element is = (Element)l.item(0);
XModelObject io = o.getChildByPath("Interface");
if(io != null) load(is, io);
}
}
}
}
public boolean save(Element parent, XModelObject o) {
if(!needToSave(o)) return true;
return super.save(parent, o);
}
protected boolean needToSave(XModelObject o) {
String s = o.getModelEntity().getProperty("saveDefault"); //$NON-NLS-1$
if(!"false".equals(s)) return true; //$NON-NLS-1$
// if(hasSetAttributes(o)) return true;
if(o.getChildren().length > 0) return true;
return false;
}
}