All Downloads are FREE. Search and download functionalities are using the official Maven repository.

graphql.GraphqlErrorBuilder Maven / Gradle / Ivy

There is a newer version: 230521-nf-execution
Show newest version
package graphql;

import graphql.execution.DataFetcherResult;
import graphql.execution.ResultPath;
import graphql.language.SourceLocation;
import graphql.schema.DataFetchingEnvironment;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import static graphql.Assert.assertNotNull;

/**
 * This helps you build {@link graphql.GraphQLError}s and also has a quick way to make a  {@link graphql.execution.DataFetcherResult}s
 * from that error.
 *
 * @param  this base class allows you to derive new classes from this base error builder
 */
@SuppressWarnings("unchecked")
@PublicApi
public class GraphqlErrorBuilder> implements GraphQLError.Builder {

    private String message;
    private List path;
    private List locations = new ArrayList<>();
    private ErrorClassification errorType = ErrorType.DataFetchingException;
    private Map extensions = null;

    public String getMessage() {
        return message;
    }

    @Nullable
    public List getPath() {
        return path;
    }

    @Nullable
    public List getLocations() {
        return locations;
    }

    public ErrorClassification getErrorType() {
        return errorType;
    }

    @Nullable
    public Map getExtensions() {
        return extensions;
    }

    /**
     * @return a builder of {@link graphql.GraphQLError}s
     */
    public static GraphqlErrorBuilder newError() {
        return new GraphqlErrorBuilder<>();
    }

    /**
     * This will set up the {@link GraphQLError#getLocations()} and {@link graphql.GraphQLError#getPath()} for you from the
     * fetching environment.
     *
     * @param dataFetchingEnvironment the data fetching environment
     *
     * @return a builder of {@link graphql.GraphQLError}s
     */
    public static GraphqlErrorBuilder newError(DataFetchingEnvironment dataFetchingEnvironment) {
        return new GraphqlErrorBuilder<>()
                .location(dataFetchingEnvironment.getField().getSourceLocation())
                .path(dataFetchingEnvironment.getExecutionStepInfo().getPath());
    }

    protected GraphqlErrorBuilder() {
    }

    public B message(String message, Object... formatArgs) {
        if (formatArgs == null || formatArgs.length == 0) {
            this.message = assertNotNull(message);
        } else {
            this.message = String.format(assertNotNull(message), formatArgs);
        }
        return (B) this;
    }

    public B locations(@Nullable List locations) {
        if (locations != null) {
            this.locations.addAll(locations);
        } else {
            this.locations = null;
        }
        return (B) this;
    }

    public B location(@Nullable SourceLocation location) {
        if (locations != null) {
            this.locations.add(location);
        }
        return (B) this;
    }

    public B path(@Nullable ResultPath path) {
        if (path != null) {
            this.path = path.toList();
        } else {
            this.path = null;
        }
        return (B) this;
    }

    public B path(@Nullable List path) {
        this.path = path;
        return (B) this;
    }

    public B errorType(ErrorClassification errorType) {
        this.errorType = assertNotNull(errorType);
        return (B) this;
    }

    public B extensions(@Nullable Map extensions) {
        this.extensions = extensions;
        return (B) this;
    }

    /**
     * @return a newly built GraphqlError
     */
    public GraphQLError build() {
        assertNotNull(message, () -> "You must provide error message");
        return new GraphqlErrorImpl(message, locations, errorType, path, extensions);
    }

    /**
     * A simple implementation of a {@link GraphQLError}.
     * 

* This provides {@link #hashCode()} and {@link #equals(Object)} methods that afford comparison with other * {@link GraphQLError} implementations. However, the values provided in the following fields must * in turn implement {@link #hashCode()} and {@link #equals(Object)} for this to function correctly: *

    *
  • the values in the {@link #getPath()} {@link List}. *
  • the {@link #getErrorType()} {@link ErrorClassification}. *
  • the values in the {@link #getExtensions()} {@link Map}. *
*/ private static class GraphqlErrorImpl implements GraphQLError { private final String message; private final List locations; private final ErrorClassification errorType; private final List path; private final Map extensions; public GraphqlErrorImpl(String message, List locations, ErrorClassification errorType, List path, Map extensions) { this.message = message; this.locations = locations; this.errorType = errorType; this.path = path; this.extensions = extensions; } @Override public String getMessage() { return message; } @Override public List getLocations() { return locations; } @Override public ErrorClassification getErrorType() { return errorType; } @Override public List getPath() { return path; } @Override public Map getExtensions() { return extensions; } @Override public String toString() { return message; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof GraphQLError)) return false; GraphQLError that = (GraphQLError) o; return Objects.equals(getMessage(), that.getMessage()) && Objects.equals(getLocations(), that.getLocations()) && Objects.equals(getErrorType(), that.getErrorType()) && Objects.equals(getPath(), that.getPath()) && Objects.equals(getExtensions(), that.getExtensions()); } @Override public int hashCode() { return Objects.hash( getMessage(), getLocations(), getErrorType(), getPath(), getExtensions()); } } /** * A helper method that allows you to return this error as a {@link graphql.execution.DataFetcherResult} * * @return a new data fetcher result that contains the built error */ public DataFetcherResult toResult() { return DataFetcherResult.newResult() .error(build()) .build(); } }