/*
* VRuleSetsLoader.java
* Created on July 23, 2003, 4:42 PM
*/
package org.jboss.tools.common.verification.vrules.model;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.runtime.FileLocator;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.engines.impl.EnginesLoader;
import org.jboss.tools.common.model.options.PreferenceModelUtilities;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.XMLUtil;
import org.jboss.tools.common.verification.vrules.plugin.VerificationPlugin;
import org.w3c.dom.Element;
/**
* @author valera
*/
public class VRuleSetsLoader extends EnginesLoader {
/** Creates a new instance of VRuleSetsLoader */
public VRuleSetsLoader() {
util.setup(null, false);
}
public void load(XModelObject object) {
if("true".equals(object.getModel().getProperties().getProperty("initialModel"))) return; //$NON-NLS-1$ //$NON-NLS-2$
super.load(object);
Set<String> installed = new HashSet<String>();
Set resources = RuleSetResourceLoader.getResources("org.jboss.tools.common.verification.rules"); //$NON-NLS-1$
ArrayList<URL> l = new ArrayList<URL>();
Iterator it = resources.iterator();
while(it.hasNext()) {
URL url = (URL)it.next();
try {
if(url != null) url = FileLocator.resolve(url);
if(url != null) l.add(url);
} catch (IOException e) {
ModelPlugin.getPluginLog().logError(e);
}
}
it = l.iterator();
while(it.hasNext()) {
try {
URL url = (URL)it.next();
InputStream is = url.openConnection().getInputStream();
Element element = XMLUtil.getElement(is);
if (element == null) continue;
XModelObject copy = object.copy(0);
util().load(element, copy);
XModelObject[] nc = copy.getChildren();
for (int j = 0; j < nc.length; j++) {
XModelObject c = object.getChildByPath(nc[j].getPathPart());
if (c == null) {
c = nc[j].copy();
object.addChild(c);
//done to provide 'default-enabled'
mergeRules(c, c);
} else {
mergeRules(c, nc[j]);
}
c.setAttributeValue("installed", "true"); //$NON-NLS-1$ //$NON-NLS-2$
installed.add(c.getPathPart());
}
} catch (XModelException e) {
VerificationPlugin.getPluginLog().logError(e);
} catch (IOException e) {
VerificationPlugin.getPluginLog().logError(e);
}
}
XModelObject[] ch = object.getChildren();
for (int i = 0; i < ch.length; i++) {
String ins = ch[i].getAttributeValue("installed"); //$NON-NLS-1$
if ("true".equals(ins)) { //$NON-NLS-1$
if (!installed.contains(ch[i].getPathPart())) {
ch[i].removeFromParent();
}
}
}
}
static int i = 0;
protected void mergeRules(XModelObject object, XModelObject update) throws XModelException {
org.jboss.tools.common.meta.XAttribute[] as = object.getModelEntity().getAttributes();
for (int i = 0; i < as.length; i++) {
String n = as[i].getName();
if ("enabled".equals(n)) { //$NON-NLS-1$
String nv = update.getAttributeValue(n);
object.set("default-enabled", nv); //$NON-NLS-1$
}
if ("enabled".equals(n) || "installed".equals(n)) continue; //$NON-NLS-1$ //$NON-NLS-2$
String ov = object.getAttributeValue(n);
String nv = update.getAttributeValue(n);
if (ov.equals(nv)) continue;
object.getModel().changeObjectAttribute(object, n, nv);
}
XModelObject[] cs = update.getChildren();
for (int i = 0; i < cs.length; i++) {
XModelObject c = object.getChildByPath(cs[i].getPathPart());
if (c == null) {
object.addChild(cs[i].copy());
} else {
mergeRules(c, cs[i]);
}
}
cs = ((org.jboss.tools.common.model.impl.XModelObjectImpl)object).getChildrenForSave();
for (int i = 0; i < cs.length; i++) {
XModelObject c = update.getChildByPath(cs[i].getPathPart());
if (c == null) cs[i].removeFromParent();
}
}
public boolean save(XModelObject object) {
//in custom version only preference model may save user settings
if(object.getModel() != PreferenceModelUtilities.getPreferenceModel()) return true;
return super.save(object);
}
protected String fileName(XModelObject object) {
return ".rule-sets.xml"; //$NON-NLS-1$
}
}