summaryrefslogtreecommitdiffstats
path: root/vespaclient-core/src/main/java/com/yahoo/feedhandler/VespaFeedHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'vespaclient-core/src/main/java/com/yahoo/feedhandler/VespaFeedHandler.java')
-rwxr-xr-xvespaclient-core/src/main/java/com/yahoo/feedhandler/VespaFeedHandler.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/vespaclient-core/src/main/java/com/yahoo/feedhandler/VespaFeedHandler.java b/vespaclient-core/src/main/java/com/yahoo/feedhandler/VespaFeedHandler.java
new file mode 100755
index 00000000000..6e3facbdc98
--- /dev/null
+++ b/vespaclient-core/src/main/java/com/yahoo/feedhandler/VespaFeedHandler.java
@@ -0,0 +1,102 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.feedhandler;
+
+import com.google.inject.Inject;
+import com.yahoo.clientmetrics.RouteMetricSet;
+import com.yahoo.container.jdisc.HttpRequest;
+import com.yahoo.container.jdisc.HttpResponse;
+import com.yahoo.feedapi.DocprocMessageProcessor;
+import com.yahoo.feedapi.FeedContext;
+import com.yahoo.feedapi.Feeder;
+import com.yahoo.feedapi.JsonFeeder;
+import com.yahoo.feedapi.MessagePropertyProcessor;
+import com.yahoo.feedapi.SingleSender;
+import com.yahoo.feedapi.XMLFeeder;
+import com.yahoo.jdisc.Metric;
+import com.yahoo.vespa.config.content.LoadTypeConfig;
+import com.yahoo.vespaclient.config.FeederConfig;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * Feed documents from a com.yahoo.container.handler.Request.
+ *
+ * @author Thomas Gundersen
+ * @author steinar
+ */
+public final class VespaFeedHandler extends VespaFeedHandlerBase {
+
+ public static final String JSON_INPUT = "jsonInput";
+
+ @Inject
+ public VespaFeedHandler(FeederConfig feederConfig, LoadTypeConfig loadTypeConfig, Executor executor,
+ Metric metric) throws Exception {
+ super(feederConfig, loadTypeConfig, executor, metric);
+ }
+
+ VespaFeedHandler(FeedContext context, Executor executor) throws Exception {
+ super(context, executor);
+ }
+
+ public static VespaFeedHandler createFromContext(FeedContext context, Executor executor) throws Exception {
+ return new VespaFeedHandler(context, executor);
+ }
+
+ @Override
+ public HttpResponse handle(HttpRequest request) {
+ return handle(request, (RouteMetricSet.ProgressCallback)null);
+ }
+
+ public HttpResponse handle(HttpRequest request, RouteMetricSet.ProgressCallback callback) {
+ if (request.getProperty("status") != null) {
+ return new MetricResponse(context.getMetrics().getMetricSet());
+ }
+
+ boolean asynchronous = request.getBooleanProperty("asynchronous");
+
+ MessagePropertyProcessor.PropertySetter properties = getPropertyProcessor().buildPropertySetter(request);
+
+ String route = properties.getRoute().toString();
+ FeedResponse response = new FeedResponse(new RouteMetricSet(route, callback));
+
+ SingleSender sender = new SingleSender(response, getSharedSender(route), !asynchronous);
+ sender.addMessageProcessor(properties);
+ sender.addMessageProcessor(new DocprocMessageProcessor(getDocprocChain(request), getDocprocServiceRegistry(request)));
+
+ Feeder feeder = createFeeder(sender, request);
+ feeder.setAbortOnDocumentError(properties.getAbortOnDocumentError());
+ feeder.setCreateIfNonExistent(properties.getCreateIfNonExistent());
+ response.setAbortOnFeedError(properties.getAbortOnFeedError());
+
+ List<String> errors = feeder.parse();
+ for (String s : errors) {
+ response.addXMLParseError(s);
+ }
+ if (errors.size() > 0 && feeder instanceof XMLFeeder) {
+ response.addXMLParseError("If you are trying to feed JSON, set the Content-Type header to application/json.");
+ }
+
+ sender.done();
+
+ if (asynchronous) {
+ return response;
+ }
+ long millis = getTimeoutMillis(request);
+ boolean completed = sender.waitForPending(millis);
+ if ( ! completed)
+ response.addError("Timed out after "+millis+" ms waiting for responses");
+ response.done();
+ return response;
+ }
+
+ private Feeder createFeeder(SingleSender sender, HttpRequest request) {
+ String contentType = request.getHeader("Content-Type");
+ if (Boolean.valueOf(request.getProperty(JSON_INPUT)) || (contentType != null && contentType.startsWith("application/json"))) {
+ return new JsonFeeder(getDocumentTypeManager(), sender, getRequestInputStream(request));
+ } else {
+ return new XMLFeeder(getDocumentTypeManager(), sender, getRequestInputStream(request));
+ }
+ }
+
+}