aboutsummaryrefslogtreecommitdiffstats
path: root/documentapi/src/main/java/com/yahoo/documentapi/Response.java
blob: cea9f247ade145ba12d5e3ef559776d90b3279af (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.documentapi;

import com.yahoo.messagebus.Trace;

import java.util.Objects;

import static com.yahoo.documentapi.Response.Outcome.ERROR;
import static com.yahoo.documentapi.Response.Outcome.SUCCESS;

/**
 * <p>An asynchronous response from the document api.
 * Subclasses of this provide additional response information for particular operations.</p>
 *
 * <p>This is a <i>value object</i>.</p>
 *
 * @author bratseth
 */
public class Response {

    private final long requestId;
    private final String textMessage;
    private final Outcome outcome;
    private final Trace trace;

    /** Creates a successful response containing no information */
    public Response(long requestId) {
        this(requestId, null);
    }

    /**
     * Creates a successful response containing a textual message
     *
     * @param textMessage the message to encapsulate in the Response
     */
    public Response(long requestId, String textMessage) {
        this(requestId, textMessage, SUCCESS);
    }

    /**
     * Creates a response containing a textual message
     *
     * @param textMessage the message to encapsulate in the Response
     * @param success     true if the response represents a successful call
     */
    @Deprecated(since = "7") // TODO: Remove on Vespa 8
    public Response(long requestId, String textMessage, boolean success) {
        this(requestId, textMessage, success ? SUCCESS : ERROR);
    }

    /**
     * Creates a response containing a textual message
     *
     * @param textMessage the message to encapsulate in the Response
     * @param outcome     the outcome of the operation
     */
    public Response(long requestId, String textMessage, Outcome outcome) {
        this(requestId, textMessage, outcome, null);
    }

    /**
     * Creates a response containing a textual message
     *
     * @param textMessage the message to encapsulate in the Response
     * @param outcome     the outcome of the operation
     */
    public Response(long requestId, String textMessage, Outcome outcome, Trace trace) {
        this.requestId = requestId;
        this.textMessage = textMessage;
        this.outcome = outcome;
        this.trace = trace;
    }

    /**
     * Returns the text message of this response or null if there is none
     *
     * @return the message, or null
     */
    public String getTextMessage() { return textMessage; }

    /**
     * Returns whether this response encodes a success or a failure
     *
     * @return true if success
     */
    public boolean isSuccess() { return outcome == SUCCESS; }

    /** Returns the outcome of this operation. */
    public Outcome outcome() { return outcome; }

    public long getRequestId() { return requestId; }

    /** Returns the trace of this operation, or null if there is none. */
    public Trace getTrace() { return trace; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if ( ! (o instanceof Response)) return false;
        Response response = (Response) o;
        return requestId == response.requestId &&
               Objects.equals(textMessage, response.textMessage) &&
               outcome == response.outcome;
    }

    @Override
    public int hashCode() {
        return Objects.hash(requestId, textMessage, outcome);
    }

    public String toString() {
        return "Response " + requestId + (textMessage == null ? "" : textMessage) + " " + outcome;
    }


    public enum Outcome {

        /** The operation was a success. */
        SUCCESS,

        /** The operation failed due to an unmet test-and-set condition. */
        CONDITION_FAILED,

        /** The operation failed because its target document was not found. */
        NOT_FOUND,

        /** The operation failed because the cluster had insufficient storage to accept it. */
        INSUFFICIENT_STORAGE,

        /** The operation failed for some unknown reason. */
        ERROR

    }

}