{"action":"created","comment":{"url":"https://api.github.com/repos/Sureit/ppms/pulls/comments/180961877","pull_request_review_id":111474569,"id":180961877,"diff_hunk":"@@ -0,0 +1,452 @@\n+package com.sureit.ppm.controller.helper;\n+\n+import java.io.IOException;\n+import java.nio.file.Files;\n+import java.nio.file.Path;\n+import java.nio.file.Paths;\n+import java.text.SimpleDateFormat;\n+import java.util.ArrayList;\n+import java.util.Date;\n+import java.util.HashMap;\n+import java.util.LinkedHashMap;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.stream.Collectors;\n+\n+import javax.servlet.http.HttpServletRequest;\n+import javax.servlet.http.HttpSession;\n+\n+import org.apache.commons.codec.binary.Base64;\n+import org.json.JSONException;\n+import org.json.JSONObject;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+import org.springframework.beans.BeanUtils;\n+import org.springframework.beans.factory.annotation.Autowired;\n+import org.springframework.beans.factory.annotation.Value;\n+import org.springframework.stereotype.Component;\n+import org.springframework.web.multipart.MultipartFile;\n+\n+import com.fasterxml.jackson.core.JsonProcessingException;\n+import com.fasterxml.jackson.core.type.TypeReference;\n+import com.fasterxml.jackson.databind.MappingIterator;\n+import com.fasterxml.jackson.databind.ObjectMapper;\n+import com.fasterxml.jackson.dataformat.csv.CsvMapper;\n+import com.fasterxml.jackson.dataformat.csv.CsvSchema;\n+import com.sureit.ppm.constants.BulkUploadProcessConstants;\n+import com.sureit.ppm.entity.model.BulkUploadProcessEntity;\n+import com.sureit.ppm.entity.model.BulkUploadProcessFileContent;\n+import com.sureit.ppm.entity.model.BulkUploadProcessMetaData;\n+import com.sureit.ppm.exception.BulkUploadProcessException;\n+import com.sureit.ppm.exception.ManageUsersException;\n+import com.sureit.ppm.service.IBulkUploadProcessService;\n+import com.sureit.ppm.service.IManageUsersDataService;\n+import com.sureit.ppm.view.model.BulkUploadProcessBean;\n+\n+@Component(\"bulkUploadProcessHelper\")\n+public class BulkUploadProcessHelper {\n+\n+\tprivate static final Logger log = LoggerFactory.getLogger(BulkUploadProcessHelper.class);\n+\n+\t@Autowired\n+\tIBulkUploadProcessService bulkUploadProcessService;\n+\t@Autowired\n+\tIManageUsersDataService manageUsersDataService;\n+\t@Value(\"${bulkUpload.csvFilePath.input}\")\n+\tprivate String csvFilePath;\n+\n+\t@Autowired\n+\tprivate HttpSession session;\n+\n+\tpublic String createBulkUploadNewProcess(BulkUploadProcessBean processBean, HttpServletRequest request)\n+\t\t\tthrows BulkUploadProcessException {\n+\t\tlog.info(\"createBulkUploadNewProcess method started in  \" + this.getClass());\n+\t\tJSONObject responseJSONObj = null;\n+\t\tObjectMapper objectMapper = null;\n+\n+\t\ttry {\n+\n+\t\t\tsession = request.getSession();\n+\n+\t\t\tobjectMapper = new ObjectMapper();\n+\n+\t\t\tString CSVString = processBean.getSampleFileUserList();\n+\n+\t\t\tbyte[] byteArrayCSV = convertBase64toByteArray(CSVString);\n+\n+\t\t\tList<Map<String, String>> csvFileHeader = getCSVFileHeader(byteArrayCSV, processBean);\n+\n+\t\t\tList<Map<String, String>> usersList = getCSVByteArraytoList(byteArrayCSV, processBean);\n+\n+\t\t\tBulkUploadProcessEntity processEntity = new BulkUploadProcessEntity();\n+\t\t\tBulkUploadProcessMetaData metaData = new BulkUploadProcessMetaData();\n+\t\t\tBulkUploadProcessFileContent fileContent = new BulkUploadProcessFileContent();\n+\n+\t\t\tBeanUtils.copyProperties(processBean, metaData);\n+\t\t\tmetaData.setFileHeaderList(csvFileHeader);\n+\t\t\tmetaData.setSampleFileBinaryData(CSVString);\n+\t\t\tfileContent.setSampleFileUserList(usersList);\n+\n+\t\t\tprocessEntity.setTemplateSampleFileContent(fileContent);\n+\t\t\tprocessEntity.setTemplateProcessMetaData(metaData);\n+\n+\t\t\tString responseString = objectMapper.writeValueAsString(processEntity);\n+\n+\t\t\tresponseJSONObj = new JSONObject();\n+\n+\t\t\tString userFeildList = objectMapper.writeValueAsString(manageUsersDataService.getUserInfoFields());\n+\t\t\tList<Map<String, String>> userInfoFeildList = objectMapper.readValue(userFeildList,\n+\t\t\t\t\tnew TypeReference<List<Map<String, String>>>() {\n+\t\t\t\t\t});\n+\n+\t\t\tresponseJSONObj.put(BulkUploadProcessConstants.FILE_HEADER_LIST, csvFileHeader);\n+\t\t\tresponseJSONObj.put(BulkUploadProcessConstants.FILE_TARGET_HEADER_LIST, userInfoFeildList);\n+\n+\t\t\tresponseJSONObj.put(BulkUploadProcessConstants.PROCESS_NAME, metaData.getProcessName());\n+\t\t\tlog.debug(\"Process Name \" + metaData.getProcessName());\n+\t\t\tsession.setAttribute(metaData.getProcessName(), responseString);\n+\t\t\tlog.info(\"createBulkUploadNewProcess method Ended in  \" + this.getClass());\n+\t\t} catch (JSONException | IOException | ManageUsersException ex) {\n+\t\t\tlog.error(\"JSONException or SystemAdminMangerUserException or IOException in createBulkUploadNewProcess \"\n+\t\t\t\t\t+ ex.getMessage());\n+\t\t\tthrow new BulkUploadProcessException(\n+\t\t\t\t\tBulkUploadProcessConstants.ERROR_IN_PROCESSING_THE_JSON_OBJECT + ex.getMessage());\n+\t\t}\n+\t\treturn responseJSONObj.toString();\n+\n+\t}\n+\n+\tpublic String createBulkUploadProcessMapping(String bulkUploadMappingJSON) throws BulkUploadProcessException {\n+\t\tlog.info(\"createBulkUploadProcessMapping method started in  \" + this.getClass());\n+\t\tJSONObject responseJSONObject = null;\n+\n+\t\ttry {\n+\t\t\tObjectMapper objectMapper = new ObjectMapper();\n+\n+\t\t\tresponseJSONObject = new JSONObject();\n+\t\t\t// convert into JSONObject.\n+\t\t\tJSONObject mappingJSONObject = new JSONObject(bulkUploadMappingJSON);\n+\n+\t\t\tString templateObj = (String) session\n+\t\t\t\t\t.getAttribute(mappingJSONObject.getString(BulkUploadProcessConstants.PROCESS_NAME));\n+\n+\t\t\tJSONObject templateJSONObj = new JSONObject(templateObj);\n+\n+\t\t\t// get the mapping object.\n+\t\t\tList<Map<String, String>> mappingList = objectMapper.readValue(\n+\t\t\t\t\tmappingJSONObject.getJSONArray(BulkUploadProcessConstants.MAPPING_BULK_ARRAY).toString(),\n+\t\t\t\t\tnew TypeReference<List<Map<String, String>>>() {\n+\t\t\t\t\t});\n+\t\t\t// get the user sample File List.\n+\t\t\tList<Map<String, String>> usersList = objectMapper.readValue(\n+\t\t\t\t\ttemplateJSONObj.getJSONObject(BulkUploadProcessConstants.TEMPLATE_SAMPLE_FILE_CONTENT)\n+\t\t\t\t\t\t\t.getJSONArray(BulkUploadProcessConstants.SAMPLE_FILE_USER_LIST).toString(),\n+\t\t\t\t\tnew TypeReference<List<Map<String, String>>>() {\n+\t\t\t\t\t});\n+\n+\t\t\tList<Map<String, String>> usersListNew = new ArrayList<Map<String, String>>();\n+\n+\t\t\t// shuffle and map the mapping object target fields and sample file\n+\t\t\t// list users.\n+\t\t\tusersList.stream().forEach(userListMap -> {\n+\n+\t\t\t\tMap<String, String> userListMapNew = new LinkedHashMap<String, String>();\n+\n+\t\t\t\tmappingList.stream().forEach(mapping -> {\n+\n+\t\t\t\t\tuserListMapNew.put(mapping.get(BulkUploadProcessConstants.TARGET_FIELD_NAME),\n+\t\t\t\t\t\t\tuserListMap.get(mapping.get(BulkUploadProcessConstants.SOURCE_FIELD_NAME)));\n+\n+\t\t\t\t});\n+\n+\t\t\t\tusersListNew.add(userListMapNew);\n+\n+\t\t\t});\n+\n+\t\t\tList<String> targetFieldHeaderList = mappingList.stream()\n+\t\t\t\t\t.map(mapping -> mapping.get(BulkUploadProcessConstants.TARGET_FIELD_NAME))\n+\t\t\t\t\t.collect(Collectors.toList());\n+\n+\t\t\t// set the newly mapped sample File users list into json object.\n+\t\t\ttemplateJSONObj.getJSONObject(BulkUploadProcessConstants.TEMPLATE_SAMPLE_FILE_CONTENT)\n+\t\t\t\t\t.put(BulkUploadProcessConstants.SAMPLE_FILE_USER_LIST, usersListNew);\n+\t\t\t// set the mapping object into json object.\n+\t\t\ttemplateJSONObj.getJSONObject(BulkUploadProcessConstants.TEMPLATE_PROCESS_META_DATA)\n+\t\t\t\t\t.put(BulkUploadProcessConstants.BULK_UPLOAD_PROCESS_MAPPING, mappingList);\n+\n+\t\t\t// store the json object into session object.\n+\t\t\tsession.setAttribute(mappingJSONObject.getString(BulkUploadProcessConstants.PROCESS_NAME),\n+\t\t\t\t\ttemplateJSONObj.toString());\n+\n+\t\t\tresponseJSONObject.put(BulkUploadProcessConstants.PROCESS_NAME,\n+\t\t\t\t\tmappingJSONObject.getString(BulkUploadProcessConstants.PROCESS_NAME));\n+\t\t\tresponseJSONObject.put(BulkUploadProcessConstants.SAMPLE_FILE_USER_LIST, usersListNew);\n+\t\t\tresponseJSONObject.put(BulkUploadProcessConstants.TARGET_FIELD_HEADER_LIST, targetFieldHeaderList);\n+\n+\t\t\tlog.info(\"createBulkUploadProcessMapping method Ended in  \" + this.getClass());\n+\t\t} catch (JSONException | IOException ex) {\n+\t\t\tlog.error(\"JSONException or IOException in createBulkUploadProcessMapping \" + ex.getMessage());\n+\t\t\tthrow new BulkUploadProcessException(\n+\t\t\t\t\tBulkUploadProcessConstants.ERROR_IN_PROCESSING_THE_JSON_OBJECT + ex.getMessage());\n+\t\t}\n+\t\treturn responseJSONObject.toString();\n+\t}\n+\n+\tpublic String saveBulkUploadProcess(String bulkUploadMappingJSON) throws BulkUploadProcessException {\n+\t\tlog.info(\"saveBulkUploadProcess method Started in  \" + this.getClass());\n+\t\tString responseString = null;\n+\t\ttry {\n+\t\t\tJSONObject requestProcessObj = new JSONObject(bulkUploadMappingJSON);\n+\n+\t\t\tString processSessionObj = (String) session\n+\t\t\t\t\t.getAttribute(requestProcessObj.getString(BulkUploadProcessConstants.PROCESS_NAME));\n+\t\t\tresponseString = bulkUploadProcessService.saveBulkUploadProcess(processSessionObj);\n+\t\t\tlog.info(\"saveBulkUploadProcess method Ended in  \" + this.getClass());\n+\t\t} catch (Exception ex) {\n+\t\t\tlog.error(\"Exception occurred in saveBulkUploadProcess  \" + ex.getMessage());\n+\t\t\tthrow new BulkUploadProcessException(\"Error in saving json object\" + ex.getMessage());\n+\t\t}\n+\t\treturn responseString;\n+\t}\n+\n+\tpublic String viewProcessUserDetails(String viewProcessDetails) throws BulkUploadProcessException {\n+\n+\t\tlog.info(\"viewProcessUserDetails method Started in  \" + this.getClass());\n+\n+\t\tString viewProcessUserDetails = null;\n+\t\ttry {\n+\n+\t\t\tviewProcessUserDetails = bulkUploadProcessService.viewProcessUserDetails(viewProcessDetails);\n+\t\t\tlog.debug(\"ViewProcessUserDetails \" + viewProcessUserDetails);\n+\n+\t\t\tlog.info(\"viewProcessUserDetails method Ended in  \" + this.getClass());\n+\t\t} catch (Exception ex) {\n+\t\t\tlog.error(\"Exception Occurred in viewProcessUserDetails \" + ex.getMessage());\n+\t\t\tthrow new BulkUploadProcessException(\"Error getting object from DataBase\" + ex.getMessage());\n+\n+\t\t}\n+\t\treturn viewProcessUserDetails;\n+\t}\n+\n+\tpublic String deleteBulkUploadProcessTemplate(String bulkUploadTemplateDetails) throws BulkUploadProcessException {\n+\n+\t\tlog.info(\"deleteBulkUploadProcessTemplate method Started in  \" + this.getClass());\n+\t\tString responseObj = null;\n+\t\ttry {\n+\n+\t\t\tresponseObj = bulkUploadProcessService.deleteBulkUploadProcessTemplate(bulkUploadTemplateDetails);\n+\t\t\tlog.debug(\"deleteBulkUploadProcessTemplate responseObj \" + responseObj);\n+\t\t\tlog.info(\"deleteBulkUploadProcessTemplate method Ended in  \" + this.getClass());\n+\t\t} catch (Exception ex) {\n+\t\t\tlog.error(\"Exception Occurred in deleteBulkUploadProcessTemplate \" + ex.getMessage());\n+\t\t\tthrow new BulkUploadProcessException(\"Error deleting object from DataBase\" + ex.getMessage());\n+\t\t}\n+\t\treturn responseObj;\n+\n+\t}\n+\n+\tpublic String editBulkUploadProcess(String bulkUploadTemplateDetails) throws BulkUploadProcessException {\n+\t\tlog.info(\"editBulkUploadProcess method Started in  \" + this.getClass());\n+\t\tString responseObj = null;\n+\t\ttry {\n+\n+\t\t\tresponseObj = bulkUploadProcessService.editBulkUploadProcess(bulkUploadTemplateDetails);\n+\t\t\tlog.debug(\"editBulkUploadProcess responseObj \" + responseObj);\n+\t\t\tlog.info(\"editBulkUploadProcess method Ended in  \" + this.getClass());\n+\t\t} catch (Exception ex) {\n+\t\t\tex.printStackTrace();\n+\t\t\tlog.error(\"Exception Occurred in editBulkUploadProcess \" + ex.getMessage());\n+\t\t\tthrow new BulkUploadProcessException(\"Error getting object from DataBase\" + ex.getMessage());\n+\t\t}\n+\t\treturn responseObj;\n+\t}\n+\n+\tpublic String uploadProcessTemplateFile(String templateProcessDetails, MultipartFile uploadfile)\n+\t\t\tthrows BulkUploadProcessException {\n+\t\tlog.info(\"uploadProcessTemplateFile method Started in  \" + this.getClass());\n+\t\tJSONObject responseJSONObj = null;\n+\t\tJSONObject requestJSONObj = null;\n+\t\tString uploadPath = csvFilePath;\n+\t\tString underScore = \"_\";\n+\t\ttry {\n+\t\t\trequestJSONObj = new JSONObject(templateProcessDetails);\n+\t\t\tresponseJSONObj = new JSONObject();\n+\t\t\tif (uploadfile.isEmpty()) {\n+\n+\t\t\t\tresponseJSONObj.put(BulkUploadProcessConstants.ERROR_CODE, \"500\");\n+\t\t\t\tresponseJSONObj.put(BulkUploadProcessConstants.ERROR_MSG,\n+\t\t\t\t\t\tBulkUploadProcessConstants.PLEASE_SELECT_A_FILE);\n+\n+\t\t\t} else {\n+\t\t\t\tbyte[] bytes = uploadfile.getBytes();\n+\t\t\t\tString[] fileNameArray = uploadfile.getOriginalFilename().split(\"\\\\.\");\n+\t\t\t\tString timeStamp = new SimpleDateFormat(\"yyyyMMddHHmmss\").format(new Date());\n+\t\t\t\tPath path = Paths\n+\t\t\t\t\t\t.get(uploadPath + \"//\" + fileNameArray[0] + underScore + timeStamp + \".\" + fileNameArray[1]);\n+\t\t\t\tlog.debug(\"csvFilePath \" + path.toString());\n+\t\t\t\tFiles.write(path, bytes);\n+\t\t\t\trequestJSONObj.put(BulkUploadProcessConstants.FILE_CREATED_TIME_STAMP, timeStamp);\n+\t\t\t\trequestJSONObj.put(BulkUploadProcessConstants.FILE_NAME, uploadfile.getOriginalFilename());\n+\t\t\t\trequestJSONObj.put(BulkUploadProcessConstants.FILE_PROCESS_STATUS, BulkUploadProcessConstants.RECEIVED);\n+\t\t\t\tbulkUploadProcessService.uploadProcessTemplateFile(requestJSONObj.toString());\n+\t\t\t\tresponseJSONObj.put(BulkUploadProcessConstants.MESSAGE,\n+\t\t\t\t\t\tBulkUploadProcessConstants.FILE_UPLOADED_SUCCESSFULLY);\n+\t\t\t\tlog.info(\"uploadProcessTemplateFile method Ended in  \" + this.getClass());\n+\t\t\t}\n+\n+\t\t} catch (Exception ex) {\n+\t\t\tex.printStackTrace();\n+\t\t\tlog.error(\"Exception Occurred in uploadProcessTemplateFile \" + ex.getMessage());\n+\t\t\tthrow new BulkUploadProcessException(BulkUploadProcessConstants.ERROR_IN_UPLOADING_FILES + ex.getMessage());\n+\t\t}\n+\t\treturn responseJSONObj.toString();\n+\t}\n+\n+\tpublic byte[] convertBase64toByteArray(String CSVString) {\n+\n+\t\treturn Base64.decodeBase64(CSVString);\n+\t}\n+\n+\tpublic List<Map<String, String>> getCSVByteArraytoList(byte[] byteArrayCSV, BulkUploadProcessBean processBean) {\n+\t\tlog.info(\"getCSVByteArraytoList method Started in  \" + this.getClass());\n+\t\tCsvMapper csvMapper = new CsvMapper();\n+\t\tCsvSchema schema = CsvSchema.emptySchema().withHeader();\n+\t\tList<Map<String, String>> usersList = null;\n+\t\ttry {\n+\n+\t\t\tif (processBean.getFileUploadOption().equals(BulkUploadProcessConstants.WITH_OUT_HEADER)) {\n+\t\t\t\tint index = 0;\n+\t\t\t\tList<String> readValue = csvMapper.readValue(byteArrayCSV, List.class);\n+\n+\t\t\t\tCsvSchema.Builder schemaBuilder = CsvSchema.builder();\n+\t\t\t\tfor (String col : readValue) {\n+\t\t\t\t\tschemaBuilder.addColumn(String.valueOf(index++));\n+\t\t\t\t}\n+\t\t\t\tschema = schemaBuilder.build();\n+\t\t\t}\n+\n+\t\t\tMappingIterator<Map<String, String>> mappingIterator = csvMapper.readerFor(Map.class).with(schema)\n+\t\t\t\t\t.readValues(byteArrayCSV);\n+\n+\t\t\tusersList = mappingIterator.readAll();\n+\t\t\tlog.info(\"getCSVByteArraytoList method Ended in  \" + this.getClass());\n+\n+\t\t} catch (JsonProcessingException e) {\n+\t\t\tlog.error(\"JsonProcessingException Occurred in getCSVByteArraytoList \" + e.getMessage());\n+\t\t\te.printStackTrace();\n+\t\t} catch (IOException e) {\n+\t\t\tlog.error(\"IOException Occurred in getCSVByteArraytoList \" + e.getMessage());\n+\t\t\te.printStackTrace();\n+\t\t}\n+\t\treturn usersList;\n+\t}\n+\n+\t@SuppressWarnings(\"unchecked\")\n+\tpublic List<Map<String, String>> getCSVFileHeader(byte[] byteArrayCSV, BulkUploadProcessBean processBean) {\n+\t\tlog.info(\"getCSVFileHeader method Started in  \" + this.getClass());\n+\t\tCsvMapper csvMapper = new CsvMapper();\n+\t\tList<String> readValue = null;","path":"ppms-root/app/ppms-service/src/main/java/com/sureit/ppm/controller/helper/BulkUploadProcessHelper.java","position":348,"original_position":348,"commit_id":"7784b3c4af2ceec6df335313363d5e12bfa052f1","original_commit_id":"7784b3c4af2ceec6df335313363d5e12bfa052f1","user":{"login":"badgujar","id":20929346,"avatar_url":"https://avatars3.githubusercontent.com/u/20929346?v=4","gravatar_id":"","url":"https://api.github.com/users/badgujar","html_url":"https://github.com/badgujar","followers_url":"https://api.github.com/users/badgujar/followers","following_url":"https://api.github.com/users/badgujar/following{/other_user}","gists_url":"https://api.github.com/users/badgujar/gists{/gist_id}","starred_url":"https://api.github.com/users/badgujar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/badgujar/subscriptions","organizations_url":"https://api.github.com/users/badgujar/orgs","repos_url":"https://api.github.com/users/badgujar/repos","events_url":"https://api.github.com/users/badgujar/events{/privacy}","received_events_url":"https://api.github.com/users/badgujar/received_events","type":"User","site_admin":false},"body":"readValue -> valueList","created_at":"2018-04-12T04:24:24Z","updated_at":"2018-04-12T04:39:01Z","html_url":"https://github.com/Sureit/ppms/pull/68#discussion_r180961877","pull_request_url":"https://api.github.com/repos/Sureit/ppms/pulls/68","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/Sureit/ppms/pulls/comments/180961877"},"html":{"href":"https://github.com/Sureit/ppms/pull/68#discussion_r180961877"},"pull_request":{"href":"https://api.github.com/repos/Sureit/ppms/pulls/68"}}},"pull_request":{"url":"https://api.github.com/repos/Sureit/ppms/pulls/68","id":180906802,"html_url":"https://github.com/Sureit/ppms/pull/68","diff_url":"https://github.com/Sureit/ppms/pull/68.diff","patch_url":"https://github.com/Sureit/ppms/pull/68.patch","issue_url":"https://api.github.com/repos/Sureit/ppms/issues/68","number":68,"state":"open","locked":false,"title":"BulUpload Code Need to Merge With Master.","user":{"login":"NarayanaSSadhu","id":36761307,"avatar_url":"https://avatars3.githubusercontent.com/u/36761307?v=4","gravatar_id":"","url":"https://api.github.com/users/NarayanaSSadhu","html_url":"https://github.com/NarayanaSSadhu","followers_url":"https://api.github.com/users/NarayanaSSadhu/followers","following_url":"https://api.github.com/users/NarayanaSSadhu/following{/other_user}","gists_url":"https://api.github.com/users/NarayanaSSadhu/gists{/gist_id}","starred_url":"https://api.github.com/users/NarayanaSSadhu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NarayanaSSadhu/subscriptions","organizations_url":"https://api.github.com/users/NarayanaSSadhu/orgs","repos_url":"https://api.github.com/users/NarayanaSSadhu/repos","events_url":"https://api.github.com/users/NarayanaSSadhu/events{/privacy}","received_events_url":"https://api.github.com/users/NarayanaSSadhu/received_events","type":"User","site_admin":false},"body":"Please review and approve.","created_at":"2018-04-11T13:38:47Z","updated_at":"2018-04-12T04:39:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c24451dbd1ce4fad080d8cfb0ed824939a197204","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Sureit/ppms/pulls/68/commits","review_comments_url":"https://api.github.com/repos/Sureit/ppms/pulls/68/comments","review_comment_url":"https://api.github.com/repos/Sureit/ppms/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Sureit/ppms/issues/68/comments","statuses_url":"https://api.github.com/repos/Sureit/ppms/statuses/7784b3c4af2ceec6df335313363d5e12bfa052f1","head":{"label":"Sureit:NarayanaSadhu-03-08-2018","ref":"NarayanaSadhu-03-08-2018","sha":"7784b3c4af2ceec6df335313363d5e12bfa052f1","user":{"login":"Sureit","id":32353185,"avatar_url":"https://avatars3.githubusercontent.com/u/32353185?v=4","gravatar_id":"","url":"https://api.github.com/users/Sureit","html_url":"https://github.com/Sureit","followers_url":"https://api.github.com/users/Sureit/followers","following_url":"https://api.github.com/users/Sureit/following{/other_user}","gists_url":"https://api.github.com/users/Sureit/gists{/gist_id}","starred_url":"https://api.github.com/users/Sureit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sureit/subscriptions","organizations_url":"https://api.github.com/users/Sureit/orgs","repos_url":"https://api.github.com/users/Sureit/repos","events_url":"https://api.github.com/users/Sureit/events{/privacy}","received_events_url":"https://api.github.com/users/Sureit/received_events","type":"Organization","site_admin":false},"repo":{"id":105110645,"name":"ppms","full_name":"Sureit/ppms","owner":{"login":"Sureit","id":32353185,"avatar_url":"https://avatars3.githubusercontent.com/u/32353185?v=4","gravatar_id":"","url":"https://api.github.com/users/Sureit","html_url":"https://github.com/Sureit","followers_url":"https://api.github.com/users/Sureit/followers","following_url":"https://api.github.com/users/Sureit/following{/other_user}","gists_url":"https://api.github.com/users/Sureit/gists{/gist_id}","starred_url":"https://api.github.com/users/Sureit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sureit/subscriptions","organizations_url":"https://api.github.com/users/Sureit/orgs","repos_url":"https://api.github.com/users/Sureit/repos","events_url":"https://api.github.com/users/Sureit/events{/privacy}","received_events_url":"https://api.github.com/users/Sureit/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Sureit/ppms","description":null,"fork":false,"url":"https://api.github.com/repos/Sureit/ppms","forks_url":"https://api.github.com/repos/Sureit/ppms/forks","keys_url":"https://api.github.com/repos/Sureit/ppms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Sureit/ppms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Sureit/ppms/teams","hooks_url":"https://api.github.com/repos/Sureit/ppms/hooks","issue_events_url":"https://api.github.com/repos/Sureit/ppms/issues/events{/number}","events_url":"https://api.github.com/repos/Sureit/ppms/events","assignees_url":"https://api.github.com/repos/Sureit/ppms/assignees{/user}","branches_url":"https://api.github.com/repos/Sureit/ppms/branches{/branch}","tags_url":"https://api.github.com/repos/Sureit/ppms/tags","blobs_url":"https://api.github.com/repos/Sureit/ppms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Sureit/ppms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Sureit/ppms/git/refs{/sha}","trees_url":"https://api.github.com/repos/Sureit/ppms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Sureit/ppms/statuses/{sha}","languages_url":"https://api.github.com/repos/Sureit/ppms/languages","stargazers_url":"https://api.github.com/repos/Sureit/ppms/stargazers","contributors_url":"https://api.github.com/repos/Sureit/ppms/contributors","subscribers_url":"https://api.github.com/repos/Sureit/ppms/subscribers","subscription_url":"https://api.github.com/repos/Sureit/ppms/subscription","commits_url":"https://api.github.com/repos/Sureit/ppms/commits{/sha}","git_commits_url":"https://api.github.com/repos/Sureit/ppms/git/commits{/sha}","comments_url":"https://api.github.com/repos/Sureit/ppms/comments{/number}","issue_comment_url":"https://api.github.com/repos/Sureit/ppms/issues/comments{/number}","contents_url":"https://api.github.com/repos/Sureit/ppms/contents/{+path}","compare_url":"https://api.github.com/repos/Sureit/ppms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Sureit/ppms/merges","archive_url":"https://api.github.com/repos/Sureit/ppms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Sureit/ppms/downloads","issues_url":"https://api.github.com/repos/Sureit/ppms/issues{/number}","pulls_url":"https://api.github.com/repos/Sureit/ppms/pulls{/number}","milestones_url":"https://api.github.com/repos/Sureit/ppms/milestones{/number}","notifications_url":"https://api.github.com/repos/Sureit/ppms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Sureit/ppms/labels{/name}","releases_url":"https://api.github.com/repos/Sureit/ppms/releases{/id}","deployments_url":"https://api.github.com/repos/Sureit/ppms/deployments","created_at":"2017-09-28T06:30:40Z","updated_at":"2018-04-11T12:11:40Z","pushed_at":"2018-04-11T15:40:38Z","git_url":"git://github.com/Sureit/ppms.git","ssh_url":"git@github.com:Sureit/ppms.git","clone_url":"https://github.com/Sureit/ppms.git","svn_url":"https://github.com/Sureit/ppms","homepage":null,"size":68923,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":4,"license":null,"forks":0,"open_issues":4,"watchers":0,"default_branch":"master"}},"base":{"label":"Sureit:master","ref":"master","sha":"c5c2ea4be82a89cb3d3ceed5d1d3008d068b013a","user":{"login":"Sureit","id":32353185,"avatar_url":"https://avatars3.githubusercontent.com/u/32353185?v=4","gravatar_id":"","url":"https://api.github.com/users/Sureit","html_url":"https://github.com/Sureit","followers_url":"https://api.github.com/users/Sureit/followers","following_url":"https://api.github.com/users/Sureit/following{/other_user}","gists_url":"https://api.github.com/users/Sureit/gists{/gist_id}","starred_url":"https://api.github.com/users/Sureit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sureit/subscriptions","organizations_url":"https://api.github.com/users/Sureit/orgs","repos_url":"https://api.github.com/users/Sureit/repos","events_url":"https://api.github.com/users/Sureit/events{/privacy}","received_events_url":"https://api.github.com/users/Sureit/received_events","type":"Organization","site_admin":false},"repo":{"id":105110645,"name":"ppms","full_name":"Sureit/ppms","owner":{"login":"Sureit","id":32353185,"avatar_url":"https://avatars3.githubusercontent.com/u/32353185?v=4","gravatar_id":"","url":"https://api.github.com/users/Sureit","html_url":"https://github.com/Sureit","followers_url":"https://api.github.com/users/Sureit/followers","following_url":"https://api.github.com/users/Sureit/following{/other_user}","gists_url":"https://api.github.com/users/Sureit/gists{/gist_id}","starred_url":"https://api.github.com/users/Sureit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sureit/subscriptions","organizations_url":"https://api.github.com/users/Sureit/orgs","repos_url":"https://api.github.com/users/Sureit/repos","events_url":"https://api.github.com/users/Sureit/events{/privacy}","received_events_url":"https://api.github.com/users/Sureit/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Sureit/ppms","description":null,"fork":false,"url":"https://api.github.com/repos/Sureit/ppms","forks_url":"https://api.github.com/repos/Sureit/ppms/forks","keys_url":"https://api.github.com/repos/Sureit/ppms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Sureit/ppms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Sureit/ppms/teams","hooks_url":"https://api.github.com/repos/Sureit/ppms/hooks","issue_events_url":"https://api.github.com/repos/Sureit/ppms/issues/events{/number}","events_url":"https://api.github.com/repos/Sureit/ppms/events","assignees_url":"https://api.github.com/repos/Sureit/ppms/assignees{/user}","branches_url":"https://api.github.com/repos/Sureit/ppms/branches{/branch}","tags_url":"https://api.github.com/repos/Sureit/ppms/tags","blobs_url":"https://api.github.com/repos/Sureit/ppms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Sureit/ppms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Sureit/ppms/git/refs{/sha}","trees_url":"https://api.github.com/repos/Sureit/ppms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Sureit/ppms/statuses/{sha}","languages_url":"https://api.github.com/repos/Sureit/ppms/languages","stargazers_url":"https://api.github.com/repos/Sureit/ppms/stargazers","contributors_url":"https://api.github.com/repos/Sureit/ppms/contributors","subscribers_url":"https://api.github.com/repos/Sureit/ppms/subscribers","subscription_url":"https://api.github.com/repos/Sureit/ppms/subscription","commits_url":"https://api.github.com/repos/Sureit/ppms/commits{/sha}","git_commits_url":"https://api.github.com/repos/Sureit/ppms/git/commits{/sha}","comments_url":"https://api.github.com/repos/Sureit/ppms/comments{/number}","issue_comment_url":"https://api.github.com/repos/Sureit/ppms/issues/comments{/number}","contents_url":"https://api.github.com/repos/Sureit/ppms/contents/{+path}","compare_url":"https://api.github.com/repos/Sureit/ppms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Sureit/ppms/merges","archive_url":"https://api.github.com/repos/Sureit/ppms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Sureit/ppms/downloads","issues_url":"https://api.github.com/repos/Sureit/ppms/issues{/number}","pulls_url":"https://api.github.com/repos/Sureit/ppms/pulls{/number}","milestones_url":"https://api.github.com/repos/Sureit/ppms/milestones{/number}","notifications_url":"https://api.github.com/repos/Sureit/ppms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Sureit/ppms/labels{/name}","releases_url":"https://api.github.com/repos/Sureit/ppms/releases{/id}","deployments_url":"https://api.github.com/repos/Sureit/ppms/deployments","created_at":"2017-09-28T06:30:40Z","updated_at":"2018-04-11T12:11:40Z","pushed_at":"2018-04-11T15:40:38Z","git_url":"git://github.com/Sureit/ppms.git","ssh_url":"git@github.com:Sureit/ppms.git","clone_url":"https://github.com/Sureit/ppms.git","svn_url":"https://github.com/Sureit/ppms","homepage":null,"size":68923,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":4,"license":null,"forks":0,"open_issues":4,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Sureit/ppms/pulls/68"},"html":{"href":"https://github.com/Sureit/ppms/pull/68"},"issue":{"href":"https://api.github.com/repos/Sureit/ppms/issues/68"},"comments":{"href":"https://api.github.com/repos/Sureit/ppms/issues/68/comments"},"review_comments":{"href":"https://api.github.com/repos/Sureit/ppms/pulls/68/comments"},"review_comment":{"href":"https://api.github.com/repos/Sureit/ppms/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Sureit/ppms/pulls/68/commits"},"statuses":{"href":"https://api.github.com/repos/Sureit/ppms/statuses/7784b3c4af2ceec6df335313363d5e12bfa052f1"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"badgujar"}}