Files
gerrit/java/com/google/gerrit/extensions/restapi/RestCollectionCreateView.java
Edwin Kempin db6175a2a1 Add a common interface for all REST views on collections
The purpose of this change is to remove duplicate code in
RestApiServlet. The code in RestApiServlet that extracts the input type
from the REST view interface definition is almost identically for the 3
cases that extract the input type from RestCollectionView,
RestCreateView and RestDeleteMissingView. We can have this code only
once if all of these interfaces extend a common interface.

Since all of these views are about collections, naming this common
interface 'RestCollectionView' seems to be the best fit. This means the
current 'RestCollectionView' needs to get a new name.

The current 'RestCollectionView' that supports modifications on REST
collections is renamed to 'RestCollectionModifyView' as this name is
consistent with the existing 'RestModifyView' that supports
modifications on REST resources.

We could keep the names for 'RestCreateView' and
'RestDeleteMissingView', but for name consistency with
'RestCollectionModifyView' they are renamed to
'RestCollectionCreateView' and 'RestCollectionDeleteMissingView'.

Change-Id: Id2289a51c7d55bd61222ac132084e7f87328504c
Signed-off-by: Edwin Kempin <ekempin@google.com>
2018-07-19 09:39:14 +02:00

46 lines
2.0 KiB
Java

// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.extensions.restapi;
/**
* RestView that supports accepting input and creating a resource.
*
* <p>The input must be supplied as JSON as the body of the HTTP request. Create views can be
* invoked by the HTTP methods {@code PUT} and {@code POST}.
*
* <p>The RestCreateView is only invoked when the parse method of the {@code RestCollection} throws
* {@link ResourceNotFoundException}, and hence the resource doesn't exist yet.
*
* @param <P> type of the parent resource
* @param <C> type of the child resource that is created
* @param <I> type of input the JSON parser will parse the input into.
*/
public interface RestCollectionCreateView<P extends RestResource, C extends RestResource, I>
extends RestCollectionView<P, C, I> {
/**
* Process the view operation by creating the resource.
*
* @param parentResource parent resource of the resource that should be created
* @param input input after parsing from request.
* @return result to return to the client. Use {@link BinaryResult} to avoid automatic conversion
* to JSON.
* @throws RestApiException if the resource creation is rejected
* @throws Exception the implementation of the view failed. The exception will be logged and HTTP
* 500 Internal Server Error will be returned to the client.
*/
Object apply(P parentResource, IdString id, I input) throws Exception;
}