package cz.cvut.fel.adaptiverestfulapi.core;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* Represents HTTP header.
*/
public class HttpHeader {
private String key;
private List<HttpHeaderValue> values;
public static HttpHeader create(String key, List<HttpHeaderValue> values) {
if (values.size() > 0) {
return new HttpHeader(key, values);
}
return null;
}
private HttpHeader(String key, List<HttpHeaderValue> values) {
this.key = key;
List<HttpHeaderValue> copy = new LinkedList<>();
for (HttpHeaderValue value : values) {
copy.add(value);
}
Collections.sort(copy);
Collections.reverse(copy);
this.values = copy;
}
/**
* Returns key.
* @return
*/
public String getKey() {
return this.key;
}
public void add(HttpHeaderValue value) {
this.values.add(value);
Collections.sort(this.values);
Collections.reverse(this.values);
}
/**
* Returns the value with the highest priority.
* @param <T>
* @return
*/
public <T> T get() {
return this.values.get(0).get();
}
/**
* Returns list of values.
* @return
*/
public List<HttpHeaderValue> getValues() {
return Collections.unmodifiableList(this.values);
}
/**
* Returns comma-separated string of values.
* @return
*/
public String getString() {
StringBuilder sb = new StringBuilder();
Iterator<HttpHeaderValue> iterator = this.values.iterator();
while (iterator.hasNext()){
sb.append(iterator.next().getValue());
if (iterator.hasNext()) {
sb.append(", ");
}
}
return sb.toString();
}
/**
* Check whether header contains specified value.
* @param value
* @return
*/
public boolean contains(String value) {
return this.contains(new HttpHeaderValue(value));
}
/**
* Checks whether header contains specified value.
* @param value
* @return
*/
public boolean contains(HttpHeaderValue value) {
for (HttpHeaderValue val : this.values) {
if (val.getValue().equalsIgnoreCase(value.getValue())) {
return true;
}
}
return false;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(this.key);
sb.append(": ");
sb.append(this.getString());
return sb.toString();
}
}