diff --git a/assessment-api/assessment-service/app/controllers/v4/QuestionController.scala b/assessment-api/assessment-service/app/controllers/v4/QuestionController.scala index fd56af44705b8a9b4f0d1e8aeb6155716247f1bd..8488016aaee3f8cf30a8b8086915e9c96081f33e 100644 --- a/assessment-api/assessment-service/app/controllers/v4/QuestionController.scala +++ b/assessment-api/assessment-service/app/controllers/v4/QuestionController.scala @@ -1,7 +1,6 @@ package controllers.v4 import akka.actor.{ActorRef, ActorSystem} -import com.twitter.util.Config.intoList import controllers.BaseController import handlers.{CompetencyExcelParser, QuestionExcelParser} import org.sunbird.common.dto.{Request, Response, ResponseHandler} @@ -16,207 +15,215 @@ import scala.concurrent.duration.Duration import scala.concurrent.{Await, ExecutionContext, Future} import org.slf4j.{Logger, LoggerFactory} import org.sunbird.cache.impl.RedisCache + +import java.util + class QuestionController @Inject()(@Named(ActorNames.QUESTION_ACTOR) questionActor: ActorRef, cc: ControllerComponents, actorSystem: ActorSystem)(implicit exec: ExecutionContext) extends BaseController(cc) { - val objectType = "Question" - val schemaName: String = "question" - val version = "1.0" - - private val logger: Logger = LoggerFactory.getLogger(RedisCache.getClass.getCanonicalName) - def create() = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, AnyRef]] - question.putAll(headers) - val questionRequest = getRequest(question, headers, QuestionOperations.createQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - getResult(ApiId.CREATE_QUESTION, questionActor, questionRequest) - } - - def read(identifier: String, mode: Option[String], fields: Option[String]) = Action.async { implicit request => - val headers = commonHeaders() - val question = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]] - question.putAll(headers) - question.putAll(Map("identifier" -> identifier, "fields" -> fields.getOrElse(""), "mode" -> mode.getOrElse("read")).asJava) - val questionRequest = getRequest(question, headers, QuestionOperations.readQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - getResult(ApiId.READ_QUESTION, questionActor, questionRequest) - } - - def privateRead(identifier: String, mode: Option[String], fields: Option[String]) = Action.async { implicit request => - val headers = commonHeaders() - val question = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]] - question.putAll(headers) - question.putAll(Map("identifier" -> identifier, "fields" -> fields.getOrElse(""), "mode" -> mode.getOrElse("read")).asJava) - val questionRequest = getRequest(question, headers, QuestionOperations.readPrivateQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - getResult(ApiId.READ_PRIVATE_QUESTION, questionActor, questionRequest) - } - - def update(identifier: String) = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; - question.putAll(headers) - val questionRequest = getRequest(question, headers, QuestionOperations.updateQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - questionRequest.getContext.put("identifier", identifier) - getResult(ApiId.UPDATE_QUESTION, questionActor, questionRequest) - } - - def review(identifier: String) = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; - question.putAll(headers) - val questionRequest = getRequest(question, headers, QuestionOperations.reviewQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - questionRequest.getContext.put("identifier", identifier) - getResult(ApiId.REVIEW_QUESTION, questionActor, questionRequest) - } - - def publish(identifier: String) = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; - question.putAll(headers) - val questionRequest = getRequest(question, headers, QuestionOperations.publishQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - questionRequest.getContext.put("identifier", identifier) - getResult(ApiId.PUBLISH_QUESTION, questionActor, questionRequest) - } - - def retire(identifier: String) = Action.async { implicit request => - val headers = commonHeaders() - val question = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]] - question.putAll(headers) - val questionRequest = getRequest(question, headers, QuestionOperations.retireQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - questionRequest.getContext.put("identifier", identifier) - getResult(ApiId.RETIRE_QUESTION, questionActor, questionRequest) - } - - def importQuestion() = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - body.putAll(headers) - val questionRequest = getRequest(body, headers, QuestionOperations.importQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - getResult(ApiId.IMPORT_QUESTION, questionActor, questionRequest) - } - - def systemUpdate(identifier: String) = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val content = body.getOrDefault(schemaName, new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; - content.putAll(headers) - val questionRequest = getRequest(content, headers, QuestionOperations.systemUpdateQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - questionRequest.getContext.put("identifier", identifier); - getResult(ApiId.SYSTEM_UPDATE_QUESTION, questionActor, questionRequest) - } - - def list(fields: Option[String]) = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val question = body.getOrDefault("search", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; - question.putAll(headers) - question.put("fields", fields.getOrElse("")) - val questionRequest = getRequest(question, headers, QuestionOperations.listQuestions.toString) - questionRequest.put("identifiers", questionRequest.get("identifier")) - setRequestContext(questionRequest, version, objectType, schemaName) - getResult(ApiId.LIST_QUESTIONS, questionActor, questionRequest) - } - - def reject(identifier: String) = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val question = body.getOrDefault(schemaName, new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; - question.putAll(headers) - val questionRequest = getRequest(question, headers, QuestionOperations.rejectQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - questionRequest.getContext.put("identifier", identifier) - getResult(ApiId.REJECT_QUESTION, questionActor, questionRequest) - } - - def copy(identifier: String, mode: Option[String]) = Action.async { implicit request => - val headers = commonHeaders() - val body = requestBody() - val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; - question.putAll(headers) - question.putAll(Map("identifier" -> identifier, "mode" -> mode.getOrElse(""), "copyType" -> AssessmentConstants.COPY_TYPE_DEEP).asJava) - val questionRequest = getRequest(question, headers, QuestionOperations.copyQuestion.toString) - setRequestContext(questionRequest, version, objectType, schemaName) - getResult(ApiId.COPY_QUESTION, questionActor, questionRequest) - } - - //Create question by uploading excel file - def uploadExcel() = Action(parse.multipartFormData) { implicit request => - logger.info("Inside upload excel") - val competency = request.body - .file("file") - .map { filePart => - val absolutePath = filePart.ref.path.toAbsolutePath - CompetencyExcelParser.getCompetency(absolutePath.toFile) - } - - val questions = request.body - .file("file") - .map { filePart => - val absolutePath = filePart.ref.path.toAbsolutePath - QuestionExcelParser.getQuestions(absolutePath.toFile) - } - logger.info("questions after parsing "+questions) - val futures = questions.get.map(question => { - val headers = commonHeaders(request.headers) - question.putAll(headers) - logger.info("put headers "+headers) - val questionRequest = getRequest(question, headers, QuestionOperations.createQuestion.toString) - logger.info("After the questionRequest") - setRequestContext(questionRequest, version, objectType, schemaName) - logger.info("After the setRequestContext") - getResponse(ApiId.CREATE_QUESTION, questionActor, questionRequest) - } - ) - logger.info("After the getResponse") - val f = Future.sequence(futures).map(results => results.map(_.asInstanceOf[Response]).groupBy(_.getResponseCode.toString).mapValues(listResult => { - listResult.map(result => { - setResponseEnvelope(result) - JavaJsonUtils.serialize(result.getResult) - }) - })).map(f => Ok(Json.stringify(Json.toJson(f))).as("application/json")) - logger.info("in Future sequence") - Await.result(f, Duration.apply("30s")) - } - - def createFrameworkMappingData() = Action(parse.multipartFormData) { implicit request => - val competency = request.body - .file("file") - .map { filePart => - val absolutePath = filePart.ref.path.toAbsolutePath - CompetencyExcelParser.getCompetency(absolutePath.toFile) - } - val futures = competency.get.map(competncy => { - val headers = commonHeaders(request.headers) - competncy.putAll(headers) - logger.info("put headers " + headers) - val questionRequest = getRequest(competncy, headers, QuestionOperations.createQuestion.toString) - logger.info("After the questionRequest") - setRequestContext(questionRequest, version, objectType, schemaName) - logger.info("After the setRequestContext") - getResponse(ApiId.CREATE_QUESTION, questionActor, questionRequest) - } - ) - val headers = commonHeaders(request.headers) - System.out.println("Headers is " + headers) - val body = requestBody() - System.out.println("body is " + body) - val question = body.getOrDefault("competency", new java.util.HashMap()).asInstanceOf[java.util.Map[String, AnyRef]] - question.putAll(headers) - val questionRequest = getRequest(question, headers, QuestionOperations.bulkUploadFrameworkMapping.toString) - setRequestContext(questionRequest, version, "competency", "competency") - getResult(ApiId.FRAMEWORK_COMPETENCY_QUESTION, questionActor, questionRequest) - //[request.type] - } + val objectType = "Question" + val schemaName: String = "question" + val version = "1.0" + + private val logger: Logger = LoggerFactory.getLogger(RedisCache.getClass.getCanonicalName) + + def create() = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, AnyRef]] + question.putAll(headers) + val questionRequest = getRequest(question, headers, QuestionOperations.createQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + getResult(ApiId.CREATE_QUESTION, questionActor, questionRequest) + } + + def read(identifier: String, mode: Option[String], fields: Option[String]) = Action.async { implicit request => + val headers = commonHeaders() + val question = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]] + question.putAll(headers) + question.putAll(Map("identifier" -> identifier, "fields" -> fields.getOrElse(""), "mode" -> mode.getOrElse("read")).asJava) + val questionRequest = getRequest(question, headers, QuestionOperations.readQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + getResult(ApiId.READ_QUESTION, questionActor, questionRequest) + } + + def privateRead(identifier: String, mode: Option[String], fields: Option[String]) = Action.async { implicit request => + val headers = commonHeaders() + val question = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]] + question.putAll(headers) + question.putAll(Map("identifier" -> identifier, "fields" -> fields.getOrElse(""), "mode" -> mode.getOrElse("read")).asJava) + val questionRequest = getRequest(question, headers, QuestionOperations.readPrivateQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + getResult(ApiId.READ_PRIVATE_QUESTION, questionActor, questionRequest) + } + + def update(identifier: String) = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; + question.putAll(headers) + val questionRequest = getRequest(question, headers, QuestionOperations.updateQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + questionRequest.getContext.put("identifier", identifier) + getResult(ApiId.UPDATE_QUESTION, questionActor, questionRequest) + } + + def review(identifier: String) = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; + question.putAll(headers) + val questionRequest = getRequest(question, headers, QuestionOperations.reviewQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + questionRequest.getContext.put("identifier", identifier) + getResult(ApiId.REVIEW_QUESTION, questionActor, questionRequest) + } + + def publish(identifier: String) = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; + question.putAll(headers) + val questionRequest = getRequest(question, headers, QuestionOperations.publishQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + questionRequest.getContext.put("identifier", identifier) + getResult(ApiId.PUBLISH_QUESTION, questionActor, questionRequest) + } + + def retire(identifier: String) = Action.async { implicit request => + val headers = commonHeaders() + val question = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]] + question.putAll(headers) + val questionRequest = getRequest(question, headers, QuestionOperations.retireQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + questionRequest.getContext.put("identifier", identifier) + getResult(ApiId.RETIRE_QUESTION, questionActor, questionRequest) + } + + def importQuestion() = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + body.putAll(headers) + val questionRequest = getRequest(body, headers, QuestionOperations.importQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + getResult(ApiId.IMPORT_QUESTION, questionActor, questionRequest) + } + + def systemUpdate(identifier: String) = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val content = body.getOrDefault(schemaName, new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; + content.putAll(headers) + val questionRequest = getRequest(content, headers, QuestionOperations.systemUpdateQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + questionRequest.getContext.put("identifier", identifier); + getResult(ApiId.SYSTEM_UPDATE_QUESTION, questionActor, questionRequest) + } + + def list(fields: Option[String]) = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val question = body.getOrDefault("search", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; + question.putAll(headers) + question.put("fields", fields.getOrElse("")) + val questionRequest = getRequest(question, headers, QuestionOperations.listQuestions.toString) + questionRequest.put("identifiers", questionRequest.get("identifier")) + setRequestContext(questionRequest, version, objectType, schemaName) + getResult(ApiId.LIST_QUESTIONS, questionActor, questionRequest) + } + + def reject(identifier: String) = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val question = body.getOrDefault(schemaName, new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; + question.putAll(headers) + val questionRequest = getRequest(question, headers, QuestionOperations.rejectQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + questionRequest.getContext.put("identifier", identifier) + getResult(ApiId.REJECT_QUESTION, questionActor, questionRequest) + } + + def copy(identifier: String, mode: Option[String]) = Action.async { implicit request => + val headers = commonHeaders() + val body = requestBody() + val question = body.getOrDefault("question", new java.util.HashMap()).asInstanceOf[java.util.Map[String, Object]]; + question.putAll(headers) + question.putAll(Map("identifier" -> identifier, "mode" -> mode.getOrElse(""), "copyType" -> AssessmentConstants.COPY_TYPE_DEEP).asJava) + val questionRequest = getRequest(question, headers, QuestionOperations.copyQuestion.toString) + setRequestContext(questionRequest, version, objectType, schemaName) + getResult(ApiId.COPY_QUESTION, questionActor, questionRequest) + } + + //Create question by uploading excel file + def uploadExcel() = Action(parse.multipartFormData) { implicit request => + logger.info("Inside upload excel") + val questions = request.body + .file("file") + .map { filePart => + val absolutePath = filePart.ref.path.toAbsolutePath + QuestionExcelParser.getQuestions(absolutePath.toFile) + } + logger.info("questions after parsing " + questions) + val futures = questions.get.map(question => { + val headers = commonHeaders(request.headers) + question.putAll(headers) + logger.info("put headers " + headers) + val questionRequest = getRequest(question, headers, QuestionOperations.createQuestion.toString) + logger.info("After the questionRequest") + setRequestContext(questionRequest, version, objectType, schemaName) + logger.info("After the setRequestContext") + getResponse(ApiId.CREATE_QUESTION, questionActor, questionRequest) + } + ) + logger.info("After the getResponse") + val f = Future.sequence(futures).map(results => results.map(_.asInstanceOf[Response]).groupBy(_.getResponseCode.toString).mapValues(listResult => { + listResult.map(result => { + setResponseEnvelope(result) + JavaJsonUtils.serialize(result.getResult) + }) + })).map(f => Ok(Json.stringify(Json.toJson(f))).as("application/json")) + logger.info("in Future sequence") + Await.result(f, Duration.apply("30s")) + } + + def createFrameworkMappingData() = Action(parse.multipartFormData) { implicit request => + val competency = request.body + .file("file") + .map { filePart => + val absolutePath = filePart.ref.path.toAbsolutePath + println("createFrameworkMappingData:= "+absolutePath) + // CompetencyExcelParser.getExcelData(absolutePath.toFile) + CompetencyExcelParser.getCompetency(absolutePath.toFile) + } + val futures = competency.get.map(competncy => { + val headers = commonHeaders(request.headers) + logger.info("put headers " + headers) + val questionRequest = getRequest(competncy, headers, QuestionOperations.createQuestion.toString) + logger.info("After the questionRequest") + setRequestContext(questionRequest, version, objectType, schemaName) + logger.info("After the setRequestContext") + getResponse(ApiId.CREATE_QUESTION, questionActor, questionRequest) + } + ) + val headers = commonHeaders(request.headers) + System.out.println("Headers is " + headers) + val body = competencyRequestBody() + //val body = requestBody() + System.out.println("body is " + body) + val question = body.getOrDefault("competency", new java.util.HashMap()).asInstanceOf[java.util.Map[String, AnyRef]] + question.putAll(headers) + val questionRequest = getRequest(question, headers, QuestionOperations.bulkUploadFrameworkMapping.toString) + setRequestContext(questionRequest, version, "competency", "competency") + getResult(ApiId.FRAMEWORK_COMPETENCY_QUESTION, questionActor, questionRequest) + + logger.info("After the getResponse") + val f = Future.sequence(futures).map(results => results.map(_.asInstanceOf[Response]).groupBy(_.getResponseCode.toString).mapValues(listResult => { + listResult.map(result => { + setResponseEnvelope(result) + JavaJsonUtils.serialize(result.getResult) + }) + })).map(f => Ok(Json.stringify(Json.toJson(f))).as("application/json")) + logger.info("in Future sequence") + Await.result(f, Duration.apply("30s")) + } } diff --git a/assessment-api/assessment-service/app/handlers/CompetencyExcelParser.scala b/assessment-api/assessment-service/app/handlers/CompetencyExcelParser.scala index 22e36fa78e09d495031112c496c3c5c6c937d845..194215b0ecee350706acd1908e581251fc6250d5 100644 --- a/assessment-api/assessment-service/app/handlers/CompetencyExcelParser.scala +++ b/assessment-api/assessment-service/app/handlers/CompetencyExcelParser.scala @@ -1,9 +1,13 @@ package handlers +import org.apache.poi.ss.usermodel.DataFormatter import org.apache.poi.xssf.usermodel.{XSSFRow, XSSFSheet, XSSFWorkbook} import org.slf4j.{Logger, LoggerFactory} import java.io.{File, FileInputStream} +import java.util +import scala.collection.JavaConverters.{asScalaIteratorConverter, iterableAsScalaIterableConverter, mapAsScalaMapConverter} +import scala.collection.mutable import scala.collection.mutable.ListBuffer case class Activity(code: String, label: String) @@ -12,104 +16,155 @@ object CompetencyExcelParser { private val logger: Logger = LoggerFactory.getLogger(getClass.getName) - private var getData = new java.util.HashMap().asInstanceOf[ListBuffer[List[java.util.Map[String, Activity]]]] - - private var yearData = new java.util.HashMap().asInstanceOf[List[java.util.Map[String, Activity]]] - + private var getData: List[util.Map[String, AnyRef]] = List.empty def parseCompetencyData(xssFRow: XSSFRow) = { - val competency = new java.util.HashMap().asInstanceOf[java.util.Map[String, Activity]] + val data = new java.util.HashMap().asInstanceOf[java.util.Map[String, AnyRef]] + val listData = new util.ArrayList[AnyRef]() val rowContent = (0 until xssFRow.getPhysicalNumberOfCells) .map(colId => Option(xssFRow.getCell(colId)).getOrElse("").toString).toList - val activityCode = rowContent.apply(0).trim - val activityLabel = rowContent.apply(1).trim - val questionCode = rowContent.apply(2).trim - val activityDetails = Activity(activityCode, activityLabel) - competency.put(questionCode, activityDetails) - competency + val function = rowContent.apply(0).trim + val year = rowContent.apply(1).trim + val roleId = rowContent.apply(2).trim + val roleLabel = rowContent.apply(3).trim + val competencyMapping = rowContent.apply(4).trim + val activityId = rowContent.apply(5).trim + val activityLabel = rowContent.apply(6).trim + val competencyId= rowContent.apply(7).trim + val competency = rowContent.apply(8).trim + val competencyLevelId = rowContent.apply(9).trim + listData.add(function) + listData.add(year) + listData.add(roleId) + listData.add(roleLabel) + listData.add(activityId) + listData.add(activityLabel) + listData.add(competencyId) + listData.add(competency) + listData.add(competencyLevelId) + //val competencyLevel = rowContent.apply(2).trim + data.put(competencyMapping, listData) + data } - def getCompetenciesData(sheet: XSSFSheet, yearWiseEntries: ListBuffer[List[java.util.Map[String, Activity]]]) = { - logger.info("Inside the getCompetenciesData") - val sheetName = sheet.getSheetName.toLowerCase() - if (sheetName.startsWith("competencies")) { - logger.info("Inside the competencies sheet") - getData = { - (1 until sheet.getPhysicalNumberOfRows) - .filter(rowNum => { - val oRow = Option(sheet.getRow(rowNum)) - oRow match { - case Some(x) => { - val competencyBoolean = sheet.getRow(rowNum).getCell(4) - boolean2Boolean("CDM".equals(competencyBoolean.toString)) - } - case None => false - } - }).map(rowNum => parseCompetencyData(sheet.getRow(rowNum))).toList + + /*def getCompetenciesData1(sheet: XSSFSheet): List[util.Map[String, AnyRef]] = { + val column = sheet.asScala.drop(1).map(row => + if (sheet.getWorkbook.getSheetIndex(sheet) == 1 || sheet.getWorkbook.getSheetIndex(sheet) == 8) + row.getCell(4) + else + row.getCell(5) + ) + + val formatter = new DataFormatter() + val uniqueCompetencies = column.map(cell => formatter.formatCellValue(cell)).toList + + val rows = sheet.asScala.drop(1) + getData = rows.flatMap(row => { + val cell = if (sheet.getWorkbook.getSheetIndex(sheet) == 1 || sheet.getWorkbook.getSheetIndex(sheet) == 8) + row.getCell(4) + else + row.getCell(5) + if (cell != null && uniqueCompetencies.contains(cell.getStringCellValue)) { + //if(row.getCell(1)!=null||row.getCell(2)!=null||row.getCell(2)!=null||row.getCell(4)!=null||row.getCell(5)!=null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + } else { + None } - } + }).toList getData - } + }*/ + def getCompetency(file: File): List[java.util.Map[String, AnyRef]] = { + logger.info("enter into the getCompetency method") + val finalData: mutable.Map[String, List[Map[String, AnyRef]]] = mutable.Map.empty + try { + val workbook = new XSSFWorkbook(new FileInputStream(file)) + (1 until workbook.getNumberOfSheets) + .foreach(index => { + // if (index ==1) { + getData = getCompetenciesData(workbook.getSheetAt(index)) + /*}else { + getData=getCompetenciesDataFromSheet(workbook.getSheetAt(index)) + }*/ + val convertedData = getData.map(_.asScala.toMap) + finalData += (workbook.getSheetName(index) -> convertedData) + getData = finalData.toList.flatMap { case (_, maps) => maps.map(convertMap) } + }) + getData + + } catch { + case e: Exception => throw new Exception("Invalid File") + } + } - def getRowNum(sheet: XSSFSheet) = { - (1 until sheet.getPhysicalNumberOfRows) - .filter(rowNum => { - val oRow = Option(sheet.getRow(rowNum)) - oRow match { - case Some(x) => { - val competencyBoolean = sheet.getRow(rowNum).getCell(4) - boolean2Boolean("CDM".equals(competencyBoolean.toString)) - } - case None => false - } - }).map(rowNum => parseCompetency(sheet.getRow(rowNum))).toList - } + /*def getCompetenciesData2(sheet: XSSFSheet): List[util.Map[String, AnyRef]] = { + val columnIdx = if (sheet.getWorkbook.getSheetIndex(sheet) == 1 || sheet.getWorkbook.getSheetIndex(sheet) == 8) 4 else 5 + val rows = sheet.asScala.drop(1) + val formatter = new DataFormatter() - def getYearWiseCompetencyMappingData(sheet: XSSFSheet)= { - val sheetName = sheet.getSheetName.toLowerCase() - if (sheetName.startsWith("first")) { - logger.info("Inside the first sheet") - yearData = getRowNum(sheet) - }else if (sheetName.startsWith("second")) { - logger.info("Inside the second sheet") - yearData = getRowNum(sheet) - }else if (sheetName.startsWith("third")) { - logger.info("Inside the third sheet") - yearData = getRowNum(sheet) + def getCell(row: Row, colIdx: Int): Option[Cell] = { + val cell = row.getCell(colIdx) + Option(cell).filter(c => Option(formatter.formatCellValue(c)).exists(_.nonEmpty)) } - yearData - } - def getCompetency(file: File): List[java.util.Map[String, Activity]] = { - try { - val workbook = new XSSFWorkbook(new FileInputStream(file)) - (workbook.getNumberOfSheets - 1 until -1) - .foreach(index => { - if (index == 0) { - getData = getCompetenciesData(workbook.getSheetAt(index), getData) - } else { - getData = ListBuffer.apply(getYearWiseCompetencyMappingData(workbook.getSheetAt(index))) - } - }) - yearData - } catch { - case e: Exception => throw new Exception("Invalid File") - } - } + val uniqueCompetencies = rows.flatMap(row => getCell(row, columnIdx)).map(cell => formatter.formatCellValue(cell)).toList - def parseCompetency(xssFRow: XSSFRow) = { - val competency = new java.util.HashMap().asInstanceOf[java.util.Map[String, Activity]] + rows.flatMap(row => { + getCell(row, columnIdx).filter(cell => uniqueCompetencies.contains(formatter.formatCellValue(cell))).map(row => Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData)).flatten + }).toList + }*/ - val rowContent = (0 until xssFRow.getPhysicalNumberOfCells) - .map(colId => Option(xssFRow.getCell(colId)).getOrElse("").toString).toList + def convertMap(map: Map[String, AnyRef]): util.Map[String, AnyRef] = { + val javaMap = new util.HashMap[String, AnyRef]() + map.foreach { case (k, v) => javaMap.put(k, v) } + javaMap + } - val activityCode = rowContent.apply(0).trim - val activityLabel = rowContent.apply(1).trim - val questionCode = rowContent.apply(2).trim - val activityDetails = Activity(activityCode, activityLabel) - competency.put(questionCode, activityDetails) - competency + def getCompetenciesData(sheet: XSSFSheet): List[util.Map[String, AnyRef]] = { + /* val column = sheet.asScala.drop(1).map(row => + if (sheet.getWorkbook.getSheetIndex(sheet) == 1 || sheet.getWorkbook.getSheetIndex(sheet) == 8) + row.getCell(4) + else + row.getCell(5) + ).toList*/ + + /*val formatter = new DataFormatter() + val uniqueCompetencies = column.map(cell => formatter.formatCellValue(cell)).toList*/ + + val rows = sheet.asScala.drop(1) + getData = rows.flatMap(row => { + val rowValue = { + if (sheet.getWorkbook.getSheetIndex(sheet) == 1 || sheet.getWorkbook.getSheetIndex(sheet) == 8) { + if (!row.getCell(4).getStringCellValue.isEmpty) + row.getCell(4) + } else if (!row.getCell(5).getStringCellValue.isEmpty) + row.getCell(5) + } + if (sheet.getWorkbook.getSheetIndex(sheet) == 1 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 2 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 3 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 4 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 5 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 6 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 7 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 8 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else if (sheet.getWorkbook.getSheetIndex(sheet) == 9 && rowValue != null) + Option(sheet.getRow(row.getRowNum)).map(parseCompetencyData) + else { + None + } + }).toList + getData } + }