org.geogig.geoserver.rest.RepositoryResource.java Source code

Java tutorial

Introduction

Here is the source code for org.geogig.geoserver.rest.RepositoryResource.java

Source

/* (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();
        }
    }

}