package aQute.bnd.metatype; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import aQute.bnd.osgi.Analyzer; import aQute.bnd.xmlattribute.ExtensionDef; import aQute.bnd.xmlattribute.Namespaces; import aQute.bnd.xmlattribute.XMLAttributeFinder; import aQute.lib.tag.Tag; public class OCDDef extends ExtensionDef { final List<ADDef> attributes = new ArrayList<ADDef>(); final List<IconDef> icons = new ArrayList<IconDef>(); final List<DesignateDef> designates = new ArrayList<DesignateDef>(); String id; String name; String localization; String description; MetatypeVersion version; public OCDDef(XMLAttributeFinder finder, MetatypeVersion minVersion) { super(finder); this.version = minVersion; } void prepare(Analyzer analyzer) { if (attributes.isEmpty()) { updateVersion(MetatypeVersion.VERSION_1_3); } Set<String> adIds = new HashSet<String>(); for (ADDef ad : attributes) { ad.prepare(this); if (!adIds.add(ad.id)) { analyzer.error("OCD for %s.%s has duplicate AD id %s due to colliding munged element names", id, name, ad.id); } } } Tag getTag() { Tag metadata = new Tag("metatype:MetaData"); // .addAttribute("xmlns:metatype", // MetatypeVersion.VERSION_1_3.getNamespace()); Namespaces namespaces = new Namespaces(); String xmlns = version.getNamespace(); namespaces.registerNamespace("metatype", xmlns); addNamespaces(namespaces, xmlns); for (ADDef ad : attributes) ad.addNamespaces(namespaces, xmlns); for (DesignateDef dd : designates) dd.addNamespaces(namespaces, xmlns); namespaces.addNamespaces(metadata); if (localization != null) { metadata.addAttribute("localization", localization); } Tag ocd = new Tag(metadata, "OCD").addAttribute("id", id); if (name != null) { ocd.addAttribute("name", name); } if (description != null) { ocd.addAttribute("description", description); } addAttributes(ocd, namespaces); for (ADDef ad : attributes) { ocd.addContent(ad.getTag(namespaces)); } for (IconDef icon : icons) { ocd.addContent(icon.getTag()); } for (DesignateDef designate : designates) { metadata.addContent(designate.getInnerTag(namespaces)); } return metadata; } void updateVersion(MetatypeVersion version) { this.version = max(this.version, version); } static <T extends Comparable<T>> T max(T a, T b) { int n = a.compareTo(b); if (n >= 0) return a; return b; } }