// Path: src/main/java/com/github/mkopylec/errorest/response/Errors.java
// @JacksonXmlRootElement(localName = "body")
// public class Errors {
// 
//     public static final String EMPTY_ERRORS_ID = "N/A";
// 
//     protected final String id;
//     @JacksonXmlProperty(localName = "error")
//     @JacksonXmlElementWrapper(localName = "errors")
//     protected final List<Error> errors;
// 
//     @JsonCreator
//     public Errors(
//             @JsonProperty("id") @JacksonXmlProperty(localName = "id") String id,
//             @JsonProperty("errors") @JacksonXmlProperty(localName = "Jackson bug workaround") List<Error> errors
//     ) {
//         hasText(id, "Empty errors ID");
//         this.id = id;
//         this.errors = errors == null ? new ErrorsLoggingList() : new ErrorsLoggingList(errors);
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public List<Error> getErrors() {
//         return errors;
//     }
// 
//     public boolean hasErrors() {
//         return !errors.isEmpty();
//     }
// 
//     public boolean containsErrorCode(String code) {
//         return errors.stream().anyMatch(error -> error.hasCode(code));
//     }
// 
//     public boolean containsErrorDescriptions() {
//         return errors.stream().anyMatch(Error::hasDescription);
//     }
// 
//     public boolean containsErrorDescription(String description) {
//         return errors.stream().anyMatch(error -> error.hasDescription(description));
//     }
// 
//     @JsonIgnore
//     public boolean isEmpty() {
//         return EMPTY_ERRORS_ID.equals(id) && !hasErrors();
//     }
// 
//     public void formatErrors(ResponseBodyFormat bodyFormat) {
//         errors.forEach(error -> error.format(bodyFormat));
//     }
// 
//     public static Errors emptyErrors() {
//         return new Errors(EMPTY_ERRORS_ID, emptyList());
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null) {
//             return false;
//         }
//         if (obj == this) {
//             return true;
//         }
//         if (obj.getClass() != getClass()) {
//             return false;
//         }
//         Errors rhs = (Errors) obj;
//         return new EqualsBuilder()
//                 .append(this.id, rhs.id)
//                 .append(this.errors, rhs.errors)
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder()
//                 .append(id)
//                 .append(errors)
//                 .toHashCode();
//     }
// }


import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.github.mkopylec.errorest.response.Errors;
import org.slf4j.Logger;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.slf4j.LoggerFactory.getLogger;
import static org.springframework.http.HttpHeaders.ACCEPT;
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
import static org.springframework.http.MediaType.APPLICATION_XML;
import static org.springframework.http.MediaType.APPLICATION_XML_VALUE;
import static org.springframework.http.MediaType.parseMediaType;
import static org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.json;
import static org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.xml;
package com.github.mkopylec.errorest.handling.errordata.security;




public class ErrorsHttpResponseSetter {

    private static final Logger log = getLogger(ErrorsHttpResponseSetter.class);

    protected ObjectMapper jsonMapper = json().build();
    protected XmlMapper xmlMapper = xml().build();

// Path: src/main/java/com/github/mkopylec/errorest/response/Errors.java
// @JacksonXmlRootElement(localName = "body")
// public class Errors {
// 
//     public static final String EMPTY_ERRORS_ID = "N/A";
// 
//     protected final String id;
//     @JacksonXmlProperty(localName = "error")
//     @JacksonXmlElementWrapper(localName = "errors")
//     protected final List<Error> errors;
// 
//     @JsonCreator
//     public Errors(
//             @JsonProperty("id") @JacksonXmlProperty(localName = "id") String id,
//             @JsonProperty("errors") @JacksonXmlProperty(localName = "Jackson bug workaround") List<Error> errors
//     ) {
//         hasText(id, "Empty errors ID");
//         this.id = id;
//         this.errors = errors == null ? new ErrorsLoggingList() : new ErrorsLoggingList(errors);
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public List<Error> getErrors() {
//         return errors;
//     }
// 
//     public boolean hasErrors() {
//         return !errors.isEmpty();
//     }
// 
//     public boolean containsErrorCode(String code) {
//         return errors.stream().anyMatch(error -> error.hasCode(code));
//     }
// 
//     public boolean containsErrorDescriptions() {
//         return errors.stream().anyMatch(Error::hasDescription);
//     }
// 
//     public boolean containsErrorDescription(String description) {
//         return errors.stream().anyMatch(error -> error.hasDescription(description));
//     }
// 
//     @JsonIgnore
//     public boolean isEmpty() {
//         return EMPTY_ERRORS_ID.equals(id) && !hasErrors();
//     }
// 
//     public void formatErrors(ResponseBodyFormat bodyFormat) {
//         errors.forEach(error -> error.format(bodyFormat));
//     }
// 
//     public static Errors emptyErrors() {
//         return new Errors(EMPTY_ERRORS_ID, emptyList());
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null) {
//             return false;
//         }
//         if (obj == this) {
//             return true;
//         }
//         if (obj.getClass() != getClass()) {
//             return false;
//         }
//         Errors rhs = (Errors) obj;
//         return new EqualsBuilder()
//                 .append(this.id, rhs.id)
//                 .append(this.errors, rhs.errors)
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder()
//                 .append(id)
//                 .append(errors)
//                 .toHashCode();
//     }
// }


// Path: src/main/java/com/github/mkopylec/errorest/handling/errordata/security/ErrorsHttpResponseSetter.java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.github.mkopylec.errorest.response.Errors;
import org.slf4j.Logger;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.slf4j.LoggerFactory.getLogger;
import static org.springframework.http.HttpHeaders.ACCEPT;
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
import static org.springframework.http.MediaType.APPLICATION_XML;
import static org.springframework.http.MediaType.APPLICATION_XML_VALUE;
import static org.springframework.http.MediaType.parseMediaType;
import static org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.json;
import static org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.xml;

package com.github.mkopylec.errorest.handling.errordata.security;




public class ErrorsHttpResponseSetter {

    private static final Logger log = getLogger(ErrorsHttpResponseSetter.class);

    protected ObjectMapper jsonMapper = json().build();
    protected XmlMapper xmlMapper = xml().build();

    public void setErrorsResponse(Errors errors, HttpStatus responseHttpStatus, HttpServletRequest request, HttpServletResponse response) throws IOException {