From 46757539a181627be76182f74d6415e784663318 Mon Sep 17 00:00:00 2001 From: andrewlalis Date: Thu, 16 Aug 2018 14:40:45 +0200 Subject: [PATCH] Removed ugly http requests and use a github api now. Everything is a lot cleaner, and I can initialize student repositories now. --- pom.xml | 6 + src/main/java/nl/andrewlalis/Main.java | 19 +- .../nl/andrewlalis/git_api/GithubManager.java | 202 ++++++++ .../nl/andrewlalis/git_api/Initializer.java | 451 ------------------ .../java/nl/andrewlalis/model/TATeam.java | 6 +- .../andrewlalis/model/TeachingAssistant.java | 2 + .../java/nl/andrewlalis/util/CommandLine.java | 2 +- 7 files changed, 225 insertions(+), 463 deletions(-) create mode 100644 src/main/java/nl/andrewlalis/git_api/GithubManager.java delete mode 100644 src/main/java/nl/andrewlalis/git_api/Initializer.java diff --git a/pom.xml b/pom.xml index 4114823..2510ab2 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,12 @@ jackson-annotations ${jackson.version} + + + org.kohsuke + github-api + 1.93 + \ No newline at end of file diff --git a/src/main/java/nl/andrewlalis/Main.java b/src/main/java/nl/andrewlalis/Main.java index 6fb18d1..ad58dab 100644 --- a/src/main/java/nl/andrewlalis/Main.java +++ b/src/main/java/nl/andrewlalis/Main.java @@ -1,6 +1,6 @@ package nl.andrewlalis; -import nl.andrewlalis.git_api.Initializer; +import nl.andrewlalis.git_api.GithubManager; import nl.andrewlalis.model.StudentTeam; import nl.andrewlalis.util.Logging; import nl.andrewlalis.util.TeamGenerator; @@ -9,6 +9,7 @@ import java.io.IOException; import java.util.List; import java.util.Map; import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; @@ -28,20 +29,25 @@ public class Main { // Initialize logger. ConsoleHandler handler = new ConsoleHandler(); - handler.setLevel(Level.FINEST); - logger.addHandler(handler); + handler.setLevel(Level.INFO); try { Logging.setup(true); // TODO: Replace true with command line arg. + Handler[] handlers = logger.getHandlers(); + for (Handler h : handlers) { + logger.removeHandler(h); + } + logger.setUseParentHandlers(false); + logger.addHandler(handler); } catch (IOException e) { logger.severe("Unable to save log to file."); } - logger.info("Initializer for Github Repositories in Educational Organizations."); + logger.info("GithubManager for Github Repositories in Educational Organizations."); // Get studentTeams from CSV file. List studentTeams = getStudentTeamsFromCSV(userOptions.get("input"), Integer.parseInt(userOptions.get("teamsize"))); - Initializer initializer = new Initializer( + GithubManager githubManager = new GithubManager( userOptions.get("organization"), userOptions.get("token"), "assignments_2018", @@ -50,7 +56,8 @@ public class Main { ); try { - initializer.initializeGithubRepos(studentTeams); + githubManager.initializeGithubRepos(studentTeams); + //githubManager.deleteAllRepositories(); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/nl/andrewlalis/git_api/GithubManager.java b/src/main/java/nl/andrewlalis/git_api/GithubManager.java new file mode 100644 index 0000000..011d51d --- /dev/null +++ b/src/main/java/nl/andrewlalis/git_api/GithubManager.java @@ -0,0 +1,202 @@ +package nl.andrewlalis.git_api; + +import nl.andrewlalis.model.Student; +import nl.andrewlalis.model.StudentTeam; +import org.kohsuke.github.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +/** + * This class is responsible for initializing the Github repositories and setting permissions, adding teams, etc. + */ +public class GithubManager { + + /** + * The name of the organization to operate on. + */ + private String organizationName; + + /** + * The object which simplifies creating REST URL's for most of the requests. + */ + private URLBuilder urlBuilder; + + /** + * The assignments repository where students will get assignments from. + */ + private GHRepository assignmentsRepo; + private String assignmentsRepoName; + + /** + * The name of the team which contains all teaching assistants. + */ + private String teachingAssistantsTeamName; + + /** + * The prefix used to prepend the names of student repositories. + * Should ideally contain the current school year. + */ + private String studentRepoPrefix; + + /** + * Github object for API interactions. + */ + private GitHub github; + private GHOrganization organization; + + /** + * The logger for outputting debug info. + */ + private static final Logger logger = Logger.getLogger(GithubManager.class.getName()); + static { + logger.setParent(Logger.getGlobal()); + } + + public GithubManager(String organizationName, String accessToken, String assignmentsRepo, String teachingAssistantsTeamName, String studentRepoPrefix) { + this.organizationName = organizationName; + this.assignmentsRepoName = assignmentsRepo; + this.teachingAssistantsTeamName = teachingAssistantsTeamName; + this.studentRepoPrefix = studentRepoPrefix; + this.urlBuilder = new URLBuilder(organizationName, accessToken); + + try { + this.github = GitHub.connectUsingOAuth(accessToken); + this.organization = this.github.getOrganization(this.organizationName); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Initializes the github repository for all studentTeams given. + * + * Creates for the entire organization: + * - an assignments repository with protected master branch and TA permissions. + * Creates for each team: + * - a repository + * - protected master branch + * - development branch + * - adds students to repository + * - adds all students to assignments repository. + * @param studentTeams The list of student studentTeams. + * @throws Exception If an error occurs while initializing the github repositories. + */ + public void initializeGithubRepos(List studentTeams) throws Exception { + GHTeam teamAll = this.organization.getTeamByName(this.teachingAssistantsTeamName); + + this.setupAssignmentsRepo(teamAll); + + StudentTeam t = new StudentTeam(); + Student s = new Student(3050831, "Andrew Lalis", "andrewlalisofficial@gmail.com", "andrewlalis", null); + t.addStudent(s); + t.setId(42); + + this.setupStudentTeam(t, teamAll); + } + + /** + * Sets up the organization's assignments repository, and grants permissions to all teaching assistants. + * @param allTeachingAssistants A team consisting of all teaching assistants. + * @throws IOException If an HTTP request failed. + */ + private void setupAssignmentsRepo(GHTeam allTeachingAssistants) throws IOException { + // Create the repository. + GHCreateRepositoryBuilder builder = this.organization.createRepository(this.assignmentsRepoName); + builder.description("Assignments repository for Advanced Object Oriented Programming"); + builder.wiki(false); + builder.issues(true); + builder.private_(false); // TODO: Make this true for production. + builder.team(allTeachingAssistants); + builder.gitignoreTemplate("Java"); + this.assignmentsRepo = builder.create(); + + // Protect the master branch. + GHBranchProtectionBuilder protectionBuilder = this.assignmentsRepo.getBranch("master").enableProtection(); + protectionBuilder.includeAdmins(false); + protectionBuilder.restrictPushAccess(); + protectionBuilder.teamPushAccess(allTeachingAssistants); + protectionBuilder.addRequiredChecks("ci/circleci"); + protectionBuilder.enable(); + + // Grant all teaching assistants write access. + allTeachingAssistants.add(this.assignmentsRepo, GHOrganization.Permission.ADMIN); + } + + /** + * Creates and sets up a student team's repository, and invites those students to the organization's assignments + * repository as well. + * @param team The student team to set up. + * @param taTeam The team of teaching assistants that is responsible for these students. + * @throws IOException If an HTTP request fails. + */ + private void setupStudentTeam(StudentTeam team, GHTeam taTeam) throws IOException { + String teamRepoName = team.generateUniqueName(this.studentRepoPrefix); + + List students = team.getStudents(); + StringBuilder description = new StringBuilder("Group "); + description.append(team.getId()).append(": "); + + for (Student s : students) { + description.append(s.getName()).append(' '); + } + + GHCreateRepositoryBuilder builder = this.organization.createRepository(teamRepoName); + builder.team(taTeam); + builder.wiki(false); + builder.issues(true); + builder.description(description.toString()); + builder.gitignoreTemplate("Java"); + builder.private_(false); // TODO: Change this to true for production + GHRepository repo = builder.create(); + logger.info("Created repository: " + repo.getName()); + + // Protect the master branch. + GHBranchProtectionBuilder protectionBuilder = repo.getBranch("master").enableProtection(); + protectionBuilder.includeAdmins(false); + protectionBuilder.teamPushAccess(taTeam); + protectionBuilder.addRequiredChecks("ci/circleci"); + protectionBuilder.enable(); + logger.fine("Protected master branch of repository: " + repo.getName()); + + // Create development branch. + String sha1 = repo.getBranch(repo.getDefaultBranch()).getSHA1(); + repo.createRef("refs/heads/development", sha1); + logger.fine("Created development branch of repository: " + repo.getName()); + + taTeam.add(repo, GHOrganization.Permission.ADMIN); + logger.fine("Added team " + taTeam.getName() + " as admin to repository: " + repo.getName()); + + List users = new ArrayList<>(); + for (Student student : team.getStudents()) { + GHUser user = this.github.getUser(student.getGithubUsername()); + users.add(user); + } + + repo.addCollaborators(users); + this.assignmentsRepo.addCollaborators(users); + } + + /** + * Deletes all repositories in the organization. + * @throws IOException if an error occurs with sending requests. + */ + public void deleteAllRepositories() throws IOException { + Map repoMap = this.organization.getRepositories(); + for (Map.Entry repoEntry : repoMap.entrySet()) { + repoEntry.getValue().delete(); + } + } + + /** + * Archives all repositories whose name contains the given substring. + * @param sub Any repository containing this substring will be archived. + */ + public void archiveAllRepositories(String sub) { + + } + +} diff --git a/src/main/java/nl/andrewlalis/git_api/Initializer.java b/src/main/java/nl/andrewlalis/git_api/Initializer.java deleted file mode 100644 index 086c6a6..0000000 --- a/src/main/java/nl/andrewlalis/git_api/Initializer.java +++ /dev/null @@ -1,451 +0,0 @@ -package nl.andrewlalis.git_api; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import nl.andrewlalis.model.Student; -import nl.andrewlalis.model.StudentTeam; -import nl.andrewlalis.model.TATeam; -import org.apache.http.HttpResponse; -import org.apache.http.StatusLine; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; -import java.util.stream.Collectors; - -/** - * This class is responsible for initializing the Github repositories and setting permissions, adding teams, etc. - */ -public class Initializer { - - /** - * The name of the organization to operate on. - */ - private String organizationName; - - /** - * The oauth access token needed for the request. - */ - private String accessToken; - - /** - * The object which simplifies creating REST URL's for most of the requests. - */ - private URLBuilder urlBuilder; - - /** - * The name of the assignments repository where students will get assignments from. - */ - private String assignmentsRepo; - - /** - * The name of the team which contains all teaching assistants. - */ - private String teachingAssistantsTeamName; - - /** - * The prefix used to prepend the names of student repositories. - * Should ideally contain the current school year. - */ - private String studentRepoPrefix; - - /** - * The HttpClient object to use with all requests. - */ - private HttpClient client; - - /** - * ObjectMapper to use when constructing JSON objects. - */ - private ObjectMapper mapper; - - /** - * The logger for outputting debug info. - */ - private static final Logger logger = Logger.getLogger(Initializer.class.getName()); - static { - logger.setParent(Logger.getGlobal()); - } - - public Initializer(String organizationName, String accessToken, String assignmentsRepo, String teachingAssistantsTeamName, String studentRepoPrefix) { - this.organizationName = organizationName; - this.accessToken = accessToken; - this.assignmentsRepo = assignmentsRepo; - this.teachingAssistantsTeamName = teachingAssistantsTeamName; - this.studentRepoPrefix = studentRepoPrefix; - this.urlBuilder = new URLBuilder(organizationName, accessToken); - this.client = HttpClientBuilder.create().build(); - this.mapper = new ObjectMapper(); - } - - /** - * Initializes the github repository for all studentTeams given. - * - * Creates for the entire organization: - * - an assignments repository with protected master branch and TA permissions. - * Creates for each team: - * - a repository - * - protected master branch - * - development branch - * - adds students to repository - * - adds all students to assignments repository. - * @param studentTeams The list of student studentTeams. - * @throws Exception If an error occurs while initializing the github repositories. - */ - public void initializeGithubRepos(List studentTeams) throws Exception { - List taTeams = listMemberTeams(); - TATeam teamAll = this.getTeamAll(taTeams, this.teachingAssistantsTeamName); - - this.setupAssignmentsRepo(teamAll); - - } - - /** - * Sets up the organization's assignments repository, and grants permissions to all teaching assistants. - * @param allTeachingAssistants A team consisting of all teaching assistants. - * @return True if everything went successfully, or false if an error occurred. - * @throws IOException If an HTTP request failed. - */ - private boolean setupAssignmentsRepo(TATeam allTeachingAssistants) throws IOException { - // First, create the assignments repository. - boolean successCreate = this.createRepository(this.assignmentsRepo, allTeachingAssistants); - if (successCreate) { - logger.info("Created repository: " + this.assignmentsRepo); - } else { - logger.severe("Could not create repository: " + this.assignmentsRepo); - } - - // Then, protect the master branch. - boolean successProtect = this.protectMasterBranch(this.assignmentsRepo, allTeachingAssistants); - if (successProtect) { - logger.info("Protected master branch of: " + this.assignmentsRepo); - } else { - logger.severe("Could not protect master branch of: " + this.assignmentsRepo); - } - - // And finally give all teaching assistants admin permissions to the repository. - boolean successGrant = this.grantTeamPermissions(this.assignmentsRepo, allTeachingAssistants); - if (successGrant) { - logger.info("Granted permissions to teaching assistants for: " + this.assignmentsRepo); - } else { - logger.severe("Could not grant permissions to teaching assistants for: " + this.assignmentsRepo); - } - - return successCreate && successProtect && successGrant; - } - - /** - * Creates and sets up a student team's repository, and invites those students to the organization's assignments - * repository as well. - * @param team The student team to set up. - * @param taTeam The team of teaching assistants that is responsible for these students. - * @return True if everything went according to plan, false if at least one error occurred. - * @throws IOException If an HTTP request fails. - */ - private boolean setupStudentTeam(StudentTeam team, TATeam taTeam) throws IOException { - String teamRepoName = team.generateUniqueName(this.studentRepoPrefix); - - // First create the repository. - boolean successCreate = this.createRepository(teamRepoName, taTeam); - if (successCreate) { - logger.info("Created repository: " + teamRepoName); - } else { - logger.severe("Could not create repository: " + teamRepoName); - } - - // Then protect the master branch. - boolean successProtect = this.protectMasterBranch(teamRepoName, taTeam); - if (successProtect) { - logger.info("Protected master branch of: " + teamRepoName); - } else { - logger.severe("Could not protect master branch of: " + teamRepoName); - } - - // And finally create the development branch. - boolean successDev = this.createDevelopmentBranch(teamRepoName); - if (successDev) { - logger.info("Created development branch for: " + teamRepoName); - } else { - logger.severe("Could not create development branch for: " + teamRepoName); - } - - boolean successGrant = this.grantTeamPermissions(teamRepoName, taTeam); - if (successGrant) { - logger.info("Granted permissions for: " + teamRepoName + " to " + taTeam.getName()); - } else { - logger.severe("Could not grant permissions for: " + teamRepoName + " to " + taTeam.getName()); - } - - Map studentSuccesses = new HashMap<>(); - // For every student in the team, add them to the organization's assignments repo, and their own. - for (Student student : team.getStudents()) { - // First invite to their own repository. - boolean successInviteOwn = this.addStudentToRepository(teamRepoName, student, true); - if (successInviteOwn) { - logger.info("Invited " + student + " to " + teamRepoName); - } else { - logger.severe("Could not invite " + student + " to " + teamRepoName); - } - - // Then invite the student to the assignments repo. - boolean successInviteAssign = this.addStudentToRepository(this.assignmentsRepo, student, false); - if (successInviteAssign) { - logger.info("Invited " + student + " to " + this.assignmentsRepo); - } else { - logger.severe("Could not invite " + student + " to " + this.assignmentsRepo); - } - - studentSuccesses.put(student, new Boolean[]{successInviteOwn, successInviteAssign}); - } - - // Calculate total success. - boolean allStudentSuccess = true; - for (Map.Entry entry : studentSuccesses.entrySet()) { - for (boolean b : entry.getValue()) { - allStudentSuccess &= b; - } - } - - return successCreate && successProtect && successDev && successGrant && allStudentSuccess; - } - - /** - * Invites a student as a collaborator to a repository. - * @param repositoryName The name of the repository to invite the student to. - * @param student The student to send the invitation to. - * @param writeAllowed Whether or not the student is allowed to push to the repository. - * @return True if successful and the invitation is created, false otherwise. - * @throws IOException If an error occurs while performing a request or with json compiling. - */ - private boolean addStudentToRepository(String repositoryName, Student student, boolean writeAllowed) throws IOException { - // First create a simple JSON object that either gives push or pull permission. - ObjectNode root = this.mapper.createObjectNode(); - root.put("permissions", (writeAllowed ? "push" : "pull")); - String json = this.mapper.writeValueAsString(root); - - // Then make the request. - HttpPut put = new HttpPut(this.urlBuilder.buildCollaboratorURL(repositoryName, student.getGithubUsername())); - put.setEntity(new StringEntity(json)); - logger.fine("Sending PUT request to add student: " + student + " to repository: " + repositoryName); - HttpResponse response = this.client.execute(put); - logger.finest("Response from PUT to add student to repository: " + response.getStatusLine().getStatusCode()); - - // Only if 201 is returned do we know that a collaborator is invited. - return response.getStatusLine().getStatusCode() == 201; - } - - /** - * Creates the development branch needed by all student repositories. - * @param repositoryName The name of the repository. - * @return True if the branch could successfully be created, false otherwise. - * @throws IOException If an error occurs while performing a request or with json compiling. - */ - private boolean createDevelopmentBranch(String repositoryName) throws IOException { - // First obtain a reference for the repository. - HttpGet get = new HttpGet(this.urlBuilder.buildReferenceGetURL(repositoryName)); - HttpResponse getResponse = this.client.execute(get); - if (getResponse.getStatusLine().getStatusCode() != 200) { - return false; - } - ObjectNode responseRoot = this.mapper.valueToTree(getResponseBody(getResponse)); - String sha = responseRoot.get("object").get("sha").textValue(); - - // Construct the request data. - ObjectNode root = this.mapper.createObjectNode(); - root.put("ref", "refs/heads/development"); - root.put("sha", sha); - String json = this.mapper.writeValueAsString(root); - - // Send the request. - HttpPost post = new HttpPost(this.urlBuilder.buildReferencePostURL(repositoryName)); - post.setEntity(new StringEntity(json)); - logger.fine("Sending POST request to create development branch for repository: " + repositoryName); - HttpResponse postResponse = this.client.execute(post); - logger.finest("Response from POST to create development branch: " + postResponse.getStatusLine().getStatusCode()); - - // Only if 201 is returned, is this successful. - return postResponse.getStatusLine().getStatusCode() == 201; - } - - /** - * Grants the given team admin permissions to the repository with the given name. - * @param repositoryName The name of the repository. - * @param team The team to give admin permissions to. - * @return True if rights were successfully granted, false otherwise. - * @throws IOException If an error occurs while attempting to give a team admin rights over the repository. - */ - private boolean grantTeamPermissions(String repositoryName, TATeam team) throws IOException { - // First, create the JSON object, which is simply one value pair. - ObjectNode root = this.mapper.createObjectNode(); - root.put("permission", "admin"); - String json = this.mapper.writeValueAsString(root); - - // Create and send request. - HttpPut put = new HttpPut(this.urlBuilder.buildTeamPermissionsURL(repositoryName, String.valueOf(team.getId()))); - put.setEntity(new StringEntity(json)); - logger.fine("Sending PUT request to add team " + team.getName() + " as admins for repo: " + repositoryName); - HttpResponse response = this.client.execute(put); - logger.finest("Response from adding team as admins: " + response.getStatusLine().getStatusCode()); - - // Return true only if request returns 204. - return response.getStatusLine().getStatusCode() == 204; - } - - /** - * Protects the master branch of the given repository. - * @see Github Branch Protection - * @param repositoryName The repository to protect the master branch of. - * @param taTeam The team to give rights to. - * @return True if the master branch has been protected, false otherwise. - * @throws IOException If an error occurs with requests or compiling json. - */ - private boolean protectMasterBranch(String repositoryName, TATeam taTeam) throws IOException { - // First, create quite a complex JSON object. - // settings - ObjectNode root = this.mapper.createObjectNode(); - // required_status_checks - { - ObjectNode requiredStatusChecksNode = this.mapper.createObjectNode(); - requiredStatusChecksNode.put("strict", false); - // contexts - { - ArrayNode contextsNode = this.mapper.createArrayNode(); - contextsNode.add("ci/circleci"); - requiredStatusChecksNode.set("contexts", contextsNode); - } - root.set("required_status_checks", requiredStatusChecksNode); - } - root.put("enforce_admins", false); - root.set("required_pull_request_reviews", this.mapper.createObjectNode()); - // restrictions - { - ObjectNode restrictionsNode = this.mapper.createObjectNode(); - restrictionsNode.set("users", this.mapper.createArrayNode()); - // teams - { - ArrayNode teamsNode = this.mapper.createArrayNode(); - teamsNode.add(taTeam.getName()); - restrictionsNode.set("teams", teamsNode); - } - root.set("restrictions", restrictionsNode); - } - String json = this.mapper.writer().writeValueAsString(root); - - // Create request and put the json to the server. - HttpPut put = new HttpPut(this.urlBuilder.buildBranchProtectionURL(repositoryName, "master")); - put.setEntity(new StringEntity(json)); - put.setHeader("Accept", "application/vnd.github.luke-cage-preview+json"); - logger.fine("Sending PUT request to protect master branch of repository: " + repositoryName); - HttpResponse response = this.client.execute(put); - logger.finest("Response from protecting master branch: " + response.getStatusLine().getStatusCode()); - logger.finest(getResponseBody(response)); - - // Return true only if the status code is 200. - return response.getStatusLine().getStatusCode() == 200; - } - - /** - * Creates a repository of the given name and assigns the given team to it. - * @param repositoryName The name of the repository to make. - * @param taTeam The team to assign to this repository. - * @return True if the repository was created successfully, or false if an error occurred. - * @throws IOException If an error occurs during http requesting or JSON processing. - */ - private boolean createRepository(String repositoryName, TATeam taTeam) throws IOException { - logger.info("Creating repository: " + repositoryName); - - ObjectNode root = this.mapper.createObjectNode(); - root.put("name", repositoryName); - root.put("private", false); - root.put("has_issues", true); - root.put("has_wiki", true); - root.put("team_id", taTeam.getId()); - root.put("auto_init", false); - root.put("gitignore_template", "Java"); - String json = this.mapper.writer().writeValueAsString(root); - - // Create the request and post it. - HttpPost post = new HttpPost(this.urlBuilder.buildRepoURL()); - post.setEntity(new StringEntity(json)); - post.setHeader("Content-type", "application/json"); - logger.fine("Sending POST request to create repository: " + repositoryName); - HttpResponse response = this.client.execute(post); - logger.finest("Response from creating repository POST: " + response.getStatusLine().getStatusCode()); - logger.finest(getResponseBody(response)); - - // Return true if 201 is the response code, and false otherwise. - return response.getStatusLine().getStatusCode() == 201; - } - - /** - * Extracts the team containing all TA's from a list of all teams. - * @param taTeams The list of all teams in the organization. - * @param teamAllName The name of the team representing all TA's. - * @return The team which holds all TA's. - * @throws Exception If no team with the given name exists. - */ - private TATeam getTeamAll(List taTeams, String teamAllName) throws Exception { - for (TATeam team : taTeams) { - if (team.getName().equals(teamAllName)) { - return team; - } - } - throw new Exception("No team with name " + teamAllName + " could be found."); - } - - /** - * Obtains a list of all teams in the organization, meaning all teaching assistant teams. - * @return A list of all teams in the organization. - */ - private List listMemberTeams() { - CloseableHttpClient client = HttpClients.createDefault(); - HttpGet get = new HttpGet(this.urlBuilder.buildTeamURL()); - try (CloseableHttpResponse response = client.execute(get)) { - StatusLine line = response.getStatusLine(); - logger.finer("Response code from listing member teams: " + line.getStatusCode()); - String result = getResponseBody(response); - logger.finer("Response entity: " + result); - - ObjectMapper mapper = new ObjectMapper(); - List memberTeams = mapper.readValue(result, new TypeReference>(){}); - for (TATeam r : memberTeams) { - logger.finest(r.toString()); - } - return memberTeams; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - /** - * Extracts a string which represents the response body of an HttpResponse. - * @param response The response to a previous request. - * @return A string containing the whole response body. - */ - private static String getResponseBody(HttpResponse response) { - try { - return new BufferedReader(new InputStreamReader(response.getEntity().getContent())).lines().collect(Collectors.joining("\n")); - } catch (IOException e) { - e.printStackTrace(); - return ""; - } - } -} diff --git a/src/main/java/nl/andrewlalis/model/TATeam.java b/src/main/java/nl/andrewlalis/model/TATeam.java index 572b77a..0bbcdf3 100644 --- a/src/main/java/nl/andrewlalis/model/TATeam.java +++ b/src/main/java/nl/andrewlalis/model/TATeam.java @@ -11,7 +11,6 @@ import java.util.List; * Represents a teaching assistant team, which is itself a 'team' in the organization. This class is used for parsing * json from requests to github to get a list of all teams in the organization. */ -@JsonIgnoreProperties(ignoreUnknown = true) public class TATeam { private List teachingAssistants; @@ -19,13 +18,11 @@ public class TATeam { /** * The team's display name. */ - @JsonProperty("name") private String name; /** * The team's unique identifier. */ - @JsonProperty("id") private int id; /** @@ -33,8 +30,7 @@ public class TATeam { * @param name The name of the team. * @param id The unique identifier for this team. */ - @JsonCreator - public TATeam(@JsonProperty("name") String name, @JsonProperty("id") int id) { + public TATeam(String name, int id) { this.name = name; this.id = id; this.teachingAssistants = new ArrayList(); diff --git a/src/main/java/nl/andrewlalis/model/TeachingAssistant.java b/src/main/java/nl/andrewlalis/model/TeachingAssistant.java index 918bb5c..f04723f 100644 --- a/src/main/java/nl/andrewlalis/model/TeachingAssistant.java +++ b/src/main/java/nl/andrewlalis/model/TeachingAssistant.java @@ -1,5 +1,7 @@ package nl.andrewlalis.model; +import org.kohsuke.github.GHTeam; + public class TeachingAssistant extends Person { /** diff --git a/src/main/java/nl/andrewlalis/util/CommandLine.java b/src/main/java/nl/andrewlalis/util/CommandLine.java index 8e4e206..1075d9e 100644 --- a/src/main/java/nl/andrewlalis/util/CommandLine.java +++ b/src/main/java/nl/andrewlalis/util/CommandLine.java @@ -67,7 +67,7 @@ public class CommandLine { options.addOption(organizationInput); // The maximum team size. - Option teamSizeInput = new Option("s", "teamsize", true, "The maximum size of teams to generate."); + Option teamSizeInput = new Option("ts", "teamsize", true, "The maximum size of teams to generate."); teamSizeInput.setRequired(false); options.addOption(teamSizeInput);