{"action":"created","comment":{"url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/comments/86673845","pull_request_review_id":7322094,"id":86673845,"diff_hunk":"@@ -135,65 +165,304 @@ public DocumentManager getDocumentManager() {\n \t}\n \n \tpublic MetadataManager getMetadataManager() {\n-\t\treturn metadataManager;\n+\t\treturn dataManager.getMetadataManager();\n \t}\n \n \tpublic DataManager getDataManager() {\n \t\treturn dataManager;\n \t}\n-\n+\t\n+\tprivate void registerWSHooks() {\n+\t\t wsManager.registerEventHandler(WSConnection.EventType.ON_CONNECT, () -> {\n+\t\t\tIPreferenceStore prefStore = Activator.getDefault().getPreferenceStore();\n+\t\t\tString username = prefStore.getString(PreferenceConstants.USERNAME);\n+\t\t\tString password = prefStore.getString(PreferenceConstants.PASSWORD);\n+\t\t\tboolean showWelcomeDialog = (username == null || username.equals(\"\") || password == null || password.equals(\"\"));\n+\t\t\tif (showWelcomeDialog) {\n+\t\t\t\tDisplay.getDefault().asyncExec(() -> new WelcomeDialog(new Shell(), prefStore).open());\n+\t\t\t} else {\n+\t\t\t\tif (prefStore.getBoolean(PreferenceConstants.AUTO_CONNECT)) {\n+\t\t\t\t\tnew Thread(() -> {\n+\t\t\t\t\t\trequestManager.login(username, password);\n+\t\t\t\t\t}).start();\n+\t\t\t\t}\n+\t\t\t}\n+\t\t });\n+\t}\n+\t\n \tprivate void registerNotificationHooks() {\n+\t\tSessionStorage storage = dataManager.getSessionStorage();\n+\t\t// ~~~ project hooks ~~~\n+\t\t// Project.Rename\n+\t\twsManager.registerNotificationHandler(\"Project\", \"Rename\", (notification) -> {\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tString newName = (((ProjectRenameNotification) notification.getData()).newName);\n+\t\t\tProject project = storage.getProjectById(resId);\n+\t\t\tproject.setName(newName);\n+\t\t\tProjectMetadata meta = getMetadataManager().getProjectMetadata(resId);\n+\t\t\tmeta.setName(newName);\n+\t\t\tstorage.setProject(project);\n+\t\t});\n+\t\t// Project.GrantPermissions\n+\t\twsManager.registerNotificationHandler(\"Project\", \"GrantPermissions\", (notification) -> {\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tArrayList<Long> projects = new ArrayList<>();\n+\t\t\tprojects.add(resId);\n+\t\t\tRequest projectLookupRequest = new ProjectLookupRequest(projects).getRequest(response -> {\n+\t        \tProjectLookupResponse r = (ProjectLookupResponse) response.getData();\n+\t        \tif (r.getProjects() == null || r.getProjects().length != 1) {\n+\t        \t\tSystem.out.println(\"Couldn't read projects from lookup\");\n+\t        \t} else {\n+\t        \t\tProject p = r.getProjects()[0];\n+\t    \t\t\tstorage.setProject(p);\n+\t        \t}\n+\t        }, new UIRequestErrorHandler(\"Couldn't send Project Lookup Request.\"));\n+\t        wsManager.sendAuthenticatedRequest(projectLookupRequest);\n+\t\t});\n+\t\t// Project.RevokePermissions\n+\t\twsManager.registerNotificationHandler(\"Project\", \"RevokePermissions\", (notification) -> {\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tProjectRevokePermissionsNotification n = ((ProjectRevokePermissionsNotification) notification.getData());\n+\t\t\tProject project = storage.getProjectById(resId);\n+\t\t\tif (project.getPermissions() == null) {\n+\t\t\t\tproject.setPermissions(new HashMap<>());\n+\t\t\t}\n+\t\t\tproject.getPermissions().remove(n.revokeUsername);\n+\t\t\tif (storage.getUsername().equals(n.revokeUsername)) {\n+\t\t\t\tstorage.removeProjectById(resId);\n+\t\t\t\tgetMetadataManager().projectDeleted(resId);\n+\t\t\t} else {\n+\t\t\t\tstorage.setProject(project);\n+\t\t\t}\n+\t\t});\n+\t\t// Project.Delete\n+\t\twsManager.registerNotificationHandler(\"Project\", \"Delete\", (notification) -> {\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tstorage.removeProjectById(resId);\n+\t\t\tgetMetadataManager().projectDeleted(resId);\n+\t\t});\n+\t\t\n+\t\t// ~~~ file hooks ~~~\n+\t\t// File.Create\n+\t\twsManager.registerNotificationHandler(\"File\", \"Create\", (notification) -> {\n+\t\t\tMetadataManager mm = dataManager.getMetadataManager();\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tProjectMetadata pmeta = mm.getProjectMetadata(resId);\n+\t\t\tif (pmeta == null) {\n+\t\t\t\tSystem.out.println(\"Received File.Create notification for unsubscribed project.\");\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\tFileCreateNotification n = ((FileCreateNotification) notification.getData());\n+\t\t\tFileMetadata meta = mm.getFileMetadata(n.file.getFileID());\n+\t\t\tif (meta != null) {\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\t\n+\t\t\tProject p = dataManager.getSessionStorage().getProjectById(pmeta.getProjectID());\n+\t\t\tIWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();\n+\t\t\tIProject eclipseProject = root.getProject(p.getName());\n+\t\t\tIProgressMonitor monitor = new NullProgressMonitor();\n+\t\t\trequestManager.pullFileAndCreate(eclipseProject, p, n.file, monitor);\n+\t\t});\n+\t\t// File.Rename\n+\t\twsManager.registerNotificationHandler(\"File\", \"Rename\", (notification) -> {\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tMetadataManager mm = dataManager.getMetadataManager();\n+\t\t\tFileMetadata meta = mm.getFileMetadata(resId);\n+\t\t\tif (meta == null) {\n+\t\t\t\tSystem.out.println(\"Received File.Rename notification for non-existent file.\");\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\tFileRenameNotification n = ((FileRenameNotification) notification.getData());\n+\t\t\tString projectLocation = mm.getProjectLocation(mm.getProjectIDForFileID(resId));\n+\t\t\t\n+\t\t\t// TODO (fahslaj): Finish these blocks of code in integration of editor\n+//\t\t\tStringBuilder pathBuilder = new StringBuilder();\n+//\t\t\tpathBuilder.append(projectLocation);\n+//\t\t\tpathBuilder.append(meta.getRelativePath());\n+//\t\t\tpathBuilder.append(meta.getFilename());\n+//\t\t\t\n+//\t\t\tStringBuilder newPathBuilder = new StringBuilder();\n+//\t\t\tnewPathBuilder.append(projectLocation);\n+//\t\t\tnewPathBuilder.append(meta.getRelativePath());\n+//\t\t\tnewPathBuilder.append(n.newName);\n+//\t\t\t\n+//\t\t\tFile file = new File(pathBuilder.toString());\n+//\t\t\tif (file.exists()) {\n+//\t\t\t\tfile.renameTo(new File(newPathBuilder.toString()));\n+//\t\t\t\tmeta.setFilename(n.newName);\n+//\t\t\t} else {\n+//\t\t\t\tSystem.out.println(\"Tried to rename file that does not exist: \" + pathBuilder.toString());\n+//\t\t\t\treturn;\n+//\t\t\t}\n+\t\t});\n+\t\t// File.Move\n+\t\twsManager.registerNotificationHandler(\"File\", \"Move\", (notification) -> {\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tMetadataManager mm = dataManager.getMetadataManager();\n+\t\t\tFileMetadata meta = mm.getFileMetadata(resId);\n+\t\t\tif (meta == null) {\n+\t\t\t\tSystem.out.println(\"Received File.Move notification for unsubscribed project.\");\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\tFileMoveNotification n = ((FileMoveNotification) notification.getData());\n+\t\t\tString projectLocation = mm.getProjectLocation(mm.getProjectIDForFileID(resId));\n+\t\t\t\n+\t\t\t// TODO (fahslaj): Finish these blocks of code in integration of editor\n+//\t\t\tStringBuilder pathBuilder = new StringBuilder();\n+//\t\t\tpathBuilder.append(projectLocation);\n+//\t\t\tpathBuilder.append(meta.getRelativePath());\n+//\t\t\tpathBuilder.append(meta.getFilename());\n+//\t\t\t\n+//\t\t\tStringBuilder newPathBuilder = new StringBuilder();\n+//\t\t\tnewPathBuilder.append(projectLocation);\n+//\t\t\tnewPathBuilder.append(n.newPath);\n+//\t\t\tnewPathBuilder.append(meta.getFilename());\n+//\t\t\t\n+//\t\t\tFile file = new File(pathBuilder.toString());\n+//\t\t\tif (file.exists()) {\n+//\t\t\t\tfile.renameTo(new File(newPathBuilder.toString()));\n+//\t\t\t\tmeta.setRelativePath(n.newPath);\n+//\t\t\t} else {\n+//\t\t\t\tSystem.out.println(\"Tried to move file that does not exist: \" + pathBuilder.toString());\n+//\t\t\t\treturn;\n+//\t\t\t}\n+\t\t});\n+\t\t// File.Delete\n+\t\twsManager.registerNotificationHandler(\"File\", \"Delete\", (notification) -> {\n+\t\t\tlong resId = notification.getResourceID();\n+\t\t\tMetadataManager mm = dataManager.getMetadataManager();\n+\t\t\tFileMetadata meta = mm.getFileMetadata(resId);\n+\t\t\tif (meta == null) {\n+\t\t\t\tSystem.out.println(\"Received File.Delete notification for unsubscribed project or file that does not exist.\");\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\tString projectLocation = mm.getProjectLocation(mm.getProjectIDForFileID(resId));\n+\t\t\t\n+\t\t\t// TODO (fahslaj): Finish these blocks of code in integration of editor\n+//\t\t\tStringBuilder pathBuilder = new StringBuilder();\n+//\t\t\tpathBuilder.append(projectLocation);\n+//\t\t\tpathBuilder.append(meta.getRelativePath());\n+//\t\t\tpathBuilder.append(meta.getFilename());\n+//\t\t\t\n+//\t\t\tFile file = new File(pathBuilder.toString());\n+//\t\t\tif (file.exists()) {\n+//\t\t\t\tfile.delete();\n+//\t\t\t\tmm.fileDeleted(resId);\n+//\t\t\t} else {\n+//\t\t\t\tSystem.out.println(\"Tried to delete file that does not exist: \" + pathBuilder.toString());\n+//\t\t\t\treturn;\n+//\t\t\t}\n+\t\t});\n+\t\t// File.Change\n \t\twsManager.registerNotificationHandler(\"File\", \"Change\",\n \t\t\t\t(Notification n) -> documentManager.handleNotification(n));\n \t}\n-\n-\tprivate void websocketLogin() throws ConnectException, InterruptedException {\n-\t\tRequest req1 = new UserRegisterRequest(StringConstants.PREFERENCES_USERNAME,\n-\t\t\t\tStringConstants.PREFERENCES_FIRSTNAME, StringConstants.PREFERENCES_LASTNAME,\n-\t\t\t\tStringConstants.PREFERENCES_EMAIL, StringConstants.PREFERENCES_PASSWORD).getRequest(resp -> {\n-\n-\t\t\t\t\tRequest req2 = new UserLoginRequest(StringConstants.PREFERENCES_USERNAME,\n-\t\t\t\t\t\t\tStringConstants.PREFERENCES_PASSWORD).getRequest(response -> {\n-\t\t\t\t\t\t\t\t// TODO(wongb) Add login logic for server\n-\t\t\t\t\t\t\t\tif (response.getStatus() != 200) {\n-\t\t\t\t\t\t\t\t\tthrow new IllegalStateException(\"Failed to log in\");\n-\t\t\t\t\t\t\t\t}\n-\n-\t\t\t\t\t\t\t\tgetWSManager().setAuthInfo(StringConstants.PREFERENCES_USERNAME,\n-\t\t\t\t\t\t\t\t\t\t((UserLoginResponse) response.getData()).getToken());\n-\n-\t\t\t\t\t\t\t\ttry {\n-\t\t\t\t\t\t\t\t\t// Subscribe to all projects that are CCProjects\n-\t\t\t\t\t\t\t\t\tfor(ProjectMetadata metadata : metadataManager.getAllProjects()){\n-\t\t\t\t\t\t\t\t\twsManager.sendRequest(new ProjectSubscribeRequest(metadata.getProjectId())\n-\t\t\t\t\t\t\t\t\t\t\t.getRequest(null, null));\n-\t\t\t\t\t\t\t\t\t}\n-\t\t\t\t\t\t\t\t} catch (ConnectException e) {\n-\t\t\t\t\t\t\t\t\te.printStackTrace();\n-\t\t\t\t\t\t\t\t}\n-\n-\t\t\t\t\t\t\t\t// For creating new file\n-\t\t\t\t\t\t\t\t// IRequestData data = new\n-\t\t\t\t\t\t\t\t// FileCreateRequest(StringConstants.FILE_NAME,\n-\t\t\t\t\t\t\t\t// StringConstants.FILE_PATH,\n-\t\t\t\t\t\t\t\t// StringConstants.PROJ_ID,\n-\t\t\t\t\t\t\t\t// (\"package testPkg1;\\n\" + \"\\n\" + \"public class\n-\t\t\t\t\t\t\t\t// TestClass1 {\\n\"\n-\t\t\t\t\t\t\t\t// + \"\\n\" + \"}\").getBytes());\n-\t\t\t\t\t\t\t\t// try {\n-\t\t\t\t\t\t\t\t// getWSManager().sendRequest(data.getRequest());\n-\t\t\t\t\t\t\t\t// } catch (ConnectException e) {\n-\t\t\t\t\t\t\t\t// // TODO Auto-generated catch block\n-\t\t\t\t\t\t\t\t// e.printStackTrace();\n-\t\t\t\t\t\t\t\t// }\n-\t\t\t\t\t\t\t}, null);\n-\t\t\t\t\ttry {\n-\t\t\t\t\t\tgetWSManager().sendRequest(req2, -1);\n-\t\t\t\t\t} catch (ConnectException e) {\n-\t\t\t\t\t\tthrow new IllegalStateException(\"Failed to connect while attempting to log in\", e);\n+\t\n+\tprivate void initPropertyListeners() {\t\t\n+\t\tdataManager.getSessionStorage().addPropertyChangeListener((event) -> {\n+\t\t\tif (event.getPropertyName().equals(SessionStorage.USERNAME)) {\n+\t\t\t\trequestManager.fetchProjects();\n+\t\t\t\tDisplay.getDefault().asyncExec(() -> {\n+\t\t\t\t\tif (event.getOldValue() == null || !event.getOldValue().equals(event.getNewValue())) {\n+\t\t\t\t\t\tif (Window.OK == OkCancelDialog.createDialog(\"Do you want to auto-subscribe to subscribed projets from the last session?\\n\"\n+\t\t\t\t\t\t\t\t+ \"This will overwrite any local changes made since the last online session.\").open()) {\n+\t\t\t\t\t\t\tautoSubscribeForSession = true;\n+\t\t\t\t\t\t} else {\n+\t\t\t\t\t\t\tautoSubscribeForSession = false;\n+\t\t\t\t\t\t\tsetAllSubscribedPrefs(false);\n+\t\t\t\t\t\t}\n \t\t\t\t\t}\n-\t\t\t\t}, null);\n-\t\tgetWSManager().sendRequest(req1, -1);\n-\n+\t\t\t\t});\n+\t\t\t} else if (event.getPropertyName().equals(SessionStorage.PROJECT_LIST)) {\n+\t\t\t\tSessionStorage storage = dataManager.getSessionStorage();\n+\t\t\t\tList<Long> subscribedIdsFromPrefs = getSubscribedProjectIds();\n+\t\t\t\tSet<Long> subscribedIds = storage.getSubscribedIds();\n+\t\t\t\tif (autoSubscribeForSession) {\n+\t\t\t\t\tfor (Long id : subscribedIdsFromPrefs) {\n+\t\t\t\t\t\tProject p = storage.getProjectById(id);\n+\t\t\t\t\t\tif (p == null) {\n+\t\t\t\t\t\t\tremoveProjectIdFromPrefs(id);\n+\t\t\t\t\t\t} else if (!subscribedIds.contains(id)) {\n+\t\t\t\t\t\t\trequestManager.subscribeToProject(id);\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t});\n+\t}\n+\t\n+\t/**\n+\t * Removes the \"auto-subscribe\" preference associated with the given projectID.\n+\t * Should be called when either the project is no longer on the server or the\n+\t * user no longer has permissions for a project.\n+\t * \n+\t * @param id\n+\t */\n+\tpublic void removeProjectIdFromPrefs(long id) {\n+\t\tPreferences pluginPrefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);\n+\t\tPreferences projectPrefs = pluginPrefs.node(PreferenceConstants.NODE_PROJECTS);\n+\t\tString[] projectIDs;\n+\t\ttry {\n+\t\t\tprojectIDs = projectPrefs.childrenNames();\n+\t\t\tfor (int i = 0; i < projectIDs.length; i++) {\n+\t\t\t\tif (id == Long.parseLong(projectIDs[i])) {","path":"src/main/java/cceclipseplugin/core/PluginManager.java","position":448,"original_position":448,"commit_id":"4916fe8397eb496788cf3b9158aab96a2a433ea4","original_commit_id":"4916fe8397eb496788cf3b9158aab96a2a433ea4","user":{"login":"ObsessiveOrange","id":6174404,"avatar_url":"https://avatars.githubusercontent.com/u/6174404?v=3","gravatar_id":"","url":"https://api.github.com/users/ObsessiveOrange","html_url":"https://github.com/ObsessiveOrange","followers_url":"https://api.github.com/users/ObsessiveOrange/followers","following_url":"https://api.github.com/users/ObsessiveOrange/following{/other_user}","gists_url":"https://api.github.com/users/ObsessiveOrange/gists{/gist_id}","starred_url":"https://api.github.com/users/ObsessiveOrange/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ObsessiveOrange/subscriptions","organizations_url":"https://api.github.com/users/ObsessiveOrange/orgs","repos_url":"https://api.github.com/users/ObsessiveOrange/repos","events_url":"https://api.github.com/users/ObsessiveOrange/events{/privacy}","received_events_url":"https://api.github.com/users/ObsessiveOrange/received_events","type":"User","site_admin":false},"body":"Is there no way to do a lookup or use a map as the underlying serialization type?","created_at":"2016-11-05T21:46:17Z","updated_at":"2016-11-05T21:48:59Z","html_url":"https://github.com/CodeCollaborate/EclipsePlugin/pull/4#discussion_r86673845","pull_request_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/comments/86673845"},"html":{"href":"https://github.com/CodeCollaborate/EclipsePlugin/pull/4#discussion_r86673845"},"pull_request":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4","id":89533112,"html_url":"https://github.com/CodeCollaborate/EclipsePlugin/pull/4","diff_url":"https://github.com/CodeCollaborate/EclipsePlugin/pull/4.diff","patch_url":"https://github.com/CodeCollaborate/EclipsePlugin/pull/4.patch","issue_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/4","number":4,"state":"open","locked":false,"title":"Base UI Functionality","user":{"login":"fahslaj","id":6913035,"avatar_url":"https://avatars.githubusercontent.com/u/6913035?v=3","gravatar_id":"","url":"https://api.github.com/users/fahslaj","html_url":"https://github.com/fahslaj","followers_url":"https://api.github.com/users/fahslaj/followers","following_url":"https://api.github.com/users/fahslaj/following{/other_user}","gists_url":"https://api.github.com/users/fahslaj/gists{/gist_id}","starred_url":"https://api.github.com/users/fahslaj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fahslaj/subscriptions","organizations_url":"https://api.github.com/users/fahslaj/orgs","repos_url":"https://api.github.com/users/fahslaj/repos","events_url":"https://api.github.com/users/fahslaj/events{/privacy}","received_events_url":"https://api.github.com/users/fahslaj/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-10-16T17:51:52Z","updated_at":"2016-11-05T21:48:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"04003bf39f0eccad3e76f79d03d818ee0248eac7","assignee":{"login":"ObsessiveOrange","id":6174404,"avatar_url":"https://avatars.githubusercontent.com/u/6174404?v=3","gravatar_id":"","url":"https://api.github.com/users/ObsessiveOrange","html_url":"https://github.com/ObsessiveOrange","followers_url":"https://api.github.com/users/ObsessiveOrange/followers","following_url":"https://api.github.com/users/ObsessiveOrange/following{/other_user}","gists_url":"https://api.github.com/users/ObsessiveOrange/gists{/gist_id}","starred_url":"https://api.github.com/users/ObsessiveOrange/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ObsessiveOrange/subscriptions","organizations_url":"https://api.github.com/users/ObsessiveOrange/orgs","repos_url":"https://api.github.com/users/ObsessiveOrange/repos","events_url":"https://api.github.com/users/ObsessiveOrange/events{/privacy}","received_events_url":"https://api.github.com/users/ObsessiveOrange/received_events","type":"User","site_admin":false},"assignees":[{"login":"ObsessiveOrange","id":6174404,"avatar_url":"https://avatars.githubusercontent.com/u/6174404?v=3","gravatar_id":"","url":"https://api.github.com/users/ObsessiveOrange","html_url":"https://github.com/ObsessiveOrange","followers_url":"https://api.github.com/users/ObsessiveOrange/followers","following_url":"https://api.github.com/users/ObsessiveOrange/following{/other_user}","gists_url":"https://api.github.com/users/ObsessiveOrange/gists{/gist_id}","starred_url":"https://api.github.com/users/ObsessiveOrange/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ObsessiveOrange/subscriptions","organizations_url":"https://api.github.com/users/ObsessiveOrange/orgs","repos_url":"https://api.github.com/users/ObsessiveOrange/repos","events_url":"https://api.github.com/users/ObsessiveOrange/events{/privacy}","received_events_url":"https://api.github.com/users/ObsessiveOrange/received_events","type":"User","site_admin":false},{"login":"fahslaj","id":6913035,"avatar_url":"https://avatars.githubusercontent.com/u/6913035?v=3","gravatar_id":"","url":"https://api.github.com/users/fahslaj","html_url":"https://github.com/fahslaj","followers_url":"https://api.github.com/users/fahslaj/followers","following_url":"https://api.github.com/users/fahslaj/following{/other_user}","gists_url":"https://api.github.com/users/fahslaj/gists{/gist_id}","starred_url":"https://api.github.com/users/fahslaj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fahslaj/subscriptions","organizations_url":"https://api.github.com/users/fahslaj/orgs","repos_url":"https://api.github.com/users/fahslaj/repos","events_url":"https://api.github.com/users/fahslaj/events{/privacy}","received_events_url":"https://api.github.com/users/fahslaj/received_events","type":"User","site_admin":false},{"login":"loganga","id":12075896,"avatar_url":"https://avatars.githubusercontent.com/u/12075896?v=3","gravatar_id":"","url":"https://api.github.com/users/loganga","html_url":"https://github.com/loganga","followers_url":"https://api.github.com/users/loganga/followers","following_url":"https://api.github.com/users/loganga/following{/other_user}","gists_url":"https://api.github.com/users/loganga/gists{/gist_id}","starred_url":"https://api.github.com/users/loganga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/loganga/subscriptions","organizations_url":"https://api.github.com/users/loganga/orgs","repos_url":"https://api.github.com/users/loganga/repos","events_url":"https://api.github.com/users/loganga/events{/privacy}","received_events_url":"https://api.github.com/users/loganga/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4/commits","review_comments_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4/comments","review_comment_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/4/comments","statuses_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/statuses/4916fe8397eb496788cf3b9158aab96a2a433ea4","head":{"label":"CodeCollaborate:UI-2.0","ref":"UI-2.0","sha":"4916fe8397eb496788cf3b9158aab96a2a433ea4","user":{"login":"CodeCollaborate","id":14879560,"avatar_url":"https://avatars.githubusercontent.com/u/14879560?v=3","gravatar_id":"","url":"https://api.github.com/users/CodeCollaborate","html_url":"https://github.com/CodeCollaborate","followers_url":"https://api.github.com/users/CodeCollaborate/followers","following_url":"https://api.github.com/users/CodeCollaborate/following{/other_user}","gists_url":"https://api.github.com/users/CodeCollaborate/gists{/gist_id}","starred_url":"https://api.github.com/users/CodeCollaborate/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CodeCollaborate/subscriptions","organizations_url":"https://api.github.com/users/CodeCollaborate/orgs","repos_url":"https://api.github.com/users/CodeCollaborate/repos","events_url":"https://api.github.com/users/CodeCollaborate/events{/privacy}","received_events_url":"https://api.github.com/users/CodeCollaborate/received_events","type":"Organization","site_admin":false},"repo":{"id":54053128,"name":"EclipsePlugin","full_name":"CodeCollaborate/EclipsePlugin","owner":{"login":"CodeCollaborate","id":14879560,"avatar_url":"https://avatars.githubusercontent.com/u/14879560?v=3","gravatar_id":"","url":"https://api.github.com/users/CodeCollaborate","html_url":"https://github.com/CodeCollaborate","followers_url":"https://api.github.com/users/CodeCollaborate/followers","following_url":"https://api.github.com/users/CodeCollaborate/following{/other_user}","gists_url":"https://api.github.com/users/CodeCollaborate/gists{/gist_id}","starred_url":"https://api.github.com/users/CodeCollaborate/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CodeCollaborate/subscriptions","organizations_url":"https://api.github.com/users/CodeCollaborate/orgs","repos_url":"https://api.github.com/users/CodeCollaborate/repos","events_url":"https://api.github.com/users/CodeCollaborate/events{/privacy}","received_events_url":"https://api.github.com/users/CodeCollaborate/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CodeCollaborate/EclipsePlugin","description":"Eclipse Plugin for collaborative editing","fork":false,"url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin","forks_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/forks","keys_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/teams","hooks_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/hooks","issue_events_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/events{/number}","events_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/events","assignees_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/assignees{/user}","branches_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/branches{/branch}","tags_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/tags","blobs_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/statuses/{sha}","languages_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/languages","stargazers_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/stargazers","contributors_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/contributors","subscribers_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/subscribers","subscription_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/subscription","commits_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/contents/{+path}","compare_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/merges","archive_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/downloads","issues_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues{/number}","pulls_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls{/number}","milestones_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/milestones{/number}","notifications_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/labels{/name}","releases_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/releases{/id}","deployments_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/deployments","created_at":"2016-03-16T17:35:54Z","updated_at":"2016-09-25T14:13:03Z","pushed_at":"2016-11-04T03:57:45Z","git_url":"git://github.com/CodeCollaborate/EclipsePlugin.git","ssh_url":"git@github.com:CodeCollaborate/EclipsePlugin.git","clone_url":"https://github.com/CodeCollaborate/EclipsePlugin.git","svn_url":"https://github.com/CodeCollaborate/EclipsePlugin","homepage":"","size":8882,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"test"}},"base":{"label":"CodeCollaborate:test","ref":"test","sha":"b3a427cebf1af03fb36b2925c09555276f2afabe","user":{"login":"CodeCollaborate","id":14879560,"avatar_url":"https://avatars.githubusercontent.com/u/14879560?v=3","gravatar_id":"","url":"https://api.github.com/users/CodeCollaborate","html_url":"https://github.com/CodeCollaborate","followers_url":"https://api.github.com/users/CodeCollaborate/followers","following_url":"https://api.github.com/users/CodeCollaborate/following{/other_user}","gists_url":"https://api.github.com/users/CodeCollaborate/gists{/gist_id}","starred_url":"https://api.github.com/users/CodeCollaborate/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CodeCollaborate/subscriptions","organizations_url":"https://api.github.com/users/CodeCollaborate/orgs","repos_url":"https://api.github.com/users/CodeCollaborate/repos","events_url":"https://api.github.com/users/CodeCollaborate/events{/privacy}","received_events_url":"https://api.github.com/users/CodeCollaborate/received_events","type":"Organization","site_admin":false},"repo":{"id":54053128,"name":"EclipsePlugin","full_name":"CodeCollaborate/EclipsePlugin","owner":{"login":"CodeCollaborate","id":14879560,"avatar_url":"https://avatars.githubusercontent.com/u/14879560?v=3","gravatar_id":"","url":"https://api.github.com/users/CodeCollaborate","html_url":"https://github.com/CodeCollaborate","followers_url":"https://api.github.com/users/CodeCollaborate/followers","following_url":"https://api.github.com/users/CodeCollaborate/following{/other_user}","gists_url":"https://api.github.com/users/CodeCollaborate/gists{/gist_id}","starred_url":"https://api.github.com/users/CodeCollaborate/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CodeCollaborate/subscriptions","organizations_url":"https://api.github.com/users/CodeCollaborate/orgs","repos_url":"https://api.github.com/users/CodeCollaborate/repos","events_url":"https://api.github.com/users/CodeCollaborate/events{/privacy}","received_events_url":"https://api.github.com/users/CodeCollaborate/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CodeCollaborate/EclipsePlugin","description":"Eclipse Plugin for collaborative editing","fork":false,"url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin","forks_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/forks","keys_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/teams","hooks_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/hooks","issue_events_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/events{/number}","events_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/events","assignees_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/assignees{/user}","branches_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/branches{/branch}","tags_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/tags","blobs_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/statuses/{sha}","languages_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/languages","stargazers_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/stargazers","contributors_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/contributors","subscribers_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/subscribers","subscription_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/subscription","commits_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/contents/{+path}","compare_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/merges","archive_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/downloads","issues_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues{/number}","pulls_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls{/number}","milestones_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/milestones{/number}","notifications_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/labels{/name}","releases_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/releases{/id}","deployments_url":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/deployments","created_at":"2016-03-16T17:35:54Z","updated_at":"2016-09-25T14:13:03Z","pushed_at":"2016-11-04T03:57:45Z","git_url":"git://github.com/CodeCollaborate/EclipsePlugin.git","ssh_url":"git@github.com:CodeCollaborate/EclipsePlugin.git","clone_url":"https://github.com/CodeCollaborate/EclipsePlugin.git","svn_url":"https://github.com/CodeCollaborate/EclipsePlugin","homepage":"","size":8882,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"test"}},"_links":{"self":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4"},"html":{"href":"https://github.com/CodeCollaborate/EclipsePlugin/pull/4"},"issue":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/4"},"comments":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/CodeCollaborate/EclipsePlugin/statuses/4916fe8397eb496788cf3b9158aab96a2a433ea4"}}}}
{"actor":{"display_login":"ObsessiveOrange"}}