// Path: core/src/main/java/au/com/sensis/stubby/model/StubExchange.java
// public class StubExchange {
// 
//     private StubRequest request;
//     private StubResponse response;
//     private Long delay;
//     private String script;
//     
//     public StubExchange() { }
//     
//     public StubExchange(StubExchange other) { // copy constructor
//         this.request = (other.request != null) ? new StubRequest(other.request) : null;
//         this.response = (other.response != null) ? new StubResponse(other.response) : null;
//         this.delay = other.delay;
//         this.script = other.script;
//     }
// 
//     public StubRequest getRequest() {
//         return request;
//     }
// 
//     public void setRequest(StubRequest request) {
//         this.request = request;
//     }
// 
//     public StubResponse getResponse() {
//         return response;
//     }
// 
//     public void setResponse(StubResponse response) {
//         this.response = response;
//     }
// 
//     public Long getDelay() {
//         return delay;
//     }
// 
//     public void setDelay(Long delay) {
//         this.delay = delay;
//     }
// 
//     public String getScript() {
//         return script;
//     }
// 
//     public void setScript(String script) {
//         this.script = script;
//     }
// 
// }
// 
// Path: core/src/main/java/au/com/sensis/stubby/model/StubRequest.java
// public class StubRequest extends StubMessage {
// 
//     private String method;
//     private String path;
//     private List<StubParam> params;
// 
//     public StubRequest() { }
//     
//     public StubRequest(StubRequest other) { // copy constructor
//         super(other);
//         this.method = other.method;
//         this.path = other.path;
//         if (other.params != null) {
//             this.params = new ArrayList<StubParam>();
//             for (StubParam param : other.params) {
//                 this.params.add(new StubParam(param));
//             }
//         }
//     }
//     
//     public String getMethod() {
//         return method;
//     }
// 
//     public void setMethod(String method) {
//         this.method = method;
//     }
// 
//     public String getPath() {
//         return path;
//     }
// 
//     public void setPath(String path) {
//         this.path = path;
//     }
// 
//     public List<StubParam> getParams() {
//         return params;
//     }
// 
//     public void setParams(List<StubParam> params) {
//         this.params = params;
//     }
//     
//     @JsonIgnore
//     public String getParam(String name) { // get first, case sensitive lookup
//         if (params != null) {
//             for (StubParam param : params) {
//                 if (param.getName().equals(name)) {
//                     return param.getValue();
//                 }
//             }
//         }
//         return null; // not found
//     }
// 
//     @JsonIgnore
//     public List<String> getParams(String name) { // get all, case sensitive lookup
//         List<String> result = new ArrayList<String>();
//         if (params != null) {
//             for (StubParam param : params) {
//                 if (param.getName().equals(name)) {
//                     result.add(param.getValue());
//                 }
//             }
//         }
//         return result; // empty list if not found
//     }
// 
// }
// 
// Path: core/src/main/java/au/com/sensis/stubby/utils/JsonUtils.java
// public class JsonUtils {
//     
//     public static ObjectMapper mapper() {
//         return new ObjectMapper();
//     }
//     
//     public static ObjectMapper defaultMapper() {
//         ObjectMapper result = mapper();
//         result.enable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
//         result.enable(DeserializationConfig.Feature.USE_BIG_DECIMAL_FOR_FLOATS); // for 'exact' floating-point matches
//         result.setSerializationInclusion(Inclusion.NON_NULL);
//         return result;
//     }
//     
//     public static ObjectWriter prettyWriter() {
//         return defaultMapper().writerWithDefaultPrettyPrinter();
//     }
//     
//     public static String prettyPrint(Object value) {
//         try {
//             return prettyWriter().writeValueAsString(value); 
//         } catch (IOException e) {
//             throw new RuntimeException("Error serializing JSON", e);
//         }
//     }
// 
//     public static String serialize(Object object) {
//         try {
//             return defaultMapper().writeValueAsString(object);
//         } catch (IOException e) {
//             throw new RuntimeException("Error serializing JSON", e);
//         }
//     }
//     
//     public static void serialize(OutputStream stream, Object object) {
//         try {
//             defaultMapper().writeValue(stream, object);
//         } catch (IOException e) {
//             throw new RuntimeException("Error serializing JSON", e);
//         }
//     }
// 
//     public static <T> T deserialize(String json, Class<T> type) {
//         try {
//             return defaultMapper().readValue(json, type);
//         } catch (IOException e) {
//             throw new RuntimeException("Error deserializing JSON", e);
//         }
//     }
//     
//     public static <T> T deserialize(InputStream stream, Class<T> type) {
//         try {
//             return defaultMapper().readValue(stream, type);
//         } catch (IOException e) {
//             throw new RuntimeException("Error deserializing JSON", e);
//         }
//     }
//     
// }


import java.io.InputStream;
import java.io.OutputStream;
import au.com.sensis.stubby.model.StubExchange;
import au.com.sensis.stubby.model.StubRequest;
import au.com.sensis.stubby.utils.JsonUtils;
package au.com.sensis.stubby.service;



public class JsonServiceInterface { // interface using serialized JSON strings/streams

    private StubService service;

    public JsonServiceInterface(StubService service) {
        this.service = service;
    }
    
