Extract option setting utils for REST endpoints

This makes the parsing of "fields=" in all endpoints slightly more
lenient: it is now case-insensitive and supports ' ' as a delimiter in
addition to ','. This matches the previous behavior of "q=" in
GetCapabilities.

Change-Id: Iea40cf31b5f5a3a73264c74506848a3cfc73c542
This commit is contained in:
Dave Borowitz
2013-04-04 16:43:32 -07:00
parent 5fb8de5587
commit 2edf0ee8fe
3 changed files with 45 additions and 13 deletions

View File

@@ -68,6 +68,7 @@ import com.google.gerrit.httpd.WebSession;
import com.google.gerrit.server.AccessPath;
import com.google.gerrit.server.AnonymousUser;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.OptionUtil;
import com.google.gerrit.server.OutputFormat;
import com.google.gerrit.server.account.CapabilityControl;
import com.google.gson.ExclusionStrategy;
@@ -587,9 +588,7 @@ public class RestApiServlet extends HttpServlet {
Multimap<String, String> config) {
final Set<String> want = Sets.newHashSet();
for (String p : config.get("fields")) {
Iterables.addAll(want, Splitter.on(',')
.omitEmptyStrings().trimResults()
.split(p));
Iterables.addAll(want, OptionUtil.splitOptionValue(p));
}
if (!want.isEmpty()) {
gb.addSerializationExclusionStrategy(new ExclusionStrategy() {

View File

@@ -0,0 +1,41 @@
// Copyright (C) 2013 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.server;
import com.google.common.base.CharMatcher;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
/** Utilities for option parsing. */
public class OptionUtil {
private static final Splitter COMMA_OR_SPACE =
Splitter.on(CharMatcher.anyOf(", ")).omitEmptyStrings().trimResults();
private static final Function<String, String> TO_LOWER_CASE =
new Function<String, String>() {
@Override
public String apply(String input) {
return input.toLowerCase();
}
};
public static Iterable<String> splitOptionValue(String value) {
return Iterables.transform(COMMA_OR_SPACE.split(value), TO_LOWER_CASE);
}
private OptionUtil() {
}
}

View File

@@ -28,8 +28,6 @@ import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
import static com.google.gerrit.common.data.GlobalCapability.VIEW_CONNECTIONS;
import static com.google.gerrit.common.data.GlobalCapability.VIEW_QUEUE;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
@@ -40,6 +38,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.OptionUtil;
import com.google.gerrit.server.OutputFormat;
import com.google.gerrit.server.account.AccountResource.Capability;
import com.google.gerrit.server.git.QueueProvider;
@@ -63,14 +62,7 @@ class GetCapabilities implements RestReadView<AccountResource> {
if (query == null) {
query = Sets.newHashSet();
}
Iterables.addAll(query, Iterables.transform(
Splitter.onPattern("[, ]").omitEmptyStrings().trimResults().split(name),
new Function<String, String>() {
@Override
public String apply(String input) {
return input.toLowerCase();
}
}));
Iterables.addAll(query, OptionUtil.splitOptionValue(name));
}
private Set<String> query;