/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.rest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.springframework.hateoas.Link;
import org.springframework.stereotype.Service;
/**
* A Service able to list all the discoverable endpoints in our REST
* application. Endpoints need to register their managed endpoints. The service
* is responsible to check conflict and priorities
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
* @author Tim Donohue
*/
@Service
public class DiscoverableEndpointsService {
/**
* Contains all the registeredEndpoints as received by the single controller
*/
private Map<Object, List<Link>> registeredEndpoints = new HashMap<Object, List<Link>>();
/**
* Is the computed list of discoverableEndpoints valid?
*/
private boolean initialized = false;
private List<Link> discoverableEndpoints = new ArrayList<Link>();
public void register(Object controller, List<Link> links) {
synchronized (this) {
initialized = false;
registeredEndpoints.put(controller, links);
}
}
public void unregister(Object controller) {
synchronized (this) {
initialized = false;
registeredEndpoints.remove(controller);
}
}
public List<Link> getDiscoverableEndpoints() {
synchronized (this) {
if (initialized)
return discoverableEndpoints;
discoverableEndpoints.clear();
Set<String> rels = new HashSet<String>();
for (Entry<Object, List<Link>> controller : registeredEndpoints.entrySet()) {
for (Link link : controller.getValue()) {
if (isLinkValid(controller.getKey(), link.getHref())) {
discoverableEndpoints.add(link);
// sanity check
// FIXME improve logging for debugging
if (rels.contains(link.getRel())) {
throw new IllegalStateException("The rel " + link.getRel() + " is defined multiple times!");
}
rels.add(link.getRel());
}
}
}
initialized = true;
return discoverableEndpoints;
}
}
private boolean isLinkValid(Object controller, String href) {
// FIXME we need to implement a check to be sure that there are no other
// controller with an highter precedence mapped on the same URL (this
// could be used to override default implementation)
return true;
}
}