/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.options.impl;
import java.util.Properties;
import org.jboss.tools.common.meta.XAttribute;
import org.jboss.tools.common.meta.XChild;
import org.jboss.tools.common.meta.XModelEntity;
import org.jboss.tools.common.model.XModelConstants;
import org.jboss.tools.common.model.XModelObjectConstants;
import org.jboss.tools.common.model.options.SharableConstants;
import org.jboss.tools.common.model.options.SharableElement;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class SharableLoaderImpl implements SharableConstants {
public SharableLoaderImpl() {}
public void loadSharable(Element element, SharableElement sharable, String scopename) {
sharable.setScope(scopename);
loadAttributes(element, sharable, scopename);
loadChildren(element, sharable, scopename);
String precisescope = element.getAttribute(SCOPE);
sharable.setScope(reduceScopeName(scopename, precisescope));
}
XModelObjectLoaderUtil loader = new XModelObjectLoaderUtil();
public void loadAttributes(Element element, SharableElement sharable, String scopename) {
XAttribute[] an = sharable.getModelEntity().getAttributes();
for (int i = 0; i < an.length; i++) {
String xml = an[i].getXMLName();
if(xml == null || xml.trim().length() == 0) continue;
String v = loader.getAttribute(element, xml);
if(v != null && "Note2".equals(an[i].getEditor().getName())) { //$NON-NLS-1$
v = XModelObjectLoaderUtil.loadFromXMLAttribute(v);
}
if(v != null) sharable.setAttributeValue(an[i].getName(), v);
}
}
public void loadChildren(Element element, SharableElement sharable, String scopename) {
NodeList nl = element.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node c = nl.item(i);
if(c.getNodeType() != Node.ELEMENT_NODE) continue;
loadChild((Element)c, sharable, scopename);
}
}
public void loadChild(Element element, SharableElement sharable, String scopename) {
String en = XModelObjectLoaderUtil.getModelEntityAttribute(element);
if(en == null) return;
XModelEntity ent = sharable.getModel().getMetaData().getEntity(en);
if(ent == null) return;
boolean hasName = (ent.getAttribute(XModelObjectConstants.ATTR_NAME) != null);
String name = (!hasName) ? element.getNodeName()
: element.getAttribute(XModelObjectConstants.XML_ATTR_NAME);
SharableElement sc = sharable.findSharableChild(name);
if(sc == null) {
Properties p = new Properties();
if(hasName) p.setProperty(XModelObjectConstants.ATTR_NAME, name);
sc = (SharableElement)sharable.getModel().createModelObject(en, p);
sc.setScopeExists(PROJECT, false);
sharable.addChild(sc);
if(!hasName) sharable.setName(name);
}
if(sc != null) {
if(sc instanceof SharableContainerImpl)
new SharableContainerLoader().loadSharable(element, sc, scopename);
else
loadSharable(element, sc, scopename);
}
}
//// save
public void saveSharable(Element parent, SharableElement sharable, String scopename) {
if(!sharable.scopeExists(scopename)) return;
XModelEntity entity = sharable.getModelEntity();
String en = entity.getName();
if(en.startsWith("Sharable")) en = en.substring(8); //$NON-NLS-1$
Element element = parent.getOwnerDocument().createElement(en);
parent.appendChild(element);
saveAttributes(element, sharable, scopename);
saveChildren(element, sharable, scopename);
}
public void saveAttributes(Element element, SharableElement sharable, String scopename) {
XModelEntity entity = sharable.getModelEntity();
element.setAttribute(XModelConstants.XMODEL_ENTITY_ATTR, entity.getName());
XAttribute[] as = sharable.getModelEntity().getAttributes();
element.setAttribute(SCOPE, reduceScopeName(scopename, sharable.getScope()));
for (int i = 0; i < as.length; i++) {
if(as[i].isFake()) continue;
String xml = as[i].getXMLName();
if(xml == null || xml.trim().length() == 0) continue;
String v = sharable.getAttributeValue(as[i].getName(), scopename);
if(v != null && "Note2".equals(as[i].getEditor().getName())) { //$NON-NLS-1$
v = XModelObjectLoaderUtil.saveToXMLAttribute(v);
}
loader.saveAttribute(element, xml, v);
}
}
public void saveChildren(Element element, SharableElement sharable, String scopename) {
SharableElement[] se = sharable.getSharableChildren();
for (int i = 0; i < se.length; i++) {
if(se[i] != null) {
if(se[i] instanceof SharableContainerImpl)
new SharableContainerLoader().saveSharable(element, se[i], scopename);
else
saveSharable(element, se[i], scopename);
}
}
}
public String reduceScopeName(String currentscope, String precisescope) {
/*
if(precisescope == null || precisescope.length() == 0) return currentscope;
return (GENERAL.equals(currentscope)) ? GENERAL :
(PROJECT.equals(currentscope) &&
PRIVATE.equals(precisescope)) ? PROJECT : precisescope;
*/
return currentscope;
}
public void loadSystemSharable(SharableElement sharable) {
XModelEntity entity = sharable.getModelEntity();
XChild[] children = entity.getChildren();
for (int i = 0; i < children.length; i++) {
if(children[i].isRequired()) {
SharableElement c = (SharableElement)sharable.getModel().createModelObject(children[i].getName(), new Properties());
if(c == null) {
ModelPlugin.getPluginLog().logInfo("Could not create sharable folder " + children[i].getName()); //$NON-NLS-1$
continue;
}
c.setScope(PROJECT);
loadSystemSharable(c);
sharable.addChild(c);
}
}
}
}