diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-02-08 11:19:19 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-02-08 11:19:19 +0100 |
commit | 3abb7bc8bc8d6845284c86cd4b6869536e0daee9 (patch) | |
tree | af7071d95eabf149b6aae2f5ce2eba0289936417 | |
parent | b69c1cad6dae7506c22e13ceb2432d8f1839ab4d (diff) |
Nonfunctional changes only
33 files changed, 239 insertions, 135 deletions
diff --git a/application/src/main/java/com/yahoo/application/container/handler/Request.java b/application/src/main/java/com/yahoo/application/container/handler/Request.java index cd1ac64cb9e..56163622961 100644 --- a/application/src/main/java/com/yahoo/application/container/handler/Request.java +++ b/application/src/main/java/com/yahoo/application/container/handler/Request.java @@ -4,16 +4,18 @@ package com.yahoo.application.container.handler; import com.google.common.annotations.Beta; import net.jcip.annotations.Immutable; +import java.nio.charset.StandardCharsets; + /** * A request for use with {@link com.yahoo.application.container.JDisc#handleRequest(Request)}. * - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> - * @since 5.1.15 + * @author Einar M R Rosenvinge * @see Response */ @Immutable @Beta public class Request { + private final Headers headers = new Headers(); private final String uri; private final byte[] body; @@ -29,7 +31,7 @@ public class Request { } /** - * Creates a Request with a message body. + * Creates a GET Request with a message body. * * @param uri the URI of the request * @param body the body of the request @@ -38,6 +40,15 @@ public class Request { this(uri, body, Method.GET); } + /** + * Creates a GET Request with a message body. + * + * @param uri the URI of the request + * @param body the body of the request as a UTF-8 string + */ + public Request(String uri, String body) { + this(uri, body.getBytes(StandardCharsets.UTF_8), Method.GET); + } /** * Creates a Request with a message body. @@ -52,6 +63,15 @@ public class Request { } /** + * Creates a Request with a message body. + * + * @param uri the URI of the request + * @param body the body of the request as a UTF-8 string + */ + public Request(String uri, String body, Method method) { + this(uri, body.getBytes(StandardCharsets.UTF_8), method); + } + /** * Returns a mutable multi-map of headers for this Request. * * @return a mutable multi-map of headers for this Request @@ -99,4 +119,5 @@ public class Request { TRACE, CONNECT } + } diff --git a/application/src/test/java/com/yahoo/application/container/HttpFilterTest.java b/application/src/test/java/com/yahoo/application/container/HttpFilterTest.java new file mode 100644 index 00000000000..c48421a8f86 --- /dev/null +++ b/application/src/test/java/com/yahoo/application/container/HttpFilterTest.java @@ -0,0 +1,48 @@ +package com.yahoo.application.container; + +import com.yahoo.application.Networking; +import com.yahoo.application.container.handler.Request; +import com.yahoo.application.container.handler.Response; +import com.yahoo.text.Utf8; +import org.junit.Test; + +import java.nio.charset.CharacterCodingException; + +import static org.junit.Assert.assertEquals; + +/** + * @author bratseth + */ +public class HttpFilterTest { + + private static String getXML() { + return "<container version='1.0'>" + + " <handler id='test-handler' class='com.yahoo.application.container.handlers.EchoRequestHandler'>" + + " <binding>http://*/*</binding>" + + " </handler>" + + " <http>" + + " <server port='4080' id='controller4080'/>"+ + " <filtering>" + + " <request-chain id='request-filters'>" + + " <filter id='com.yahoo.application.container.filters.ThrowingFilter'/>" + + " <binding>http://*/*</binding>" + + " </request-chain>" + + " </filtering>"+ + " </http>" + + "</container>"; + } + + @Test + public void testFilterInvocation() throws InterruptedException, CharacterCodingException { + String requestData = "data"; + Request req = new Request("http://localhost/echo", requestData.getBytes(Utf8.getCharset())); + + try (JDisc container = JDisc.fromServicesXml(getXML(), Networking.disable)) { + Response response = container.handleRequest(req); + assertEquals(response.getBodyAsString(), requestData); + req.toString(); + response.toString(); + } + } + +} diff --git a/application/src/test/java/com/yahoo/application/container/JDiscContainerDocprocTest.java b/application/src/test/java/com/yahoo/application/container/JDiscContainerDocprocTest.java index d6c0e08a570..ea7b37db520 100644 --- a/application/src/test/java/com/yahoo/application/container/JDiscContainerDocprocTest.java +++ b/application/src/test/java/com/yahoo/application/container/JDiscContainerDocprocTest.java @@ -23,7 +23,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; /** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public class JDiscContainerDocprocTest { diff --git a/application/src/test/java/com/yahoo/application/container/JDiscContainerRequestTest.java b/application/src/test/java/com/yahoo/application/container/JDiscContainerRequestTest.java index 1ab91547f04..0916b57394d 100644 --- a/application/src/test/java/com/yahoo/application/container/JDiscContainerRequestTest.java +++ b/application/src/test/java/com/yahoo/application/container/JDiscContainerRequestTest.java @@ -20,7 +20,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; /** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public class JDiscContainerRequestTest { @@ -38,7 +38,7 @@ public class JDiscContainerRequestTest { @Test public void requireThatRequestBodyWorks() throws InterruptedException, CharacterCodingException { - final String DATA = "we have no bananas today"; + String DATA = "we have no bananas today"; Request req = new Request("http://banana/echo", DATA.getBytes(Utf8.getCharset())); try (JDisc container = JDisc.fromServicesXml(getXML(EchoRequestHandler.class.getCanonicalName(), "http://*/echo"), Networking.disable)) { @@ -64,7 +64,7 @@ public class JDiscContainerRequestTest { @Test(expected = WriteException.class) public void requireThatRequestHandlerThatThrowsInWriteWorks() throws InterruptedException { - final String DATA = "we have no bananas today"; + String DATA = "we have no bananas today"; Request req = new Request("http://banana/throwwrite", DATA.getBytes(Utf8.getCharset())); try (JDisc container = JDisc.fromServicesXml(getXML(ThrowingInWriteRequestHandler.class.getCanonicalName(), "http://*/throwwrite"), Networking.disable)) { @@ -76,7 +76,7 @@ public class JDiscContainerRequestTest { @Test(expected = DelayedWriteException.class) public void requireThatRequestHandlerThatThrowsDelayedInWriteWorks() throws InterruptedException { - final String DATA = "we have no bananas today"; + String DATA = "we have no bananas today"; Request req = new Request("http://banana/delayedthrowwrite", DATA.getBytes(Utf8.getCharset())); try (JDisc container = JDisc.fromServicesXml(getXML(DelayedThrowingInWriteRequestHandler.class.getCanonicalName(), "http://*/delayedthrowwrite"), Networking.disable)) { @@ -84,4 +84,5 @@ public class JDiscContainerRequestTest { req.toString(); } } + } diff --git a/application/src/test/java/com/yahoo/application/container/filters/ThrowingFilter.java b/application/src/test/java/com/yahoo/application/container/filters/ThrowingFilter.java new file mode 100644 index 00000000000..9148d9a8715 --- /dev/null +++ b/application/src/test/java/com/yahoo/application/container/filters/ThrowingFilter.java @@ -0,0 +1,29 @@ +package com.yahoo.application.container.filters; + +import com.yahoo.jdisc.handler.ResponseHandler; +import com.yahoo.jdisc.http.filter.DiscFilterRequest; +import com.yahoo.jdisc.http.filter.SecurityRequestFilter; + +import java.security.Principal; + +/** + * @author bratseth + */ +public class ThrowingFilter implements SecurityRequestFilter { + + @Override + public void filter(DiscFilterRequest discFilterRequest, ResponseHandler responseHandler) { + if (1==1) throw new RuntimeException("Filter ran"); + discFilterRequest.setUserPrincipal(new MockPrincipal()); + } + + private static class MockPrincipal implements Principal { + + @Override + public String getName() { + return "testuser"; + } + + } + +} diff --git a/application/src/test/java/com/yahoo/application/container/handler/HeadersTestCase.java b/application/src/test/java/com/yahoo/application/container/handler/HeadersTestCase.java index 7f4a32c7df6..629513689cd 100644 --- a/application/src/test/java/com/yahoo/application/container/handler/HeadersTestCase.java +++ b/application/src/test/java/com/yahoo/application/container/handler/HeadersTestCase.java @@ -13,8 +13,8 @@ import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; /** - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Simon Thoresen + * @author Einar M R Rosenvinge */ public class HeadersTestCase { diff --git a/application/src/test/java/com/yahoo/application/container/handler/ResponseTestCase.java b/application/src/test/java/com/yahoo/application/container/handler/ResponseTestCase.java index 53b62753523..0e27f68ef13 100644 --- a/application/src/test/java/com/yahoo/application/container/handler/ResponseTestCase.java +++ b/application/src/test/java/com/yahoo/application/container/handler/ResponseTestCase.java @@ -9,7 +9,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; /** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public class ResponseTestCase { diff --git a/application/src/test/java/com/yahoo/application/container/handlers/EchoRequestHandler.java b/application/src/test/java/com/yahoo/application/container/handlers/EchoRequestHandler.java index 30fe379d864..1763c87e8ca 100644 --- a/application/src/test/java/com/yahoo/application/container/handlers/EchoRequestHandler.java +++ b/application/src/test/java/com/yahoo/application/container/handlers/EchoRequestHandler.java @@ -7,11 +7,13 @@ import com.yahoo.jdisc.handler.ContentChannel; import com.yahoo.jdisc.handler.ResponseHandler; /** -* @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> +* @author Einar M R Rosenvinge */ public class EchoRequestHandler extends AbstractRequestHandler { + @Override public ContentChannel handleRequest(com.yahoo.jdisc.Request request, ResponseHandler handler) { return handler.handleResponse(new com.yahoo.jdisc.Response(Response.Status.OK)); } + } diff --git a/application/src/test/java/com/yahoo/application/container/processors/Rot13Processor.java b/application/src/test/java/com/yahoo/application/container/processors/Rot13Processor.java index f0ec8c25a88..95765e69d33 100644 --- a/application/src/test/java/com/yahoo/application/container/processors/Rot13Processor.java +++ b/application/src/test/java/com/yahoo/application/container/processors/Rot13Processor.java @@ -10,9 +10,10 @@ import com.yahoo.processing.test.ProcessorLibrary; import static com.yahoo.application.container.docprocs.Rot13DocumentProcessor.rot13; /** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public class Rot13Processor extends Processor { + @Override public Response process(Request request, Execution execution) { Object fooObj = request.properties().get("title"); @@ -23,4 +24,5 @@ public class Rot13Processor extends Processor { } return response; } + } diff --git a/application/src/test/java/com/yahoo/application/container/searchers/MockSearcher.java b/application/src/test/java/com/yahoo/application/container/searchers/MockSearcher.java index ad65e597519..106d68f6644 100644 --- a/application/src/test/java/com/yahoo/application/container/searchers/MockSearcher.java +++ b/application/src/test/java/com/yahoo/application/container/searchers/MockSearcher.java @@ -1,4 +1,4 @@ -// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.application.container.searchers;
import com.yahoo.search.Query;
@@ -13,10 +13,12 @@ import com.yahoo.search.searchchain.Execution; * @author Christian Andersen
*/
public class MockSearcher extends Searcher {
+
@Override
public Result search(Query query, Execution execution) {
HitGroup hits = new HitGroup();
hits.add(new Hit("foo", query));
return new Result(query, hits);
}
+
}
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/HttpResponse.java b/container-core/src/main/java/com/yahoo/container/jdisc/HttpResponse.java index cd91d2d914c..1b089930482 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/HttpResponse.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/HttpResponse.java @@ -14,8 +14,7 @@ import java.util.Collections; * An HTTP response as an opaque payload with headers and content type. * * @author hmusum - * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> - * @since 5.1 + * @author Steinar Knutsen */ public abstract class HttpResponse { diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/VespaHeaders.java b/container-core/src/main/java/com/yahoo/container/jdisc/VespaHeaders.java index 8959114adea..d50abfde0a2 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/VespaHeaders.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/VespaHeaders.java @@ -13,6 +13,7 @@ import static com.yahoo.container.protect.Error.NO_BACKENDS_IN_SERVICE; import static com.yahoo.container.protect.Error.TIMEOUT; import static com.yahoo.container.protect.Error.UNAUTHORIZED; +import java.net.URLDecoder; import java.util.Iterator; import com.yahoo.collections.Tuple2; diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java index 722d61def55..20485a73a35 100644 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java @@ -21,15 +21,15 @@ import java.util.List; * @author bakksjo */ public class FilterBindingsProvider implements Provider<FilterBindings> { + final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>(); final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>(); - public FilterBindingsProvider( - final ComponentId componentId, - final ServerConfig config, - final FilterChainRepository filterChainRepository, - final ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) { - final ComponentId serverId = componentId.getNamespace(); + public FilterBindingsProvider(ComponentId componentId, + ServerConfig config, + FilterChainRepository filterChainRepository, + ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) { + ComponentId serverId = componentId.getNamespace(); try { FilterUtil.setupFilters( componentId, @@ -58,4 +58,5 @@ public class FilterBindingsProvider implements Provider<FilterBindings> { @Override public void deconstruct() {} + } diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java index fabe4a48da0..9896e30756d 100644 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java @@ -17,26 +17,23 @@ import java.util.List; /** * Helper class to set up filter binding repositories based on config. * - * @author bakksjo + * @author Øyvind Bakksjø */ class FilterUtil { + private static final ComponentId SEARCH_SERVER_COMPONENT_ID = ComponentId.fromString("SearchServer"); private final BindingRepository<RequestFilter> requestFilters; private final BindingRepository<ResponseFilter> responseFilters; - private FilterUtil( - final BindingRepository<RequestFilter> requestFilters, - final BindingRepository<ResponseFilter> responseFilters) { + private FilterUtil(BindingRepository<RequestFilter> requestFilters, BindingRepository<ResponseFilter> responseFilters) { this.requestFilters = requestFilters; this.responseFilters = responseFilters; } - private void configureFilters( - final List<FilterSpec> filtersConfig, - final FilterChainRepository filterChainRepository) { - for (final FilterSpec filterConfig : filtersConfig) { - final Object filter = filterChainRepository.getFilter(ComponentSpecification.fromString(filterConfig.getId())); + private void configureFilters(List<FilterSpec> filtersConfig, FilterChainRepository filterChainRepository) { + for (FilterSpec filterConfig : filtersConfig) { + Object filter = filterChainRepository.getFilter(ComponentSpecification.fromString(filterConfig.getId())); if (filter == null) { throw new RuntimeException("No http filter with id " + filterConfig.getId()); } @@ -44,9 +41,10 @@ class FilterUtil { } } - private void addFilter(final Object filter, final String binding) { + private void addFilter(Object filter, String binding) { if (filter instanceof RequestFilter && filter instanceof ResponseFilter) { - throw new RuntimeException("The filter " + filter.getClass().getName() + " is unsupported since it's both a RequestFilter and a ResponseFilter."); + throw new RuntimeException("The filter " + filter.getClass().getName() + + " is unsupported since it's both a RequestFilter and a ResponseFilter."); } else if (filter instanceof RequestFilter) { requestFilters.put(new UriPattern(binding), (RequestFilter) filter); } else if (filter instanceof ResponseFilter) { @@ -57,14 +55,11 @@ class FilterUtil { } //TVT: remove - private void configureLegacyFilters( - final ComponentId id, - final ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) { - final ComponentId serverName = id.getNamespace(); + private void configureLegacyFilters(ComponentId id, ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) { + ComponentId serverName = id.getNamespace(); if (SEARCH_SERVER_COMPONENT_ID.equals(serverName) && !legacyRequestFilters.allComponents().isEmpty()) { - requestFilters.bind( - "http://*/*", - SecurityRequestFilterChain.newInstance(legacyRequestFilters.allComponents())); + requestFilters.bind("http://*/*", + SecurityRequestFilterChain.newInstance(legacyRequestFilters.allComponents())); } } @@ -74,14 +69,13 @@ class FilterUtil { * @param requestFilters output argument that will be mutated * @param responseFilters output argument that will be mutated */ - public static void setupFilters( - final ComponentId componentId, - final ComponentRegistry<SecurityRequestFilter> legacyRequestFilters, - final List<FilterSpec> filtersConfig, - final FilterChainRepository filterChainRepository, - final BindingRepository<RequestFilter> requestFilters, - final BindingRepository<ResponseFilter> responseFilters) { - final FilterUtil filterUtil = new FilterUtil(requestFilters, responseFilters); + public static void setupFilters(ComponentId componentId, + ComponentRegistry<SecurityRequestFilter> legacyRequestFilters, + List<FilterSpec> filtersConfig, + FilterChainRepository filterChainRepository, + BindingRepository<RequestFilter> requestFilters, + BindingRepository<ResponseFilter> responseFilters) { + FilterUtil filterUtil = new FilterUtil(requestFilters, responseFilters); // TODO: remove filterUtil.configureLegacyFilters(componentId, legacyRequestFilters); @@ -90,6 +84,7 @@ class FilterUtil { } public static class FilterSpec { + private final String id; private final String binding; @@ -106,4 +101,5 @@ class FilterUtil { return binding; } } + } diff --git a/container-search/src/main/java/com/yahoo/search/federation/FederationResult.java b/container-search/src/main/java/com/yahoo/search/federation/FederationResult.java index a7983447a81..62f0f172313 100644 --- a/container-search/src/main/java/com/yahoo/search/federation/FederationResult.java +++ b/container-search/src/main/java/com/yahoo/search/federation/FederationResult.java @@ -88,7 +88,7 @@ class FederationResult { /** * Returns the result of this by blocking until timeout if necessary. * - * @return the result if available, or null otherwise + * @return the result if available, or empty otherwise */ public Optional<Result> getIfAvailable(long timeout) { if (availableResult.isPresent()) return availableResult; diff --git a/document/src/main/java/com/yahoo/document/DocumentUpdate.java b/document/src/main/java/com/yahoo/document/DocumentUpdate.java index 359873e1cf4..f486ab6d33d 100644 --- a/document/src/main/java/com/yahoo/document/DocumentUpdate.java +++ b/document/src/main/java/com/yahoo/document/DocumentUpdate.java @@ -29,7 +29,7 @@ import java.util.Optional; * docUpdate.addFieldUpdate(update); * </pre> * - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge * @see com.yahoo.document.update.FieldUpdate * @see com.yahoo.document.update.ValueUpdate */ diff --git a/document/src/main/java/com/yahoo/document/fieldpathupdate/AssignFieldPathUpdate.java b/document/src/main/java/com/yahoo/document/fieldpathupdate/AssignFieldPathUpdate.java index b799a56197f..ef048fd020b 100644 --- a/document/src/main/java/com/yahoo/document/fieldpathupdate/AssignFieldPathUpdate.java +++ b/document/src/main/java/com/yahoo/document/fieldpathupdate/AssignFieldPathUpdate.java @@ -15,9 +15,10 @@ import java.util.HashMap; import java.util.Map; /** - * @author <a href="mailto:thomasg@yahoo-inc.com">Thomas Gundersen</a> + * @author Thomas Gundersen */ public class AssignFieldPathUpdate extends FieldPathUpdate { + class SimpleAssignIteratorHandler extends FieldPathIteratorHandler { FieldValue newValue; boolean removeIfZero; @@ -278,4 +279,5 @@ public class AssignFieldPathUpdate extends FieldPathUpdate { public FieldValue getFieldValue() { return fieldValue; } + } diff --git a/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java b/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java index 318b696ce7a..01c36ed5753 100644 --- a/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java +++ b/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java @@ -14,11 +14,11 @@ import com.yahoo.document.serialization.DocumentUpdateReader; import com.yahoo.document.serialization.VespaDocumentSerializerHead; /** - * @author <a href="mailto:thomasg@yahoo-inc.com">Thomas Gundersen</a> + * @author Thomas Gundersen */ public abstract class FieldPathUpdate { - public static enum Type { + public enum Type { ASSIGN(0), REMOVE(1), ADD(2); diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java index 83dc9df2826..89d98571394 100644 --- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java +++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java @@ -40,7 +40,7 @@ public class VespaDocumentDeserializerHead extends VespaDocumentDeserializer42 { for (int i = 0; i < size; i++) { int type = getByte(null); update.addFieldPathUpdate(FieldPathUpdate.create(FieldPathUpdate.Type.valueOf(type), - update.getDocumentType(), this)); + update.getDocumentType(), this)); } } catch (ParseException e) { throw new DeserializationException(e); diff --git a/document/src/main/java/com/yahoo/document/update/MapValueUpdate.java b/document/src/main/java/com/yahoo/document/update/MapValueUpdate.java index 37b4329c934..edb40c6959b 100644 --- a/document/src/main/java/com/yahoo/document/update/MapValueUpdate.java +++ b/document/src/main/java/com/yahoo/document/update/MapValueUpdate.java @@ -25,7 +25,7 @@ import com.yahoo.document.serialization.DocumentUpdateWriter; * must represent a legal operation on an integer value.</li> * </ul> * - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public class MapValueUpdate extends ValueUpdate { protected FieldValue value; diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/Response.java b/jdisc_core/src/main/java/com/yahoo/jdisc/Response.java index d624e070a2e..6132a5c40ad 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/Response.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/Response.java @@ -19,7 +19,7 @@ import java.util.Map; * <p>The usage pattern of the Response is similar to that of the Request in that the {@link ResponseHandler} returns a * {@link ContentChannel} into which to write the Response content.</p> * - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + * @author Simon Thoresen * @see Request * @see ResponseHandler */ diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java index 661f96d7dc3..e1f8005eeed 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java @@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit; /** * A HTTP request. * - * @author <a href="mailto:anirudha@yahoo-inc.com">Anirudha Khanna</a> + * @author Anirudha Khanna * @author Einar M R Rosenvinge */ public class HttpRequest extends Request implements ServletOrJdiscHttpRequest { diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpResponse.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpResponse.java index cf54c546eb7..a4c19becb49 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpResponse.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpResponse.java @@ -18,7 +18,7 @@ import java.util.List; /** * A HTTP response. * - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public class HttpResponse extends Response implements ServletOrJdiscHttpResponse { @@ -27,7 +27,6 @@ public class HttpResponse extends Response implements ServletOrJdiscHttpResponse private String message; public interface Status extends Response.Status { - int REQUEST_ENTITY_TOO_LARGE = REQUEST_TOO_LONG; int REQUEST_RANGE_NOT_SATISFIABLE = REQUESTED_RANGE_NOT_SATISFIABLE; } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestFilter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestFilter.java index 8202ef0e693..c4e5f5878ee 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestFilter.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestFilter.java @@ -5,9 +5,10 @@ import com.yahoo.jdisc.handler.ResponseHandler; import com.yahoo.jdisc.http.HttpRequest; /** - * @author <a href="mailto:einarmr@yahoo-inc.com">Einar M R Rosenvinge</a> + * @author Einar M R Rosenvinge */ public interface RequestFilter extends com.yahoo.jdisc.SharedResource, RequestFilterBase { - public void filter(HttpRequest request, ResponseHandler handler); + void filter(HttpRequest request, ResponseHandler handler); + } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java index 52e05484afc..2bcb1635dfb 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java @@ -92,4 +92,5 @@ public class SecurityFilterInvoker implements FilterInvoker { return uri; } } + } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilter.java index 77ee10111be..63dd1037aed 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilter.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilter.java @@ -4,7 +4,7 @@ package com.yahoo.jdisc.http.filter; import com.yahoo.jdisc.handler.ResponseHandler; /** - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + * @author Simon Thoresen */ public interface SecurityRequestFilter extends RequestFilterBase { diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilterChain.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilterChain.java index d6c5629d6c1..daed3792ee8 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilterChain.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityRequestFilterChain.java @@ -17,11 +17,10 @@ import java.util.List; * Implementation of TypedFilterChain for DiscFilterRequest * * @author tejalk - * */ public final class SecurityRequestFilterChain extends AbstractResource implements RequestFilter { - private final List<SecurityRequestFilter> filters = new ArrayList<SecurityRequestFilter>(); + private final List<SecurityRequestFilter> filters = new ArrayList<>(); private SecurityRequestFilterChain(Iterable<? extends SecurityRequestFilter> filters) { for (SecurityRequestFilter filter : filters) { diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java index 190408c88b8..b554f98ebd7 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/FilteringRequestHandler.java @@ -24,49 +24,50 @@ import java.util.concurrent.atomic.AtomicBoolean; /** * Request handler that invokes request and response filters in addition to the bound request handler. * - * @author bakksjo - * $Id$ + * @author Øyvind Bakksjø */ class FilteringRequestHandler extends AbstractRequestHandler { + private static final ContentChannel COMPLETING_CONTENT_CHANNEL = new ContentChannel() { + @Override - public void write(final ByteBuffer buf, final CompletionHandler handler) { + public void write(ByteBuffer buf, CompletionHandler handler) { CompletionHandlers.tryComplete(handler); } @Override - public void close(final CompletionHandler handler) { + public void close(CompletionHandler handler) { CompletionHandlers.tryComplete(handler); } + }; private final BindingSet<RequestFilter> requestFilters; private final BindingSet<ResponseFilter> responseFilters; - public FilteringRequestHandler( - final BindingSet<RequestFilter> requestFilters, - final BindingSet<ResponseFilter> responseFilters) { + public FilteringRequestHandler(BindingSet<RequestFilter> requestFilters, + BindingSet<ResponseFilter> responseFilters) { this.requestFilters = requestFilters; this.responseFilters = responseFilters; } @Override - public ContentChannel handleRequest(final Request request, final ResponseHandler originalResponseHandler) { + public ContentChannel handleRequest(Request request, ResponseHandler originalResponseHandler) { Preconditions.checkArgument(request instanceof HttpRequest, "Expected HttpRequest, got " + request); Objects.requireNonNull(originalResponseHandler, "responseHandler"); - final RequestFilter requestFilter = requestFilters.resolve(request.getUri()); - final ResponseFilter responseFilter = responseFilters.resolve(request.getUri()); + RequestFilter requestFilter = requestFilters.resolve(request.getUri()); + ResponseFilter responseFilter = responseFilters.resolve(request.getUri()); // Not using request.connect() here - it adds logic for error handling that we'd rather leave to the framework. - final RequestHandler resolvedRequestHandler = request.container().resolveHandler(request); + RequestHandler resolvedRequestHandler = request.container().resolveHandler(request); if (resolvedRequestHandler == null) { throw new BindingNotFoundException(request.getUri()); } - final RequestHandler requestHandler = new ReferenceCountingRequestHandler(resolvedRequestHandler); + RequestHandler requestHandler = new ReferenceCountingRequestHandler(resolvedRequestHandler); - final ResponseHandler responseHandler; + ResponseHandler responseHandler; if (responseFilter != null) { responseHandler = new FilteringResponseHandler(originalResponseHandler, responseFilter, request); } else { @@ -74,15 +75,14 @@ class FilteringRequestHandler extends AbstractRequestHandler { } if (requestFilter != null) { - final InterceptingResponseHandler interceptingResponseHandler - = new InterceptingResponseHandler(responseHandler); + InterceptingResponseHandler interceptingResponseHandler = new InterceptingResponseHandler(responseHandler); requestFilter.filter(HttpRequest.class.cast(request), interceptingResponseHandler); if (interceptingResponseHandler.hasProducedResponse()) { return COMPLETING_CONTENT_CHANNEL; } } - final ContentChannel contentChannel = requestHandler.handleRequest(request, responseHandler); + ContentChannel contentChannel = requestHandler.handleRequest(request, responseHandler); if (contentChannel == null) { throw new RequestDeniedException(request); } @@ -90,37 +90,37 @@ class FilteringRequestHandler extends AbstractRequestHandler { } private static class FilteringResponseHandler implements ResponseHandler { + private final ResponseHandler delegate; private final ResponseFilter responseFilter; private final Request request; - public FilteringResponseHandler( - final ResponseHandler delegate, - final ResponseFilter responseFilter, - final Request request) { + public FilteringResponseHandler(ResponseHandler delegate, ResponseFilter responseFilter, Request request) { this.delegate = Objects.requireNonNull(delegate); this.responseFilter = Objects.requireNonNull(responseFilter); this.request = request; } @Override - public ContentChannel handleResponse(final Response response) { + public ContentChannel handleResponse(Response response) { responseFilter.filter(response, request); return delegate.handleResponse(response); } + } private static class InterceptingResponseHandler implements ResponseHandler { + private final ResponseHandler delegate; private AtomicBoolean hasResponded = new AtomicBoolean(false); - public InterceptingResponseHandler(final ResponseHandler delegate) { + public InterceptingResponseHandler(ResponseHandler delegate) { this.delegate = Objects.requireNonNull(delegate); } @Override - public ContentChannel handleResponse(final Response response) { - final ContentChannel content = delegate.handleResponse(response); + public ContentChannel handleResponse(Response response) { + ContentChannel content = delegate.handleResponse(response); hasResponded.set(true); return content; } @@ -129,4 +129,5 @@ class FilteringRequestHandler extends AbstractRequestHandler { return hasResponded.get(); } } + } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java index f41e44b0a73..57e5ba0cf03 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java @@ -32,9 +32,10 @@ import static com.yahoo.jdisc.http.HttpHeaders.Values.APPLICATION_X_WWW_FORM_URL import static com.yahoo.jdisc.http.server.jetty.Exceptions.throwUnchecked; /** - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + * @author Simon Thoresen Hult */ class HttpRequestDispatch { + private static final Logger log = Logger.getLogger(HttpRequestDispatch.class.getName()); private final static String CHARSET_ANNOTATION = ";charset="; @@ -47,12 +48,11 @@ class HttpRequestDispatch { private final RequestHandler requestHandler; private final MetricReporter metricReporter; - public HttpRequestDispatch( - final JDiscContext jDiscContext, - final AccessLogEntry accessLogEntry, - final Context metricContext, - final HttpServletRequest servletRequest, - final HttpServletResponse servletResponse) throws IOException { + public HttpRequestDispatch(JDiscContext jDiscContext, + AccessLogEntry accessLogEntry, + Context metricContext, + HttpServletRequest servletRequest, + HttpServletResponse servletResponse) throws IOException { this.jDiscContext = jDiscContext; requestHandler = newRequestHandler(jDiscContext, accessLogEntry, servletRequest); @@ -73,7 +73,7 @@ class HttpRequestDispatch { } public void dispatch() throws IOException { - final ServletRequestReader servletRequestReader; + ServletRequestReader servletRequestReader; try { servletRequestReader = handleRequest(); } catch (Throwable throwable) { @@ -145,7 +145,7 @@ class HttpRequestDispatch { private ServletRequestReader handleRequest() throws IOException { servletResponseController.registerWriteListener(); HttpRequest jdiscRequest = HttpRequestFactory.newJDiscRequest(jDiscContext.container, servletRequest); - final ContentChannel requestContentChannel; + ContentChannel requestContentChannel; try (ResourceReference ref = References.fromResource(jdiscRequest)) { HttpRequestFactory.copyHeaders(servletRequest, jdiscRequest); @@ -186,25 +186,23 @@ class HttpRequestDispatch { } - private static RequestHandler newRequestHandler( - final JDiscContext context, - final AccessLogEntry accessLogEntry, - final HttpServletRequest servletRequest) { - final RequestHandler requestHandler = wrapHandlerIfFormPost( + private static RequestHandler newRequestHandler(JDiscContext context, + AccessLogEntry accessLogEntry, + HttpServletRequest servletRequest) { + RequestHandler requestHandler = wrapHandlerIfFormPost( new FilteringRequestHandler(context.requestFilters, context.responseFilters), servletRequest, context.serverConfig.removeRawPostBodyForWwwUrlEncodedPost()); return new AccessLoggingRequestHandler(requestHandler, accessLogEntry); } - private static RequestHandler wrapHandlerIfFormPost( - final RequestHandler requestHandler, - final HttpServletRequest servletRequest, - final boolean removeBodyForFormPost) { + private static RequestHandler wrapHandlerIfFormPost(RequestHandler requestHandler, + HttpServletRequest servletRequest, + boolean removeBodyForFormPost) { if (!servletRequest.getMethod().equals("POST")) { return requestHandler; } - final String contentType = servletRequest.getHeader(HttpHeaders.Names.CONTENT_TYPE); + String contentType = servletRequest.getHeader(HttpHeaders.Names.CONTENT_TYPE); if (contentType == null) { return requestHandler; } @@ -214,7 +212,7 @@ class HttpRequestDispatch { return new FormPostRequestHandler(requestHandler, getCharsetName(contentType), removeBodyForFormPost); } - private static String getCharsetName(final String contentType) { + private static String getCharsetName(String contentType) { if (!contentType.startsWith(CHARSET_ANNOTATION, APPLICATION_X_WWW_FORM_URLENCODED.length())) { return StandardCharsets.UTF_8.name(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/ErrorResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/ErrorResponse.java index 7c5a1fffbc0..701ae665757 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/ErrorResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/ErrorResponse.java @@ -15,6 +15,13 @@ public class ErrorResponse extends HttpResponse { private final Slime slime = new Slime(); + public enum errorCodes { + NOT_FOUND, + BAD_REQUEST, + METHOD_NOT_ALLOWED, + INTERNAL_SERVER_ERROR + } + public ErrorResponse(int code, String errorType, String message) { super(code); Cursor root = slime.setObject(); @@ -22,15 +29,6 @@ public class ErrorResponse extends HttpResponse { root.setString("message", message); } - public enum errorCodes { - NOT_FOUND, - BAD_REQUEST, - METHOD_NOT_ALLOWED, - INTERNAL_SERVER_ERROR, - INVALID_APPLICATION_PACKAGE, - UNKNOWN_VESPA_VERSION - } - public static ErrorResponse notFoundError(String message) { return new ErrorResponse(NOT_FOUND, errorCodes.NOT_FOUND.name(), message); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java index 7e329e1599b..f9d878dabec 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java @@ -67,13 +67,14 @@ public class NodesApiHandler extends LoggingRequestHandler { case PATCH: return handlePATCH(request); default: return ErrorResponse.methodNotAllowed("Method '" + request.getMethod() + "' is not supported"); } - } catch (NotFoundException | com.yahoo.vespa.hosted.provision.NotFoundException e) { + } + catch (NotFoundException | com.yahoo.vespa.hosted.provision.NotFoundException e) { return ErrorResponse.notFoundError(Exceptions.toMessageString(e)); - } catch (IllegalArgumentException e) { + } + catch (IllegalArgumentException e) { return ErrorResponse.badRequest(Exceptions.toMessageString(e)); } catch (RuntimeException e) { - e.printStackTrace(); log.log(Level.WARNING, "Unexpected error handling '" + request.getUri() + "'", e); return ErrorResponse.internalServerError(Exceptions.toMessageString(e)); } @@ -88,7 +89,7 @@ public class NodesApiHandler extends LoggingRequestHandler { if (path.startsWith("/nodes/v2/state/")) return new NodesResponse(ResponseType.nodesInStateList, request, nodeRepository); if (path.startsWith("/nodes/v2/acl/")) return new NodeAclResponse(request, nodeRepository); if (path.equals( "/nodes/v2/command/")) return ResourcesResponse.fromStrings(request.getUri(), "restart", "reboot"); - return ErrorResponse.notFoundError("Nothing at path '" + request.getUri().getPath() + "'"); + return ErrorResponse.notFoundError("Nothing at path '" + path + "'"); } private HttpResponse handlePUT(HttpRequest request) { @@ -114,7 +115,7 @@ public class NodesApiHandler extends LoggingRequestHandler { return new MessageResponse("Moved " + lastElement(path) + " to active"); } else { - return ErrorResponse.notFoundError("Cannot put to path '" + request.getUri().getPath() + "'"); + return ErrorResponse.notFoundError("Cannot put to path '" + path + "'"); } } @@ -171,11 +172,11 @@ public class NodesApiHandler extends LoggingRequestHandler { } public int addNodes(InputStream jsonStream) { - List<Node> nodes = createNodesFromSlime(getSlimeFromInputStream(jsonStream).get()); + List<Node> nodes = createNodesFromSlime(toSlime(jsonStream).get()); return nodeRepository.addNodes(nodes).size(); } - private static Slime getSlimeFromInputStream(InputStream jsonStream) { + private Slime toSlime(InputStream jsonStream) { try { byte[] jsonBytes = IOUtils.readBytes(jsonStream, 1000 * 1000); return SlimeUtils.jsonToSlime(jsonBytes); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java index 3ca0c4ff365..1239069c1a0 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java @@ -8,17 +8,19 @@ package com.yahoo.vespa.hosted.provision.testutils; * @author dybis */ public class ContainerConfig { + public static final String servicesXmlV2(int port) { return - "<jdisc version=\"1.0\">" + - " <component id=\"com.yahoo.vespa.hosted.provision.testutils.MockNodeFlavors\"/>" + - " <component id=\"com.yahoo.vespa.hosted.provision.testutils.MockNodeRepository\"/>" + - " <handler id=\"com.yahoo.vespa.hosted.provision.restapi.v2.NodesApiHandler\">" + - " <binding>http://*/nodes/v2/*</binding>" + - " </handler>" + - " <http>\n" + - " <server id='myServer' port='" + port + "' />\n" + - " </http>" + - "</jdisc>"; + "<jdisc version='1.0'>" + + " <component id='com.yahoo.vespa.hosted.provision.testutils.MockNodeFlavors'/>" + + " <component id='com.yahoo.vespa.hosted.provision.testutils.MockNodeRepository'/>" + + " <handler id='com.yahoo.vespa.hosted.provision.restapi.v2.NodesApiHandler'>" + + " <binding>http://*/nodes/v2/*</binding>" + + " </handler>" + + " <http>" + + " <server id='myServer' port='" + port + "' />" + + " </http>" + + "</jdisc>"; } + } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index d2af29765fd..20440c2bc9e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -469,7 +469,7 @@ public class RestApiTest { assertResponse(request, 200, "{\"message\":\"Scheduled reboot of " + rebootCount + " matching nodes\"}"); } - /** Replace @include(localFile) with the content of the file */ + /** Replaces @include(localFile) with the content of the file */ private String include(String response) throws IOException { // Please don't look at this code int includeIndex = response.indexOf("@include("); |