Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Introduce a GraphqlErrorException for Kotlin users and generally. (#1743
)

* Introduce a GraphqlErrorException for Kotlin users and a as a general purpose exception that can be an error

* PR feedback and now more generic
  • Loading branch information
bbakerman committed Jan 17, 2020
1 parent 21cdd1d commit 578985f
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 150 deletions.
118 changes: 118 additions & 0 deletions src/main/java/graphql/GraphqlErrorException.java
@@ -0,0 +1,118 @@
package graphql;

import graphql.language.SourceLocation;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
* A base class for graphql runtime exceptions that also implement {@link graphql.GraphQLError} and can be used
* in a general sense direct or have specialisations made of it.
* <p>
* This is aimed amongst other reasons at Kotlin consumers due to https://github.com/graphql-java/graphql-java/issues/1690
* as well as being a way to share common code.
*/
@PublicApi
public class GraphqlErrorException extends GraphQLException implements GraphQLError {

private final List<SourceLocation> locations;
private final Map<String, Object> extensions;
private final List<Object> path;
private final ErrorClassification errorClassification;

protected GraphqlErrorException(BuilderBase<?, ?> builder) {
super(builder.message, builder.cause);
this.locations = builder.sourceLocations;
this.extensions = builder.extensions;
this.path = builder.path;
this.errorClassification = builder.errorClassification;
}

@Override
public List<SourceLocation> getLocations() {
return locations;
}

@Override
public ErrorClassification getErrorType() {
return errorClassification;
}

@Override
public List<Object> getPath() {
return path;
}

@Override
public Map<String, Object> getExtensions() {
return extensions;
}

public static Builder newErrorException() {
return new Builder();
}

public static class Builder extends BuilderBase<Builder, GraphqlErrorException> {
public GraphqlErrorException build() {
return new GraphqlErrorException(this);
}
}

/**
* A trait like base class that contains the properties that GraphqlErrorException handles and can
* be used by other classes to derive their own builders.
*
* @param <T> the derived class
* @param <B> the class to be built
*/
protected abstract static class BuilderBase<T extends BuilderBase<T, B>, B extends GraphqlErrorException> {
protected String message;
protected Throwable cause;
protected ErrorClassification errorClassification = ErrorType.DataFetchingException;
protected List<SourceLocation> sourceLocations;
protected Map<String, Object> extensions;
protected List<Object> path;

private T asDerivedType() {
//noinspection unchecked
return (T) this;
}

public T message(String message) {
this.message = message;
return asDerivedType();
}

public T cause(Throwable cause) {
this.cause = cause;
return asDerivedType();
}

public T sourceLocation(SourceLocation sourceLocation) {
return sourceLocations(sourceLocation == null ? null : Collections.singletonList(sourceLocation));
}

public T sourceLocations(List<SourceLocation> sourceLocations) {
this.sourceLocations = sourceLocations;
return asDerivedType();
}

public T errorClassification(ErrorClassification errorClassification) {
this.errorClassification = errorClassification;
return asDerivedType();
}

public T path(List<Object> path) {
this.path = path;
return asDerivedType();
}

public T extensions(Map<String, Object> extensions) {
this.extensions = extensions;
return asDerivedType();
}

public abstract B build();
}
}
52 changes: 4 additions & 48 deletions src/main/java/graphql/schema/CoercingParseLiteralException.java
@@ -1,19 +1,12 @@
package graphql.schema;