    public void addResponse(String exchange) {
// Path: core/src/main/java/au/com/sensis/stubby/model/StubExchange.java
// public class StubExchange {
// 
//     private StubRequest request;
//     private StubResponse response;
//     private Long delay;
//     private String script;
//     
//     public StubExchange() { }
//     
//     public StubExchange(StubExchange other) { // copy constructor
//         this.request = (other.request != null) ? new StubRequest(other.request) : null;
//         this.response = (other.response != null) ? new StubResponse(other.response) : null;
//         this.delay = other.delay;
//         this.script = other.script;
//     }
// 
//     public StubRequest getRequest() {
//         return request;
//     }
// 
//     public void setRequest(StubRequest request) {
//         this.request = request;
//     }
// 
//     public StubResponse getResponse() {
//         return response;
//     }
// 
//     public void setResponse(StubResponse response) {
//         this.response = response;
//     }
// 
//     public Long getDelay() {
//         return delay;
//     }
// 
//     public void setDelay(Long delay) {
//         this.delay = delay;
//     }
// 
//     public String getScript() {
//         return script;
//     }
// 
//     public void setScript(String script) {
//         this.script = script;
//     }
// 
// }
// 
// Path: core/src/main/java/au/com/sensis/stubby/model/StubRequest.java
// public class StubRequest extends StubMessage {
// 
//     private String method;
//     private String path;
//     private List<StubParam> params;
// 
//     public StubRequest() { }
//     
//     public StubRequest(StubRequest other) { // copy constructor
//         super(other);
//         this.method = other.method;
//         this.path = other.path;
//         if (other.params != null) {
//             this.params = new ArrayList<StubParam>();
//             for (StubParam param : other.params) {
//                 this.params.add(new StubParam(param));
//             }
//         }
//     }
//     
//     public String getMethod() {
//         return method;
//     }
// 
//     public void setMethod(String method) {
//         this.method = method;
//     }
// 
//     public String getPath() {
//         return path;
//     }
// 
//     public void setPath(String path) {
//         this.path = path;
//     }
// 
//     public List<StubParam> getParams() {
//         return params;
//     }
// 
//     public void setParams(List<StubParam> params) {
//         this.params = params;
//     }
//     
//     @JsonIgnore
//     public String getParam(String name) { // get first, case sensitive lookup
//         if (params != null) {
//             for (StubParam param : params) {
//                 if (param.getName().equals(name)) {
//                     return param.getValue();
//                 }
//             }
//         }
//         return null; // not found
//     }
// 
//     @JsonIgnore
//     public List<String> getParams(String name) { // get all, case sensitive lookup
//         List<String> result = new ArrayList<String>();
//         if (params != null) {
//             for (StubParam param : params) {
//                 if (param.getName().equals(name)) {
//                     result.add(param.getValue());
//                 }
//             }
//         }
//         return result; // empty list if not found
//     }
// 
// }
// 
// Path: core/src/main/java/au/com/sensis/stubby/utils/JsonUtils.java
// public class JsonUtils {
//     
//     public static ObjectMapper mapper() {
//         return new ObjectMapper();
//     }
//     
//     public static ObjectMapper defaultMapper() {
//         ObjectMapper result = mapper();
//         result.enable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
//         result.enable(DeserializationConfig.Feature.USE_BIG_DECIMAL_FOR_FLOATS); // for 'exact' floating-point matches
//         result.setSerializationInclusion(Inclusion.NON_NULL);
//         return result;
//     }
//     
//     public static ObjectWriter prettyWriter() {
//         return defaultMapper().writerWithDefaultPrettyPrinter();
//     }
//     
//     public static String prettyPrint(Object value) {
//         try {
//             return prettyWriter().writeValueAsString(value); 
//         } catch (IOException e) {
//             throw new RuntimeException("Error serializing JSON", e);
//         }
//     }
// 
//     public static String serialize(Object object) {
//         try {
//             return defaultMapper().writeValueAsString(object);
//         } catch (IOException e) {
//             throw new RuntimeException("Error serializing JSON", e);
//         }
//     }
//     
//     public static void serialize(OutputStream stream, Object object) {
//         try {
//             defaultMapper().writeValue(stream, object);
//         } catch (IOException e) {
//             throw new RuntimeException("Error serializing JSON", e);
//         }
//     }
// 
//     public static <T> T deserialize(String json, Class<T> type) {
//         try {
//             return defaultMapper().readValue(json, type);
//         } catch (IOException e) {
//             throw new RuntimeException("Error deserializing JSON", e);
//         }
//     }
//     
//     public static <T> T deserialize(InputStream stream, Class<T> type) {
//         try {
//             return defaultMapper().readValue(stream, type);
//         } catch (IOException e) {
//             throw new RuntimeException("Error deserializing JSON", e);
//         }
//     }
//     
// }


// Path: core/src/main/java/au/com/sensis/stubby/service/JsonServiceInterface.java
import java.io.InputStream;
import java.io.OutputStream;
import au.com.sensis.stubby.model.StubExchange;
import au.com.sensis.stubby.model.StubRequest;
import au.com.sensis.stubby.utils.JsonUtils;

package au.com.sensis.stubby.service;



public class JsonServiceInterface { // interface using serialized JSON strings/streams

    private StubService service;

    public JsonServiceInterface(StubService service) {
        this.service = service;
    }
    
    public void addResponse(String exchange) {
        service.addResponse(JsonUtils.deserialize(exchange, StubExchange.class));