Remove transition code for set of parameter refactoring

None of the logged warnings happened in the last week.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=204307010
This commit is contained in:
guyben 2018-07-12 08:54:19 -07:00 committed by jianglai
parent badda1d407
commit a00cb2237a
6 changed files with 62 additions and 59 deletions

View file

@ -96,6 +96,6 @@ public class BatchModule {
@Provides @Provides
@Parameter(PARAM_RESAVE_TIMES) @Parameter(PARAM_RESAVE_TIMES)
static ImmutableSet<DateTime> provideResaveTimes(HttpServletRequest req) { static ImmutableSet<DateTime> provideResaveTimes(HttpServletRequest req) {
return extractSetOfDatetimeParameters(req, PARAM_RESAVE_TIMES, null); return extractSetOfDatetimeParameters(req, PARAM_RESAVE_TIMES);
} }
} }

View file

@ -45,8 +45,7 @@ public class BackendModule {
@Provides @Provides
@Parameter(RequestParameters.PARAM_TLDS) @Parameter(RequestParameters.PARAM_TLDS)
static ImmutableSet<String> provideTlds(HttpServletRequest req) { static ImmutableSet<String> provideTlds(HttpServletRequest req) {
ImmutableSet<String> tlds = ImmutableSet<String> tlds = extractSetOfParameters(req, RequestParameters.PARAM_TLDS);
extractSetOfParameters(req, RequestParameters.PARAM_TLDS, RequestParameters.PARAM_TLD);
assertTldsExist(tlds); assertTldsExist(tlds);
return tlds; return tlds;
} }

View file

@ -59,7 +59,7 @@ public abstract class RdeModule {
@Provides @Provides
@Parameter(PARAM_WATERMARKS) @Parameter(PARAM_WATERMARKS)
static ImmutableSet<DateTime> provideWatermarks(HttpServletRequest req) { static ImmutableSet<DateTime> provideWatermarks(HttpServletRequest req) {
return extractSetOfDatetimeParameters(req, PARAM_WATERMARKS, PARAM_WATERMARK); return extractSetOfDatetimeParameters(req, PARAM_WATERMARKS);
} }
@Provides @Provides

View file

@ -23,7 +23,6 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet;
import com.google.common.base.Ascii; import com.google.common.base.Ascii;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.flogger.FluentLogger;
import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.BadRequestException;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -33,8 +32,6 @@ import org.joda.time.DateTime;
/** Utilities for extracting parameters from HTTP requests. */ /** Utilities for extracting parameters from HTTP requests. */
public final class RequestParameters { public final class RequestParameters {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
/** The standardized request parameter name used by any action taking a tld parameter. */ /** The standardized request parameter name used by any action taking a tld parameter. */
public static final String PARAM_TLD = "tld"; public static final String PARAM_TLD = "tld";
/** The standardized request parameter name used by any action taking multiple tld parameters. */ /** The standardized request parameter name used by any action taking multiple tld parameters. */
@ -101,64 +98,33 @@ public final class RequestParameters {
/** /**
* Returns all GET or POST parameters associated with {@code name} (or {@code nameLegacy}). * Returns all GET or POST parameters associated with {@code name} (or {@code nameLegacy}).
* *
* <p>While transitioning from "param=key1&param=key2" to "params=key1,key2" style of set inputing * <p>The parameter value is assumed to be a comma-delimited set of values - so tlds=com,net would
* - we will be accepting all options (with a warning for "wrong" uses). * result in ImmutableSet.of("com", "net").
* *
* <p>TODO(b/78226288): remove transition code (including "legacyName") once there are no more * <p>Empty strings are not supported, and are automatically removed from the result.
* warnings. *
* <p>Both missing parameter and parameter with empty value result in an empty set.
* *
* @param req the request that has the parameter * @param req the request that has the parameter
* @param name the name of the parameter, should be in plural form (e.g. tlds=com,net) * @param name the name of the parameter, should be in plural form (e.g. tlds=, not tld=)
* @param legacyName the legacy, singular form, name. Used only while transitioning from the
* tld=com&tld=net form, in case we forgot to fix some reference. Null if there was no
* singular form to transition from.
*/ */
public static ImmutableSet<String> extractSetOfParameters( public static ImmutableSet<String> extractSetOfParameters(HttpServletRequest req, String name) {
HttpServletRequest req, String name, @Nullable String legacyName) {
String[] parameters = req.getParameterValues(name); String[] parameters = req.getParameterValues(name);
if (legacyName != null) { if (parameters == null || parameters.length == 0) {
String[] legacyParameters = req.getParameterValues(legacyName);
if (legacyParameters != null) {
if (parameters == null) {
logger.atWarning().log(
"Bad 'set of parameters' input! Used legacy name %s instead of new name %s",
legacyName, name);
parameters = legacyParameters;
} else {
logger.atSevere().log(
"Bad 'set of parameters' input! Used both legacy name %s and new name %s! "
+ "Ignoring lagacy name.",
legacyName, name);
}
}
}
if (parameters == null) {
return ImmutableSet.of(); return ImmutableSet.of();
} }
if (parameters.length > 1) { if (parameters.length > 1) {
logger.atWarning().log( throw new BadRequestException(
"Bad 'set of parameters' input! " String.format(
+ "Received multiple values instead of single comma-delimited value for parameter %s", "Bad 'set of parameters' input! Received multiple values instead of single "
name); + "comma-delimited value for parameter %s",
return ImmutableSet.copyOf(parameters); name));
} }
if (parameters[0].isEmpty()) { return Splitter.on(',')
return ImmutableSet.of(); .splitToList(parameters[0])
} .stream()
return ImmutableSet.copyOf(Splitter.on(',').split(parameters[0])); .filter(s -> !s.isEmpty())
} .collect(toImmutableSet());
/**
* Returns all GET or POST parameters associated with {@code name}.
*
* <p>While transitioning from "param=key1&param=key2" to "params=key1,key2" style of set inputing
* - we will be accepting all options (with a warning for "wrong" uses).
*
* <p>TODO(b/78226288): remove transition code (including "legacyName") once there are no more
* warnings.
*/
public static ImmutableSet<String> extractSetOfParameters(HttpServletRequest req, String name) {
return extractSetOfParameters(req, name, null);
} }
/** /**
@ -260,9 +226,9 @@ public final class RequestParameters {
* @throws BadRequestException if one of the parameter values is not a valid {@link DateTime}. * @throws BadRequestException if one of the parameter values is not a valid {@link DateTime}.
*/ */
public static ImmutableSet<DateTime> extractSetOfDatetimeParameters( public static ImmutableSet<DateTime> extractSetOfDatetimeParameters(
HttpServletRequest req, String name, @Nullable String legacyName) { HttpServletRequest req, String name) {
try { try {
return extractSetOfParameters(req, name, legacyName) return extractSetOfParameters(req, name)
.stream() .stream()
.filter(not(String::isEmpty)) .filter(not(String::isEmpty))
.map(DateTime::parse) .map(DateTime::parse)

View file

@ -88,7 +88,7 @@ public class ToolsServerModule {
@Provides @Provides
@Parameter(RequestParameters.PARAM_TLDS) @Parameter(RequestParameters.PARAM_TLDS)
static ImmutableSet<String> provideTlds(HttpServletRequest req) { static ImmutableSet<String> provideTlds(HttpServletRequest req) {
return extractSetOfParameters(req, RequestParameters.PARAM_TLDS, RequestParameters.PARAM_TLD); return extractSetOfParameters(req, RequestParameters.PARAM_TLDS);
} }
@Provides @Provides

View file

@ -23,6 +23,7 @@ import static google.registry.request.RequestParameters.extractOptionalEnumParam
import static google.registry.request.RequestParameters.extractOptionalParameter; import static google.registry.request.RequestParameters.extractOptionalParameter;
import static google.registry.request.RequestParameters.extractRequiredDatetimeParameter; import static google.registry.request.RequestParameters.extractRequiredDatetimeParameter;
import static google.registry.request.RequestParameters.extractRequiredParameter; import static google.registry.request.RequestParameters.extractRequiredParameter;
import static google.registry.request.RequestParameters.extractSetOfParameters;
import static google.registry.testing.JUnitBackports.assertThrows; import static google.registry.testing.JUnitBackports.assertThrows;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -78,6 +79,43 @@ public class RequestParametersTest {
assertThat(extractOptionalParameter(req, "spin")).isEmpty(); assertThat(extractOptionalParameter(req, "spin")).isEmpty();
} }
@Test
public void testExtractSetOfParameters_notPresent_returnsEmpty() {
assertThat(extractSetOfParameters(req, "spin")).isEmpty();
}
@Test
public void testExtractSetOfParameters_empty_returnsEmpty() {
when(req.getParameterValues("spin")).thenReturn(new String[]{""});
assertThat(extractSetOfParameters(req, "spin")).isEmpty();
}
@Test
public void testExtractSetOfParameters_oneValue_returnsValue() {
when(req.getParameterValues("spin")).thenReturn(new String[]{"bog"});
assertThat(extractSetOfParameters(req, "spin")).containsExactly("bog");
}
@Test
public void testExtractSetOfParameters_multipleValues_returnsAll() {
when(req.getParameterValues("spin")).thenReturn(new String[]{"bog,gob"});
assertThat(extractSetOfParameters(req, "spin")).containsExactly("bog", "gob");
}
@Test
public void testExtractSetOfParameters_multipleValuesWithEmpty_removesEmpty() {
when(req.getParameterValues("spin")).thenReturn(new String[]{",bog,,gob,"});
assertThat(extractSetOfParameters(req, "spin")).containsExactly("bog", "gob");
}
@Test
public void testExtractSetOfParameters_multipleParameters_error() {
when(req.getParameterValues("spin")).thenReturn(new String[]{"bog", "gob"});
BadRequestException thrown =
assertThrows(BadRequestException.class, () -> extractSetOfParameters(req, "spin"));
assertThat(thrown).hasMessageThat().contains("spin");
}
@Test @Test
public void testExtractBooleanParameter_notPresent_returnsFalse() { public void testExtractBooleanParameter_notPresent_returnsFalse() {
assertThat(extractBooleanParameter(req, "love")).isFalse(); assertThat(extractBooleanParameter(req, "love")).isFalse();