package aQute.bnd.metatype;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import aQute.bnd.osgi.Annotation;
import aQute.bnd.xmlattribute.ExtensionDef;
import aQute.bnd.xmlattribute.Namespaces;
import aQute.bnd.xmlattribute.XMLAttributeFinder;
import aQute.lib.tag.Tag;
public class ADDef extends ExtensionDef {
AttributeDefinition ad;
Annotation a;
String id;
String name;
String description;
AttributeType type;
private String typeString;
int cardinality;
String min;
String max;
String[] defaults;
boolean required = true;
final List<OptionDef> options = new ArrayList<OptionDef>();
public ADDef(XMLAttributeFinder finder) {
super(finder);
}
public void prepare(OCDDef ocdDef) {
if (type == AttributeType.CHARACTER && ocdDef.version == MetatypeVersion.VERSION_1_2) {
typeString = "Char";
} else {
typeString = (type == null) ? "*INVALID*" : type.toString();
}
}
Tag getTag(Namespaces namespaces) {
Tag ad = new Tag("AD").addAttribute("id", id).addAttribute("type", typeString);
if (cardinality != 0) {
ad.addAttribute("cardinality", cardinality);
}
if (!required) {
ad.addAttribute("required", required);
}
if (name != null) {
ad.addAttribute("name", name);
}
if (description != null) {
ad.addAttribute("description", description);
}
if (min != null) {
ad.addAttribute("min", min);
}
if (max != null) {
ad.addAttribute("max", max);
}
if (defaults != null) {
StringBuffer b = new StringBuffer();
String sep = "";
for (String defaultValue : defaults) {
b.append(sep);
escape(defaultValue, b);
sep = ",";
}
ad.addAttribute("default", b.toString());
}
for (OptionDef option : options) {
ad.addContent(option.getTag());
}
addAttributes(ad, namespaces);
return ad;
}
private static final Pattern escapes = Pattern.compile("[ ,\\\\]");
private void escape(String defaultValue, StringBuffer b) {
Matcher m = escapes.matcher(defaultValue);
while (m.find()) {
String match = m.group();
if (match.equals("\\"))
m.appendReplacement(b, "\\\\\\\\");
else
m.appendReplacement(b, "\\\\" + match);
}
m.appendTail(b);
}
}