/*
* Copyright 2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.hateoas;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;
/**
* A representation model class to be rendered as specified for the media type {@code application/vnd.error}.
*
* @see https://github.com/blongden/vnd.error
* @author Oliver Gierke
*/
@XmlRootElement(name = "errors")
public class VndErrors implements Iterable<VndErrors.VndError> {
@XmlElement(name = "error")//
private final List<VndError> vndErrors;
/**
* Creates a new {@link VndErrors} instance containing a single {@link VndError} with the given logref, message and
* optional {@link Link}s.
*
* @param logref must not be {@literal null} or empty.
* @param message must not be {@literal null} or empty.
* @param links
*/
public VndErrors(String logref, String message, Link... links) {
this(new VndError(logref, message, links));
}
/**
* Creates a new {@link VndErrors} wrapper for at least one {@link VndError}.
*
* @param errors must not be {@literal null}.
* @param errors
*/
public VndErrors(VndError error, VndError... errors) {
Assert.notNull(error, "Error must not be null");
this.vndErrors = new ArrayList<VndError>(errors.length + 1);
this.vndErrors.add(error);
this.vndErrors.addAll(Arrays.asList(errors));
}
/**
* Creates a new {@link VndErrors} wrapper for the given {@link VndErrors}.
*
* @param errors must not be {@literal null} or empty.
*/
@JsonCreator
public VndErrors(List<VndError> errors) {
Assert.notNull(errors, "Errors must not be null!");
Assert.isTrue(!errors.isEmpty(), "Errors must not be empty!");
this.vndErrors = errors;
}
/**
* Protected default constructor to allow JAXB marshalling.
*/
protected VndErrors() {
this.vndErrors = new ArrayList<VndError>();
}
/**
* Adds an additional {@link VndError} to the wrapper.
*
* @param errors
*/
public VndErrors add(VndError error) {
this.vndErrors.add(error);
return this;
}
/**
* Dummy method to allow {@link JsonValue} to be configured.
*
* @return the vndErrors
*/
@JsonValue
private List<VndError> getErrors() {
return vndErrors;
}
/*
* (non-Javadoc)
* @see java.lang.Iterable#iterator()
*/
@Override
public Iterator<VndErrors.VndError> iterator() {
return this.vndErrors.iterator();
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return String.format("VndErrors[%s]", StringUtils.collectionToCommaDelimitedString(vndErrors));
}
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return vndErrors.hashCode();
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof VndErrors)) {
return false;
}
VndErrors that = (VndErrors) obj;
return this.vndErrors.equals(that.vndErrors);
}
/**
* A single {@link VndError}.
*
* @author Oliver Gierke
*/
@XmlType
public static class VndError extends ResourceSupport {
@XmlAttribute @JsonProperty private final String logref;
@XmlElement @JsonProperty private final String message;
/**
* Creates a new {@link VndError} with the given logref, a message as well as some {@link Link}s.
*
* @param logref must not be {@literal null} or empty.
* @param message must not be {@literal null} or empty.
* @param links
*/
public VndError(String logref, String message, Link... links) {
Assert.hasText(logref, "Logref must not be null or empty!");
Assert.hasText(message, "Message must not be null or empty!");
this.logref = logref;
this.message = message;
this.add(Arrays.asList(links));
}
/**
* Protected default constructor to allow JAXB marshalling.
*/
protected VndError() {
this.logref = null;
this.message = null;
}
/**
* Returns the logref of the error.
*
* @return the logref
*/
public String getLogref() {
return logref;
}
/**
* Returns the message of the error.
*
* @return the message
*/
public String getMessage() {
return message;
}
/*
* (non-Javadoc)
* @see org.springframework.hateoas.ResourceSupport#toString()
*/
@Override
public String toString() {
return String.format("VndError[logref: %s, message: %s, links: [%s]]", logref, message,
StringUtils.collectionToCommaDelimitedString(getLinks()));
}
/*
* (non-Javadoc)
* @see org.springframework.hateoas.ResourceSupport#hashCode()
*/
@Override
public int hashCode() {
int result = 17;
result += 31 * logref.hashCode();
result += 31 * message.hashCode();
return result;
}
/*
* (non-Javadoc)
* @see org.springframework.hateoas.ResourceSupport#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof VndError)) {
return false;
}
VndError that = (VndError) obj;
return this.logref.equals(that.logref) && this.message.equals(that.message);
}
}
}