aQute.bnd.build.model.clauses.HeaderClause 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.build.model.clauses;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import aQute.bnd.header.Attrs;
public class HeaderClause implements Cloneable, Comparable {
private static final String INTERNAL_LIST_SEPARATOR = ";";
private static final String INTERNAL_LIST_SEPARATOR_NEWLINES = INTERNAL_LIST_SEPARATOR + "\\\n\t\t";
protected String name;
protected Attrs attribs;
public HeaderClause(String name, Attrs attribs) {
assert name != null;
this.name = name;
this.attribs = attribs == null ? new Attrs() : attribs;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Attrs getAttribs() {
return attribs;
}
public List getListAttrib(String attrib) {
String string = attribs.get(attrib);
if (string == null)
return null;
List result = new ArrayList();
StringTokenizer tokenizer = new StringTokenizer(string, ",");
while (tokenizer.hasMoreTokens()) {
result.add(tokenizer.nextToken().trim());
}
return result;
}
public void setListAttrib(String attrib, Collection< ? extends String> value) {
if (value == null || value.isEmpty())
attribs.remove(attrib);
else {
StringBuilder buffer = new StringBuilder();
boolean first = true;
for (String string : value) {
if (!first)
buffer.append(',');
buffer.append(string);
first = false;
}
attribs.put(attrib, buffer.toString());
}
}
public void formatTo(StringBuilder buffer) {
formatTo(buffer, null);
}
public void formatTo(StringBuilder buffer, Comparator> sorter) {
String separator = newlinesBetweenAttributes() ? INTERNAL_LIST_SEPARATOR_NEWLINES : INTERNAL_LIST_SEPARATOR;
// If the name contains a comma, then quote the whole thing
String tmpName = name;
if (tmpName.indexOf(',') > -1)
tmpName = "'" + tmpName + "'";
buffer.append(tmpName);
if (attribs != null) {
Set> set;
if (sorter != null) {
set = new TreeSet>(sorter);
set.addAll(attribs.entrySet());
} else {
set = attribs.entrySet();
}
for (Iterator> iter = set.iterator(); iter.hasNext();) {
Entry entry = iter.next();
String name = entry.getKey();
String value = entry.getValue();
if (value != null && value.length() > 0) {
buffer.append(separator);
// If the value contains any comma or equals, then quote the
// whole thing
if (value.indexOf(',') > -1 || value.indexOf('=') > -1)
value = "'" + value + "'";
buffer.append(name).append('=').append(value);
}
}
}
}
protected boolean newlinesBetweenAttributes() {
return false;
}
@Override
public HeaderClause clone() {
try {
HeaderClause clone = (HeaderClause) super.clone();
clone.name = this.name;
clone.attribs = new Attrs(this.attribs);
return clone;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public int compareTo(HeaderClause other) {
return this.name.compareTo(other.name);
}
@SuppressWarnings("deprecation")
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((attribs == null) ? 0 : attribs.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
HeaderClause other = (HeaderClause) obj;
if (attribs == null) {
if (other.attribs != null)
return false;
} else if (!attribs.isEqual(other.attribs))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}