// Path: src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/response/SnapshotResponseBuilder.java
// public class SnapshotResponseBuilder {
// 
//     private SnapshotAPIState state;
// 
//     public SnapshotResponse buildWithTarget(
//             String target,
//             String method
//     ) throws InvalidAPICallException {
//         checkPrefix(target);
//         return parseTarget(target, target.split("/"), method);
//     }
// 
//     private void checkPrefix(String target) throws InvalidAPICallException {
//         if (!target.startsWith("/api/v0/docs/")) {
//             throw new InvalidAPICallException(target);
//         }
//     }
// 
//     private SnapshotResponse parseTarget(
//             String target,
//             String[] parts,
//             String method
//     ) throws InvalidAPICallException {
//         String projectName = parts[4];
//         if (parts.length == 5) {
//             if (method.equals("GET")) {
//                 return new SnapshotGetDocResponse(
//                         state.getStateForGetDoc(projectName)
//                 );
//             }
//         } else if (parts.length == 6) {
//             String type = parts[5];
//             if (type.equals("snapshots") && method.equals("POST")) {
//                 return new SnapshotPushResponse(
//                         state.getStateForPush(projectName),
//                         state.getStateForPostback(projectName)
//                 );
//             } else if (type.equals("saved_vers") && method.equals("GET")) {
//                 return new SnapshotGetSavedVersResponse(
//                         state.getStateForGetSavedVers(projectName)
//                 );
//             }
//         } else if (parts.length == 7) {
//             if (parts[5].equals("snapshots") && method.equals("GET")) {
//                 try {
//                     return new SnapshotGetForVerResponse(
//                             state.getStateForGetForVers(
//                                     projectName, Integer.parseInt(parts[6])
//                             )
//                     );
//                 } catch (NumberFormatException e) {
// 
//                 }
//             }
//         }
//         throw new InvalidAPICallException(target);
//     }
// 
//     public void setState(SnapshotAPIState state) {
//         this.state = state;
//     }
// 
// }
// 
// Path: src/main/java/uk/ac/ic/wlgitbridge/util/Log.java
// public class Log {
// 
//     private static Logger logger = LoggerFactory.getLogger(GitBridgeApp.class);
// 
//     public static void trace(String msg) {
//         logger.trace(msg);
//     }
// 
//     public static void trace(String msg, Throwable t) {
//         logger.trace(msg, t);
//     }
// 
//     public static void debug(String msg) {
//         logger.debug(msg);
//     }
// 
//     public static void debug(String msg, Throwable t) {
//         logger.debug(msg, t);
//     }
// 
//     public static void info(String msg) {
//         logger.info(msg);
//     }
// 
//     public static void info(String format, Object arg) {
//         logger.info(format, arg);
//     }
// 
//     public static void info(String format, Object arg1, Object arg2) {
//         logger.info(format, arg1, arg2);
//     }
// 
//     public static void info(String format, Object... args) {
//         logger.info(format, args);
//     }
// 
//     public static void info(String msg, Throwable t) {
//         logger.info(msg, t);
//     }
// 
//     public static void warn(String msg) {
//         logger.warn(msg);
//     }
// 
//     public static void warn(String msg, Object arg) {
//         logger.warn(msg, arg);
//     }
// 
//     public static void warn(String msg, Object arg1, Object arg2) {
//         logger.warn(msg, arg1, arg2);
//     }
// 
//     public static void warn(String msg, Object... args) {
//         logger.warn(msg, args);
//     }
// 
//     public static void warn(String msg, Throwable t) {
//         logger.warn(msg, t);
//     }
// 
//     public static void error(String msg) {
//         logger.error(msg);
//     }
// 
//     public static void error(String msg, Object... args) {
//         logger.error(msg, args);
//     }
// 
//     public static void error(String msg, Throwable t) {
//         logger.error(msg, t);
//     }
// 
// }


import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler;
import uk.ac.ic.wlgitbridge.snapshot.servermock.response.SnapshotResponseBuilder;
import uk.ac.ic.wlgitbridge.snapshot.servermock.state.SnapshotAPIState;
import uk.ac.ic.wlgitbridge.util.Log;
import java.io.File;
package uk.ac.ic.wlgitbridge.snapshot.servermock.server;



/**
 * Created by Winston on 09/01/15.
 */
public class MockSnapshotServer {

    private final Server server;
    private final SnapshotResponseBuilder responseBuilder;
    private int port;

    public MockSnapshotServer(int port, File resourceBase) {
        server = new Server(port);
        responseBuilder = new SnapshotResponseBuilder();
        server.setHandler(getHandlerForResourceBase(resourceBase));
    }

    private HandlerCollection getHandlerForResourceBase(File resourceBase) {
        HandlerCollection handlers = new HandlerCollection();
        handlers.addHandler(new MockSnapshotRequestHandler(responseBuilder));
        handlers.addHandler(resourceHandlerWithBase(resourceBase));
        return handlers;
    }

    private ResourceHandler resourceHandlerWithBase(File resourceBase) {
        ResourceHandler resourceHandler = new ResourceHandler();
        resourceHandler.setResourceBase(resourceBase.getAbsolutePath());
        return resourceHandler;
    }

