/* (c) 2017 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.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.RestletException; import org.locationtech.geogig.rest.StreamingWriterRepresentation; import org.locationtech.geogig.rest.Variants; import org.locationtech.geogig.rest.repository.DeleteRepository; 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.data.Status; import org.restlet.resource.Representation; 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; /** * Access point to a single repository. Provides a Repository information response for <b>GET</b> * requests. Performs a Repository delete operation for <b>DELETE</b> requests. */ public class RepositoryResource extends DeleteRepository { 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 = "RepositoryResource.ftl"; FreemarkerFormat format = new FreemarkerFormat(templateName, getClass(), MediaType.TEXT_HTML); representation = format.toRepresentation(getMap()); } else { Request request = getRequest(); GeoServerRepositoryProvider repoFinder = (GeoServerRepositoryProvider) repositoryProvider( request); Optional<RepositoryInfo> repository = repoFinder.findRepository(request); if (!repository.isPresent()) { throw new RestletException("not found", Status.CLIENT_ERROR_NOT_FOUND); } final String baseURL = getRequest().getRootRef().toString(); RepositoryInfo repoInfo = repository.get(); representation = new RepositorytRepresentation(variant.getMediaType(), baseURL, repoInfo); } return representation; } private Map<String, Object> getMap() { Map<String, Object> map = Maps.newHashMap(); PageInfo pageInfo = getPageInfo(); map.put("page", pageInfo); map.put("Manifest", "manifest"); return map; } protected PageInfo getPageInfo() { return (PageInfo) getRequest().getAttributes().get(PageInfo.KEY); } private static class RepositorytRepresentation extends StreamingWriterRepresentation { private final RepositoryInfo repo; public RepositorytRepresentation(MediaType mediaType, String baseURL, RepositoryInfo repo) { super(mediaType, baseURL); this.repo = repo; } @Override public void write(StreamingWriter w) throws StreamWriterException { w.writeStartElement("repository"); w.writeElement("id", repo.getId()); w.writeElement("name", repo.getRepoName()); w.writeElement("location", repo.getMaskedLocation()); w.writeEndElement(); } } }