// Path: src/main/java/de/fesere/hypermedia/cj/model/builder/CollectionBuilder.java
// public class CollectionBuilder<T> {
// 
//     private final WriteTransformer<T> transformer;
//     private UriConstructor uriConstructor;
//     private LinkBuilder linkBuilder;
//     private Template temaplate;
//     private List<Query> queries = new LinkedList<>();
//     private List<Item> items = new LinkedList<>();
// 
//     public CollectionBuilder(URI href, WriteTransformer<T> transformer) {
//         this.transformer = transformer;
//         if (href == null) {
//             throw new IllegalArgumentException("URI must not be null!");
//         }
//         uriConstructor = new UriConstructor(href);
//         linkBuilder = new LinkBuilder(href);
//     }
// 
//     public CollectionBuilder(URI href) {
//         this(href, null);
//     }
// 
//     public CollectionBuilder addTemplate(Template temaplte) {
//         this.temaplate = temaplte;
//         return this;
//     }
// 
//     public CollectionBuilder addQuery(Query query) {
//         queries.add(query);
//         return this;
//     }
// 
//     public CollectionBuilder addQuery(Query query, String relativURL) {
//         URI absoluteURL = uriConstructor.buildAbsoluteHrefFromRelative(relativURL);
// 
//         Query temp = new Query(absoluteURL, query.getRel(), query.getPrompt(), query.getData());
// 
//         return addQuery(temp);
//     }
// 
//     public LinkBuilder getLinkBuilder() {
//         return linkBuilder;
//     }
// 
//     public CollectionBuilder addObject(T object) {
//         Item item = transformer.transform(object);
//         if (item != null) {
//             addItem(item);
//         }
// 
//         return this;
//     }
// 
//     public CollectionBuilder addItem(Item item) {
//         items.add(item);
//         return this;
//     }
// 
//     public Collection build() {
//         return new Collection(uriConstructor.getBase(), items, queries, linkBuilder.build(), temaplate);
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/model/builder/ItemBuilder.java
// public class ItemBuilder {
// 
//     private List<DataEntry> dataEntries = new LinkedList<>();
//     private UriConstructor constructor;
//     private LinkBuilder linkBuilder;
// 
//     public ItemBuilder(URI href) {
//         constructor = new UriConstructor(href);
//         linkBuilder = new LinkBuilder(href);
//     }
// 
//     public ItemBuilder addData(DataEntry entry) {
//         dataEntries.add(entry);
//         return this;
//     }
// 
//     public LinkBuilder getLinkBuilder() {
//         return linkBuilder;
//     }
// 
//     public Item build() {
//         return new Item(constructor.getBase(), dataEntries, linkBuilder.build());
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/model/builder/DataEntryFactory.java
// public final class DataEntryFactory {
// 
//     public static DataEntry create(String name, Object value, String prompt) {
// 
//         if(StringUtils.isBlank(name)){
//             return createNone();
//         }
// 
//         if(value == null) {
//            throw new MalformedDataValueException("value of '"+name+"' can not be null");
//         }
// 
//         Class type = value.getClass();
// 
//         if (TypeUtils.isString(type)) {
//             return new StringDataEntry(name, (String) value, prompt);
//         } else if (TypeUtils.isNumber(type)) {
//             return new NumberDataEntry(name, (Number) value, prompt);
//         } else if (TypeUtils.isBoolean(type)) {
//             return new BooleanDataEntry(name, (Boolean) value, prompt);
//         } else {
//            throw new SerializationException("'"+name+"' of type " + type + " can not be converted to DataEntry");
//         }
//     }
// 
//     public static DataEntry create(String name, Object value) {
//         return create(name, value, null);
//     }
// 
//     private static DataEntry createNone() {
//         return new NoneDataEntry("none");
//     }
// 
//     public static DataEntry createNull(String name, String prompt) {
//         return new NullDataEntry(name,prompt);
//     }
// 
//     public static DataEntry createNull(String name) {
//         return createNull(name, null);
//     }
// 
//     public static DataEntry createEmpty(String name, String prompt) {
//         return new StringDataEntry(name, "", prompt);
//     }
// 
//     public static DataEntry createEmpty(String name) {
//         return new StringDataEntry(name);
//     }
// }


import de.fesere.hypermedia.cj.model.builder.CollectionBuilder;
import de.fesere.hypermedia.cj.model.builder.ItemBuilder;
import org.junit.Test;
import java.net.URI;
import static de.fesere.hypermedia.cj.model.builder.DataEntryFactory.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.closeTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.core.Is.is;
package de.fesere.hypermedia.cj.model;




public class CollectionWithTypedItemsTest extends SerializationTestBase {

