// Path: src/main/java/de/fesere/hypermedia/cj/model/Collection.java
// @JsonTypeName("collection")
// @JsonIgnoreProperties(ignoreUnknown = true)
// @JsonInclude(JsonInclude.Include.NON_EMPTY)
// @JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
// @JsonPropertyOrder({"version", "href", "links", "error", "items", "queries", "template"})
// public class Collection implements Wrapped{
// 
//     private static final String VERSION = "1.0";
// 
//     @JsonProperty("href")
//     private final URI href;
// 
//     @JsonProperty("items")
//     private final List<Item>  items   = new ArrayList<>();
// 
//     @JsonProperty("links")
//     private final List<Link>  links   = new ArrayList<>();
// 
//     @JsonProperty("queries")
//     private final  List<Query> queries = new ArrayList<>();
// 
//     @JsonProperty("template")
//     private Template template;
// 
//     @JsonProperty("error")
//     private Error error;
// 
// 
// 
//     @JsonCreator()
//     public Collection(@JsonProperty("href") URI href) {
//         this.href = href;
//     }
// 
//     public Collection(URI uri, Error error) {
//         this(uri);
//         this.error = error;
//     }
// 
//     public Collection(URI href, List<Item> items, List<Query> queries, List<Link>links, Template template) {
//         this(href);
//         if(items != null) {
//             this.items.addAll(items);
//         }
//         if(queries != null) {
//             this.queries.addAll(queries);
//         }
//         if(links != null) {
//             this.links.addAll(links);
//         }
//         this.template = template;
//     }
// 
//     public URI getHref() {
//         return this.href;
//     }
// 
//     public List<Item> getItems() {
//         throwExceptionOnError();
// 
//         return new ArrayList<>(items);
//     }
// 
//     public List<Link> getLinks() {
//         throwExceptionOnError();
// 
//         return new ArrayList<>(links);
//     }
// 
//     private void throwExceptionOnError() {
//         if(hasError()) {
//             throw new CollectionHasErrorsException(getError());
//         }
//     }
// 
//     public List<Query> getQueries() {
//         throwExceptionOnError();
// 
//         return new ArrayList<>(queries);
//     }
// 
// 
//     public <T> List<T> transform(ReadTransformation<T> transformer) {
//         throwExceptionOnError();
// 
//         List<T> result = new ArrayList<>(items.size());
// 
//         for(Item item : items) {
//             T convertedItem = transformer.transform(item);
//             if(convertedItem != null) {
//                 result.add(convertedItem);
//             }
//         }
// 
//         return result;
//     }
// 
//     public boolean hasError() {
//         return error != null;
//     }
// 
//     public Error getError() {
//         return error;
//     }
// 
//     public Link getLink(String rel) {
//         throwExceptionOnError();
// 
//         return findByRel(links,rel);
// 
// 
//     }
// 
//     private <T extends Link> T findByRel(List<T> elements, String rel) {
//         for(T linkable : elements ) {
//             if(linkable.getRel().equalsIgnoreCase(rel)) {
//                 return linkable;
//             }
//         }
// 
//         throw new ElementNotFoundException("Did not find element '"+rel+"' in collection " + href );
//     }
// 
//     public Query getQuery(String rel) {
//         throwExceptionOnError();
// 
//         return findByRel(queries, rel);
//     }
// 
//     public Template getTemplate() {
//         throwExceptionOnError();
//         return template;
//     }
// 
//     @JsonProperty("version")
//     public String getVersion() {
//         return VERSION;
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/model/Error.java
// @JsonSerialize
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class Error {
// 
//     private final String title;
//     private final String code;
//     private final String message;
// 
//     @JsonCreator
//     public Error(@JsonProperty("title") String title, @JsonProperty("code") String code, @JsonProperty("message") String message) {
// 
//         this.title = title;
//         this.code = code;
//         this.message = message;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public String getCode() {
//         return code;
//     }
// }


import de.fesere.hypermedia.cj.model.Collection;
import de.fesere.hypermedia.cj.model.Error;
import java.net.URI;
package de.fesere.hypermedia.cj.model.builder;



public class ErrorBuilder {

    private String title = "An error occured";
    private String status = "500";
    private String message = "There was an error processing the message";
    private URI base;

    public ErrorBuilder(URI base) {
        this.base = base;
    }

    public ErrorBuilder withTitle(String title) {
        this.title = title;
        return this;
    }

    public ErrorBuilder withStatus(String status) {
        this.status = status;
        return this;
    }

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

    public Collection build() {
// Path: src/main/java/de/fesere/hypermedia/cj/model/Collection.java
// @JsonTypeName("collection")
// @JsonIgnoreProperties(ignoreUnknown = true)
// @JsonInclude(JsonInclude.Include.NON_EMPTY)
// @JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
// @JsonPropertyOrder({"version", "href", "links", "error", "items", "queries", "template"})
// public class Collection implements Wrapped{
// 
//     private static final String VERSION = "1.0";
// 
//     @JsonProperty("href")
//     private final URI href;
// 
//     @JsonProperty("items")
//     private final List<Item>  items   = new ArrayList<>();
// 
//     @JsonProperty("links")
//     private final List<Link>  links   = new ArrayList<>();
// 
//     @JsonProperty("queries")
//     private final  List<Query> queries = new ArrayList<>();
// 
//     @JsonProperty("template")
//     private Template template;
// 
//     @JsonProperty("error")
//     private Error error;
// 
// 
// 
//     @JsonCreator()
//     public Collection(@JsonProperty("href") URI href) {
//         this.href = href;
//     }
// 
//     public Collection(URI uri, Error error) {
//         this(uri);
//         this.error = error;
//     }
// 
//     public Collection(URI href, List<Item> items, List<Query> queries, List<Link>links, Template template) {
//         this(href);
//         if(items != null) {
//             this.items.addAll(items);
//         }
//         if(queries != null) {
//             this.queries.addAll(queries);
//         }
//         if(links != null) {
//             this.links.addAll(links);
//         }
//         this.template = template;
//     }
// 
//     public URI getHref() {
//         return this.href;
//     }
// 
//     public List<Item> getItems() {
//         throwExceptionOnError();
// 
//         return new ArrayList<>(items);
//     }
// 
//     public List<Link> getLinks() {
//         throwExceptionOnError();
// 
//         return new ArrayList<>(links);
//     }
// 
//     private void throwExceptionOnError() {
//         if(hasError()) {
//             throw new CollectionHasErrorsException(getError());
//         }
//     }
// 
//     public List<Query> getQueries() {
//         throwExceptionOnError();
// 
//         return new ArrayList<>(queries);
//     }
// 
// 
//     public <T> List<T> transform(ReadTransformation<T> transformer) {
//         throwExceptionOnError();
// 
//         List<T> result = new ArrayList<>(items.size());
// 
//         for(Item item : items) {
//             T convertedItem = transformer.transform(item);
//             if(convertedItem != null) {
//                 result.add(convertedItem);
//             }
//         }
// 
//         return result;
//     }
// 
//     public boolean hasError() {
//         return error != null;
//     }
// 
//     public Error getError() {
//         return error;
//     }
// 
//     public Link getLink(String rel) {
//         throwExceptionOnError();
// 
//         return findByRel(links,rel);
// 
// 
//     }
// 
//     private <T extends Link> T findByRel(List<T> elements, String rel) {
//         for(T linkable : elements ) {
//             if(linkable.getRel().equalsIgnoreCase(rel)) {
//                 return linkable;
//             }
//         }
// 
//         throw new ElementNotFoundException("Did not find element '"+rel+"' in collection " + href );
//     }
// 
//     public Query getQuery(String rel) {
//         throwExceptionOnError();
// 
//         return findByRel(queries, rel);
//     }
// 
//     public Template getTemplate() {
//         throwExceptionOnError();
//         return template;
//     }
// 
//     @JsonProperty("version")
//     public String getVersion() {
//         return VERSION;
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/model/Error.java
// @JsonSerialize
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class Error {
// 
//     private final String title;
//     private final String code;
//     private final String message;
// 
//     @JsonCreator
//     public Error(@JsonProperty("title") String title, @JsonProperty("code") String code, @JsonProperty("message") String message) {
// 
//         this.title = title;
//         this.code = code;
//         this.message = message;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public String getCode() {
//         return code;
//     }
// }


// Path: src/main/java/de/fesere/hypermedia/cj/model/builder/ErrorBuilder.java
import de.fesere.hypermedia.cj.model.Collection;
import de.fesere.hypermedia.cj.model.Error;
import java.net.URI;

package de.fesere.hypermedia.cj.model.builder;



public class ErrorBuilder {

    private String title = "An error occured";
    private String status = "500";
    private String message = "There was an error processing the message";
    private URI base;

    public ErrorBuilder(URI base) {
        this.base = base;
    }

    public ErrorBuilder withTitle(String title) {
        this.title = title;
        return this;
    }

    public ErrorBuilder withStatus(String status) {
        this.status = status;
        return this;
    }

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

    public Collection build() {
        Error error = new Error(title, "" + status, message);