// Path: core/src/main/java/au/com/sensis/stubby/model/StubParam.java
// public class StubParam {
// 
//     private String name;
//     private String value;
//     
//     public StubParam() { }
// 
//     public StubParam(String name, String value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     public StubParam(StubParam other) { // copy constructor
//         this.name = other.name;
//         this.value = other.value;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getValue() {
//         return value;
//     }
// 
//     public void setValue(String value) {
//         this.value = value;
//     }
//     
//     @Override
//     public String toString() {
//         return name + "=" + value;
//     }
// 
// }
// 
// 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/model/StubResponse.java
// public class StubResponse extends StubMessage {
// 
//     private Integer status;
// 
//     public StubResponse() { }
//     
//     public StubResponse(StubResponse other) { // copy constructor
//         super(other);
//         this.status = other.status;
//     }
//     
//     public Integer getStatus() {
//         return status;
//     }
// 
//     public void setStatus(Integer status) {
//         this.status = status;
//     }
// 
// }
// 
// 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.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import au.com.sensis.stubby.model.StubParam;
import au.com.sensis.stubby.model.StubRequest;
import au.com.sensis.stubby.model.StubResponse;
import au.com.sensis.stubby.utils.JsonUtils;
package au.com.sensis.stubby.servlet;





/*
 * Transform between stubby & Servlet HTTP structures
 */
public class Transformer {

    @SuppressWarnings("unchecked")
// Path: core/src/main/java/au/com/sensis/stubby/model/StubParam.java
// public class StubParam {
// 
//     private String name;
//     private String value;
//     
//     public StubParam() { }
// 
//     public StubParam(String name, String value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     public StubParam(StubParam other) { // copy constructor
//         this.name = other.name;
//         this.value = other.value;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getValue() {
//         return value;
//     }
// 
//     public void setValue(String value) {
//         this.value = value;
//     }
//     
//     @Override
//     public String toString() {
//         return name + "=" + value;
//     }
// 
// }
// 
// 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/model/StubResponse.java
// public class StubResponse extends StubMessage {
// 
//     private Integer status;
// 
//     public StubResponse() { }
//     
//     public StubResponse(StubResponse other) { // copy constructor
//         super(other);
//         this.status = other.status;
//     }
//     
//     public Integer getStatus() {
//         return status;
//     }
// 
//     public void setStatus(Integer status) {
//         this.status = status;
//     }
// 
// }
// 
// 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: servlet/src/main/java/au/com/sensis/stubby/servlet/Transformer.java
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import au.com.sensis.stubby.model.StubParam;
import au.com.sensis.stubby.model.StubRequest;
import au.com.sensis.stubby.model.StubResponse;
import au.com.sensis.stubby.utils.JsonUtils;

package au.com.sensis.stubby.servlet;





/*
 * Transform between stubby & Servlet HTTP structures
 */
public class Transformer {

    @SuppressWarnings("unchecked")
    public static List<StubParam> fromServletHeaders(HttpServletRequest request) {