package org.jboss.resteasy.spi;
import org.jboss.resteasy.plugins.delegates.LinkHeaderDelegate;
import javax.ws.rs.core.Link;
import javax.ws.rs.core.MultivaluedMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Abstraction for LInk headers. Also uses JAXRS classes rather than deprecated old resteasy ones.
*
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class LinkHeaders
{
private Map<String, Link> linksByRelationship = new HashMap<String, Link>();
private Map<String, Link> linksByTitle = new HashMap<String, Link>();
private List<Link> links = new ArrayList<Link>();
public LinkHeaders addLinks(MultivaluedMap<String, String> headers)
{
List<String> values = headers.get("Link");
if (values == null) return this;
for (String val : values)
{
LinkHeader linkHeader = new LinkHeaderDelegate().fromString(val);
for (Link link : linkHeader.getLinks())
{
addLink(link);
}
}
return this;
}
public LinkHeaders addLinkObjects(MultivaluedMap<String, Object> headers, HeaderValueProcessor factory)
{
List<Object> values = headers.get("Link");
if (values == null) return this;
for (Object val : values)
{
if (val instanceof Link) addLink((Link)val);
else
{
String str = factory.toHeaderString(val);
addLink(Link.valueOf(str));
}
}
return this;
}
public LinkHeaders addLink(final Link link)
{
links.add(link);
for (String rel : link.getRels())
{
linksByRelationship.put(rel, link);
}
if (link.getTitle() != null) linksByTitle.put(link.getTitle(), link);
return this;
}
public Link getLinkByTitle(String title)
{
return linksByTitle.get(title);
}
public Link getLinkByRelationship(String rel)
{
return linksByRelationship.get(rel);
}
/**
* Index of links by relationship "rel" or "rev"
*
* @return
*/
public Map<String, Link> getLinksByRelationship()
{
return linksByRelationship;
}
/**
* Index of links by title
*
* @return
*/
public Map<String, Link> getLinksByTitle()
{
return linksByTitle;
}
/**
* All the links defined
*
* @return
*/
public List<Link> getLinks()
{
return links;
}
}