    @Test
    public void testWriteJsonWithMultipleTypes() {
        String json = readFile("/examples/read-collection-with-typed-data.json");
        CollectionBuilder builder = new CollectionBuilder(URI.create("http://example.org/friends/"));

// Path: src/main/java/de/fesere/hypermedia/cj/model/builder/CollectionBuilder.java
// public class CollectionBuilder<T> {
// 
//     private final WriteTransformer<T> transformer;
//     private UriConstructor uriConstructor;
//     private LinkBuilder linkBuilder;
//     private Template temaplate;
//     private List<Query> queries = new LinkedList<>();
//     private List<Item> items = new LinkedList<>();
// 
//     public CollectionBuilder(URI href, WriteTransformer<T> transformer) {
//         this.transformer = transformer;
//         if (href == null) {
//             throw new IllegalArgumentException("URI must not be null!");
//         }
//         uriConstructor = new UriConstructor(href);
//         linkBuilder = new LinkBuilder(href);
//     }
// 
//     public CollectionBuilder(URI href) {
//         this(href, null);
//     }
// 
//     public CollectionBuilder addTemplate(Template temaplte) {
//         this.temaplate = temaplte;
//         return this;
//     }
// 
//     public CollectionBuilder addQuery(Query query) {
//         queries.add(query);
//         return this;
//     }
// 
//     public CollectionBuilder addQuery(Query query, String relativURL) {
//         URI absoluteURL = uriConstructor.buildAbsoluteHrefFromRelative(relativURL);
// 
//         Query temp = new Query(absoluteURL, query.getRel(), query.getPrompt(), query.getData());
// 
//         return addQuery(temp);
//     }
// 
//     public LinkBuilder getLinkBuilder() {
//         return linkBuilder;
//     }
// 
//     public CollectionBuilder addObject(T object) {
//         Item item = transformer.transform(object);
//         if (item != null) {
//             addItem(item);
//         }
// 
//         return this;
//     }
// 
//     public CollectionBuilder addItem(Item item) {
//         items.add(item);
//         return this;
//     }
// 
//     public Collection build() {
//         return new Collection(uriConstructor.getBase(), items, queries, linkBuilder.build(), temaplate);
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/model/builder/ItemBuilder.java
// public class ItemBuilder {
// 
//     private List<DataEntry> dataEntries = new LinkedList<>();
//     private UriConstructor constructor;
//     private LinkBuilder linkBuilder;
// 
//     public ItemBuilder(URI href) {
//         constructor = new UriConstructor(href);
//         linkBuilder = new LinkBuilder(href);
//     }
// 
//     public ItemBuilder addData(DataEntry entry) {
//         dataEntries.add(entry);
//         return this;
//     }
// 
//     public LinkBuilder getLinkBuilder() {
//         return linkBuilder;
//     }
// 
//     public Item build() {
//         return new Item(constructor.getBase(), dataEntries, linkBuilder.build());
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/model/builder/DataEntryFactory.java
// public final class DataEntryFactory {
// 
//     public static DataEntry create(String name, Object value, String prompt) {
// 
//         if(StringUtils.isBlank(name)){
//             return createNone();
//         }
// 
//         if(value == null) {
//            throw new MalformedDataValueException("value of '"+name+"' can not be null");
//         }
// 
//         Class type = value.getClass();
// 
//         if (TypeUtils.isString(type)) {
//             return new StringDataEntry(name, (String) value, prompt);
//         } else if (TypeUtils.isNumber(type)) {
//             return new NumberDataEntry(name, (Number) value, prompt);
//         } else if (TypeUtils.isBoolean(type)) {
//             return new BooleanDataEntry(name, (Boolean) value, prompt);
//         } else {
//            throw new SerializationException("'"+name+"' of type " + type + " can not be converted to DataEntry");
//         }
//     }
// 
//     public static DataEntry create(String name, Object value) {
//         return create(name, value, null);
//     }
// 
//     private static DataEntry createNone() {
//         return new NoneDataEntry("none");
//     }
// 
//     public static DataEntry createNull(String name, String prompt) {
//         return new NullDataEntry(name,prompt);
//     }
// 
//     public static DataEntry createNull(String name) {
//         return createNull(name, null);
//     }
// 
//     public static DataEntry createEmpty(String name, String prompt) {
//         return new StringDataEntry(name, "", prompt);
//     }
// 
//     public static DataEntry createEmpty(String name) {
//         return new StringDataEntry(name);
//     }
// }


// Path: src/test/java/de/fesere/hypermedia/cj/model/CollectionWithTypedItemsTest.java
import de.fesere.hypermedia.cj.model.builder.CollectionBuilder;
import de.fesere.hypermedia.cj.model.builder.ItemBuilder;
import org.junit.Test;
import java.net.URI;
import static de.fesere.hypermedia.cj.model.builder.DataEntryFactory.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.closeTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.core.Is.is;

package de.fesere.hypermedia.cj.model;




public class CollectionWithTypedItemsTest extends SerializationTestBase {

    @Test
    public void testWriteJsonWithMultipleTypes() {
        String json = readFile("/examples/read-collection-with-typed-data.json");
        CollectionBuilder builder = new CollectionBuilder(URI.create("http://example.org/friends/"));

        ItemBuilder itemBuilder = new ItemBuilder(URI.create("http://example.org/friends/jdoe"));