// Path: src/main/java/de/fesere/hypermedia/cj/http/HTTPClient.java
// public interface HTTPClient {
// 
//     String getLink(URI uri);
// 
//     URI post(URI href, String body, Map<String, String> header);
// 
//     String put(URI href, String body, Map<String, String> headder);
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/serialization/Serializer.java
// public class Serializer {
// 
//     private final ObjectMapper mapper;
// 
//     public Serializer() {
//         this(new ObjectMapperConfig().getConfiguredObjectMapper());
//     }
// 
//     protected Serializer(ObjectMapper mapper) {
//         this.mapper = mapper;
//     }
// 
//     public <T> T deserialize(String input, Class<T> responseClass) {
//         if(Wrapped.class.isAssignableFrom(responseClass)) {
//             Object deserializedObject = deserializeWrapped(input);
// 
//             if(deserializedObject.getClass().isAssignableFrom(responseClass)) {
//                 return responseClass.cast(deserializedObject);
//             }
//             else {
//                 throw new SerializationException("input could not be serialized to " + responseClass.getCanonicalName());
//             }
//         }
// 
//         return defaultDeserialisation(input, responseClass);
//     }
// 
//     private Object deserializeWrapped(String input) {
//         return defaultDeserialisation(input, Wrapper.class).getElement();
//     }
// 
// 
//     public String serialize(Object obj) {
//         if(obj instanceof Wrapped) {
//            return serialize((Wrapped) obj);
//         }
// 
//         return defaultSerialization(obj);
//     }
// 
//     private String defaultSerialization(Object obj) {
//         try {
//             return mapper.writeValueAsString(obj);
//         } catch (JsonProcessingException e) {
//             throw new SerializationException("Could not serilize " + obj.getClass().getName() + " to string", e);
//         }
//     }
// 
//     private String serialize(Wrapped wrapped) {
//         return defaultSerialization(new Wrapper<>(wrapped));
//     }
// 
//     private <T> T defaultDeserialisation(String input, Class<T> responseClass) {
//         try {
//             return mapper.readValue(input, responseClass);
//         } catch (IOException e) {
//             throw new SerializationException("Could not deseriliaze input to " + responseClass.getName(), e);
//         }
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/serialization/Wrapper.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// @JsonSerialize(using = WrapperSerializer.class)
// @JsonDeserialize(using = WrapperDeserializer.class)
// public class Wrapper<T> {
// 
//     private  T element;
// 
// 
//     public Wrapper(T element) {
//         this.element = element;
//     }
// 
//     public T getElement() {
//         return element;
//     }
// }


import de.fesere.hypermedia.cj.http.HTTPClient;
import de.fesere.hypermedia.cj.serialization.Serializer;
import de.fesere.hypermedia.cj.serialization.Wrapper;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
package de.fesere.hypermedia.cj.model;



public class CjClient {

    private final HTTPClient httpClient;
// Path: src/main/java/de/fesere/hypermedia/cj/http/HTTPClient.java
// public interface HTTPClient {
// 
//     String getLink(URI uri);
// 
//     URI post(URI href, String body, Map<String, String> header);
// 
//     String put(URI href, String body, Map<String, String> headder);
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/serialization/Serializer.java
// public class Serializer {
// 
//     private final ObjectMapper mapper;
// 
//     public Serializer() {
//         this(new ObjectMapperConfig().getConfiguredObjectMapper());
//     }
// 
//     protected Serializer(ObjectMapper mapper) {
//         this.mapper = mapper;
//     }
// 
//     public <T> T deserialize(String input, Class<T> responseClass) {
//         if(Wrapped.class.isAssignableFrom(responseClass)) {
//             Object deserializedObject = deserializeWrapped(input);
// 
//             if(deserializedObject.getClass().isAssignableFrom(responseClass)) {
//                 return responseClass.cast(deserializedObject);
//             }
//             else {
//                 throw new SerializationException("input could not be serialized to " + responseClass.getCanonicalName());
//             }
//         }
// 
//         return defaultDeserialisation(input, responseClass);
//     }
// 
//     private Object deserializeWrapped(String input) {
//         return defaultDeserialisation(input, Wrapper.class).getElement();
//     }
// 
// 
//     public String serialize(Object obj) {
//         if(obj instanceof Wrapped) {
//            return serialize((Wrapped) obj);
//         }
// 
//         return defaultSerialization(obj);
//     }
// 
//     private String defaultSerialization(Object obj) {
//         try {
//             return mapper.writeValueAsString(obj);
//         } catch (JsonProcessingException e) {
//             throw new SerializationException("Could not serilize " + obj.getClass().getName() + " to string", e);
//         }
//     }
// 
//     private String serialize(Wrapped wrapped) {
//         return defaultSerialization(new Wrapper<>(wrapped));
//     }
// 
//     private <T> T defaultDeserialisation(String input, Class<T> responseClass) {
//         try {
//             return mapper.readValue(input, responseClass);
//         } catch (IOException e) {
//             throw new SerializationException("Could not deseriliaze input to " + responseClass.getName(), e);
//         }
//     }
// }
// 
// Path: src/main/java/de/fesere/hypermedia/cj/serialization/Wrapper.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// @JsonSerialize(using = WrapperSerializer.class)
// @JsonDeserialize(using = WrapperDeserializer.class)
// public class Wrapper<T> {
// 
//     private  T element;
// 
// 
//     public Wrapper(T element) {
//         this.element = element;
//     }
// 
//     public T getElement() {
//         return element;
//     }
// }


// Path: src/main/java/de/fesere/hypermedia/cj/model/CjClient.java
import de.fesere.hypermedia.cj.http.HTTPClient;
import de.fesere.hypermedia.cj.serialization.Serializer;
import de.fesere.hypermedia.cj.serialization.Wrapper;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

package de.fesere.hypermedia.cj.model;



public class CjClient {

    private final HTTPClient httpClient;
    private Serializer serializer = new Serializer();