// 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/utils/RequestFilterBuilder.java
// public class RequestFilterBuilder {
//     
//     private static final String METHOD_PARAM = "method";
//     private static final String PATH_PARAM = "path";
//     private static final Pattern PARAM_PATTERN = Pattern.compile("^param\\[(.+)\\]$");
//     private static final Pattern HEADER_PATTERN = Pattern.compile("^header\\[(.+)\\]$");
// 
//     private StubRequest filter;
//     
//     public RequestFilterBuilder() {
//         this.filter = new StubRequest();
//         this.filter.setParams(new ArrayList<StubParam>());
//         this.filter.setHeaders(new ArrayList<StubParam>());
//     }
//     
//     public RequestFilterBuilder fromParams(List<StubParam> params) {
//         for (StubParam param : params) {
//             addParam(param.getName(), param.getValue());
//         }
//         return this;
//     }
// 
//     private void addParam(String name, String value) {
//         if (METHOD_PARAM.equals(name)) {
//             filter.setMethod(value);
//             return;
//         }
//         if (PATH_PARAM.equals(name)) {
//             filter.setPath(value);
//             return;
//         }
//         Matcher matcher = PARAM_PATTERN.matcher(name);
//         if (matcher.matches()) {
//             String param = matcher.group(1);
//             filter.getParams().add(new StubParam(param, value));
//             return;
//         }
//         matcher = HEADER_PATTERN.matcher(name);
//         if (matcher.matches()) {
//             String header = matcher.group(1);
//             filter.getHeaders().add(new StubParam(header, value));
//             return;
//         }
//     }
//     
//     public StubRequest getFilter() {
//         return filter;
//     }
//     
// }


import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import au.com.sensis.stubby.model.StubParam;
import au.com.sensis.stubby.model.StubRequest;
import au.com.sensis.stubby.utils.RequestFilterBuilder;
package au.com.sensis.stubby.servlet;




/*
 * Handles operations on requets collection (eg, 'DELETE /_control/requests')
 */
@SuppressWarnings("serial")
public class RequestsServlet extends AbstractStubServlet {

    private StubRequest createFilter(HttpServletRequest request) {
        List<StubParam> params = Transformer.fromServletParams(request);
        return new RequestFilterBuilder().fromParams(params).getFilter();
    }

    private Long getWaitParam(HttpServletRequest request) {
        String waitStr = request.getParameter("wait");
        if (waitStr != null) {
            return Long.parseLong(waitStr);
        } else {
            return null; // not found
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 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/utils/RequestFilterBuilder.java
// public class RequestFilterBuilder {
//     
//     private static final String METHOD_PARAM = "method";
//     private static final String PATH_PARAM = "path";
//     private static final Pattern PARAM_PATTERN = Pattern.compile("^param\\[(.+)\\]$");
//     private static final Pattern HEADER_PATTERN = Pattern.compile("^header\\[(.+)\\]$");
// 
//     private StubRequest filter;
//     
//     public RequestFilterBuilder() {
//         this.filter = new StubRequest();
//         this.filter.setParams(new ArrayList<StubParam>());
//         this.filter.setHeaders(new ArrayList<StubParam>());
//     }
//     
//     public RequestFilterBuilder fromParams(List<StubParam> params) {
//         for (StubParam param : params) {
//             addParam(param.getName(), param.getValue());
//         }
//         return this;
//     }
// 
//     private void addParam(String name, String value) {
//         if (METHOD_PARAM.equals(name)) {
//             filter.setMethod(value);
//             return;
//         }
//         if (PATH_PARAM.equals(name)) {
//             filter.setPath(value);
//             return;
//         }
//         Matcher matcher = PARAM_PATTERN.matcher(name);
//         if (matcher.matches()) {
//             String param = matcher.group(1);
//             filter.getParams().add(new StubParam(param, value));
//             return;
//         }
//         matcher = HEADER_PATTERN.matcher(name);
//         if (matcher.matches()) {
//             String header = matcher.group(1);
//             filter.getHeaders().add(new StubParam(header, value));
//             return;
//         }
//     }
//     
//     public StubRequest getFilter() {
//         return filter;
//     }
//     
// }


// Path: servlet/src/main/java/au/com/sensis/stubby/servlet/RequestsServlet.java
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import au.com.sensis.stubby.model.StubParam;
import au.com.sensis.stubby.model.StubRequest;
import au.com.sensis.stubby.utils.RequestFilterBuilder;

package au.com.sensis.stubby.servlet;




/*
 * Handles operations on requets collection (eg, 'DELETE /_control/requests')
 */
@SuppressWarnings("serial")
public class RequestsServlet extends AbstractStubServlet {

    private StubRequest createFilter(HttpServletRequest request) {
        List<StubParam> params = Transformer.fromServletParams(request);
        return new RequestFilterBuilder().fromParams(params).getFilter();
    }

    private Long getWaitParam(HttpServletRequest request) {
        String waitStr = request.getParameter("wait");
        if (waitStr != null) {
            return Long.parseLong(waitStr);
        } else {
            return null; // not found
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        StubRequest filter = createFilter(request);