import graphql.ErrorType;
import graphql.GraphQLError;
import graphql.GraphQLException;
import graphql.GraphqlErrorException;
import graphql.PublicApi;
import graphql.language.SourceLocation;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@PublicApi
public class CoercingParseLiteralException extends GraphQLException implements GraphQLError {
private final List<SourceLocation> sourceLocations;
private final Map<String, Object> extensions;
public class CoercingParseLiteralException extends GraphqlErrorException {

public CoercingParseLiteralException() {
this(newCoercingParseLiteralException());
Expand All @@ -36,56 +29,19 @@ public CoercingParseLiteralException(Throwable cause) {
}

private CoercingParseLiteralException(Builder builder) {
super(builder.message, builder.cause);
this.sourceLocations = builder.sourceLocations;
this.extensions = builder.extensions;
}

@Override
public List<SourceLocation> getLocations() {
return sourceLocations;
super(builder);
}

@Override
public ErrorType getErrorType() {
return ErrorType.ValidationError;
}

@Override
public Map<String, Object> getExtensions() {
return extensions;
}

public static Builder newCoercingParseLiteralException() {
return new Builder();
}

public static class Builder {
private String message;
private Throwable cause;
private List<SourceLocation> sourceLocations;
private Map<String, Object> extensions;

public Builder message(String message) {
this.message = message;
return this;
}

public Builder cause(Throwable cause) {
this.cause = cause;
return this;
}

public Builder sourceLocation(SourceLocation sourceLocation) {
this.sourceLocations = sourceLocation == null ? null : Collections.singletonList(sourceLocation);
return this;
}

public Builder extensions(Map<String, Object> extensions) {
this.extensions = extensions;
return this;
}

public static class Builder extends BuilderBase<Builder, CoercingParseLiteralException> {
public CoercingParseLiteralException build() {
return new CoercingParseLiteralException(this);
}
Expand Down
57 changes: 4 additions & 53 deletions src/main/java/graphql/schema/CoercingParseValueException.java
@@ -1,19 +1,12 @@
package graphql.schema;

import graphql.ErrorType;
import graphql.GraphQLError;
import graphql.GraphQLException;
import graphql.GraphqlErrorException;
import graphql.PublicApi;
import graphql.language.SourceLocation;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@PublicApi
public class CoercingParseValueException extends GraphQLException implements GraphQLError {
private final List<SourceLocation> sourceLocations;
private final Map<String, Object> extensions;
public class CoercingParseValueException extends GraphqlErrorException {

public CoercingParseValueException() {
this(newCoercingParseValueException());
Expand All @@ -36,61 +29,19 @@ public CoercingParseValueException(String message, Throwable cause, SourceLocati
}

private CoercingParseValueException(Builder builder) {
super(builder.message, builder.cause);
this.sourceLocations = builder.sourceLocations;
this.extensions = builder.extensions;
}

@Override
public List<SourceLocation> getLocations() {
return sourceLocations;
super(builder);
}

@Override
public ErrorType getErrorType() {
return ErrorType.ValidationError;
}

@Override
public Map<String, Object> getExtensions() {
return extensions;
}

public static Builder newCoercingParseValueException() {
return new Builder();
}

public static class Builder {
private String message;
private Throwable cause;
private List<SourceLocation> sourceLocations;
private Map<String, Object> extensions;

public Builder message(String message) {
this.message = message;
return this;
}

public Builder cause(Throwable cause) {
this.cause = cause;
return this;
}

public Builder sourceLocation(SourceLocation sourceLocation) {
this.sourceLocations = sourceLocation == null ? null : Collections.singletonList(sourceLocation);
return this;
}

public Builder sourceLocations(List<SourceLocation> sourceLocations) {
this.sourceLocations = sourceLocations;
return this;
}

public Builder extensions(Map<String, Object> extensions) {
this.extensions = extensions;
return this;
}

public static class Builder extends BuilderBase<Builder,CoercingParseValueException> {
public CoercingParseValueException build() {
return new CoercingParseValueException(this);
}
Expand Down
53 changes: 4 additions & 49 deletions src/main/java/graphql/schema/CoercingSerializeException.java
Expand Up @@ -2,19 +2,11 @@

import graphql.ErrorClassification;
import graphql.ErrorType;
import graphql.GraphQLError;
import graphql.GraphQLException;
import graphql.GraphqlErrorException;
import graphql.PublicApi;
import graphql.language.SourceLocation;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@PublicApi
public class CoercingSerializeException extends GraphQLException implements GraphQLError {
private final List<SourceLocation> sourceLocations;
private final Map<String, Object> extensions;
public class CoercingSerializeException extends GraphqlErrorException {

public CoercingSerializeException() {
this(newCoercingSerializeException());
Expand All @@ -33,56 +25,19 @@ public CoercingSerializeException(Throwable cause) {
}

private CoercingSerializeException(Builder builder) {
super(builder.message, builder.cause);
this.sourceLocations = builder.sourceLocations;
this.extensions = builder.extensions;
}

@Override
public List<SourceLocation> getLocations() {
return sourceLocations;
super(builder);
}

@Override
public ErrorClassification getErrorType() {
return ErrorType.DataFetchingException;
}

@Override
public Map<String, Object> getExtensions() {
return extensions;
}

public static Builder newCoercingSerializeException() {
return new Builder();
}

public static class Builder {
private String message;
private Throwable cause;
private Map<String, Object> extensions;
private List<SourceLocation> sourceLocations;

public Builder message(String message) {
this.message = message;
return this;
}

public Builder cause(Throwable cause) {
this.cause = cause;
return this;
}

public Builder sourceLocation(SourceLocation sourceLocation) {
this.sourceLocations = sourceLocation == null ? null : Collections.singletonList(sourceLocation);
return this;
}

public Builder extensions(Map<String, Object> extensions) {
this.extensions = extensions;
return this;
}

public static class Builder extends BuilderBase<Builder, CoercingSerializeException> {
public CoercingSerializeException build() {
return new CoercingSerializeException(this);
}
Expand Down

0 comments on commit 578985f

Please sign in to comment.