/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geogig.geoserver.rest;
import static org.locationtech.geogig.rest.Variants.JSON;
import static org.locationtech.geogig.rest.Variants.XML;
import static org.locationtech.geogig.web.api.RESTUtils.repositoryProvider;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.geogig.geoserver.config.RepositoryInfo;
import org.geoserver.rest.PageInfo;
import org.geoserver.rest.format.FreemarkerFormat;
import org.locationtech.geogig.rest.StreamingWriterRepresentation;
import org.locationtech.geogig.rest.Variants;
import org.locationtech.geogig.rest.repository.RepositoryProvider;
import org.locationtech.geogig.web.api.StreamWriterException;
import org.locationtech.geogig.web.api.StreamingWriter;
import org.restlet.Context;
import org.restlet.data.MediaType;
import org.restlet.data.Preference;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.Variant;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class RepositoryListResource extends Resource {
private static final Variant HTML = new Variant(MediaType.TEXT_HTML);
@Override
public void init(Context context, Request request, Response response) {
super.init(context, request, response);
List<Variant> variants = getVariants();
variants.add(HTML);
variants.add(XML);
variants.add(JSON);
}
@Override
public Variant getPreferredVariant() {
Optional<Variant> byExtension = Variants.getVariantByExtension(getRequest(), getVariants());
if (byExtension.isPresent()) {
return byExtension.get();
}
List<MediaType> acceptedMediaTypes = Lists.transform(
getRequest().getClientInfo().getAcceptedMediaTypes(),
new Function<Preference<MediaType>, MediaType>() {
@Override
public MediaType apply(Preference<MediaType> input) {
return input.getMetadata();
}
});
if (acceptedMediaTypes.contains(MediaType.TEXT_HTML)) {
return HTML;
}
if (acceptedMediaTypes.contains(MediaType.TEXT_XML)) {
return XML;
}
if (acceptedMediaTypes.contains(MediaType.APPLICATION_JSON)) {
return JSON;
}
return XML;
}
@Override
public Representation getRepresentation(Variant variant) {
Representation representation;
if (HTML.equals(variant)) {
String templateName = "RepositoryListResource.ftl";
FreemarkerFormat format = new FreemarkerFormat(templateName, getClass(),
MediaType.TEXT_HTML);
representation = format.toRepresentation(getMap());
} else {
List<RepositoryInfo> repos = getRepositories();
final String baseURL = getRequest().getRootRef().toString();
representation = new RepositoryListRepresentation(variant.getMediaType(), baseURL,
repos);
}
return representation;
}
public Map<String, Object> getMap() {
List<RepositoryInfo> repositories = getRepositories();
Map<String, Object> map = Maps.newHashMap();
map.put("repositories", repositories);
map.put("page", getPageInfo());
return map;
}
protected PageInfo getPageInfo() {
return (PageInfo) getRequest().getAttributes().get(PageInfo.KEY);
}
private List<RepositoryInfo> getRepositories() {
Request request = getRequest();
GeoServerRepositoryProvider repoFinder = (GeoServerRepositoryProvider) repositoryProvider(
request);
List<RepositoryInfo> repos = new ArrayList<>(repoFinder.getRepositoryInfos());
return repos;
}
private static class RepositoryListRepresentation extends StreamingWriterRepresentation {
private final List<RepositoryInfo> repos;
public RepositoryListRepresentation(MediaType mediaType, String baseURL,
List<RepositoryInfo> repos) {
super(mediaType, baseURL);
this.repos = repos;
}
@Override
public void write(StreamingWriter w) throws StreamWriterException {
w.writeStartElement("repos");
w.writeStartArray("repo");
for (RepositoryInfo repo : repos) {
write(w, repo);
}
w.writeEndArray();
w.writeEndElement();
}
private void write(StreamingWriter w, RepositoryInfo repo) throws StreamWriterException {
w.writeStartArrayElement("repo");
w.writeElement("id", repo.getId());
w.writeElement("name", repo.getRepoName());
encodeAlternateAtomLink(w, RepositoryProvider.BASE_REPOSITORY_ROUTE + "/" +
repo.getRepoName());
w.writeEndArrayElement();
}
}
}