// Path: src/main/java/com/github/jasminb/jsonapi/exceptions/InvalidJsonApiResourceException.java
// public class InvalidJsonApiResourceException extends RuntimeException {
// 
//     /**
//      * Creates a new InvalidJsonApiResourceException.
//      */
//     public InvalidJsonApiResourceException() {
//         super("Resource must contain at least one of 'data', 'error' or 'meta' nodes.");
//     }
// 
//     /**
//      * Creates a new InvalidJsonApiResourceException.
//      *
//      * @param errorMessage detail message containing spec for resource that was invalid.
//      */
//     public InvalidJsonApiResourceException(String errorMessage) {
//         super(errorMessage);
//     }
// }
// 
// Path: src/main/java/com/github/jasminb/jsonapi/exceptions/ResourceParseException.java
// public class ResourceParseException extends RuntimeException {
// 	private final Errors errors;
// 
// 	public ResourceParseException(Errors errors) {
// 		super(errors.toString());
// 		this.errors = errors;
// 	}
// 
// 	/**
// 	 * Returns Errors or <code>null</code>
// 	 * @return {@link Errors}
// 	 */
// 	public Errors getErrors() {
// 		return errors;
// 	}
// }
// 
// Path: src/main/java/com/github/jasminb/jsonapi/models/errors/Errors.java
// public class Errors {
// 	private List<Error> errors;
// 
// 	public List<Error> getErrors() {
// 		return errors;
// 	}
// 
// 	public void setErrors(List<Error> errors) {
// 		this.errors = errors;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "Errors{" +
// 				"errors=" + (errors != null ? errors : "Undefined") +
// 				'}';
// 	}
// }


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.jasminb.jsonapi.exceptions.InvalidJsonApiResourceException;
import com.github.jasminb.jsonapi.exceptions.ResourceParseException;
import com.github.jasminb.jsonapi.models.errors.Errors;
				hasContainerOrNull(dataNode, JSONAPISpecConstants.LINKS) &&
				hasContainerOrNull(dataNode, JSONAPISpecConstants.RELATIONSHIPS);
	}

	/**
	 * Returns <code>true</code> in case 'DATA' node has array of valid Resource Objects.
	 *
	 * @param dataNode resource object array data node
	 * @return <code>true</code> if node is empty array or contains only valid Resource Objects
	 */
	public static boolean isArrayOfResourceObjects(JsonNode dataNode) {
		if (dataNode != null && dataNode.isArray()) {
			for (JsonNode element : dataNode) {
				if (!isResourceObject(element) && !isResourceIdentifierObject(element)) {
					return false;
				}
			}
			return true;
		}
		return false;
	}

	/**
	 * Returns <code>true</code> in case 'DATA' node has array of valid Resource Identifier Objects.
	 *
	 * @param dataNode resource identifier object array data node
	 * @return <code>true</code> if node is empty array or contains only valid Resource Identifier Objects
	 */
	public static boolean isArrayOfResourceIdentifierObjects(JsonNode dataNode) {
		if (dataNode != null && dataNode.isArray()) {
// Path: src/main/java/com/github/jasminb/jsonapi/exceptions/InvalidJsonApiResourceException.java
// public class InvalidJsonApiResourceException extends RuntimeException {
// 
//     /**
//      * Creates a new InvalidJsonApiResourceException.
//      */
//     public InvalidJsonApiResourceException() {
//         super("Resource must contain at least one of 'data', 'error' or 'meta' nodes.");
//     }
// 
//     /**
//      * Creates a new InvalidJsonApiResourceException.
//      *
//      * @param errorMessage detail message containing spec for resource that was invalid.
//      */
//     public InvalidJsonApiResourceException(String errorMessage) {
//         super(errorMessage);
//     }
// }
// 
// Path: src/main/java/com/github/jasminb/jsonapi/exceptions/ResourceParseException.java
// public class ResourceParseException extends RuntimeException {
// 	private final Errors errors;
// 
// 	public ResourceParseException(Errors errors) {
// 		super(errors.toString());
// 		this.errors = errors;
// 	}
// 
// 	/**
// 	 * Returns Errors or <code>null</code>
// 	 * @return {@link Errors}
// 	 */
// 	public Errors getErrors() {
// 		return errors;
// 	}
// }
// 
// Path: src/main/java/com/github/jasminb/jsonapi/models/errors/Errors.java
// public class Errors {
// 	private List<Error> errors;
// 
// 	public List<Error> getErrors() {
// 		return errors;
// 	}
// 
// 	public void setErrors(List<Error> errors) {
// 		this.errors = errors;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "Errors{" +
// 				"errors=" + (errors != null ? errors : "Undefined") +
// 				'}';
// 	}
// }


// Path: src/main/java/com/github/jasminb/jsonapi/ValidationUtils.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.jasminb.jsonapi.exceptions.InvalidJsonApiResourceException;
import com.github.jasminb.jsonapi.exceptions.ResourceParseException;
import com.github.jasminb.jsonapi.models.errors.Errors;

				hasContainerOrNull(dataNode, JSONAPISpecConstants.LINKS) &&
				hasContainerOrNull(dataNode, JSONAPISpecConstants.RELATIONSHIPS);
	}

	/**
	 * Returns <code>true</code> in case 'DATA' node has array of valid Resource Objects.
	 *
	 * @param dataNode resource object array data node
	 * @return <code>true</code> if node is empty array or contains only valid Resource Objects
	 */
	public static boolean isArrayOfResourceObjects(JsonNode dataNode) {
		if (dataNode != null && dataNode.isArray()) {
			for (JsonNode element : dataNode) {
				if (!isResourceObject(element) && !isResourceIdentifierObject(element)) {
					return false;
				}
			}
			return true;
		}
		return false;
	}

	/**
	 * Returns <code>true</code> in case 'DATA' node has array of valid Resource Identifier Objects.
	 *
	 * @param dataNode resource identifier object array data node
	 * @return <code>true</code> if node is empty array or contains only valid Resource Identifier Objects
	 */
	public static boolean isArrayOfResourceIdentifierObjects(JsonNode dataNode) {
		if (dataNode != null && dataNode.isArray()) {
			for (JsonNode element : dataNode) {