org.ow2.mind.plugin.ConfigurationElementImpl Maven / Gradle / Ivy
The newest version!
/**
* Copyright (C) 2010 STMicroelectronics
*
* This file is part of "Mind Compiler" is free software: you can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
* Contact: [email protected]
*
* Authors: Matthieu Leclercq
* Contributors:
*/
package org.ow2.mind.plugin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.objectweb.fractal.adl.CompilerError;
import org.objectweb.fractal.adl.error.GenericErrors;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
class ConfigurationElementImpl implements ConfigurationElement {
private final PluginImpl plugin;
private final Object parent;
private final String name;
private final Map attributes;
private final List children;
ConfigurationElementImpl(final PluginImpl plugin, final Object parent,
final Element element) {
this.plugin = plugin;
this.parent = parent;
name = element.getNodeName();
final NamedNodeMap attrs = element.getAttributes();
attributes = new HashMap(attrs.getLength());
for (int i = 0; i < attrs.getLength(); i++) {
final Attr attr = (Attr) attrs.item(i);
attributes.put(attr.getName(), attr.getValue());
}
final NodeList childNodes = element.getChildNodes();
children = new ArrayList();
for (int i = 0; i < childNodes.getLength(); i++) {
final Node node = childNodes.item(i);
if (!(node instanceof Element)) continue;
children.add(new ConfigurationElementImpl(plugin, this, (Element) node));
}
}
public String getName() {
return name;
}
public String getAttribute(final String name) {
return attributes.get(name);
}
public String getAttribute(final String name, final String defaultValue) {
return attributes.containsKey(name) ? attributes.get(name) : defaultValue;
}
public Map getAttributes() {
return Collections.unmodifiableMap(attributes);
}
public T createInstance(final String attrName, final Class expectedType) {
final String className = getAttribute(attrName);
if (className == null) return null;
Class> uncastedClass;
try {
uncastedClass = plugin.getClassLoader().loadClass(className);
} catch (final ClassNotFoundException e) {
throw new CompilerError(GenericErrors.GENERIC_ERROR, e,
"Can't load class '" + className + "'");
}
Class extends T> castedClass;
try {
castedClass = uncastedClass.asSubclass(expectedType);
} catch (final ClassCastException e) {
throw new CompilerError(GenericErrors.GENERIC_ERROR, e, "Class '"
+ className + "' is not a sub-class of '" + expectedType.getName()
+ "'.");
}
return plugin.getPluginManager().getInstance(castedClass);
}
public Iterable getChildren() {
return Iterables.unmodifiableIterable(children);
}
public ConfigurationElement getChild() {
if (children.isEmpty())
return null;
else
return children.get(0);
}
public Iterable getChildren(final String name) {
return Iterables.filter(children, new Predicate() {
public boolean apply(final ConfigurationElement input) {
return input.getName().equals(name);
}
});
}
public ConfigurationElement getChild(final String name) {
final Iterator children = getChildren(name)
.iterator();
return children.hasNext() ? children.next() : null;
}
public Object getParent() {
return parent;
}
void setAttribute(final String name, final String value) {
attributes.put(name, value);
}
}