    public void start() {
        try {
            server.start();
        } catch (Exception e) {
// Path: src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/response/SnapshotResponseBuilder.java
// public class SnapshotResponseBuilder {
// 
//     private SnapshotAPIState state;
// 
//     public SnapshotResponse buildWithTarget(
//             String target,
//             String method
//     ) throws InvalidAPICallException {
//         checkPrefix(target);
//         return parseTarget(target, target.split("/"), method);
//     }
// 
//     private void checkPrefix(String target) throws InvalidAPICallException {
//         if (!target.startsWith("/api/v0/docs/")) {
//             throw new InvalidAPICallException(target);
//         }
//     }
// 
//     private SnapshotResponse parseTarget(
//             String target,
//             String[] parts,
//             String method
//     ) throws InvalidAPICallException {
//         String projectName = parts[4];
//         if (parts.length == 5) {
//             if (method.equals("GET")) {
//                 return new SnapshotGetDocResponse(
//                         state.getStateForGetDoc(projectName)
//                 );
//             }
//         } else if (parts.length == 6) {
//             String type = parts[5];
//             if (type.equals("snapshots") && method.equals("POST")) {
//                 return new SnapshotPushResponse(
//                         state.getStateForPush(projectName),
//                         state.getStateForPostback(projectName)
//                 );
//             } else if (type.equals("saved_vers") && method.equals("GET")) {
//                 return new SnapshotGetSavedVersResponse(
//                         state.getStateForGetSavedVers(projectName)
//                 );
//             }
//         } else if (parts.length == 7) {
//             if (parts[5].equals("snapshots") && method.equals("GET")) {
//                 try {
//                     return new SnapshotGetForVerResponse(
//                             state.getStateForGetForVers(
//                                     projectName, Integer.parseInt(parts[6])
//                             )
//                     );
//                 } catch (NumberFormatException e) {
// 
//                 }
//             }
//         }
//         throw new InvalidAPICallException(target);
//     }
// 
//     public void setState(SnapshotAPIState state) {
//         this.state = state;
//     }
// 
// }
// 
// Path: src/main/java/uk/ac/ic/wlgitbridge/util/Log.java
// public class Log {
// 
//     private static Logger logger = LoggerFactory.getLogger(GitBridgeApp.class);
// 
//     public static void trace(String msg) {
//         logger.trace(msg);
//     }
// 
//     public static void trace(String msg, Throwable t) {
//         logger.trace(msg, t);
//     }
// 
//     public static void debug(String msg) {
//         logger.debug(msg);
//     }
// 
//     public static void debug(String msg, Throwable t) {
//         logger.debug(msg, t);
//     }
// 
//     public static void info(String msg) {
//         logger.info(msg);
//     }
// 
//     public static void info(String format, Object arg) {
//         logger.info(format, arg);
//     }
// 
//     public static void info(String format, Object arg1, Object arg2) {
//         logger.info(format, arg1, arg2);
//     }
// 
//     public static void info(String format, Object... args) {
//         logger.info(format, args);
//     }
// 
//     public static void info(String msg, Throwable t) {
//         logger.info(msg, t);
//     }
// 
//     public static void warn(String msg) {
//         logger.warn(msg);
//     }
// 
//     public static void warn(String msg, Object arg) {
//         logger.warn(msg, arg);
//     }
// 
//     public static void warn(String msg, Object arg1, Object arg2) {
//         logger.warn(msg, arg1, arg2);
//     }
// 
//     public static void warn(String msg, Object... args) {
//         logger.warn(msg, args);
//     }
// 
//     public static void warn(String msg, Throwable t) {
//         logger.warn(msg, t);
//     }
// 
//     public static void error(String msg) {
//         logger.error(msg);
//     }
// 
//     public static void error(String msg, Object... args) {
//         logger.error(msg, args);
//     }
// 
//     public static void error(String msg, Throwable t) {
//         logger.error(msg, t);
//     }
// 
// }


// Path: src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotServer.java
import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler;
import uk.ac.ic.wlgitbridge.snapshot.servermock.response.SnapshotResponseBuilder;
import uk.ac.ic.wlgitbridge.snapshot.servermock.state.SnapshotAPIState;
import uk.ac.ic.wlgitbridge.util.Log;
import java.io.File;

package uk.ac.ic.wlgitbridge.snapshot.servermock.server;



/**
 * Created by Winston on 09/01/15.
 */
public class MockSnapshotServer {

    private final Server server;
    private final SnapshotResponseBuilder responseBuilder;
    private int port;

    public MockSnapshotServer(int port, File resourceBase) {
        server = new Server(port);
        responseBuilder = new SnapshotResponseBuilder();
        server.setHandler(getHandlerForResourceBase(resourceBase));
    }

    private HandlerCollection getHandlerForResourceBase(File resourceBase) {
        HandlerCollection handlers = new HandlerCollection();
        handlers.addHandler(new MockSnapshotRequestHandler(responseBuilder));
        handlers.addHandler(resourceHandlerWithBase(resourceBase));
        return handlers;
    }

    private ResourceHandler resourceHandlerWithBase(File resourceBase) {
        ResourceHandler resourceHandler = new ResourceHandler();
        resourceHandler.setResourceBase(resourceBase.getAbsolutePath());
        return resourceHandler;
    }

    public void start() {
        try {
            server.start();
        } catch (Exception e) {
            Log.warn("Exception when trying to start server", e);