[Demonstration 1]

[Buggy Method]
public static JSONObject getJson(DirectedGraph graph, String type, Dataset dataset) {
    return getJsonObject(graph.vertexSet(), graph.edgeSet(), new HashSet<String>(), new HashSet<DefaultEdge>(), true, dataset, type);
}

[Buggy Hunk]
return getJsonObject(graph.vertexSet(), graph.edgeSet(), new HashSet<String>(), new HashSet<DefaultEdge>(), true, dataset, type);

[Patch]
return getJsonObject(graph.vertexSet(), graph.edgeSet(), new HashSet<String>(), new HashSet<DefaultEdge>(), true, true, dataset, type);

[Demonstration 2]

[Buggy Method]
private void checkVertexAsStartOfPath(GraphFeatures gf, String v, List<String> verticesInPaths) {
    List<String> path = checkVertexAsPartOfPath(gf.getGraph(), v, new ArrayList<String>());
    if (path.size() >= 5) {
        DirectedGraph graph = gf.getGraph();
        DirectedGraph<String, DefaultEdge> doublyLinkedPath = new DefaultDirectedGraph<>(DefaultEdge.class);
        SimpleGraph<String, DefaultEdge> simpleDoublyLinkedPath = new SimpleGraph<>(DefaultEdge.class);
        DirectedGraph<String, DefaultEdge> doublyLinkedPath2 = new DefaultDirectedGraph<>(DefaultEdge.class);
        String lastVertex = null;
        for (String vertex : path) {
            doublyLinkedPath.addVertex(vertex);
            simpleDoublyLinkedPath.addVertex(vertex);
            // TODO why on second run only?
            if (lastVertex != null) {
                // TODO don't add edges we have added before!
                addEdge(doublyLinkedPath, graph.getAllEdges(vertex, lastVertex).toString(), vertex, lastVertex);
                addEdge(doublyLinkedPath, graph.getAllEdges(lastVertex, vertex).toString(), lastVertex, vertex);
                addEdge(simpleDoublyLinkedPath, graph.getAllEdges(vertex, lastVertex).toString(), vertex, lastVertex);
            }
            lastVertex = vertex;
        }
        this.patternsWithSurroundingGC.add(JsonOutput.getJson(doublyLinkedPath, doublyLinkedPath2, PATH, this.dataset).toString());
        this.connectedGraphsGC.add(simpleDoublyLinkedPath);
        this.connectedGraphsGCTypes.add(PATH);
        verticesInPaths.addAll(path);
    } else if (path.size() > 1) {
        logger.info("Path of length {} found", path.size());
    }
}

[Buggy Hunk]
} else if (path.size() > 1) {

[Patch]
} else if (path.size() > 3) {

[Demonstration 3]

[Buggy Method]
public static Result service(String ownerName, String projectName, String service, boolean isAdvertise) throws IOException, UnsupportedOperationException, ServletException {
    if (!isSupportedService(service)) {
        return forbidden(String.format("Unsupported service: '%s'", service));
    }
    Project project = Project.findByOwnerAndProjectName(ownerName, projectName);
    if (project == null) {
        return notFound();
    }
    models.User user = UserApp.currentUser();
    if (!isAllowed(project, service)) {
        if (user.isAnonymous()) {
            return BasicAuthAction.unauthorized(response());
        } else {
            // If you want the Git client showing your custom message to
            // the user, the Content-Type should be exact "text/plain"
            // without any parameter. For more details, see the code at
            // https://github.com/git/git/commit/426e70d4a11ce3b4f70636d57c6a0ab16ae08a00#diff-eea0ad565ec5903a11b6023755d491cfR154
            response().setHeader("Content-Type", "text/plain");
            return forbidden(String.format("'%s' has no permission to '%s/%s'.", user.name, ownerName, projectName));
        }
    }
    if (isAdvertise) {
        return ok(RepositoryService.gitAdvertise(project, service, response()));
    } else {
        if (request().body().isMaxSizeExceeded()) {
            return status(REQUEST_ENTITY_TOO_LARGE);
        } else {
            user.visits(project);
            return ok(RepositoryService.gitRpc(project, service, request(), response()));
        }
    }
}

[Buggy Hunk]
user.name, ownerName, projectName));

[Patch]
user.loginId, ownerName, projectName));