aQute.bnd.xmlattribute.ExtensionDef Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of biz.aQute.bndlib Show documentation
Show all versions of biz.aQute.bndlib Show documentation
bndlib: A Swiss Army Knife for OSGi
package aQute.bnd.xmlattribute;
import java.lang.reflect.Array;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import aQute.bnd.annotation.xml.XMLAttribute;
import aQute.bnd.osgi.Annotation;
import aQute.lib.tag.Tag;
public class ExtensionDef {
protected final XMLAttributeFinder finder;
protected final Map attributes = new LinkedHashMap();
public ExtensionDef(XMLAttributeFinder finder) {
this.finder = finder;
}
public void addExtensionAttribute(XMLAttribute xmlAttr, Annotation a) {
attributes.put(xmlAttr, a);
}
public void addNamespaces(Namespaces namespaces, String docNS) {
for (Iterator i = attributes.keySet().iterator(); i.hasNext();) {
XMLAttribute xmlAttr = i.next();
if (matches(xmlAttr, docNS))
namespaces.registerNamespace(xmlAttr.prefix(), xmlAttr.namespace());
else
i.remove();
}
}
private boolean matches(XMLAttribute xmlAttr, String docNS) {
String[] embedIn = xmlAttr.embedIn();
if (embedIn == null)
return true;
for (String match : embedIn)
if (matches(match, docNS))
return true;
return false;
}
private boolean matches(String match, String docNS) {
if (match.equals(docNS))
return true;
if (match.endsWith("*")) {
match = match.substring(0, match.length() - 1);
return docNS.startsWith(match);
}
return false;
}
// non-matching attributes have already been removed
public void addAttributes(Tag tag, Namespaces namespaces) {
if (namespaces != null) {
for (Map.Entry entry : attributes.entrySet()) {
String prefix = namespaces.getPrefix(entry.getKey().namespace());
Annotation a = entry.getValue();
Map props = finder.getDefaults(a);
for (String key : entry.getValue().keySet()) {
Object obj = entry.getValue().get(key);
String value;
if (obj.getClass().isArray()) {
StringBuilder sb = new StringBuilder();
String sep = "";
for (int i = 0; i < Array.getLength(obj); i++) {
Object el = Array.get(obj, i);
sb.append(sep).append(String.valueOf(el));
sep = " ";
}
value = sb.toString();
} else {
value = String.valueOf(obj);
}
props.put(key, value);
}
String[] mapping = entry.getKey().mapping();
for (Map.Entry prop : props.entrySet()) {
String key = prop.getKey();
if (mapping != null && mapping.length > 0) {
String match = key + "=";
for (String map : mapping) {
if (map.startsWith(match))
key = map.substring(match.length());
}
}
tag.addAttribute(prefix + ":" + key, prop.getValue());
}
}
}
}
}