From 48246f1e0a9b26e2de8fa2698dcf782e0d730f2b Mon Sep 17 00:00:00 2001 From: chethann007 Date: Sat, 24 Jan 2026 11:03:35 +0530 Subject: [PATCH 01/17] cleanup: delete old elasticsearch utility implementation --- core/es-utils/.gitignore | 7 - core/es-utils/pom.xml | 41 - .../sunbird/common/ElasticSearchHelper.java | 773 ---------------- .../common/ElasticSearchRestHighImpl.java | 600 ------------ .../common/factory/EsClientFactory.java | 34 - .../common/inf/ElasticSearchService.java | 111 --- .../main/java/org/sunbird/dto/SearchDTO.java | 188 ---- .../org/sunbird/helper/ConnectionManager.java | 127 --- .../sunbird/helper/ElasticSearchMapping.java | 21 - .../sunbird/helper/ElasticSearchSettings.java | 21 - .../src/main/resources/elasticsearch.conf | 62 -- .../src/main/resources/indices/location.json | 161 ---- .../src/main/resources/indices/org.json | 47 - .../src/main/resources/indices/user.json | 47 - .../src/main/resources/indices/userfeed.json | 212 ----- .../src/main/resources/indices/usernotes.json | 289 ------ .../resources/mappings/location-mapping.json | 112 --- .../main/resources/mappings/org-mapping.json | 268 ------ .../main/resources/mappings/user-mapping.json | 874 ------------------ .../resources/mappings/userfeed-mapping.json | 163 ---- .../resources/mappings/usernotes-mapping.json | 240 ----- .../common/ElasticSearchRestHighImplTest.java | 469 ---------- .../common/factory/EsClientFactoryTest.java | 21 - .../sunbird/helper/ConnectionManagerTest.java | 45 - .../helper/ElasticSearchMappingTest.java | 13 - .../helper/ElasticSearchSettingsTest.java | 14 - .../resources/elasticsearch.config.properties | 3 - 27 files changed, 4963 deletions(-) delete mode 100644 core/es-utils/.gitignore delete mode 100644 core/es-utils/pom.xml delete mode 100644 core/es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java delete mode 100644 core/es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java delete mode 100644 core/es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java delete mode 100644 core/es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java delete mode 100644 core/es-utils/src/main/java/org/sunbird/dto/SearchDTO.java delete mode 100644 core/es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java delete mode 100644 core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchMapping.java delete mode 100644 core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchSettings.java delete mode 100644 core/es-utils/src/main/resources/elasticsearch.conf delete mode 100644 core/es-utils/src/main/resources/indices/location.json delete mode 100644 core/es-utils/src/main/resources/indices/org.json delete mode 100644 core/es-utils/src/main/resources/indices/user.json delete mode 100644 core/es-utils/src/main/resources/indices/userfeed.json delete mode 100644 core/es-utils/src/main/resources/indices/usernotes.json delete mode 100644 core/es-utils/src/main/resources/mappings/location-mapping.json delete mode 100644 core/es-utils/src/main/resources/mappings/org-mapping.json delete mode 100644 core/es-utils/src/main/resources/mappings/user-mapping.json delete mode 100644 core/es-utils/src/main/resources/mappings/userfeed-mapping.json delete mode 100644 core/es-utils/src/main/resources/mappings/usernotes-mapping.json delete mode 100644 core/es-utils/src/test/java/org/sunbird/common/ElasticSearchRestHighImplTest.java delete mode 100644 core/es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java delete mode 100644 core/es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java delete mode 100644 core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchMappingTest.java delete mode 100644 core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchSettingsTest.java delete mode 100644 core/es-utils/src/test/resources/elasticsearch.config.properties diff --git a/core/es-utils/.gitignore b/core/es-utils/.gitignore deleted file mode 100644 index 55977f8f94..0000000000 --- a/core/es-utils/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/target/ -.classpath -.project -.settings -/bin/ - -*.iml diff --git a/core/es-utils/pom.xml b/core/es-utils/pom.xml deleted file mode 100644 index 07f752ed12..0000000000 --- a/core/es-utils/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - core - org.sunbird - 1.0-SNAPSHOT - - 4.0.0 - org.sunbird - es-utils - 1.0-SNAPSHOT - es-utils - - - 11 - 11 - 11 - UTF-8 - UTF-8 - 1.1.1 - - - - org.sunbird - platform-common - 1.0-SNAPSHOT - - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - 7.10.2 - - - junit - junit - 4.13.1 - test - - - \ No newline at end of file diff --git a/core/es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java b/core/es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java deleted file mode 100644 index 546d5aec38..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java +++ /dev/null @@ -1,773 +0,0 @@ -package org.sunbird.common; - -import org.apache.pekko.util.Timeout; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.lucene.search.join.ScoreMode; -import org.elasticsearch.action.search.SearchRequestBuilder; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.transport.TransportClient; -import org.elasticsearch.common.unit.Fuzziness; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.ExistsQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.elasticsearch.index.query.TermQueryBuilder; -import org.elasticsearch.index.query.TermsQueryBuilder; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; -import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; -import org.elasticsearch.search.aggregations.bucket.terms.Terms; -import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket; -import org.elasticsearch.search.sort.SortOrder; -import org.sunbird.dto.SearchDTO; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import scala.concurrent.Await; -import scala.concurrent.Future; - -/** - * This class will provide all required operation for elastic search. - * - * @author arvind - * @author Manzarul - * @author mayank:github.com/iostream04 - */ -public class ElasticSearchHelper { - private static final LoggerUtil logger = new LoggerUtil(ElasticSearchHelper.class); - public static final String LTE = "<="; - public static final String LT = "<"; - public static final String GTE = ">="; - public static final String GT = ">"; - public static final String ASC_ORDER = "ASC"; - public static final String STARTS_WITH = "startsWith"; - public static final String ENDS_WITH = "endsWith"; - public static final String RAW_APPEND = ".raw"; - public static final int WAIT_TIME = 5; - public static Timeout timeout = new Timeout(WAIT_TIME, TimeUnit.SECONDS); - public static final List upsertResults = - new ArrayList<>(Arrays.asList("CREATED", "UPDATED", "NOOP")); - private static final String _DOC = "_doc"; - - private ElasticSearchHelper() {} - - /** - * This method will return the object after getting complete future. - * - * @param future - * @return Object which future inherits - */ - @SuppressWarnings("unchecked") - public static Object getResponseFromFuture(Future future) { - try { - Object result = Await.result(future, timeout.duration()); - return result; - } catch (Exception e) { - logger.error("getResponseFromFuture: error occured ", e); - } - return null; - } - - /** - * This method adds aggregations to the incoming SearchRequestBuilder object - * - * @param searchRequestBuilder which will be updated with facets if any present - * @param facets Facets provide aggregated data based on a search query - * @return SearchRequestBuilder - */ - public static SearchRequestBuilder addAggregations( - SearchRequestBuilder searchRequestBuilder, List> facets) { - long startTime = System.currentTimeMillis(); - logger.debug("addAggregations: method started at ==" + startTime); - if (facets != null && !facets.isEmpty()) { - Map map = facets.get(0); - if (!MapUtils.isEmpty(map)) { - for (Map.Entry entry : map.entrySet()) { - - String key = entry.getKey(); - String value = entry.getValue(); - if (JsonKey.DATE_HISTOGRAM.equalsIgnoreCase(value)) { - searchRequestBuilder.addAggregation( - AggregationBuilders.dateHistogram(key) - .field(key + RAW_APPEND) - .dateHistogramInterval(DateHistogramInterval.days(1))); - - } else if (null == value) { - searchRequestBuilder.addAggregation( - AggregationBuilders.terms(key).field(key + RAW_APPEND)); - } - } - } - long elapsedTime = calculateEndTime(startTime); - logger.debug( - "ElasticSearchHelper:addAggregations method end ==" - + " ,Total time elapsed = " - + elapsedTime); - } - - return searchRequestBuilder; - } - - /** - * This method returns any constraints defined in searchDto object - * - * @param searchDTO with constraints - * @return Map for constraints present in serachDTO - */ - public static Map getConstraints(SearchDTO searchDTO) { - if (null != searchDTO.getSoftConstraints() && !searchDTO.getSoftConstraints().isEmpty()) { - return searchDTO - .getSoftConstraints() - .entrySet() - .stream() - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().floatValue())); - } - return Collections.emptyMap(); - } - - /** - * This method return SearchRequestBuilder for transport client - * - * @param client transport client instance - * @param index to be checkout - * @return SearchRequestBuilder for a provided request - */ - public static SearchRequestBuilder getTransportSearchBuilder( - TransportClient client, String[] index) { - return client.prepareSearch().setIndices(index).setTypes(_DOC); - } - - /** - * Method to add the additional search query like range query , exists - not exist filter etc. - * - * @param query query which will be updated - * @param entry which will have key to be search and respective values - * @param constraintsMap constraints on key and values - */ - @SuppressWarnings("unchecked") - public static void addAdditionalProperties( - BoolQueryBuilder query, Entry entry, Map constraintsMap) { - long startTime = System.currentTimeMillis(); - logger.debug("ElasticSearchHelper:addAdditionalProperties: method started at ==" + startTime); - String key = entry.getKey(); - if (JsonKey.FILTERS.equalsIgnoreCase(key)) { - - Map filters = (Map) entry.getValue(); - for (Map.Entry en : filters.entrySet()) { - query = createFilterESOpperation(en, query, constraintsMap); - } - } else if (JsonKey.EXISTS.equalsIgnoreCase(key) || JsonKey.NOT_EXISTS.equalsIgnoreCase(key)) { - query = createESOpperation(entry, query, constraintsMap); - } else if (JsonKey.NESTED_EXISTS.equalsIgnoreCase(key) - || JsonKey.NESTED_NOT_EXISTS.equalsIgnoreCase(key)) { - query = createNestedESOpperation(entry, query, constraintsMap); - } else if (JsonKey.NESTED_KEY_FILTER.equalsIgnoreCase(key)) { - Map nestedFilters = (Map) entry.getValue(); - for (Map.Entry en : nestedFilters.entrySet()) { - query = createNestedFilterESOpperation(en, query, constraintsMap); - } - } - long elapsedTime = calculateEndTime(startTime); - logger.debug( - "ElasticSearchHelper:addAdditionalProperties: method end ==" - + " ,Total time elapsed = " - + elapsedTime); - } - - /** - * Method to create CommonTermQuery , multimatch and Range Query. - * - * @param entry which contains key for search and respective values - * @param query Object which will be updated - * @param constraintsMap constraints for key and values - * @return BoolQueryBuilder - */ - @SuppressWarnings("unchecked") - private static BoolQueryBuilder createFilterESOpperation( - Entry entry, BoolQueryBuilder query, Map constraintsMap) { - String key = entry.getKey(); - Object val = entry.getValue(); - if (val instanceof List && val != null) { - query = getTermQueryFromList(val, key, query, constraintsMap); - } else if (val instanceof Map) { - if (key.equalsIgnoreCase(JsonKey.ES_OR_OPERATION)) { - query.must(createEsORFilterQuery((Map) val)); - } else { - query = getTermQueryFromMap(val, key, query, constraintsMap); - } - } else if (val instanceof String) { - query.must( - createTermQuery(key + RAW_APPEND, ((String) val).toLowerCase(), constraintsMap.get(key))); - } else { - query.must(createTermQuery(key + RAW_APPEND, val, constraintsMap.get(key))); - } - return query; - } - - /** - * Method to create CommonTermQuery , multimatch and Range Query. - * - * @param entry which contains key for search and respective values - * @param query Object which will be updated - * @param constraintsMap constraints for key and values - * @return BoolQueryBuilder - */ - @SuppressWarnings("unchecked") - private static BoolQueryBuilder createNestedFilterESOpperation( - Entry entry, BoolQueryBuilder query, Map constraintsMap) { - String key = entry.getKey(); - Object val = entry.getValue(); - String path = key.split("\\.")[0]; - if (val instanceof List && CollectionUtils.isNotEmpty((List) val)) { - if (((List) val).get(0) instanceof String) { - ((List) val).replaceAll(String::toLowerCase); - query.must( - QueryBuilders.nestedQuery( - path, - createTermsQuery(key + RAW_APPEND, (List) val, constraintsMap.get(key)), - ScoreMode.None)); - } else { - query.must( - QueryBuilders.nestedQuery( - path, createTermsQuery(key, (List) val, constraintsMap.get(key)), ScoreMode.None)); - } - } else if (val instanceof Map) { - query = getNestedTermQueryFromMap(val, key, path, query, constraintsMap); - } else if (val instanceof String) { - query.must( - QueryBuilders.nestedQuery( - path, - createTermQuery( - key + RAW_APPEND, ((String) val).toLowerCase(), constraintsMap.get(key)), - ScoreMode.None)); - } else { - query.must( - QueryBuilders.nestedQuery( - path, - createTermQuery(key + RAW_APPEND, val, constraintsMap.get(key)), - ScoreMode.None)); - } - return query; - } - - /** - * This method returns termQuery if any present in map provided - * - * @param key for search in termquery - * @param val value of the key to be searched - * @param query which will be updated according to key , value and constraints - * @param constraintsMap for setting any constraints on values for the specified key - * @return BoolQueryBuilder - */ - private static BoolQueryBuilder getTermQueryFromMap( - Object val, String key, BoolQueryBuilder query, Map constraintsMap) { - Map value = (Map) val; - Map rangeOperation = new HashMap<>(); - Map lexicalOperation = new HashMap<>(); - for (Map.Entry it : value.entrySet()) { - String operation = it.getKey(); - if (operation.startsWith(LT) || operation.startsWith(GT)) { - rangeOperation.put(operation, it.getValue()); - } else if (operation.startsWith(STARTS_WITH) || operation.startsWith(ENDS_WITH)) { - lexicalOperation.put(operation, it.getValue()); - } - } - if (!(rangeOperation.isEmpty())) { - query.must(createRangeQuery(key, rangeOperation, constraintsMap.get(key))); - } - if (!(lexicalOperation.isEmpty())) { - query.must(createLexicalQuery(key, lexicalOperation, constraintsMap.get(key))); - } - - return query; - } - - private static BoolQueryBuilder createEsORFilterQuery(Map orFilters) { - BoolQueryBuilder query = new BoolQueryBuilder(); - for (Map.Entry mp : orFilters.entrySet()) { - query.should( - QueryBuilders.termQuery( - mp.getKey() + RAW_APPEND, ((String) mp.getValue()).toLowerCase())); - } - return query; - } - - /** - * This method returns termQuery if any present in map provided - * - * @param key for search in termquery - * @param val value of the key to be searched - * @param query which will be updated according to key , value and constraints - * @param constraintsMap for setting any constraints on values for the specified key - * @return BoolQueryBuilder - */ - private static BoolQueryBuilder getNestedTermQueryFromMap( - Object val, - String key, - String path, - BoolQueryBuilder query, - Map constraintsMap) { - Map value = (Map) val; - Map rangeOperation = new HashMap<>(); - Map lexicalOperation = new HashMap<>(); - for (Map.Entry it : value.entrySet()) { - String operation = it.getKey(); - if (operation.startsWith(LT) || operation.startsWith(GT)) { - rangeOperation.put(operation, it.getValue()); - } else if (operation.startsWith(STARTS_WITH) || operation.startsWith(ENDS_WITH)) { - lexicalOperation.put(operation, it.getValue()); - } - } - if (!(rangeOperation.isEmpty())) { - query.must( - QueryBuilders.nestedQuery( - path, - createRangeQuery(key, rangeOperation, constraintsMap.get(key)), - ScoreMode.None)); - } - if (!(lexicalOperation.isEmpty())) { - query.must( - QueryBuilders.nestedQuery( - path, - createLexicalQuery(key, lexicalOperation, constraintsMap.get(key)), - ScoreMode.None)); - } - return query; - } - - /** - * This method returns termQuery if any present in List provided - * - * @param key for search in termquery - * @param val value of the key to be searched - * @param query which will be updated according to key , value and constraints - * @param constraintsMap for setting any constraints on values for the specified key - * @return BoolQueryBuilder - */ - private static BoolQueryBuilder getTermQueryFromList( - Object val, String key, BoolQueryBuilder query, Map constraintsMap) { - if (!((List) val).isEmpty()) { - if (((List) val).get(0) instanceof String) { - ((List) val).replaceAll(String::toLowerCase); - query.must(createTermsQuery(key + RAW_APPEND, (List) val, constraintsMap.get(key))); - } else { - query.must(createTermsQuery(key, (List) val, constraintsMap.get(key))); - } - } - return query; - } - - /** Method to create EXISTS and NOT EXIST FILTER QUERY . */ - /** - * @param entry contains operations and keys for filter - * @param query do get updated with provided operations - * @param constraintsMap to set ant constraints on keys for filter - * @return - */ - @SuppressWarnings("unchecked") - private static BoolQueryBuilder createESOpperation( - Entry entry, BoolQueryBuilder query, Map constraintsMap) { - - String operation = entry.getKey(); - if (entry.getValue() != null && entry.getValue() instanceof List) { - List existsList = (List) entry.getValue(); - - if (JsonKey.EXISTS.equalsIgnoreCase(operation)) { - for (String name : existsList) { - query.must(createExistQuery(name, constraintsMap.get(name))); - } - } else if (JsonKey.NOT_EXISTS.equalsIgnoreCase(operation)) { - for (String name : existsList) { - query.mustNot(createExistQuery(name, constraintsMap.get(name))); - } - } - } - return query; - } - - /** Method to create EXISTS and NOT EXIST FILTER QUERY . */ - /** - * @param entry contains operations and keys for filter - * @param query do get updated with provided operations - * @param constraintsMap to set ant constraints on keys for filter - * @return - */ - @SuppressWarnings("unchecked") - private static BoolQueryBuilder createNestedESOpperation( - Entry entry, BoolQueryBuilder query, Map constraintsMap) { - - String operation = entry.getKey(); - if (entry.getValue() != null && entry.getValue() instanceof Map) { - Map existsMap = (Map) entry.getValue(); - - if (JsonKey.NESTED_EXISTS.equalsIgnoreCase(operation)) { - for (Map.Entry nameByPath : existsMap.entrySet()) { - query.must( - QueryBuilders.nestedQuery( - nameByPath.getValue(), - createExistQuery(nameByPath.getKey(), constraintsMap.get(nameByPath.getKey())), - ScoreMode.None)); - } - } else if (JsonKey.NESTED_NOT_EXISTS.equalsIgnoreCase(operation)) { - for (Map.Entry nameByPath : existsMap.entrySet()) { - query.mustNot( - QueryBuilders.nestedQuery( - nameByPath.getValue(), - createExistQuery(nameByPath.getKey(), constraintsMap.get(nameByPath.getKey())), - ScoreMode.None)); - } - } - } - return query; - } - - /** Method to return the sorting order on basis of string param . */ - public static SortOrder getSortOrder(String value) { - return ASC_ORDER.equalsIgnoreCase(value) ? SortOrder.ASC : SortOrder.DESC; - } - - /** - * This method return MatchQueryBuilder Object with boosts if any provided - * - * @param name of the attribute - * @param value of the attribute - * @return MatchQueryBuilder - */ - public static void createFuzzyMatchQuery(BoolQueryBuilder query, String name, Object value) { - query.must( - QueryBuilders.matchQuery(name, value).fuzziness(Fuzziness.AUTO).fuzzyTranspositions(true)); - } - - /** - * This method returns TermsQueryBuilder with boosts if any provided - * - * @param key : field name - * @param values : values for the field value - * @param boost for increasing the search parameters priority - * @return TermsQueryBuilder - */ - private static TermsQueryBuilder createTermsQuery(String key, List values, Float boost) { - if (null != (boost)) { - return QueryBuilders.termsQuery(key, (values).stream().toArray(Object[]::new)).boost(boost); - } else { - return QueryBuilders.termsQuery(key, (values).stream().toArray(Object[]::new)); - } - } - - /** - * This method returns RangeQueryBuilder with boosts if any provided - * - * @param name for the field - * @param rangeOperation: keys and value related to range - * @param boost for increasing the search parameters priority - * @return RangeQueryBuilder - */ - private static RangeQueryBuilder createRangeQuery( - String name, Map rangeOperation, Float boost) { - - RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(name + RAW_APPEND); - for (Map.Entry it : rangeOperation.entrySet()) { - switch (it.getKey()) { - case LTE: - rangeQueryBuilder.lte(it.getValue()); - break; - case LT: - rangeQueryBuilder.lt(it.getValue()); - break; - case GTE: - rangeQueryBuilder.gte(it.getValue()); - break; - case GT: - rangeQueryBuilder.gt(it.getValue()); - break; - } - } - if (null != (boost)) { - return rangeQueryBuilder.boost(boost); - } - return rangeQueryBuilder; - } - - /** - * This method returns TermQueryBuilder with boosts if any provided - * - * @param name of the field for termquery - * @param value of the field for termquery - * @param boost for increasing the search parameters priority - * @return TermQueryBuilder - */ - private static TermQueryBuilder createTermQuery(String name, Object value, Float boost) { - if (null != (boost)) { - return QueryBuilders.termQuery(name, value).boost(boost); - } else { - return QueryBuilders.termQuery(name, value); - } - } - - /** - * this method return ExistsQueryBuilder with boosts if any provided - * - * @param name of the field which required for exists operation - * @param boost for increasing the search parameters priority - * @return ExistsQueryBuilder - */ - private static ExistsQueryBuilder createExistQuery(String name, Float boost) { - if (null != (boost)) { - return QueryBuilders.existsQuery(name).boost(boost); - } else { - return QueryBuilders.existsQuery(name); - } - } - - /** - * This method create lexical query with boosts if any provided - * - * @param key for search - * @param rangeOperation to search or match in a particular way - * @param boost for increasing the search parameters priority - * @return QueryBuilder - */ - public static QueryBuilder createLexicalQuery( - String key, Map rangeOperation, Float boost) { - QueryBuilder queryBuilder = null; - for (Map.Entry it : rangeOperation.entrySet()) { - switch (it.getKey()) { - case STARTS_WITH: - { - String startsWithVal = (String) it.getValue(); - if (StringUtils.isNotBlank(startsWithVal)) { - startsWithVal = startsWithVal.toLowerCase(); - } - if (null != (boost)) { - queryBuilder = - QueryBuilders.prefixQuery(key + RAW_APPEND, startsWithVal).boost(boost); - } - queryBuilder = QueryBuilders.prefixQuery(key + RAW_APPEND, startsWithVal); - break; - } - case ENDS_WITH: - { - String endsWithRegex = "~" + it.getValue(); - if (null != (boost)) { - queryBuilder = - QueryBuilders.regexpQuery(key + RAW_APPEND, endsWithRegex).boost(boost); - } - queryBuilder = QueryBuilders.regexpQuery(key + RAW_APPEND, endsWithRegex); - break; - } - } - } - return queryBuilder; - } - - /** - * this method will take start time and subtract with current time to get the time spent in - * millis. - * - * @param startTime long - * @return long - */ - public static long calculateEndTime(long startTime) { - return System.currentTimeMillis() - startTime; - } - - /** - * This method will create searchdto on this of searchquery provided - * - * @param searchQueryMap Map contains query - * @return SearchDto for search data in elastic search - */ - public static SearchDTO createSearchDTO(Map searchQueryMap) { - SearchDTO search = new SearchDTO(); - search = getBasicBuiders(search, searchQueryMap); - search = setOffset(search, searchQueryMap); - search = getLimits(search, searchQueryMap); - if (searchQueryMap.containsKey(JsonKey.GROUP_QUERY)) { - search - .getGroupQuery() - .addAll( - (Collection>) searchQueryMap.get(JsonKey.GROUP_QUERY)); - } - search = getSoftConstraints(search, searchQueryMap); - Map fuzzy = (Map) searchQueryMap.get(JsonKey.SEARCH_FUZZY); - if (MapUtils.isNotEmpty(fuzzy)) { - search.setFuzzy(fuzzy); - } - return search; - } - - /** - * This method add any softconstraints present in seach query to search DTo - * - * @param search search which contains the search parameters for elastic search. - * @param searchQueryMap searchQueryMap which contains soft_constraints - * @return SearchDTO updated searchDTO which contains soft_constraits - */ - private static SearchDTO getSoftConstraints( - SearchDTO search, Map searchQueryMap) { - if (searchQueryMap.containsKey(JsonKey.SOFT_CONSTRAINTS)) { - search.setSoftConstraints( - (Map) searchQueryMap.get(JsonKey.SOFT_CONSTRAINTS)); - } - return search; - } - - /** - * This method adds any limits present in the search query - * - * @param search search which contains the search parameters for elastic search. - * @param searchQueryMap searchQueryMap which contain limit - * @return SearchDTO updated searchDTO which contains limit - */ - private static SearchDTO getLimits(SearchDTO search, Map searchQueryMap) { - if (searchQueryMap.containsKey(JsonKey.LIMIT)) { - if ((searchQueryMap.get(JsonKey.LIMIT)) instanceof Integer) { - search.setLimit((int) searchQueryMap.get(JsonKey.LIMIT)); - } else { - search.setLimit(((BigInteger) searchQueryMap.get(JsonKey.LIMIT)).intValue()); - } - } - return search; - } - - /** - * This method adds offset if any present in the searchQuery - * - * @param search search which contains the search parameters for elastic search. - * @param searchQueryMap searchQueryMap which contains offset - * @return SearchDTO updated searchDTO which contain offset - */ - private static SearchDTO setOffset(SearchDTO search, Map searchQueryMap) { - if (searchQueryMap.containsKey(JsonKey.OFFSET)) { - if ((searchQueryMap.get(JsonKey.OFFSET)) instanceof Integer) { - search.setOffset((int) searchQueryMap.get(JsonKey.OFFSET)); - } else { - search.setOffset(((BigInteger) searchQueryMap.get(JsonKey.OFFSET)).intValue()); - } - } - return search; - } - - /** - * This method adds basic query parameter to SearchDTO if any provided - * - * @param search search - * @param searchQueryMap searchQueryMap - * @return SearchDTO - */ - private static SearchDTO getBasicBuiders(SearchDTO search, Map searchQueryMap) { - if (searchQueryMap.containsKey(JsonKey.QUERY)) { - search.setQuery((String) searchQueryMap.get(JsonKey.QUERY)); - } - if (searchQueryMap.containsKey(JsonKey.QUERY_FIELDS)) { - search.setQueryFields((List) searchQueryMap.get(JsonKey.QUERY_FIELDS)); - } - if (searchQueryMap.containsKey(JsonKey.FACETS)) { - search.setFacets((List>) searchQueryMap.get(JsonKey.FACETS)); - } - if (searchQueryMap.containsKey(JsonKey.FIELDS)) { - search.setFields((List) searchQueryMap.get(JsonKey.FIELDS)); - } - if (searchQueryMap.containsKey(JsonKey.FILTERS)) { - search.getAdditionalProperties().put(JsonKey.FILTERS, searchQueryMap.get(JsonKey.FILTERS)); - } - if (searchQueryMap.containsKey(JsonKey.EXISTS)) { - search.getAdditionalProperties().put(JsonKey.EXISTS, searchQueryMap.get(JsonKey.EXISTS)); - } - if (searchQueryMap.containsKey(JsonKey.NOT_EXISTS)) { - search - .getAdditionalProperties() - .put(JsonKey.NOT_EXISTS, searchQueryMap.get(JsonKey.NOT_EXISTS)); - } - if (searchQueryMap.containsKey(JsonKey.SORT_BY)) { - search - .getSortBy() - .putAll((Map) searchQueryMap.get(JsonKey.SORT_BY)); - } - return search; - } - - /** - * Method returns map which contains all the request data from elasticsearch - * - * @param response response from elastic search - * @param searchDTO searchDTO which was used to search data - * @param finalFacetList Facets provide aggregated data based on a search query - * @return Map which will have all the requested data - */ - public static Map getSearchResponseMap( - SearchResponse response, SearchDTO searchDTO, List finalFacetList) { - Map responseMap = new HashMap<>(); - List> esSource = new ArrayList<>(); - long count = 0; - if (response != null) { - SearchHits hits = response.getHits(); - count = hits.getTotalHits().value; - - for (SearchHit hit : hits) { - esSource.add(hit.getSourceAsMap()); - } - - // fetch aggregations aggregations - finalFacetList = getFinalFacetList(response, searchDTO, finalFacetList); - } - responseMap.put(JsonKey.CONTENT, esSource); - if (!(finalFacetList.isEmpty())) { - responseMap.put(JsonKey.FACETS, finalFacetList); - } - responseMap.put(JsonKey.COUNT, count); - return responseMap; - } - - private static List getFinalFacetList( - SearchResponse response, SearchDTO searchDTO, List finalFacetList) { - if (null != searchDTO.getFacets() && !searchDTO.getFacets().isEmpty()) { - Map m1 = searchDTO.getFacets().get(0); - for (Map.Entry entry : m1.entrySet()) { - String field = entry.getKey(); - String aggsType = entry.getValue(); - List aggsList = new ArrayList<>(); - Map facetMap = new HashMap(); - if (JsonKey.DATE_HISTOGRAM.equalsIgnoreCase(aggsType)) { - Histogram agg = response.getAggregations().get(field); - for (Histogram.Bucket ent : agg.getBuckets()) { - // DateTime key = (DateTime) ent.getKey(); // Key - String keyAsString = ent.getKeyAsString(); // Key as String - long docCount = ent.getDocCount(); // Doc count - Map internalMap = new HashMap(); - internalMap.put(JsonKey.NAME, keyAsString); - internalMap.put(JsonKey.COUNT, docCount); - aggsList.add(internalMap); - } - } else { - Terms aggs = response.getAggregations().get(field); - for (Bucket bucket : aggs.getBuckets()) { - Map internalMap = new HashMap(); - internalMap.put(JsonKey.NAME, bucket.getKey()); - internalMap.put(JsonKey.COUNT, bucket.getDocCount()); - aggsList.add(internalMap); - } - } - facetMap.put("values", aggsList); - facetMap.put(JsonKey.NAME, field); - finalFacetList.add(facetMap); - } - } - return finalFacetList; - } -} diff --git a/core/es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java b/core/es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java deleted file mode 100644 index ce96b94e46..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java +++ /dev/null @@ -1,600 +0,0 @@ -package org.sunbird.common; - -import org.apache.pekko.dispatch.Futures; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.DocWriteResponse; -import org.elasticsearch.action.admin.indices.get.GetIndexRequest; -import org.elasticsearch.action.bulk.BulkItemResponse; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.action.delete.DeleteRequest; -import org.elasticsearch.action.delete.DeleteResponse; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.SimpleQueryStringBuilder; -import org.elasticsearch.index.query.TermQueryBuilder; -import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortMode; -import org.sunbird.common.inf.ElasticSearchService; -import org.sunbird.dto.SearchDTO; -import org.sunbird.exception.ResponseCode; -import org.sunbird.helper.ConnectionManager; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; -import scala.concurrent.Future; -import scala.concurrent.Promise; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * This class will provide all required operation for elastic search. - * - * @author github.com/iostream04 - */ -public class ElasticSearchRestHighImpl implements ElasticSearchService { - private static final String ERROR = "ERROR"; - private static final LoggerUtil logger = new LoggerUtil(ElasticSearchRestHighImpl.class); - -// private static ObjectMapper mapper = new ObjectMapper(); - - /** - * This method will put a new data entry inside Elastic search. identifier value becomes _id - * inside ES, so every time provide a unique value while saving it. - * - * @param index String ES index name - * @param identifier ES column identifier as an String - * @param data Map - * @param context - * @return Future which contains identifier for created data - */ - @Override - public Future save(String index, String identifier, Map data, RequestContext context) { - long startTime = System.currentTimeMillis(); - Promise promise = (Promise) (Promise) Futures.promise(); - - logger.debug(context, "ElasticSearchUtilRest:save: method started at ==" + startTime + " for Index " + index); - if (StringUtils.isBlank(identifier) || StringUtils.isBlank(index)) { - logger.info(context, "ElasticSearchRestHighImpl:save: " - + "Identifier or Index value is null or empty, identifier : " + identifier - + ",index: " + index + ",not able to save data."); - promise.success(ERROR); - return promise.future(); - } - data.put("identifier", identifier); - - IndexRequest indexRequest = new IndexRequest(index, _DOC, identifier).source(data); - - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(IndexResponse indexResponse) { - logger.info(context, "ElasticSearchRestHighImpl:save: Success for index : " + index - + ", identifier :" + identifier); - - promise.success(indexResponse.getId()); - logger.debug(context, "ElasticSearchRestHighImpl:save: method end at ==" + System.currentTimeMillis() - + " for Index " + index - + " ,Total time elapsed = " + calculateEndTime(startTime)); - } - - @Override - public void onFailure(Exception e) { - promise.failure(e); - logger.error(context, "ElasticSearchRestHighImpl:save: " - + "Error while saving " + index - + " id : " + identifier, e); - logger.debug(context, "ElasticSearchRestHighImpl:save: method end at ==" + System.currentTimeMillis() - + " for INdex " + index - + " ,Total time elapsed = " + calculateEndTime(startTime)); - } - }; - - ConnectionManager.getRestClient().indexAsync(indexRequest, RequestOptions.DEFAULT, listener); - - return promise.future(); - } - - /** - * This method will update data entry inside Elastic search, using identifier and provided data . - * - * @param index String ES index name - * @param documentId ES column identifier as an String - * @param document Map - * @param context - * @return true or false - */ - @Override - public Future update(String index, String documentId, Map document, RequestContext context) { - long startTime = System.currentTimeMillis(); - logger.debug(context, "ElasticSearchRestHighImpl:update: method started at ==" + startTime - + " for Index " + index); - Promise promise = (Promise) (Promise) Futures.promise(); - document.put("identifier", documentId); - - if (!StringUtils.isBlank(index) && !StringUtils.isBlank(documentId)) { -// Map updatedDoc = checkDocStringLength(document); - IndexRequest indexRequest = new IndexRequest(index).id(documentId).source(document); - UpdateRequest updateRequest = new UpdateRequest().index(index).id(documentId).doc(document).upsert(indexRequest); - - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(UpdateResponse updateResponse) { - promise.success(true); - logger.info(context, "ElasticSearchRestHighImpl:update: Success with " + updateResponse.getResult() - + " response from elastic search for index" + index - + ",documentId : " + documentId); - logger.debug(context, "ElasticSearchRestHighImpl:update: method end ==" - + " for INdex " + index - + " ,Total time elapsed = " + calculateEndTime(startTime)); - } - - @Override - public void onFailure(Exception e) { - logger.error(context, "ElasticSearchRestHighImpl:update: exception occured:" + e.getMessage(), e); - promise.failure(e); - } - }; - ConnectionManager.getRestClient().updateAsync(updateRequest, RequestOptions.DEFAULT, listener); - - } else { - logger.info(context, "ElasticSearchRestHighImpl:update: Requested data is invalid."); - promise.failure(ProjectUtil.createClientException(ResponseCode.invalidRequestData)); - } - return promise.future(); - } - - /** - * This method will provide data form ES based on incoming identifier. we can get data by passing - * index and identifier values , or all the three - * - * @param identifier String - * @param context - * @return Map or empty map - */ - @Override - public Future> getDataByIdentifier(String index, String identifier, RequestContext context) { - long startTime = System.currentTimeMillis(); - Promise> promise = (Promise>) (Promise) Futures.promise(); - if (StringUtils.isNotEmpty(identifier) && StringUtils.isNotEmpty(index)) { - logger.debug(context, "ElasticSearchRestHighImpl:getDataByIdentifier: method started at ==" + startTime - + " for Index " + index); - - GetRequest getRequest = new GetRequest(index, _DOC, identifier); - - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(GetResponse getResponse) { - if (getResponse.isExists()) { - Map sourceAsMap = getResponse.getSourceAsMap(); - if (MapUtils.isNotEmpty(sourceAsMap)) { - promise.success(sourceAsMap); - logger.debug(context, "ElasticSearchRestHighImpl:getDataByIdentifier: method end == for Index " + index - + " ,Total time elapsed = " + calculateEndTime(startTime)); - } else { - promise.success(new HashMap<>()); - } - } else { - promise.success(new HashMap<>()); - } - } - - @Override - public void onFailure(Exception e) { - logger.error(context, "ElasticSearchRestHighImpl:getDataByIdentifier: method Failed with error == ", e); - promise.failure(e); - } - }; - - ConnectionManager.getRestClient().getAsync(getRequest, RequestOptions.DEFAULT, listener); - } else { - logger.info(context, "ElasticSearchRestHighImpl:getDataByIdentifier: " - + "provided index or identifier is null, index = " + index - + ", identifier = " + identifier); - promise.failure(ProjectUtil.createClientException(ResponseCode.invalidRequestData)); - } - - return promise.future(); - } - - /** - * This method will remove data from ES based on identifier. - * - * @param index String - * @param identifier String - * @param context - */ - @Override - public Future delete(String index, String identifier, RequestContext context) { - long startTime = System.currentTimeMillis(); - logger.debug(context, "ElasticSearchRestHighImpl:delete: method started at ==" + startTime); - Promise promise = (Promise) (Promise) Futures.promise(); - if (StringUtils.isNotEmpty(identifier) && StringUtils.isNotEmpty(index)) { - DeleteRequest delRequest = new DeleteRequest(index, _DOC, identifier); - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(DeleteResponse deleteResponse) { - if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) { - logger.info(context, - "ElasticSearchRestHighImpl:delete:OnResponse: Document not found for index : " + index - + " , identifier : " + identifier); - promise.success(false); - } else { - promise.success(true); - } - } - - @Override - public void onFailure(Exception e) { - logger.error(context, "ElasticSearchRestHighImpl:delete: Async Failed due to error :", e); - promise.failure(e); - } - }; - - ConnectionManager.getRestClient().deleteAsync(delRequest, RequestOptions.DEFAULT, listener); - } else { - logger.info(context, "ElasticSearchRestHighImpl:delete: " - + "provided index or identifier is null, index = " + index - + ", identifier = " + identifier); - promise.failure(ProjectUtil.createClientException(ResponseCode.invalidRequestData)); - } - - logger.debug(context, "ElasticSearchRestHighImpl:delete: method end ==" - + " ,Total time elapsed = " + calculateEndTime(startTime)); - return promise.future(); - } - - /** - * Method to perform the elastic search on the basis of SearchDTO . SearchDTO contains the search - * criteria like fields, facets, sort by , filters etc. here user can pass single type to search - * or multiple type or null - * - * @param context - * @return search result as Map. - */ - @Override - @SuppressWarnings({"unchecked", "rawtypes"}) - public Future> search(SearchDTO searchDTO, String index, RequestContext context) { - long startTime = System.currentTimeMillis(); - - logger.debug(context, "ElasticSearchRestHighImpl:search: method started at ==" + startTime); - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - SearchRequest searchRequest = new SearchRequest(index); - searchRequest.types(_DOC); - - // check mode and set constraints - Map constraintsMap = ElasticSearchHelper.getConstraints(searchDTO); - - BoolQueryBuilder query = new BoolQueryBuilder(); - - // add channel field as mandatory - String channel = PropertiesCache.getInstance().getProperty(JsonKey.SUNBIRD_ES_CHANNEL); - if (!(StringUtils.isBlank(channel) || JsonKey.SUNBIRD_ES_CHANNEL.equals(channel))) { - query.must(QueryBuilders.matchQuery(JsonKey.CHANNEL, channel)); - } - - // apply simple query string - if (!StringUtils.isBlank(searchDTO.getQuery())) { - SimpleQueryStringBuilder sqsb = QueryBuilders.simpleQueryStringQuery(searchDTO.getQuery()); - query.must(sqsb); - if (CollectionUtils.isNotEmpty(searchDTO.getQueryFields())) { - Map searchFields = - searchDTO.getQueryFields() - .stream() - .collect(Collectors.toMap(s -> s, v -> 1.0f)); - query.must(sqsb.fields(searchFields)); - } - } - // apply the sorting - if (searchDTO.getSortBy() != null && searchDTO.getSortBy().size() > 0) { - for (Map.Entry entry : searchDTO.getSortBy().entrySet()) { - if (!entry.getKey().contains(".")) { - searchSourceBuilder.sort(entry.getKey() + ElasticSearchHelper.RAW_APPEND, - ElasticSearchHelper.getSortOrder((String) entry.getValue())); - } else { - Map map = (Map) entry.getValue(); - Map dataMap = (Map) map.get(JsonKey.TERM); - for (Map.Entry dateMapEntry : dataMap.entrySet()) { - FieldSortBuilder mySort = - new FieldSortBuilder(entry.getKey() + ElasticSearchHelper.RAW_APPEND) - .setNestedFilter(new TermQueryBuilder(dateMapEntry.getKey(), dateMapEntry.getValue())) - .sortMode(SortMode.MIN) - .order(ElasticSearchHelper.getSortOrder((String) map.get(JsonKey.ORDER))); - searchSourceBuilder.sort(mySort); - } - } - } - } - - // apply the fields filter - searchSourceBuilder.fetchSource( - searchDTO.getFields() != null - ? searchDTO.getFields().stream().toArray(String[]::new) - : null, - searchDTO.getExcludedFields() != null - ? searchDTO.getExcludedFields().stream().toArray(String[]::new) - : null); - - // setting the offset - if (searchDTO.getOffset() != null) { - searchSourceBuilder.from(searchDTO.getOffset()); - } - - // setting the limit - if (searchDTO.getLimit() != null) { - searchSourceBuilder.size(searchDTO.getLimit()); - } - // apply additional properties - if (searchDTO.getAdditionalProperties() != null && searchDTO.getAdditionalProperties().size() > 0) { - for (Map.Entry entry : searchDTO.getAdditionalProperties().entrySet()) { - ElasticSearchHelper.addAdditionalProperties(query, entry, constraintsMap); - } - } - - // do fuzzy search - if (MapUtils.isNotEmpty(searchDTO.getFuzzy())) { - Map.Entry entry = searchDTO.getFuzzy().entrySet().iterator().next(); - ElasticSearchHelper.createFuzzyMatchQuery(query, entry.getKey(), entry.getValue()); - } - // set final query to search request builder - searchSourceBuilder.query(query); - - List finalFacetList = new ArrayList(); - - if (null != searchDTO.getFacets() && !searchDTO.getFacets().isEmpty()) { - searchSourceBuilder = addAggregations(searchSourceBuilder, searchDTO.getFacets()); - } - logger.info(context, "ElasticSearchRestHighImpl:search: calling search for index " + index - + ", with query = " + searchSourceBuilder.toString()); - - searchRequest.source(searchSourceBuilder); - Promise> promise = (Promise>) (Promise) Futures.promise(); - - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(SearchResponse response) { - logger.debug(context, "ElasticSearchRestHighImpl:search:onResponse response1 = " + response); - if (response.getHits() == null || response.getHits().getTotalHits().value == 0) { - - Map responseMap = new HashMap<>(); - List> esSource = new ArrayList<>(); - responseMap.put(JsonKey.CONTENT, esSource); - responseMap.put(JsonKey.COUNT, 0); - promise.success(responseMap); - } else { - Map responseMap = ElasticSearchHelper.getSearchResponseMap(response, searchDTO, finalFacetList); - logger.debug(context, "ElasticSearchRestHighImpl:search: method end " - + " ,Total time elapsed = " + calculateEndTime(startTime)); - promise.success(responseMap); - } - } - - @Override - public void onFailure(Exception e) { - promise.failure(e); - - logger.debug(context, "ElasticSearchRestHighImpl:search: method end for Index " + index - + " ,Total time elapsed = " + calculateEndTime(startTime)); - logger.error(context, "ElasticSearchRestHighImpl:search: method Failed with error :", e); - } - }; - - ConnectionManager.getRestClient().searchAsync(searchRequest, RequestOptions.DEFAULT, listener); - return promise.future(); - } - - /** - * This method will do the health check of elastic search. - * - * @return boolean - */ - @Override - public Future healthCheck() { - GetIndexRequest indexRequest = new GetIndexRequest().indices(ProjectUtil.EsType.user.getTypeName()); - Promise promise = (Promise) (Promise) Futures.promise(); - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(Boolean getResponse) { - if (getResponse) { - promise.success(getResponse); - } else { - promise.success(false); - } - } - - @Override - public void onFailure(Exception e) { - promise.failure(e); - logger.error("ElasticSearchRestHighImpl:healthCheck: error " + e.getMessage(), e); - } - }; - ConnectionManager.getRestClient().indices().existsAsync(indexRequest, RequestOptions.DEFAULT, listener); - - return promise.future(); - } - - /** - * This method will do the bulk data insertion. - * - * @param index String index name - * @param dataList List> - * @param context - * @return boolean - */ - @Override - public Future bulkInsert(String index, List> dataList, RequestContext context) { - long startTime = System.currentTimeMillis(); - logger.debug(context, "ElasticSearchRestHighImpl:bulkInsert: method started at ==" + startTime - + " for Index " + index); - BulkRequest request = new BulkRequest(); - Promise promise = (Promise) (Promise) Futures.promise(); - for (Map data : dataList) { - data.put("identifier", data.get(JsonKey.ID)); - request.add(new IndexRequest(index, _DOC, (String) data.get(JsonKey.ID)).source(data)); - } - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(BulkResponse bulkResponse) { - Iterator responseItr = bulkResponse.iterator(); - if (responseItr != null) { - promise.success(true); - while (responseItr.hasNext()) { - - BulkItemResponse bResponse = responseItr.next(); - - if (bResponse.isFailed()) { - logger.info(context, "ElasticSearchRestHighImpl:bulkinsert: api response===" + bResponse.getId() - + " " + bResponse.getFailureMessage()); - } - } - } - } - - @Override - public void onFailure(Exception e) { - logger.error(context, "ElasticSearchRestHighImpl:bulkinsert: Bulk upload error block", e); - promise.success(false); - } - }; - ConnectionManager.getRestClient().bulkAsync(request, RequestOptions.DEFAULT, listener); - - logger.debug(context, "ElasticSearchRestHighImpl:bulkInsert: method end == for Index " + index - + " ,Total time elapsed = " + calculateEndTime(startTime)); - return promise.future(); - } - - private static long calculateEndTime(long startTime) { - return System.currentTimeMillis() - startTime; - } - - private static SearchSourceBuilder addAggregations(SearchSourceBuilder searchSourceBuilder, List> facets) { - long startTime = System.currentTimeMillis(); - logger.debug(null, "ElasticSearchRestHighImpl:addAggregations: method started at ==" + startTime); - Map map = facets.get(0); - for (Map.Entry entry : map.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - if (JsonKey.DATE_HISTOGRAM.equalsIgnoreCase(value)) { - searchSourceBuilder.aggregation( - AggregationBuilders.dateHistogram(key) - .field(key + ElasticSearchHelper.RAW_APPEND) - .dateHistogramInterval(DateHistogramInterval.days(1))); - - } else if (null == value) { - searchSourceBuilder.aggregation( - AggregationBuilders.terms(key).field(key + ElasticSearchHelper.RAW_APPEND)); - } - } - logger.debug(null, "ElasticSearchRestHighImpl:addAggregations: method end ==" - + " ,Total time elapsed = " + calculateEndTime(startTime)); - return searchSourceBuilder; - } - - /** - * This method will update data based on identifier.take the data based on identifier and merge - * with incoming data then update it. - * - * @param index String - * @param identifier String - * @param data Map - * @param context - * @return boolean - */ - @Override - public Future upsert(String index, String identifier, Map data, RequestContext context) { - long startTime = System.currentTimeMillis(); - Promise promise = (Promise) (Promise) Futures.promise(); - logger.debug(context, "ElasticSearchRestHighImpl:upsert: method started at ==" + startTime - + " for INdex " + index); - if (!StringUtils.isBlank(index) - && !StringUtils.isBlank(identifier) - && data != null - && data.size() > 0) { - data.put("identifier", identifier); - IndexRequest indexRequest = new IndexRequest(index, _DOC, identifier).source(data); - - UpdateRequest updateRequest = new UpdateRequest(index, _DOC, identifier).upsert(indexRequest); - updateRequest.doc(indexRequest); - ActionListener listener = - new ActionListener() { - @Override - public void onResponse(UpdateResponse updateResponse) { - promise.success(true); - logger.info(context, "ElasticSearchRestHighImpl:upsert: Response for index : " + updateResponse.getResult() - + "," + index - + ",identifier : " + identifier); - logger.debug(context, "ElasticSearchRestHighImpl:upsert: method end == for Index " + index - + " ,Total time elapsed = " + calculateEndTime(startTime)); - } - - @Override - public void onFailure(Exception e) { - logger.error(context, "ElasticSearchRestHighImpl:upsert: exception occured:" + e.getMessage(), e); - promise.failure(e); - } - }; - ConnectionManager.getRestClient().updateAsync(updateRequest, RequestOptions.DEFAULT, listener); - return promise.future(); - } else { - logger.info(context, "ElasticSearchRestHighImpl:upsert: Requested data is invalid."); - promise.failure(ProjectUtil.createClientException(ResponseCode.invalidRequestData)); - return promise.future(); - } - } - - /** - * This method will return map of objects on the basis of ids provided. - * - * @param ids List of String - * @param fields List of String - * @param index index of elasticserach for query - * @param context - * @return future of requested data in the form of map - */ - @Override - public Future>> getEsResultByListOfIds(List ids, List fields, String index, RequestContext context) { - Map filters = new HashMap<>(); - filters.put(JsonKey.ID, ids); - - SearchDTO searchDTO = new SearchDTO(); - searchDTO.getAdditionalProperties().put(JsonKey.FILTERS, filters); - searchDTO.setFields(fields); - - Future> resultF = search(searchDTO, index, null); - Map result = (Map) ElasticSearchHelper.getResponseFromFuture(resultF); - List> esContent = (List>) result.get(JsonKey.CONTENT); - Promise>> promise = (Promise>>) (Promise) Futures.promise(); - promise.success(esContent.stream().collect(Collectors.toMap( - obj -> { - return (String) obj.get("id"); - }, - val -> val))); - logger.debug(context, "ElasticSearchRestHighImpl:getEsResultByListOfIds: method ended for index " + index); - - return promise.future(); - } -} diff --git a/core/es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java b/core/es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java deleted file mode 100644 index ff584db779..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.sunbird.common.factory; - -import org.sunbird.common.ElasticSearchRestHighImpl; -import org.sunbird.common.inf.ElasticSearchService; -import org.sunbird.keys.JsonKey; - -public class EsClientFactory { - - private static ElasticSearchService restClient = null; - - /** - * This method return REST/TCP client for elastic search - * - * @param type can be "tcp" or "rest" - * @return ElasticSearchService with the respected type impl - */ - public static ElasticSearchService getInstance(String type) { - if (JsonKey.REST.equals(type)) { - return getRestClient(); - } - return null; - } - - private static ElasticSearchService getRestClient() { - if (restClient == null) { - synchronized (EsClientFactory.class) { - if (restClient == null) { - restClient = new ElasticSearchRestHighImpl(); - } - } - } - return restClient; - } -} diff --git a/core/es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java b/core/es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java deleted file mode 100644 index 5041858b7a..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.sunbird.common.inf; - -import java.util.List; -import java.util.Map; -import org.sunbird.dto.SearchDTO; -import org.sunbird.request.RequestContext; -import scala.concurrent.Future; - -public interface ElasticSearchService { - public static final String _DOC = "_doc"; - - /** - * This method will put a new data entry inside Elastic search. identifier value becomes _id - * inside ES, so every time provide a unique value while saving it. - * - * @param index String ES index name - * @param identifier ES column identifier as an String - * @param data Map - * @param context - * @return String identifier for created data - */ - public Future save( - String index, String identifier, Map data, RequestContext context); - - /** - * This method will update data based on identifier.take the data based on identifier and merge - * with incoming data then update it. - * - * @param index String - * @param identifier String - * @param data Map - * @param context - * @return boolean - */ - public Future update( - String index, String identifier, Map data, RequestContext context); - - /** - * This method will provide data form ES based on incoming identifier. we can get data by passing - * index and identifier values , or all the three index, identifier and type - * - * @param index String - * @param identifier String - * @param context - * @return Map or null - */ - public Future> getDataByIdentifier( - String index, String identifier, RequestContext context); - - /** - * This method will remove data from ES based on identifier. - * - * @param index String - * @param identifier String - * @param context - */ - public Future delete(String index, String identifier, RequestContext context); - - /** - * Method to perform the elastic search on the basis of SearchDTO . SearchDTO contains the search - * criteria like fields, facets, sort by , filters etc. here user can pass single type to search - * or multiple type or null - * - * @param context - * @return search result as Map. - */ - public Future> search( - SearchDTO searchDTO, String index, RequestContext context); - - /** - * This method will do the health check of elastic search. - * - * @return boolean - */ - public Future healthCheck(); - - /** - * This method will do the bulk data insertion. - * - * @param index String index name - * @param dataList List> - * @param context - * @return boolean - */ - public Future bulkInsert( - String index, List> dataList, RequestContext context); - - /** - * This method will upsert data based on identifier.take the data based on identifier and merge - * with incoming data then update it or if not present already will create it. - * - * @param index String - * @param identifier String - * @param data Map - * @param context - * @return boolean - */ - public Future upsert( - String index, String identifier, Map data, RequestContext context); - - /** - * @param ids List of ids of document - * @param fields List of fields which needs to captured - * @param index elastic search index in which search should be done - * @param context - * @return Map> It will return a map with id as key and the data from ES - * as value - */ - public Future>> getEsResultByListOfIds( - List ids, List fields, String index, RequestContext context); -} diff --git a/core/es-utils/src/main/java/org/sunbird/dto/SearchDTO.java b/core/es-utils/src/main/java/org/sunbird/dto/SearchDTO.java deleted file mode 100644 index 84310b0f88..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/dto/SearchDTO.java +++ /dev/null @@ -1,188 +0,0 @@ -/** */ -package org.sunbird.dto; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * This class will take input for elastic search query - * - * @author Manzarul - */ -public class SearchDTO { - - @SuppressWarnings("rawtypes") - private List properties; - - private List> facets = new ArrayList<>(); - private List fields; - private List excludedFields; - private Map sortBy = new HashMap<>(); - private String operation; - private String query; - private List queryFields; - - private Integer limit = 250; - private Integer offset = 0; - private boolean fuzzySearch = false; - // additional properties will hold , filters, exist , not exist - private Map additionalProperties = new HashMap<>(); - private Map softConstraints = new HashMap<>(); - - private Map fuzzy = new HashMap<>(); - - private List> groupQuery = new ArrayList<>(); - private List mode = new ArrayList<>(); - - public List> getGroupQuery() { - return groupQuery; - } - - public void setGroupQuery(List> groupQuery) { - this.groupQuery = groupQuery; - } - - public SearchDTO() { - super(); - } - - @SuppressWarnings("rawtypes") - public SearchDTO(List properties, String operation, int limit) { - super(); - this.properties = properties; - this.operation = operation; - this.limit = limit; - } - - @SuppressWarnings("rawtypes") - public List getProperties() { - return properties; - } - - @SuppressWarnings("rawtypes") - public void setProperties(List properties) { - this.properties = properties; - } - - public String getOperation() { - return operation; - } - - public void setOperation(String operation) { - this.operation = operation; - } - - public Integer getLimit() { - return limit; - } - - public void setLimit(Integer limit) { - this.limit = limit; - } - - public List> getFacets() { - return facets; - } - - public void setFacets(List> facets) { - this.facets = facets; - } - - public Map getSortBy() { - return sortBy; - } - - public void setSortBy(Map sortBy) { - this.sortBy = sortBy; - } - - public boolean isFuzzySearch() { - return fuzzySearch; - } - - public void setFuzzySearch(boolean fuzzySearch) { - this.fuzzySearch = fuzzySearch; - } - - public Map getAdditionalProperties() { - return additionalProperties; - } - - public void setAdditionalProperties(Map additionalProperties) { - this.additionalProperties = additionalProperties; - } - - public Object getAdditionalProperty(String key) { - return additionalProperties.get(key); - } - - public void addAdditionalProperty(String key, Object value) { - this.additionalProperties.put(key, value); - } - - public List getFields() { - return fields; - } - - public void setFields(List fields) { - this.fields = fields; - } - - public Integer getOffset() { - return offset; - } - - public void setOffset(Integer offset) { - this.offset = offset; - } - - public Map getSoftConstraints() { - return softConstraints; - } - - public void setSoftConstraints(Map softConstraints) { - this.softConstraints = softConstraints; - } - - public String getQuery() { - return query; - } - - public void setQuery(String query) { - this.query = query; - } - - public List getMode() { - return mode; - } - - public void setMode(List mode) { - this.mode = mode; - } - - public List getExcludedFields() { - return excludedFields; - } - - public void setExcludedFields(List excludedFields) { - this.excludedFields = excludedFields; - } - - public List getQueryFields() { - return queryFields; - } - - public void setQueryFields(List queryFields) { - this.queryFields = queryFields; - } - - public Map getFuzzy() { - return fuzzy; - } - - public void setFuzzy(Map fuzzy) { - this.fuzzy = fuzzy; - } -} diff --git a/core/es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java b/core/es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java deleted file mode 100644 index af41874f47..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java +++ /dev/null @@ -1,127 +0,0 @@ -/** */ -package org.sunbird.helper; - -import java.io.IOException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpHost; -import org.elasticsearch.client.RestClient; -import org.elasticsearch.client.RestHighLevelClient; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; - -/** - * This class will manage connection. - * - * @author Manzarul - */ -public class ConnectionManager { - private static final LoggerUtil logger = new LoggerUtil(ConnectionManager.class); - - private static RestHighLevelClient restClient = null; - private static List host = new ArrayList<>(); - private static List ports = new ArrayList<>(); - - static { - System.setProperty("es.set.netty.runtime.available.processors", "false"); - initialiseRestClientConnection(); - registerShutDownHook(); - } - - private ConnectionManager() {} - - private static boolean initialiseRestClientConnection() { - boolean response = false; - try { - String cluster = System.getenv(JsonKey.SUNBIRD_ES_CLUSTER); - String hostName = System.getenv(JsonKey.SUNBIRD_ES_IP); - String port = System.getenv(JsonKey.SUNBIRD_ES_PORT); - if (StringUtils.isBlank(hostName) || StringUtils.isBlank(port)) { - return false; - } - String[] splitedHost = hostName.split(","); - for (String val : splitedHost) { - host.add(val); - } - String[] splitedPort = port.split(","); - for (String val : splitedPort) { - ports.add(Integer.parseInt(val)); - } - response = createRestClient(cluster, host); - logger.info( - "ELASTIC SEARCH CONNECTION ESTABLISHED for restClient from EVN with Following Details cluster " - + cluster - + " hostName" - + hostName - + " port " - + port - + response); - } catch (Exception e) { - logger.error("Error while initialising connection for restClient from the Env", e); - return false; - } - return response; - } - - /** - * This method will provide ES transport client. - * - * @return TransportClient - */ - public static RestHighLevelClient getRestClient() { - if (restClient == null) { - logger.info("ConnectionManager:getRestClient eLastic search rest clinet is null "); - initialiseRestClientConnection(); - logger.info( - "ConnectionManager:getRestClient after calling initialiseRestClientConnection ES client value "); - } - return restClient; - } - - /** - * This method will create the client instance for elastic search. - * - * @param clusterName String - * @param host List - * @return boolean - * @throws UnknownHostException - */ - private static boolean createRestClient(String clusterName, List host) { - HttpHost[] httpHost = new HttpHost[host.size()]; - for (int i = 0; i < host.size(); i++) { - httpHost[i] = new HttpHost(host.get(i), 9200); - } - restClient = new RestHighLevelClient(RestClient.builder(httpHost)); - logger.info("ConnectionManager:createRestClient client initialisation done. "); - return true; - } - - /** - * This class will be called by registerShutDownHook to register the call inside jvm , when jvm - * terminate it will call the run method to clean up the resource. - * - * @author Manzarul - */ - public static class ResourceCleanUp extends Thread { - @Override - public void run() { - try { - if (null != restClient) { - restClient.close(); - } - } catch (IOException e) { - logger.info( - "ConnectionManager:ResourceCleanUp error occured during restclient resource cleanup " - + e); - } - } - } - - /** Register the hook for resource clean up. this will be called when jvm shut down. */ - public static void registerShutDownHook() { - Runtime runtime = Runtime.getRuntime(); - runtime.addShutdownHook(new ResourceCleanUp()); - } -} diff --git a/core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchMapping.java b/core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchMapping.java deleted file mode 100644 index c7c6c0d9af..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchMapping.java +++ /dev/null @@ -1,21 +0,0 @@ -/** */ -package org.sunbird.helper; - -/** - * This class will define Elastic search mapping. - * - * @author Manzarul - */ -public class ElasticSearchMapping { - - /** - * This method will define ES default mapping. - * - * @return - */ - public static String createMapping() { - String mapping = - " { \"dynamic_templates\": [ {\"longs\": {\"match_mapping_type\": \"long\", \"mapping\": {\"type\": \"long\", \"fields\": { \"raw\": {\"type\": \"long\" } }}}},{\"booleans\": {\"match_mapping_type\": \"boolean\", \"mapping\": {\"type\": \"boolean\", \"fields\": { \"raw\": { \"type\": \"boolean\" }} }}},{\"doubles\": {\"match_mapping_type\": \"double\",\"mapping\": {\"type\": \"double\",\"fields\":{\"raw\": { \"type\": \"double\" } }}}},{ \"dates\": {\"match_mapping_type\": \"date\", \"mapping\": { \"type\": \"date\",\"fields\": {\"raw\": { \"type\": \"date\" } } }}},{\"strings\": {\"match_mapping_type\": \"string\",\"mapping\": {\"type\": \"text\",\"fielddata\": true,\"copy_to\": \"all_fields\",\"analyzer\": \"cs_index_analyzer\",\"search_analyzer\": \"cs_search_analyzer\",\"fields\": {\"raw\": {\"type\": \"text\",\"fielddata\": true,\"analyzer\": \"keylower\"}}}}}],\"properties\": {\"all_fields\": {\"type\": \"text\",\"analyzer\": \"cs_index_analyzer\",\"search_analyzer\": \"cs_search_analyzer\",\"fields\": { \"raw\": { \"type\": \"text\",\"analyzer\": \"keylower\" } }} }}"; - return mapping; - } -} diff --git a/core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchSettings.java b/core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchSettings.java deleted file mode 100644 index 577e5d2b31..0000000000 --- a/core/es-utils/src/main/java/org/sunbird/helper/ElasticSearchSettings.java +++ /dev/null @@ -1,21 +0,0 @@ -/** */ -package org.sunbird.helper; - -/** - * This class will define Elastic search default settings. - * - * @author Manzarul - */ -public class ElasticSearchSettings { - - /** - * This method will do default settings for Elastic search index - * - * @return String - */ - public static String createSettingsForIndex() { - String settings = - "{\"analysis\": {\"analyzer\": {\"cs_index_analyzer\": {\"type\": \"custom\",\"tokenizer\": \"standard\",\"filter\": [\"lowercase\",\"mynGram\"]},\"cs_search_analyzer\": {\"type\": \"custom\",\"tokenizer\": \"standard\",\"filter\": [\"lowercase\",\"standard\"]},\"keylower\": {\"type\": \"custom\",\"tokenizer\": \"keyword\",\"filter\": \"lowercase\"}},\"filter\": {\"mynGram\": {\"type\": \"ngram\",\"min_gram\": 1,\"max_gram\": 20,\"token_chars\": [\"letter\", \"digit\",\"whitespace\",\"punctuation\",\"symbol\"]} }}}"; - return settings; - } -} diff --git a/core/es-utils/src/main/resources/elasticsearch.conf b/core/es-utils/src/main/resources/elasticsearch.conf deleted file mode 100644 index 9e18c715f4..0000000000 --- a/core/es-utils/src/main/resources/elasticsearch.conf +++ /dev/null @@ -1,62 +0,0 @@ - { - mapping = { - searchindex = { - user = { - index = "user", - "type" = "_doc" - }, - org = { - index = "org", - "type" = "_doc" - }, - cbatch = { - index = "cbatch", - "type" = "_doc" - }, - badgeassociations = { - index = "badgeassociations", - "type" = "_doc" - }, - content = { - index = "content", - "type" = "_doc" - }, - usercourses = { - index = "usercourses", - "type" = "_doc" - }, - usernotes = { - index = "usernotes", - "type" = "_doc" - }, - userprofilevisibility = { - index = "userprofilevisibility", - "type" = "_doc" - }, - telemetry = { - index = "telemetry", - "type" = "_doc" - }, - location = { - index = "location", - "type" = "_doc" - }, - cbatchstats = { - index = "cbatchstats", - "type" = "_doc" - } - }, - sbtestindex = { - sbtesttype = { - index = "sbtestindex", - "type" = "sbtesttype" - } - }, - searchtest = { - usertest = { - index = "searchtest", - "type" = "usertest" - } - } - } - } diff --git a/core/es-utils/src/main/resources/indices/location.json b/core/es-utils/src/main/resources/indices/location.json deleted file mode 100644 index 57d5e52624..0000000000 --- a/core/es-utils/src/main/resources/indices/location.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "settings": { - "index": { - "number_of_shards": "5", - "number_of_replicas": "1", - "analysis": { - "filter": { - "mynGram": { - "token_chars": [ - "letter", - "digit", - "whitespace", - "punctuation", - "symbol" - ], - "min_gram": "1", - "type": "ngram", - "max_gram": "20" - } - }, - "analyzer": { - "cs_index_analyzer": { - "filter": [ - "lowercase", - "mynGram" - ], - "type": "custom", - "tokenizer": "standard" - }, - "keylower": { - "filter": "lowercase", - "type": "custom", - "tokenizer": "keyword" - }, - "cs_search_analyzer": { - "filter": [ - "lowercase", - "standard" - ], - "type": "custom", - "tokenizer": "standard" - } - } - } - } - }, - "mappings": { - "_doc": { - "dynamic": false, - "properties": { - "all_fields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "code": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "id": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "name": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "parentId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "type": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "value": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - } - } - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/indices/org.json b/core/es-utils/src/main/resources/indices/org.json deleted file mode 100644 index 20f24f3281..0000000000 --- a/core/es-utils/src/main/resources/indices/org.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "settings": { - "index": { - "number_of_shards": "5", - "number_of_replicas": "1", - "analysis": { - "filter": { - "mynGram": { - "token_chars": [ - "letter", - "digit", - "whitespace", - "punctuation", - "symbol" - ], - "min_gram": "3", - "type": "ngram", - "max_gram": "10" - } - }, - "analyzer": { - "cs_index_analyzer": { - "filter": [ - "lowercase", - "mynGram" - ], - "type": "custom", - "tokenizer": "standard" - }, - "keylower": { - "filter": "lowercase", - "type": "custom", - "tokenizer": "keyword" - }, - "cs_search_analyzer": { - "filter": [ - "lowercase", - "standard" - ], - "type": "custom", - "tokenizer": "standard" - } - } - } - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/indices/user.json b/core/es-utils/src/main/resources/indices/user.json deleted file mode 100644 index 608cf96987..0000000000 --- a/core/es-utils/src/main/resources/indices/user.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "settings": { - "index": { - "number_of_shards": "5", - "number_of_replicas": "1", - "analysis": { - "filter": { - "mynGram": { - "token_chars": [ - "letter", - "digit", - "whitespace", - "punctuation", - "symbol" - ], - "min_gram": "3", - "type": "ngram", - "max_gram": "10" - } - }, - "analyzer": { - "cs_index_analyzer": { - "filter": [ - "lowercase", - "mynGram" - ], - "type": "custom", - "tokenizer": "standard" - }, - "keylower": { - "filter": "lowercase", - "type": "custom", - "tokenizer": "keyword" - }, - "cs_search_analyzer": { - "filter": [ - "lowercase", - "standard" - ], - "type": "custom", - "tokenizer": "standard" - } - } - } - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/indices/userfeed.json b/core/es-utils/src/main/resources/indices/userfeed.json deleted file mode 100644 index 1ba018b740..0000000000 --- a/core/es-utils/src/main/resources/indices/userfeed.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "settings": { - "index": { - "number_of_shards": "5", - "number_of_replicas": "1", - "analysis": { - "filter": { - "mynGram": { - "token_chars": [ - "letter", - "digit", - "whitespace", - "punctuation", - "symbol" - ], - "min_gram": "1", - "type": "ngram", - "max_gram": "20" - } - }, - "analyzer": { - "cs_index_analyzer": { - "filter": [ - "lowercase", - "mynGram" - ], - "type": "custom", - "tokenizer": "standard" - }, - "keylower": { - "filter": "lowercase", - "type": "custom", - "tokenizer": "keyword" - }, - "cs_search_analyzer": { - "filter": [ - "lowercase", - "standard" - ], - "type": "custom", - "tokenizer": "standard" - } - } - } - } - }, - "mappings": { - "_doc": { - "dynamic":false, - "properties": { - "status": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "all_fields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "category": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "data": { - "type": "object" - }, - "createdBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "id": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "identifier": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "priority": { - "type": "long", - "fields": { - "raw": { - "type": "long" - } - } - }, - "createdOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "expireOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "updatedOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "updatedBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "userId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - } - } - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/indices/usernotes.json b/core/es-utils/src/main/resources/indices/usernotes.json deleted file mode 100644 index 8cf7ff1455..0000000000 --- a/core/es-utils/src/main/resources/indices/usernotes.json +++ /dev/null @@ -1,289 +0,0 @@ -{ - "settings": { - "index": { - "number_of_shards": "5", - "number_of_replicas": "1", - "analysis": { - "filter": { - "mynGram": { - "token_chars": [ - "letter", - "digit", - "whitespace", - "punctuation", - "symbol" - ], - "min_gram": "1", - "type": "ngram", - "max_gram": "20" - } - }, - "analyzer": { - "cs_index_analyzer": { - "filter": [ - "lowercase", - "mynGram" - ], - "type": "custom", - "tokenizer": "standard" - }, - "keylower": { - "filter": "lowercase", - "type": "custom", - "tokenizer": "keyword" - }, - "cs_search_analyzer": { - "filter": [ - "lowercase", - "standard" - ], - "type": "custom", - "tokenizer": "standard" - } - } - } - } - }, - "mappings": { - "_doc": { - "dynamic": false, - "properties": { - "all_fields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "completeness": { - "type": "long", - "fields": { - "raw": { - "type": "long" - } - } - }, - "contentId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "courseId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "createdBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "createdDate": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "id": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "identifier": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "isDeleted": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "missingFields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "note": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "tags": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "title": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "updatedBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "updatedDate": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "userId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - } - } - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/mappings/location-mapping.json b/core/es-utils/src/main/resources/mappings/location-mapping.json deleted file mode 100644 index 39c416274f..0000000000 --- a/core/es-utils/src/main/resources/mappings/location-mapping.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "dynamic": false, - "properties": { - "all_fields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "code": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "id": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "name": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "parentId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "type": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "value": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/mappings/org-mapping.json b/core/es-utils/src/main/resources/mappings/org-mapping.json deleted file mode 100644 index 5f952a7940..0000000000 --- a/core/es-utils/src/main/resources/mappings/org-mapping.json +++ /dev/null @@ -1,268 +0,0 @@ -{ - "dynamic": false, - "properties": { - "address": { - "type": "object" - }, - "addressId": { - "type": "keyword", - "index": false - }, - "channel": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "completeness": { - "type": "long", - "index": false - }, - "contactdetails": { - "type": "object" - }, - "createdBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "createdDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "description": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "email": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "externalId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "hashTagId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "homeUrl": { - "type": "text", - "index": false - }, - "id": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "identifier": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "imgUrl": { - "type": "text", - "index": false - }, - "isDefault": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "isRootOrg": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "locationId": { - "type": "text", - "index": false - }, - "locationIds": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "missingFields": { - "type": "text", - "index": false - }, - "noOfMembers": { - "type": "long", - "index": false - }, - "orgCode": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "orgName": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "orgType": { - "type": "keyword", - "index": false - }, - "organisationType": { - "type": "long", - "fields": { - "raw": { - "type": "long" - } - }, - "index": true - }, - "orgTypeId": { - "type": "keyword", - "index": false - }, - "preferredLanguage": { - "type": "keyword", - "index": false - }, - "provider": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "rootOrgId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "slug": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "status": { - "type": "long", - "fields": { - "raw": { - "type": "long" - } - } - }, - "theme": { - "type": "keyword", - "index": false - }, - "updatedBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "updatedDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "orgLocation": { - "properties": { - "id": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "type": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - } - } - }, - "isTenant": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/mappings/user-mapping.json b/core/es-utils/src/main/resources/mappings/user-mapping.json deleted file mode 100644 index c602353add..0000000000 --- a/core/es-utils/src/main/resources/mappings/user-mapping.json +++ /dev/null @@ -1,874 +0,0 @@ -{ - "dynamic": false, - "properties": { - "managedBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "activeStatus": { - "type": "keyword", - "index": false - }, - "address": { - "type": "object" - }, - "appointmentType": { - "type": "keyword", - "index": false - }, - "authenticationStatus": { - "type": "keyword", - "index": false - }, - "avatar": { - "type": "keyword", - "index": false - }, - "badgeAssertions": { - "type": "object" - }, - "badges": { - "type": "object" - }, - "batches": { - "type": "object" - }, - "channel": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "classSubjectTaught": { - "type": "object" - }, - "completeness": { - "type": "long", - "index": false - }, - "countryCode": { - "type": "keyword", - "index": false - }, - "createdBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "createdDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "disabilityType": { - "type": "keyword", - "index": false - }, - "dob": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "education": { - "type": "object" - }, - "email": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "prevUsedEmail": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "emailVerified": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "emailverified": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "employmentState": { - "type": "keyword", - "index": false - }, - "encEmail": { - "type": "keyword", - "index": false - }, - "encPhone": { - "type": "keyword", - "index": false - }, - "firstName": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "framework": { - "properties": { - "board": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "gradeLevel": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "id": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "medium": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "subject": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - } - } - }, - "fullName": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "gender": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "grade": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "highestAcademicQualification": { - "type": "keyword", - "index": false - }, - "highestEnglishQualification": { - "type": "keyword", - "index": false - }, - "highestMathQualification": { - "type": "keyword", - "index": false - }, - "highestSSTQualification": { - "type": "keyword", - "index": false - }, - "highestScienceQualification": { - "type": "keyword", - "index": false - }, - "highestTeacherQualification": { - "type": "keyword", - "index": false - }, - "highestVernacularLanguageQualification": { - "type": "keyword", - "index": false - }, - "id": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "identifier": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "isDeleted": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "isMasterTrainer": { - "type": "keyword", - "index": false - }, - "jobProfile": { - "type": "object" - }, - "language": { - "type": "keyword", - "index": false - }, - "lastName": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "lastUpdatedOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "location": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "locationIds": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "loginId": { - "type": "keyword", - "index": false - }, - "maskEmail": { - "type": "keyword", - "index": false - }, - "maskPhone": { - "type": "keyword", - "index": false - }, - "maskedEmail": { - "type": "keyword", - "index": false - }, - "maskedPhone": { - "type": "keyword", - "index": false - }, - "masterTrainerSubjects": { - "type": "keyword", - "index": false - }, - "missingFields": { - "type": "keyword", - "index": false - }, - "organisations": { - "properties": { - "addedBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "addedByName": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "approvalDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "approvaldate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "approvedBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "hashTagId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "id": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "isApproved": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "isDeleted": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "isRejected": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "orgJoinDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "orgLeftDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "orgName": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "organisationId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "orgjoindate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "position": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "updatedBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "updatedDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "userId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - } - } - }, - "phone": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "prevUsedPhone": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "phoneVerified": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "phoneverified": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "profileSummary": { - "type": "keyword", - "index": false - }, - "profileVisibility": { - "type": "object" - }, - "provider": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "regOrgId": { - "type": "keyword", - "index": false - }, - "registryId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "roles": { - "properties": { - "role": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "userId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "scope": { - "type": "nested", - "properties": { - "orgId": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - } - } - }, - "createdBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "createdDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "updatedBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "updatedDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - } - } - }, - "rootOrgId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "rootOrgName": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "schoolCode": { - "type": "double", - "index": false - }, - "schoolJoiningDate": { - "type": "date", - "index": false - }, - "serviceJoiningDate": { - "type": "date", - "index": false - }, - "skills": { - "type": "object" - }, - "status": { - "type": "long", - "fields": { - "raw": { - "type": "long" - } - } - }, - "subject": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "teacherInBRC": { - "type": "keyword", - "index": false - }, - "teacherInCRC": { - "type": "keyword", - "index": false - }, - "teacherSchoolBoardAffiliation": { - "type": "keyword", - "index": false - }, - "teacherStatus": { - "type": "keyword", - "index": false - }, - "teacherType": { - "type": "keyword", - "index": false - }, - "tncAcceptedOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "tncAcceptedVersion": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "trainingsCompleted": { - "type": "keyword", - "index": false - }, - "updatedBy": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "updatedDate": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "userId": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "userName": { - "type": "keyword", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - } - }, - "userType": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_search_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "vernacularLanguageStudied": { - "type": "keyword", - "index": false - }, - "webPages": { - "type": "object" - }, - "profileLocation": { - "properties": { - "id": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "type": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - } - } - }, - "profileUserType": { - "properties": { - "subType": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "type": { - "type": "keyword", - "fields": { - "raw": { - "type": "keyword" - } - } - } - } - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/mappings/userfeed-mapping.json b/core/es-utils/src/main/resources/mappings/userfeed-mapping.json deleted file mode 100644 index deba277e57..0000000000 --- a/core/es-utils/src/main/resources/mappings/userfeed-mapping.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "dynamic":false, - "properties": { - "status": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "all_fields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "category": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "data": { - "type": "object" - }, - "createdBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "id": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "identifier": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "priority": { - "type": "long", - "fields": { - "raw": { - "type": "long" - } - } - }, - "createdOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "expireOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "updatedOn": { - "type": "date", - "fields": { - "raw": { - "type": "date" - } - } - }, - "updatedBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "userId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/main/resources/mappings/usernotes-mapping.json b/core/es-utils/src/main/resources/mappings/usernotes-mapping.json deleted file mode 100644 index c2aa64bfa2..0000000000 --- a/core/es-utils/src/main/resources/mappings/usernotes-mapping.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "dynamic": false, - "properties": { - "all_fields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower" - } - }, - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer" - }, - "completeness": { - "type": "long", - "fields": { - "raw": { - "type": "long" - } - } - }, - "contentId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "courseId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "createdBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "createdDate": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "id": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "identifier": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "isDeleted": { - "type": "boolean", - "fields": { - "raw": { - "type": "boolean" - } - } - }, - "missingFields": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "note": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "tags": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "title": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "updatedBy": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "updatedDate": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - }, - "userId": { - "type": "text", - "fields": { - "raw": { - "type": "text", - "analyzer": "keylower", - "fielddata": true - } - }, - "copy_to": [ - "all_fields" - ], - "analyzer": "cs_index_analyzer", - "search_analyzer": "cs_search_analyzer", - "fielddata": true - } - } -} \ No newline at end of file diff --git a/core/es-utils/src/test/java/org/sunbird/common/ElasticSearchRestHighImplTest.java b/core/es-utils/src/test/java/org/sunbird/common/ElasticSearchRestHighImplTest.java deleted file mode 100644 index fb80b4ec42..0000000000 --- a/core/es-utils/src/test/java/org/sunbird/common/ElasticSearchRestHighImplTest.java +++ /dev/null @@ -1,469 +0,0 @@ -package org.sunbird.common; - -import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.DocWriteResponse; -import org.elasticsearch.action.bulk.BulkItemResponse; -import org.elasticsearch.action.bulk.BulkProcessor; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.action.delete.DeleteResponse; -import org.elasticsearch.action.get.GetRequestBuilder; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.common.util.concurrent.FutureUtils; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.aggregations.Aggregations; -import org.junit.Assert; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.common.factory.EsClientFactory; -import org.sunbird.common.inf.ElasticSearchService; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.helper.ConnectionManager; -import org.sunbird.keys.JsonKey; -import org.sunbird.util.PropertiesCache; -import scala.concurrent.Future; - -import java.util.*; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.when; -import static org.powermock.api.mockito.PowerMockito.doNothing; -import static org.powermock.api.mockito.PowerMockito.mock; - -/** - * Test class for Elastic search Rest High level client Impl - * - * @author github.com/iostream04 - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -@PrepareForTest({ - ConnectionManager.class, - RestHighLevelClient.class, - AcknowledgedResponse.class, - GetRequestBuilder.class, - BulkProcessor.class, - FutureUtils.class, - SearchHit.class, - SearchHits.class, - Aggregations.class, - ElasticSearchHelper.class, - PropertiesCache.class -}) -public class ElasticSearchRestHighImplTest { - - private ElasticSearchService esService = EsClientFactory.getInstance(JsonKey.REST); - private static RestHighLevelClient client = null; - - @Before - public void initBeforeTest() { - mockBaseRules(); - mockRulesForSave(false); - } - - @Test - public void testSaveSuccess() { - mockRulesForSave(false); - Future result = esService.save("test", "001", new HashMap<>(), null); - String res = (String) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals("001", res); - } - - @Test - public void testSaveFailureWithEmptyIndex() { - - Future result = esService.save("", "001", new HashMap<>(), null); - String res = (String) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals("ERROR", res); - } - - @Test - public void testSaveFailureWithEmptyIdentifier() { - Future result = esService.save("test", "", new HashMap<>(), null); - String res = (String) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals("ERROR", res); - } - - @Test - public void testSaveFailure() { - mockRulesForSave(true); - Future result = esService.save("test", "001", new HashMap<>(), null); - String res = (String) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(null, res); - } - - @Test - public void testUpdateSuccess() { - mockRulesForUpdate(false); - Future result = esService.update("test", "001", new HashMap<>(), null); - boolean res = (boolean) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(true, res); - } - - @Test - public void testUpdateFailure() { - mockRulesForUpdate(true); - Future result = esService.update("test", "001", new HashMap<>(), null); - Object res = ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(null, res); - } - - @Test - public void testUpdateFailureWithEmptyIndex() { - try { - esService.update("", "001", new HashMap<>(), null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testUpdateFailureWithEmptyIdentifier() { - try { - esService.update("test", "", new HashMap<>(), null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testGetDataByIdentifierFailureWithEmptyIndex() { - try { - esService.getDataByIdentifier("", "001", null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testGetDataByIdentifierFailureWithEmptyIdentifier() { - try { - esService.getDataByIdentifier("test", "", null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testGetDataByIdentifierFailure() { - mockRulesForGet(true); - Future> result = esService.getDataByIdentifier("test", "001", null); - Object res = ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(null, res); - } - - @Test - public void testDeleteSuccess() { - mockRulesForDelete(false, false); - Future result = esService.delete("test", "001", null); - boolean res = (boolean) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(true, res); - } - - @Test - public void testDeleteSuccessWithoutDelete() { - mockRulesForDelete(false, true); - Future result = esService.delete("test", "001", null); - boolean res = (boolean) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(false, res); - } - - @Test - public void testDeleteFailure() { - mockRulesForDelete(true, false); - Future result = esService.delete("test", "001", null); - Object res = ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(null, res); - } - - @Test - public void testDeleteFailureWithEmptyIdentifier() { - try { - esService.delete("test", "", null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testDeleteFailureWithEmptyIndex() { - try { - esService.delete("", "001", null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testUpsertSuccess() { - mockRulesForUpdate(false); - Future result = esService.update("test", "001", new HashMap<>(), null); - boolean res = (boolean) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(true, res); - } - - @Test - public void testUpsertFailure() { - mockRulesForUpdate(true); - Future result = esService.update("test", "001", new HashMap<>(), null); - Object res = ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(null, res); - } - - @Test - public void testUpsertFailureWithEmptyIndex() { - try { - esService.update("", "001", new HashMap<>(), null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testUpsertFailureWithEmptyIdentifier() { - try { - esService.update("test", "", new HashMap<>(), null); - } catch (ProjectCommonException e) { - assertEquals(e.getErrorResponseCode(), ResponseCode.invalidRequestData.getResponseCode()); - } - } - - @Test - public void testBuilInsertSuccess() { - mockRulesForBulk(false); - List> list = new ArrayList<>(); - Map map = new HashMap<>(); - map.put(JsonKey.IDENTIFIER, "0001"); - list.add(map); - Future result = esService.bulkInsert("test", list, null); - boolean res = (boolean) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(true, res); - } - - @Test - public void testBuilInsertFailure() { - mockRulesForBulk(true); - List> list = new ArrayList<>(); - Map map = new HashMap<>(); - map.put(JsonKey.IDENTIFIER, "0001"); - list.add(map); - Future result = esService.bulkInsert("test", list, null); - boolean res = (boolean) ElasticSearchHelper.getResponseFromFuture(result); - assertEquals(false, res); - } - - private void mockBaseRules() { - client = mock(RestHighLevelClient.class); - PowerMockito.mockStatic(ConnectionManager.class); - PowerMockito.mockStatic(PropertiesCache.class); - - try { - doNothing().when(ConnectionManager.class, "registerShutDownHook"); - } catch (Exception e) { - Assert.fail("Initialization of test case failed due to " + e.getLocalizedMessage()); - } - when(ConnectionManager.getRestClient()).thenReturn(client); - } - - private static void mockRulesForBulk(boolean fail) { - Iterator itr = mock(Iterator.class); - - BulkResponse response = mock(BulkResponse.class); - when(response.iterator()).thenReturn(itr); - when(itr.hasNext()).thenReturn(false); - - if (!fail) { - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - ((ActionListener) invocation.getArguments()[2]) - .onResponse(response); - return null; - } - }) - .when(client) - .bulkAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } else { - - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - - ((ActionListener) invocation.getArguments()[2]) - .onFailure(new NullPointerException()); - return null; - } - }) - .when(client) - .bulkAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } - } - - private static void mockRulesForSave(boolean fail) { - IndexResponse ir = mock(IndexResponse.class); - when(ir.getId()).thenReturn("001"); - - if (!fail) { - - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - ((ActionListener) invocation.getArguments()[2]).onResponse(ir); - return null; - } - }) - .when(client) - .indexAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } else { - - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - - ((ActionListener) invocation.getArguments()[2]) - .onFailure(new NullPointerException()); - return null; - } - }) - .when(client) - .indexAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } - } - - @SuppressWarnings("rawtypes") - private static void mockRulesForUpdate(boolean fail) { - UpdateResponse updateRes = mock(UpdateResponse.class); - when(updateRes.getResult()).thenReturn(null); - - if (!fail) { - - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - ((ActionListener) invocation.getArguments()[2]) - .onResponse(updateRes); - return null; - } - }) - .when(client) - .updateAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } else { - - doAnswer( - new Answer() { - @SuppressWarnings("unchecked") - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - - ((ActionListener) invocation.getArguments()[2]) - .onFailure(new NullPointerException()); - return null; - } - }) - .when(client) - .updateAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } - } - - @SuppressWarnings("rawtypes") - private static void mockRulesForGet(boolean fail) { - GetResponse getResponse = mock(GetResponse.class); - Map map = new HashMap<>(); - map.put("test", "any"); - when(getResponse.getSourceAsMap()).thenReturn(map); - when(getResponse.isExists()).thenReturn(true); - - if (!fail) { - - doAnswer( - new Answer() { - @SuppressWarnings("unchecked") - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - ((ActionListener) invocation.getArguments()[2]) - .onResponse(getResponse); - return null; - } - }) - .when(client) - .getAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } else { - - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - - ((ActionListener) invocation.getArguments()[2]) - .onFailure(new NullPointerException()); - return null; - } - }) - .when(client) - .getAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } - } - - private static void mockRulesForDelete(boolean fail, boolean notFound) { - DeleteResponse delResponse = mock(DeleteResponse.class); - - if (!fail) { - if (notFound) { - when(delResponse.getResult()).thenReturn(DocWriteResponse.Result.NOT_FOUND); - } - - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - ((ActionListener) invocation.getArguments()[2]) - .onResponse(delResponse); - return null; - } - }) - .when(client) - .deleteAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } else { - - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - - ((ActionListener) invocation.getArguments()[2]) - .onFailure(new NullPointerException()); - return null; - } - }) - .when(client) - .deleteAsync(Mockito.any(), Mockito.any(), Mockito.any()); - } - } -} diff --git a/core/es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java b/core/es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java deleted file mode 100644 index 51db98ce04..0000000000 --- a/core/es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.sunbird.common.factory; - -import org.junit.Assert; -import org.junit.Test; -import org.sunbird.common.ElasticSearchRestHighImpl; -import org.sunbird.common.inf.ElasticSearchService; - -public class EsClientFactoryTest { - - @Test - public void testGetRestClient() { - ElasticSearchService service = EsClientFactory.getInstance("rest"); - Assert.assertTrue(service instanceof ElasticSearchRestHighImpl); - } - - @Test - public void testInstanceNull() { - ElasticSearchService service = EsClientFactory.getInstance("test"); - Assert.assertNull(service); - } -} diff --git a/core/es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java b/core/es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java deleted file mode 100644 index 4d5f8afb5e..0000000000 --- a/core/es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.sunbird.helper; - -import org.elasticsearch.action.bulk.BulkProcessor; -import org.elasticsearch.action.get.GetRequestBuilder; -import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.common.util.concurrent.FutureUtils; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.aggregations.Aggregations; -import org.junit.Assert; -import org.junit.FixMethodOrder; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -/** @author manzarul */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -@PrepareForTest({ - ConnectionManager.class, - AcknowledgedResponse.class, - GetRequestBuilder.class, - BulkProcessor.class, - FutureUtils.class, - SearchHit.class, - SearchHits.class, - Aggregations.class -}) -public class ConnectionManagerTest { - - // @Test - public void testGetRestClientNull() { - RestHighLevelClient client = ConnectionManager.getRestClient(); - Assert.assertNull(client); - } -} diff --git a/core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchMappingTest.java b/core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchMappingTest.java deleted file mode 100644 index 37ad6061a1..0000000000 --- a/core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchMappingTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.sunbird.helper; - -import org.junit.Assert; -import org.junit.Test; - -public class ElasticSearchMappingTest { - - @Test - public void testcreateMapping() { - String mapping = ElasticSearchMapping.createMapping(); - Assert.assertNotNull(mapping); - } -} diff --git a/core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchSettingsTest.java b/core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchSettingsTest.java deleted file mode 100644 index f21f539c99..0000000000 --- a/core/es-utils/src/test/java/org/sunbird/helper/ElasticSearchSettingsTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.sunbird.helper; - -import org.junit.Assert; -import org.junit.Test; - -public class ElasticSearchSettingsTest { - - @Test - public void testcreateSettingsForIndex() { - - String settings = ElasticSearchSettings.createSettingsForIndex(); - Assert.assertNotNull(settings); - } -} diff --git a/core/es-utils/src/test/resources/elasticsearch.config.properties b/core/es-utils/src/test/resources/elasticsearch.config.properties deleted file mode 100644 index 84aafa4ddc..0000000000 --- a/core/es-utils/src/test/resources/elasticsearch.config.properties +++ /dev/null @@ -1,3 +0,0 @@ -es.cluster.name=test -es.host.name=localhost -es.host.port=9300 \ No newline at end of file From 80679cbedd74df8c2c2981c277dc8bb9f5b9a835 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Sat, 24 Jan 2026 11:04:32 +0530 Subject: [PATCH 02/17] feat: add rewritten standardized ES utility to core module --- .../sunbird/common/ElasticSearchHelper.java | 880 ++++++++++++++++++ .../common/ElasticSearchRestHighImpl.java | 751 +++++++++++++++ .../common/factory/EsClientFactory.java | 62 ++ .../common/inf/ElasticSearchService.java | 138 +++ .../main/java/org/sunbird/dto/SearchDTO.java | 233 +++++ .../org/sunbird/helper/ConnectionManager.java | 201 ++++ 6 files changed, 2265 insertions(+) create mode 100644 core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java create mode 100644 core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java create mode 100644 core/sunbird-es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java create mode 100644 core/sunbird-es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java create mode 100644 core/sunbird-es-utils/src/main/java/org/sunbird/dto/SearchDTO.java create mode 100644 core/sunbird-es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java new file mode 100644 index 0000000000..834960c359 --- /dev/null +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java @@ -0,0 +1,880 @@ +package org.sunbird.common; + +import static org.sunbird.util.ProjectUtil.isNotNull; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.lucene.search.join.ScoreMode; +import org.apache.pekko.util.Timeout; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.ExistsQueryBuilder; +import org.elasticsearch.index.query.MatchQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; +import org.elasticsearch.index.query.TermQueryBuilder; +import org.elasticsearch.index.query.TermsQueryBuilder; +import org.elasticsearch.common.unit.Fuzziness; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; +import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket; +import org.elasticsearch.search.sort.SortOrder; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.dto.SearchDTO; +import scala.concurrent.Await; +import scala.concurrent.Future; + +/** + * Helper class for Elasticsearch operations. + * Provides utility methods for query construction, response parsing, and aggregation handling. + */ +public class ElasticSearchHelper { + + /** Less than or equal to operator constant. */ + public static final String LTE = "<="; + + /** Less than operator constant. */ + public static final String LT = "<"; + + /** Greater than or equal to operator constant. */ + public static final String GTE = ">="; + + /** Greater than operator constant. */ + public static final String GT = ">"; + + /** Ascending sort order constant. */ + public static final String ASC_ORDER = "ASC"; + + /** Starts with string operation constant. */ + public static final String STARTS_WITH = "startsWith"; + + /** Ends with string operation constant. */ + public static final String ENDS_WITH = "endsWith"; + + /** Soft mode constant for constraints. */ + public static final String SOFT_MODE = "soft"; + + /** Suffix for raw field access in Elasticsearch. */ + public static final String RAW_APPEND = ".raw"; + + /** Cache for verifying index existence. */ + protected static Map indexMap = new HashMap<>(); + + /** Cache for verifying type existence. */ + protected static Map typeMap = new HashMap<>(); + + /** Default wait time in seconds for async operations. */ + public static final int WAIT_TIME = 5; + + /** Timeout configuration for async operations. */ + public static Timeout timeout = new Timeout(WAIT_TIME, TimeUnit.SECONDS); + + /** Valid results for upsert operations. */ + public static final List upsertResults = + new ArrayList<>(Arrays.asList("CREATED", "UPDATED", "NOOP")); + + /** Default document type for Elasticsearch 6.x/7.x compatibility. */ + private static final String _DOC = "_doc"; + + private static final LoggerUtil logger = new LoggerUtil(ElasticSearchHelper.class); + + /** Private constructor to prevent instantiation of utility class. */ + private ElasticSearchHelper() {} + + /** + * Waits for and returns the result from a Scala Future. + * + * @param future The Scala Future to wait for + * @return The result object from the future, or null if an error occurs + */ + @SuppressWarnings("unchecked") + public static Object getResponseFromFuture(Future future) { + try { + if (future != null) { + return Await.result(future, timeout.duration()); + } + } catch (Exception e) { + logger.error(null, "ElasticSearchHelper:getResponseFromFuture: Error occurred while waiting for future result", e); + } + return null; + } + + /** + * Adds aggregations to the SearchRequestBuilder based on the provided facets. + * + * @param searchRequestBuilder The builder to add aggregations to + * @param facets List of facets configuration + * @return The updated SearchRequestBuilder + */ + public static SearchRequestBuilder addAggregations( + SearchRequestBuilder searchRequestBuilder, List> facets) { + long startTime = System.currentTimeMillis(); + logger.debug(null, "ElasticSearchHelper:addAggregations: method started at " + startTime); + + if (searchRequestBuilder != null && CollectionUtils.isNotEmpty(facets)) { + Map map = facets.get(0); + if (MapUtils.isNotEmpty(map)) { + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + + if (JsonKey.DATE_HISTOGRAM.equalsIgnoreCase(value)) { + searchRequestBuilder.addAggregation( + AggregationBuilders.dateHistogram(key) + .field(key + RAW_APPEND) + .dateHistogramInterval(DateHistogramInterval.days(1))); + } else if (value == null) { + searchRequestBuilder.addAggregation( + AggregationBuilders.terms(key).field(key + RAW_APPEND)); + } + } + } + } + + long elapsedTime = calculateEndTime(startTime); + logger.debug(null, "ElasticSearchHelper:addAggregations: method ended. Total time elapsed = " + elapsedTime); + return searchRequestBuilder; + } + + /** + * Extracts soft constraints from the SearchDTO. + * + * @param searchDTO The search object containing constraints + * @return Map of constraints where key is the field and value is the boost/weight + */ + public static Map getConstraints(SearchDTO searchDTO) { + if (searchDTO != null && MapUtils.isNotEmpty(searchDTO.getSoftConstraints())) { + return searchDTO.getSoftConstraints().entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().floatValue())); + } + return Collections.emptyMap(); + } + + /** + * Prepares a SearchRequestBuilder for the TransportClient (Legacy support). + * + * @param client The TransportClient instance + * @param index Array of index names to search + * @return A configured SearchRequestBuilder + */ + public static SearchRequestBuilder getTransportSearchBuilder( + TransportClient client, String[] index) { + return client.prepareSearch().setIndices(index).setTypes(_DOC); + } + + /** + * Adds additional search criteria such as filters, exists, nested filters to the query. + * + * @param query The BoolQueryBuilder to update + * @param entry Map entry containing the query key and value + * @param constraintsMap Map of constraints for boost values + */ + @SuppressWarnings("unchecked") + public static void addAdditionalProperties( + BoolQueryBuilder query, Entry entry, Map constraintsMap) { + long startTime = System.currentTimeMillis(); + logger.debug(null, "ElasticSearchHelper:addAdditionalProperties: method started at " + startTime); + + String key = entry.getKey(); + Object value = entry.getValue(); + + if (JsonKey.FILTERS.equalsIgnoreCase(key)) { + if (value instanceof Map) { + Map filters = (Map) value; + for (Map.Entry en : filters.entrySet()) { + query = createFilterESOperation(en, query, constraintsMap); + } + } + } else if (JsonKey.EXISTS.equalsIgnoreCase(key) || JsonKey.NOT_EXISTS.equalsIgnoreCase(key)) { + query = createESOperation(entry, query, constraintsMap); + } else if (JsonKey.NESTED_EXISTS.equalsIgnoreCase(key) + || JsonKey.NESTED_NOT_EXISTS.equalsIgnoreCase(key)) { + query = createNestedESOperation(entry, query, constraintsMap); + } else if (JsonKey.NESTED_KEY_FILTER.equalsIgnoreCase(key)) { + if (value instanceof Map) { + Map nestedFilters = (Map) value; + for (Map.Entry en : nestedFilters.entrySet()) { + query = createNestedFilterESOperation(en, query, constraintsMap); + } + } + } + + long elapsedTime = calculateEndTime(startTime); + logger.debug(null, "ElasticSearchHelper:addAdditionalProperties: method ended. Total time elapsed = " + elapsedTime); + } + + /** + * Creates filter operations including Terms, Term, Range, and Match queries. + * + * @param entry Map entry with field name and value/condition + * @param query The BoolQueryBuilder to append to + * @param constraintsMap Map of boost constraints + * @return The updated BoolQueryBuilder + */ + @SuppressWarnings("unchecked") + private static BoolQueryBuilder createFilterESOperation( + Entry entry, BoolQueryBuilder query, Map constraintsMap) { + String key = entry.getKey(); + Object val = entry.getValue(); + + if (val != null) { + if (val instanceof List) { + query = getTermQueryFromList(val, key, query, constraintsMap); + } else if (val instanceof Map) { + if (key.equalsIgnoreCase(JsonKey.ES_OR_OPERATION)) { + query.must(createEsORFilterQuery((Map) val)); + } else { + query = getTermQueryFromMap(val, key, query, constraintsMap); + } + } else if (val instanceof String) { + query.must( + createTermQuery(key + RAW_APPEND, ((String) val).toLowerCase(), constraintsMap.get(key))); + } else { + query.must(createTermQuery(key + RAW_APPEND, val, constraintsMap.get(key))); + } + } + return query; + } + + /** + * Creates nested filter operations for the given entry, updating the query builder. + * Handles List, Map, and String values for nested properties. + * + * @param entry The map entry containing the key (dot-separated path) and value for the filter. + * @param query The BoolQueryBuilder to update with the new nested query. + * @param constraintsMap A map of constraints (boost values) for keys. + * @return The updated BoolQueryBuilder. + */ + @SuppressWarnings("unchecked") + private static BoolQueryBuilder createNestedFilterESOperation( + Entry entry, BoolQueryBuilder query, Map constraintsMap) { + String key = entry.getKey(); + Object val = entry.getValue(); + String path = key.split("\\.")[0]; + + if (val instanceof List && CollectionUtils.isNotEmpty((List) val)) { + List valueList = (List) val; + if (valueList.get(0) instanceof String) { + List stringList = (List) val; + stringList.replaceAll(String::toLowerCase); + query.must( + QueryBuilders.nestedQuery( + path, + createTermsQuery(key + RAW_APPEND, stringList, constraintsMap.get(key)), + ScoreMode.None)); + } else { + query.must( + QueryBuilders.nestedQuery( + path, createTermsQuery(key, valueList, constraintsMap.get(key)), ScoreMode.None)); + } + } else if (val instanceof Map) { + query = getNestedTermQueryFromMap(val, key, path, query, constraintsMap); + } else if (val instanceof String) { + query.must( + QueryBuilders.nestedQuery( + path, + createTermQuery( + key + RAW_APPEND, ((String) val).toLowerCase(), constraintsMap.get(key)), + ScoreMode.None)); + } else { + query.must( + QueryBuilders.nestedQuery( + path, + createTermQuery(key + RAW_APPEND, val, constraintsMap.get(key)), + ScoreMode.None)); + } + return query; + } + + /** + * Generates a term query or range/lexical query from a Map value. + * + * @param val The value map containing operation keys (e.g., LT, GT, startsWith). + * @param key The field key for the query. + * @param query The BoolQueryBuilder to update. + * @param constraintsMap Map of boost constraints. + * @return The updated BoolQueryBuilder. + */ + @SuppressWarnings("unchecked") + private static BoolQueryBuilder getTermQueryFromMap( + Object val, String key, BoolQueryBuilder query, Map constraintsMap) { + Map value = (Map) val; + Map rangeOperation = new HashMap<>(); + Map lexicalOperation = new HashMap<>(); + + for (Map.Entry entry : value.entrySet()) { + String operation = entry.getKey(); + if (operation.startsWith(LT) || operation.startsWith(GT)) { + rangeOperation.put(operation, entry.getValue()); + } else if (operation.startsWith(STARTS_WITH) || operation.startsWith(ENDS_WITH)) { + lexicalOperation.put(operation, entry.getValue()); + } + } + + if (!rangeOperation.isEmpty()) { + query.must(createRangeQuery(key, rangeOperation, constraintsMap.get(key))); + } + if (!lexicalOperation.isEmpty()) { + query.must(createLexicalQuery(key, lexicalOperation, constraintsMap.get(key))); + } + + return query; + } + + /** + * Creates a boolean OR query for multiple term filters. + * + * @param orFilters Map of field names to values for the OR condition. + * @return A new BoolQueryBuilder with SHOULD clauses. + */ + private static BoolQueryBuilder createEsORFilterQuery(Map orFilters) { + BoolQueryBuilder query = new BoolQueryBuilder(); + for (Map.Entry entry : orFilters.entrySet()) { + query.should( + QueryBuilders.termQuery( + entry.getKey() + RAW_APPEND, ((String) entry.getValue()).toLowerCase())); + } + return query; + } + + /** + * Generates a nested term query (range or lexical) from a Map value. + * + * @param val The value map containing operation keys. + * @param key The field key for the query. + * @param path The nested path. + * @param query The BoolQueryBuilder to update. + * @param constraintsMap Map of boost constraints. + * @return The updated BoolQueryBuilder. + */ + @SuppressWarnings("unchecked") + private static BoolQueryBuilder getNestedTermQueryFromMap( + Object val, + String key, + String path, + BoolQueryBuilder query, + Map constraintsMap) { + Map value = (Map) val; + Map rangeOperation = new HashMap<>(); + Map lexicalOperation = new HashMap<>(); + + for (Map.Entry entry : value.entrySet()) { + String operation = entry.getKey(); + if (operation.startsWith(LT) || operation.startsWith(GT)) { + rangeOperation.put(operation, entry.getValue()); + } else if (operation.startsWith(STARTS_WITH) || operation.startsWith(ENDS_WITH)) { + lexicalOperation.put(operation, entry.getValue()); + } + } + + if (!rangeOperation.isEmpty()) { + query.must( + QueryBuilders.nestedQuery( + path, + createRangeQuery(key, rangeOperation, constraintsMap.get(key)), + ScoreMode.None)); + } + if (!lexicalOperation.isEmpty()) { + query.must( + QueryBuilders.nestedQuery( + path, + createLexicalQuery(key, lexicalOperation, constraintsMap.get(key)), + ScoreMode.None)); + } + return query; + } + + /** + * Generates a terms query from a List value. + * + * @param val The value list for the terms query. + * @param key The field key for the query. + * @param query The BoolQueryBuilder to update. + * @param constraintsMap Map of boost constraints. + * @return The updated BoolQueryBuilder. + */ + @SuppressWarnings("unchecked") + private static BoolQueryBuilder getTermQueryFromList( + Object val, String key, BoolQueryBuilder query, Map constraintsMap) { + if (val instanceof List && !((List) val).isEmpty()) { + if (((List) val).get(0) instanceof String) { + List stringList = (List) val; + stringList.replaceAll(String::toLowerCase); + query.must( + createTermsQuery(key + RAW_APPEND, stringList, constraintsMap.get(key))); + } else { + query.must(createTermsQuery(key, (List) val, constraintsMap.get(key))); + } + } + return query; + } + + /** + * Creates filter operations for EXISTS and NOT_EXISTS conditions. + * + * @param entry The map entry containing the operation key and list of fields. + * @param query The BoolQueryBuilder to update. + * @param constraintsMap Map of boost constraints. + * @return The updated BoolQueryBuilder. + */ + @SuppressWarnings("unchecked") + private static BoolQueryBuilder createESOperation( + Entry entry, BoolQueryBuilder query, Map constraintsMap) { + + String operation = entry.getKey(); + if (entry.getValue() instanceof List) { + List existsList = (List) entry.getValue(); + + if (JsonKey.EXISTS.equalsIgnoreCase(operation)) { + for (String name : existsList) { + query.must(createExistQuery(name, constraintsMap.get(name))); + } + } else if (JsonKey.NOT_EXISTS.equalsIgnoreCase(operation)) { + for (String name : existsList) { + query.mustNot(createExistQuery(name, constraintsMap.get(name))); + } + } + } + return query; + } + + /** + * Creates nested filter operations for NESTED_EXISTS and NESTED_NOT_EXISTS conditions. + * + * @param entry The map entry containing the operation key and map of nested paths/fields. + * @param query The BoolQueryBuilder to update. + * @param constraintsMap Map of boost constraints. + * @return The updated BoolQueryBuilder. + */ + @SuppressWarnings("unchecked") + private static BoolQueryBuilder createNestedESOperation( + Entry entry, BoolQueryBuilder query, Map constraintsMap) { + + String operation = entry.getKey(); + if (entry.getValue() instanceof Map) { + Map existsMap = (Map) entry.getValue(); + + if (JsonKey.NESTED_EXISTS.equalsIgnoreCase(operation)) { + for (Map.Entry nameByPath : existsMap.entrySet()) { + query.must( + QueryBuilders.nestedQuery( + nameByPath.getValue(), + createExistQuery(nameByPath.getKey(), constraintsMap.get(nameByPath.getKey())), + ScoreMode.None)); + } + } else if (JsonKey.NESTED_NOT_EXISTS.equalsIgnoreCase(operation)) { + for (Map.Entry nameByPath : existsMap.entrySet()) { + query.mustNot( + QueryBuilders.nestedQuery( + nameByPath.getValue(), + createExistQuery(nameByPath.getKey(), constraintsMap.get(nameByPath.getKey())), + ScoreMode.None)); + } + } + } + return query; + } + + /** + * returns the sorting order based on the string parameter. + * + * @param value The sort order string ("ASC" or "DESC"). + * @return The SortOrder enum. + */ + public static SortOrder getSortOrder(String value) { + return ASC_ORDER.equalsIgnoreCase(value) ? SortOrder.ASC : SortOrder.DESC; + } + + /** + * Creates a MatchQueryBuilder with an optional boost. + * + * @param name The attribute/field name. + * @param value The value to match. + * @param boost The optional boost value (can be null). + * @return A MatchQueryBuilder instance. + */ + public static MatchQueryBuilder createMatchQuery(String name, Object value, Float boost) { + if (isNotNull(boost)) { + return QueryBuilders.matchQuery(name, value).boost(boost); + } else { + return QueryBuilders.matchQuery(name, value); + } + } + + /** + * Creates a TermsQueryBuilder with an optional boost. + * + * @param key The field name. + * @param values The list of values for the terms query. + * @param boost The optional boost value (can be null). + * @return A TermsQueryBuilder instance. + */ + private static TermsQueryBuilder createTermsQuery(String key, List values, Float boost) { + if (isNotNull(boost)) { + return QueryBuilders.termsQuery(key, values.stream().toArray(Object[]::new)).boost(boost); + } else { + return QueryBuilders.termsQuery(key, values.stream().toArray(Object[]::new)); + } + } + + /** + * Creates a RangeQueryBuilder based on the provided operations and optional boost. + * + * @param name The field name. + * @param rangeOperation Map containing range operators (LTE, LT, GTE, GT) and values. + * @param boost The optional boost value (can be null). + * @return A RangeQueryBuilder instance. + */ + private static RangeQueryBuilder createRangeQuery( + String name, Map rangeOperation, Float boost) { + + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(name + RAW_APPEND); + for (Map.Entry entry : rangeOperation.entrySet()) { + switch (entry.getKey()) { + case LTE: + rangeQueryBuilder.lte(entry.getValue()); + break; + case LT: + rangeQueryBuilder.lt(entry.getValue()); + break; + case GTE: + rangeQueryBuilder.gte(entry.getValue()); + break; + case GT: + rangeQueryBuilder.gt(entry.getValue()); + break; + } + } + if (isNotNull(boost)) { + return rangeQueryBuilder.boost(boost); + } + return rangeQueryBuilder; + } + + /** + * Creates a TermQueryBuilder with an optional boost. + * + * @param name The field name. + * @param value The value to search for. + * @param boost The optional boost value (can be null). + * @return A TermQueryBuilder instance. + */ + private static TermQueryBuilder createTermQuery(String name, Object value, Float boost) { + if (isNotNull(boost)) { + return QueryBuilders.termQuery(name, value).boost(boost); + } else { + return QueryBuilders.termQuery(name, value); + } + } + + /** + * Creates an ExistsQueryBuilder with an optional boost. + * + * @param name The field name to check for existence. + * @param boost The optional boost value (can be null). + * @return An ExistsQueryBuilder instance. + */ + private static ExistsQueryBuilder createExistQuery(String name, Float boost) { + if (isNotNull(boost)) { + return QueryBuilders.existsQuery(name).boost(boost); + } else { + return QueryBuilders.existsQuery(name); + } + } + + /** + * Creates a lexical query (Prefix or Regexp) with optional boosts. + * + * @param key The field key. + * @param rangeOperation Map containing lexical operators (STARTS_WITH, ENDS_WITH) and values. + * @param boost The optional boost value (can be null). + * @return A QueryBuilder instance (PrefixQueryBuilder or RegexpQueryBuilder). + */ + public static QueryBuilder createLexicalQuery( + String key, Map rangeOperation, Float boost) { + QueryBuilder queryBuilder = null; + for (Map.Entry entry : rangeOperation.entrySet()) { + switch (entry.getKey()) { + case STARTS_WITH: + { + String startsWithVal = (String) entry.getValue(); + if (StringUtils.isNotBlank(startsWithVal)) { + startsWithVal = startsWithVal.toLowerCase(); + } + if (isNotNull(boost)) { + queryBuilder = + QueryBuilders.prefixQuery(key + RAW_APPEND, startsWithVal).boost(boost); + } else { + queryBuilder = QueryBuilders.prefixQuery(key + RAW_APPEND, startsWithVal); + } + break; + } + case ENDS_WITH: + { + String endsWithRegex = "~" + entry.getValue(); + if (isNotNull(boost)) { + queryBuilder = + QueryBuilders.regexpQuery(key + RAW_APPEND, endsWithRegex).boost(boost); + } else { + queryBuilder = QueryBuilders.regexpQuery(key + RAW_APPEND, endsWithRegex); + } + break; + } + } + } + return queryBuilder; + } + + /** + * Calculates the elapsed time in milliseconds. + * + * @param startTime The start time in milliseconds + * @return The elapsed time in milliseconds + */ + public static long calculateEndTime(long startTime) { + return System.currentTimeMillis() - startTime; + } + + /** + * Adds a fuzzy match query to the BoolQueryBuilder. + * + * @param query The BoolQueryBuilder to update. + * @param name The field name to match against. + * @param value The value to fuzzy match. + */ + public static void createFuzzyMatchQuery(BoolQueryBuilder query, String name, Object value) { + if (value != null) { + query.must( + QueryBuilders.matchQuery(name, value) + .fuzziness(Fuzziness.AUTO) + .fuzzyTranspositions(true)); + } + } + + /** + * Creates a SearchDTO from a search query map. + * + * @param searchQueryMap Map containing query parameters. + * @return SearchDTO configured with the provided parameters. + */ + @SuppressWarnings("unchecked") + public static SearchDTO createSearchDTO(Map searchQueryMap) { + SearchDTO search = new SearchDTO(); + search = getBasicBuilders(search, searchQueryMap); + search = setOffset(search, searchQueryMap); + search = getLimits(search, searchQueryMap); + + if (searchQueryMap.containsKey(JsonKey.GROUP_QUERY)) { + search + .getGroupQuery() + .addAll( + (Collection>) searchQueryMap.get(JsonKey.GROUP_QUERY)); + } + + search = getSoftConstraints(search, searchQueryMap); + + // Handle fuzzy search if present + Map fuzzy = (Map) searchQueryMap.get(JsonKey.SEARCH_FUZZY); + if (MapUtils.isNotEmpty(fuzzy)) { + search.setFuzzy(fuzzy); + } + + return search; + } + + /** + * Adds soft constraints from the search query map to the SearchDTO. + * + * @param search The SearchDTO to update. + * @param searchQueryMap Map containing soft constraints. + * @return The updated SearchDTO. + */ + @SuppressWarnings("unchecked") + private static SearchDTO getSoftConstraints( + SearchDTO search, Map searchQueryMap) { + if (searchQueryMap.containsKey(JsonKey.SOFT_CONSTRAINTS)) { + search.setSoftConstraints( + (Map) searchQueryMap.get(JsonKey.SOFT_CONSTRAINTS)); + } + return search; + } + + /** + * Adds limit parameter from the search query map to the SearchDTO. + * + * @param search The SearchDTO to update. + * @param searchQueryMap Map containing the limit parameter. + * @return The updated SearchDTO. + */ + private static SearchDTO getLimits(SearchDTO search, Map searchQueryMap) { + if (searchQueryMap.containsKey(JsonKey.LIMIT)) { + if (searchQueryMap.get(JsonKey.LIMIT) instanceof Integer) { + search.setLimit((int) searchQueryMap.get(JsonKey.LIMIT)); + } else { + search.setLimit(((BigInteger) searchQueryMap.get(JsonKey.LIMIT)).intValue()); + } + } + return search; + } + + /** + * Adds offset parameter from the search query map to the SearchDTO. + * + * @param search The SearchDTO to update. + * @param searchQueryMap Map containing the offset parameter. + * @return The updated SearchDTO. + */ + private static SearchDTO setOffset(SearchDTO search, Map searchQueryMap) { + if (searchQueryMap.containsKey(JsonKey.OFFSET)) { + if (searchQueryMap.get(JsonKey.OFFSET) instanceof Integer) { + search.setOffset((int) searchQueryMap.get(JsonKey.OFFSET)); + } else { + search.setOffset(((BigInteger) searchQueryMap.get(JsonKey.OFFSET)).intValue()); + } + } + return search; + } + + /** + * Adds basic query parameters to the SearchDTO. + * + * @param search The SearchDTO to update. + * @param searchQueryMap Map containing basic query parameters. + * @return The updated SearchDTO. + */ + @SuppressWarnings("unchecked") + private static SearchDTO getBasicBuilders(SearchDTO search, Map searchQueryMap) { + if (searchQueryMap.containsKey(JsonKey.QUERY)) { + search.setQuery((String) searchQueryMap.get(JsonKey.QUERY)); + } + if (searchQueryMap.containsKey(JsonKey.QUERY_FIELDS)) { + search.setQueryFields((List) searchQueryMap.get(JsonKey.QUERY_FIELDS)); + } + if (searchQueryMap.containsKey(JsonKey.FACETS)) { + search.setFacets((List>) searchQueryMap.get(JsonKey.FACETS)); + } + if (searchQueryMap.containsKey(JsonKey.FIELDS)) { + search.setFields((List) searchQueryMap.get(JsonKey.FIELDS)); + } + if (searchQueryMap.containsKey(JsonKey.FILTERS)) { + search.getAdditionalProperties().put(JsonKey.FILTERS, searchQueryMap.get(JsonKey.FILTERS)); + } + if (searchQueryMap.containsKey(JsonKey.EXISTS)) { + search.getAdditionalProperties().put(JsonKey.EXISTS, searchQueryMap.get(JsonKey.EXISTS)); + } + if (searchQueryMap.containsKey(JsonKey.NOT_EXISTS)) { + search + .getAdditionalProperties() + .put(JsonKey.NOT_EXISTS, searchQueryMap.get(JsonKey.NOT_EXISTS)); + } + if (searchQueryMap.containsKey(JsonKey.SORT_BY)) { + search + .getSortBy() + .putAll((Map) searchQueryMap.get(JsonKey.SORT_BY)); + } + return search; + } + + /** + * Converts Elasticsearch SearchResponse to a response map. + * + * @param response The Elasticsearch SearchResponse. + * @param searchDTO The SearchDTO used for the query. + * @param finalFacetList List to populate with facet aggregations. + * @return Map containing search results, facets, and count. + */ + @SuppressWarnings("unchecked") + public static Map getSearchResponseMap( + SearchResponse response, SearchDTO searchDTO, List finalFacetList) { + Map responseMap = new HashMap<>(); + List> esSource = new ArrayList<>(); + long count = 0; + + if (response != null) { + SearchHits hits = response.getHits(); + count = hits.getTotalHits().value; + + for (SearchHit hit : hits) { + esSource.add(hit.getSourceAsMap()); + } + + // Fetch aggregations + finalFacetList = getFinalFacetList(response, searchDTO, finalFacetList); + } + + responseMap.put(JsonKey.CONTENT, esSource); + if (!finalFacetList.isEmpty()) { + responseMap.put(JsonKey.FACETS, finalFacetList); + } + responseMap.put(JsonKey.COUNT, count); + return responseMap; + } + + /** + * Extracts facet aggregations from the Elasticsearch response. + * + * @param response The Elasticsearch SearchResponse. + * @param searchDTO The SearchDTO containing facet configuration. + * @param finalFacetList List to populate with facet results. + * @return The populated facet list. + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + private static List getFinalFacetList( + SearchResponse response, SearchDTO searchDTO, List finalFacetList) { + if (searchDTO.getFacets() != null && !searchDTO.getFacets().isEmpty()) { + Map facetConfig = searchDTO.getFacets().get(0); + + for (Map.Entry entry : facetConfig.entrySet()) { + String field = entry.getKey(); + String aggsType = entry.getValue(); + List aggsList = new ArrayList<>(); + Map facetMap = new HashMap(); + + if (JsonKey.DATE_HISTOGRAM.equalsIgnoreCase(aggsType)) { + Histogram agg = response.getAggregations().get(field); + for (Histogram.Bucket bucket : agg.getBuckets()) { + String keyAsString = bucket.getKeyAsString(); + long docCount = bucket.getDocCount(); + Map internalMap = new HashMap(); + internalMap.put(JsonKey.NAME, keyAsString); + internalMap.put(JsonKey.COUNT, docCount); + aggsList.add(internalMap); + } + } else { + Terms aggs = response.getAggregations().get(field); + for (Bucket bucket : aggs.getBuckets()) { + Map internalMap = new HashMap(); + internalMap.put(JsonKey.NAME, bucket.getKey()); + internalMap.put(JsonKey.COUNT, bucket.getDocCount()); + aggsList.add(internalMap); + } + } + + facetMap.put("values", aggsList); + facetMap.put(JsonKey.NAME, field); + finalFacetList.add(facetMap); + } + } + return finalFacetList; + } +} diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java new file mode 100644 index 0000000000..aa1d7300a3 --- /dev/null +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java @@ -0,0 +1,751 @@ +package org.sunbird.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.pekko.dispatch.Futures; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.admin.indices.get.GetIndexRequest; +import org.elasticsearch.action.bulk.BulkItemResponse; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.action.delete.DeleteResponse; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.SimpleQueryStringBuilder; +import org.elasticsearch.index.query.TermQueryBuilder; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortMode; +import org.sunbird.common.inf.ElasticSearchService; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.util.ProjectUtil; +import org.sunbird.util.PropertiesCache; +import org.sunbird.request.RequestContext; +import org.sunbird.exception.ResponseCode; +import org.sunbird.dto.SearchDTO; +import org.sunbird.helper.ConnectionManager; +import scala.concurrent.Future; +import scala.concurrent.Promise; + +/** + * Implementation of the ElasticSearchService using the RestHighLevelClient. + * This class provides methods to interact with Elasticsearch for indexing, + * updating, deleting, and searching documents. + */ +public class ElasticSearchRestHighImpl implements ElasticSearchService { + + private static final String ERROR = "ERROR"; + private static final LoggerUtil logger = new LoggerUtil(ElasticSearchRestHighImpl.class); + + + /** + * Saves a document to Elasticsearch. + * + * @param index The name of the index. + * @param identifier The unique identifier for the document. + * @param data The data to be saved (as a Map). + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing the identifier of the saved document, or "ERROR" if validation fails. + */ + @Override + public Future save(String index, String identifier, Map data, RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + Promise promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:save: method started at ==" + startTime + " for Index " + index); + + if (StringUtils.isBlank(identifier) || StringUtils.isBlank(index)) { + logger.info(requestContext, "ElasticSearchRestHighImpl:save: Identifier or Index value is null or empty, identifier : " + + identifier + ", index: " + index + ", not able to save data."); + promise.failure(ProjectUtil.createClientException(ResponseCode.invalidData)); + return promise.future(); + } + + try { + data.put(JsonKey.IDENTIFIER, identifier); + + IndexRequest indexRequest = new IndexRequest(index, _DOC, identifier).source(data); + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(IndexResponse indexResponse) { + logger.info(requestContext, "ElasticSearchRestHighImpl:save: Success for index : " + index + ", identifier :" + identifier); + promise.success(indexResponse.getId()); + logEndTime(startTime, index, requestContext); + } + + @Override + public void onFailure(Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:save: Error while saving " + index + " id : " + identifier, e); + promise.failure(e); + logEndTime(startTime, index, requestContext); + } + }; + + ConnectionManager.getRestClient().indexAsync(indexRequest, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:save: Failed to prepare/submit save request for index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logEndTime(startTime, index, requestContext); + } + + return promise.future(); + } + + /** + * Updates an existing document in Elasticsearch. + * + * @param index The name of the index. + * @param identifier The unique identifier for the document. + * @param data The data to update (as a Map). + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing true if update succeeds, or failure if validation/update fails. + */ + @Override + public Future update(String index, String identifier, Map data, RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + Promise promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:update: method started at ==" + startTime + " for Index " + index); + + if (StringUtils.isBlank(index) || StringUtils.isBlank(identifier) || data == null) { + logger.info(requestContext, "ElasticSearchRestHighImpl:update: Invalid parameters - index: " + index + + ", identifier: " + identifier + ", data: " + (data == null ? "null" : "present")); + promise.failure(ProjectUtil.createClientException(ResponseCode.invalidData)); + return promise.future(); + } + + try { + data.put(JsonKey.IDENTIFIER, identifier); + UpdateRequest updateRequest = new UpdateRequest(index, _DOC, identifier).doc(data); + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(UpdateResponse updateResponse) { + logger.info(requestContext, "ElasticSearchRestHighImpl:update: Success with " + updateResponse.getResult() + + " response from Elasticsearch for index: " + index + ", identifier: " + identifier); + promise.success(true); + logUpdateEndTime(startTime, index, requestContext); + } + + @Override + public void onFailure(Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:update: Failed to update document in index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logUpdateEndTime(startTime, index, requestContext); + } + }; + + ConnectionManager.getRestClient().updateAsync(updateRequest, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:update: Failed to prepare/submit update request for index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logUpdateEndTime(startTime, index, requestContext); + } + + return promise.future(); + } + + /** + * Retrieves a document from Elasticsearch by its identifier. + * + * @param index The name of the index. + * @param identifier The unique identifier for the document. + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing the document as a Map, or an empty Map if not found. + */ + @Override + public Future> getDataByIdentifier(String index, String identifier, RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + Promise> promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: method started at ==" + startTime + + " for Index " + index); + + if (StringUtils.isBlank(index) || StringUtils.isBlank(identifier)) { + logger.info(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: Invalid parameters - index: " + + index + ", identifier: " + identifier); + promise.failure(ProjectUtil.createClientException(ResponseCode.invalidData)); + return promise.future(); + } + + try { + GetRequest getRequest = new GetRequest(index, _DOC, identifier); + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(GetResponse getResponse) { + if (getResponse.isExists()) { + Map sourceAsMap = getResponse.getSourceAsMap(); + if (MapUtils.isNotEmpty(sourceAsMap)) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: Document found for index: " + + index + ", identifier: " + identifier); + promise.success(sourceAsMap); + } else { + logger.debug(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: Document exists but source is empty for index: " + + index + ", identifier: " + identifier); + promise.success(new HashMap<>()); + } + } else { + logger.debug(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: Document not found for index: " + + index + ", identifier: " + identifier); + promise.success(new HashMap<>()); + } + logGetEndTime(startTime, index, requestContext); + } + + @Override + public void onFailure(Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: Failed to retrieve document from index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logGetEndTime(startTime, index, requestContext); + } + }; + + ConnectionManager.getRestClient().getAsync(getRequest, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: Failed to prepare/submit get request for index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logGetEndTime(startTime, index, requestContext); + } + + return promise.future(); + } + + /** + * Deletes a document from Elasticsearch by its identifier. + * + * @param index The name of the index. + * @param identifier The unique identifier for the document to delete. + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing true if deletion succeeds, false if document not found, or failure on error. + */ + @Override + public Future delete(String index, String identifier, RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + Promise promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:delete: method started at ==" + startTime); + + if (StringUtils.isBlank(index) || StringUtils.isBlank(identifier)) { + logger.info(requestContext, "ElasticSearchRestHighImpl:delete: Invalid parameters - index: " + + index + ", identifier: " + identifier); + promise.failure(ProjectUtil.createClientException(ResponseCode.invalidData)); + return promise.future(); + } + + try { + DeleteRequest delRequest = new DeleteRequest(index, _DOC, identifier); + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(DeleteResponse deleteResponse) { + if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) { + logger.info(requestContext, "ElasticSearchRestHighImpl:delete: Document not found for index: " + + index + ", identifier: " + identifier); + promise.success(false); + } else { + logger.info(requestContext, "ElasticSearchRestHighImpl:delete: Successfully deleted document from index: " + + index + ", identifier: " + identifier); + promise.success(true); + } + logDeleteEndTime(startTime, requestContext); + } + + @Override + public void onFailure(Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:delete: Failed to delete document from index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logDeleteEndTime(startTime, requestContext); + } + }; + + ConnectionManager.getRestClient().deleteAsync(delRequest, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:delete: Failed to prepare/submit delete request for index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logDeleteEndTime(startTime, requestContext); + } + + return promise.future(); + } + + /** + * Performs an Elasticsearch search based on SearchDTO criteria. + * Supports filters, facets, sorting, pagination, fuzzy search, and field selection. + * + * @param searchDTO The search criteria containing filters, facets, sort, pagination, etc. + * @param index The name of the index to search. + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing search results as a Map with content, count, and facets. + */ + @Override + @SuppressWarnings({"unchecked", "rawtypes"}) + public Future> search(SearchDTO searchDTO, String index, RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + Promise> promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:search: method started at ==" + startTime); + + try { + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + SearchRequest searchRequest = new SearchRequest(index); + // Note: types() is deprecated in Elasticsearch 7.x, document type is now always "_doc" + + // Check mode and set constraints + Map constraintsMap = ElasticSearchHelper.getConstraints(searchDTO); + BoolQueryBuilder query = new BoolQueryBuilder(); + + // Add channel field as mandatory + String channel = PropertiesCache.getInstance().getProperty(JsonKey.SUNBIRD_ES_CHANNEL); + if (!(StringUtils.isBlank(channel) || JsonKey.SUNBIRD_ES_CHANNEL.equals(channel))) { + query.must(ElasticSearchHelper.createMatchQuery(JsonKey.CHANNEL, channel, constraintsMap.get(JsonKey.CHANNEL))); + } + + // Apply simple query string + if (!StringUtils.isBlank(searchDTO.getQuery())) { + SimpleQueryStringBuilder sqsb = QueryBuilders.simpleQueryStringQuery(searchDTO.getQuery()); + if (CollectionUtils.isEmpty(searchDTO.getQueryFields())) { + query.must(sqsb.field("all_fields")); + } else { + Map searchFields = searchDTO.getQueryFields().stream() + .collect(Collectors.toMap(s -> s, v -> 1.0f)); + query.must(sqsb.fields(searchFields)); + } + } + + // Apply sorting + if (searchDTO.getSortBy() != null && !searchDTO.getSortBy().isEmpty()) { + for (Map.Entry entry : searchDTO.getSortBy().entrySet()) { + if (!entry.getKey().contains(".")) { + searchSourceBuilder.sort(entry.getKey() + ElasticSearchHelper.RAW_APPEND, + ElasticSearchHelper.getSortOrder((String) entry.getValue())); + } else { + Map map = (Map) entry.getValue(); + Map dataMap = (Map) map.get(JsonKey.TERM); + for (Map.Entry dateMapEntry : dataMap.entrySet()) { + FieldSortBuilder mySort = new FieldSortBuilder(entry.getKey() + ElasticSearchHelper.RAW_APPEND) + .setNestedFilter(new TermQueryBuilder(dateMapEntry.getKey(), dateMapEntry.getValue())) + .sortMode(SortMode.MIN) + .order(ElasticSearchHelper.getSortOrder((String) map.get(JsonKey.ORDER))); + searchSourceBuilder.sort(mySort); + } + } + } + } + + // Apply field filters + searchSourceBuilder.fetchSource( + searchDTO.getFields() != null ? searchDTO.getFields().stream().toArray(String[]::new) : null, + searchDTO.getExcludedFields() != null ? searchDTO.getExcludedFields().stream().toArray(String[]::new) : null); + + // Set offset + if (searchDTO.getOffset() != null) { + searchSourceBuilder.from(searchDTO.getOffset()); + } + + // Set limit + if (searchDTO.getLimit() != null) { + searchSourceBuilder.size(searchDTO.getLimit()); + } + + // Apply additional properties + if (searchDTO.getAdditionalProperties() != null && !searchDTO.getAdditionalProperties().isEmpty()) { + for (Map.Entry entry : searchDTO.getAdditionalProperties().entrySet()) { + ElasticSearchHelper.addAdditionalProperties(query, entry, constraintsMap); + } + } + + // Apply fuzzy search + if (MapUtils.isNotEmpty(searchDTO.getFuzzy())) { + Map.Entry entry = searchDTO.getFuzzy().entrySet().iterator().next(); + ElasticSearchHelper.createFuzzyMatchQuery(query, entry.getKey(), entry.getValue()); + } + + // Set final query + searchSourceBuilder.query(query); + List finalFacetList = new ArrayList(); + + // Add aggregations + if (searchDTO.getFacets() != null && !searchDTO.getFacets().isEmpty()) { + searchSourceBuilder = addAggregations(searchSourceBuilder, searchDTO.getFacets(), requestContext); + } + + logger.info(requestContext, "ElasticSearchRestHighImpl:search: calling search for index " + index + + ", with query = " + searchSourceBuilder.toString()); + + searchRequest.source(searchSourceBuilder); + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(SearchResponse response) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:search: onResponse received"); + + if (response.getHits() == null || response.getHits().getTotalHits().value == 0) { + Map responseMap = new HashMap<>(); + responseMap.put(JsonKey.CONTENT, new ArrayList<>()); + responseMap.put(JsonKey.COUNT, 0); + promise.success(responseMap); + } else { + Map responseMap = ElasticSearchHelper.getSearchResponseMap(response, searchDTO, finalFacetList); + promise.success(responseMap); + } + logSearchEndTime(startTime, index, requestContext); + } + + @Override + public void onFailure(Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:search: Search failed for index: " + index, e); + promise.failure(e); + logSearchEndTime(startTime, index, requestContext); + } + }; + + ConnectionManager.getRestClient().searchAsync(searchRequest, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:search: Failed to prepare/submit search request for index: " + index, e); + promise.failure(e); + logSearchEndTime(startTime, index, requestContext); + } + + return promise.future(); + } + + /** + * Performs a health check on Elasticsearch by verifying index existence. + * + * @return A Future containing true if Elasticsearch is healthy, false otherwise. + */ + @Override + public Future healthCheck() { + Promise promise = Futures.promise(); + + try { + // Use a common index for health check (can be made configurable) + GetIndexRequest indexRequest = new GetIndexRequest().indices(ProjectUtil.EsType.courseBatch.getTypeName()); + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(Boolean getResponse) { + promise.success(getResponse != null ? getResponse : false); + logger.info(null, "ElasticSearchRestHighImpl:healthCheck: Health check successful, index exists: " + getResponse); + } + + @Override + public void onFailure(Exception e) { + logger.error(null, "ElasticSearchRestHighImpl:healthCheck: Health check failed", e); + promise.failure(e); + } + }; + + ConnectionManager.getRestClient().indices().existsAsync(indexRequest, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(null, "ElasticSearchRestHighImpl:healthCheck: Failed to prepare health check request", e); + promise.failure(e); + } + + return promise.future(); + } + + /** + * Performs bulk insertion of documents into Elasticsearch. + * + * @param index The name of the index. + * @param dataList List of documents to insert. + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing true if bulk insert succeeds, false otherwise. + */ + @Override + public Future bulkInsert(String index, List> dataList, RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + Promise promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:bulkInsert: method started at ==" + startTime + " for Index " + index); + + if (StringUtils.isBlank(index) || dataList == null || dataList.isEmpty()) { + logger.info(requestContext, "ElasticSearchRestHighImpl:bulkInsert: Invalid parameters - index: " + index + + ", dataList size: " + (dataList == null ? "null" : dataList.size())); + promise.failure(ProjectUtil.createClientException(ResponseCode.invalidData)); + return promise.future(); + } + + try { + BulkRequest request = new BulkRequest(); + + for (Map data : dataList) { + String id = (String) data.get(JsonKey.ID); + if (StringUtils.isNotBlank(id)) { + data.put(JsonKey.IDENTIFIER, id); + request.add(new IndexRequest(index, _DOC, id).source(data)); + } else { + logger.warn(requestContext, "ElasticSearchRestHighImpl:bulkInsert: Skipping document without ID", null); + } + } + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(BulkResponse bulkResponse) { + boolean hasFailures = false; + Iterator responseItr = bulkResponse.iterator(); + + while (responseItr.hasNext()) { + BulkItemResponse bResponse = responseItr.next(); + if (bResponse.isFailed()) { + hasFailures = true; + logger.warn(requestContext, "ElasticSearchRestHighImpl:bulkInsert: Failed to index document - ID: " + + bResponse.getId() + ", Failure: " + bResponse.getFailureMessage(), null); + } + } + + if (!hasFailures) { + logger.info(requestContext, "ElasticSearchRestHighImpl:bulkInsert: Successfully inserted " + + dataList.size() + " documents into index: " + index); + } + + promise.success(true); + logBulkInsertEndTime(startTime, index, requestContext); + } + + @Override + public void onFailure(Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:bulkInsert: Bulk upload failed for index: " + index, e); + promise.success(false); + logBulkInsertEndTime(startTime, index, requestContext); + } + }; + + ConnectionManager.getRestClient().bulkAsync(request, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:bulkInsert: Failed to prepare/submit bulk request for index: " + index, e); + promise.success(false); + logBulkInsertEndTime(startTime, index, requestContext); + } + + return promise.future(); + } + + /** + * Adds aggregations to the SearchSourceBuilder based on facet configurations. + * Supports date histogram and terms aggregations. + * + * @param searchSourceBuilder The SearchSourceBuilder to add aggregations to. + * @param facets List of facet configurations (map of field names to aggregation types). + * @param requestContext The RequestContext for logging (can be null). + * @return The updated SearchSourceBuilder with aggregations added. + */ + private static SearchSourceBuilder addAggregations(SearchSourceBuilder searchSourceBuilder, + List> facets, + RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + logger.debug(requestContext, "ElasticSearchRestHighImpl:addAggregations: method started at ==" + startTime); + + if (CollectionUtils.isNotEmpty(facets)) { + Map map = facets.get(0); + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + + if (JsonKey.DATE_HISTOGRAM.equalsIgnoreCase(value)) { + searchSourceBuilder.aggregation( + AggregationBuilders.dateHistogram(key) + .field(key + ElasticSearchHelper.RAW_APPEND) + .dateHistogramInterval(DateHistogramInterval.days(1))); + } else if (null == value) { + searchSourceBuilder.aggregation( + AggregationBuilders.terms(key).field(key + ElasticSearchHelper.RAW_APPEND)); + } + } + } + + logger.debug(requestContext, "ElasticSearchRestHighImpl:addAggregations: method end, Total time elapsed = " + + ElasticSearchHelper.calculateEndTime(startTime)); + return searchSourceBuilder; + } + + /** + * Performs an upsert operation (update if exists, insert if not) on Elasticsearch. + * + * @param index The name of the index. + * @param identifier The unique identifier for the document. + * @param data The data to upsert. + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing true if upsert succeeds, or failure on error. + */ + @Override + public Future upsert(String index, String identifier, Map data, RequestContext requestContext) { + long startTime = System.currentTimeMillis(); + Promise promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:upsert: method started at ==" + startTime + " for Index " + index); + + if (StringUtils.isBlank(index) || StringUtils.isBlank(identifier) || data == null || data.isEmpty()) { + logger.info(requestContext, "ElasticSearchRestHighImpl:upsert: Invalid parameters - index: " + index + + ", identifier: " + identifier + ", data: " + (data == null ? "null" : "size=" + data.size())); + promise.failure(ProjectUtil.createClientException(ResponseCode.invalidData)); + return promise.future(); + } + + try { + data.put(JsonKey.IDENTIFIER, identifier); + IndexRequest indexRequest = new IndexRequest(index, _DOC, identifier).source(data); + UpdateRequest updateRequest = new UpdateRequest(index, _DOC, identifier).upsert(indexRequest).doc(indexRequest); + + ActionListener listener = new ActionListener() { + @Override + public void onResponse(UpdateResponse updateResponse) { + logger.info(requestContext, "ElasticSearchRestHighImpl:upsert: Success with result: " + updateResponse.getResult() + + " for index: " + index + ", identifier: " + identifier); + promise.success(true); + logUpsertEndTime(startTime, index, requestContext); + } + + @Override + public void onFailure(Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:upsert: Failed to upsert document in index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logUpsertEndTime(startTime, index, requestContext); + } + }; + + ConnectionManager.getRestClient().updateAsync(updateRequest, RequestOptions.DEFAULT, listener); + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:upsert: Failed to prepare/submit upsert request for index: " + + index + ", identifier: " + identifier, e); + promise.failure(e); + logUpsertEndTime(startTime, index, requestContext); + } + + return promise.future(); + } + + /** + * Retrieves multiple documents by their IDs with specified fields. + * + * @param ids List of document IDs to retrieve. + * @param fields List of fields to include in the results. + * @param index The name of the index. + * @param requestContext The RequestContext for logging and tracing. + * @return A Future containing a map of document ID to document data. + */ + @Override + public Future>> getEsResultByListOfIds(List ids, List fields, + String index, RequestContext requestContext) { + Promise>> promise = Futures.promise(); + + logger.debug(requestContext, "ElasticSearchRestHighImpl:getEsResultByListOfIds: method started for index " + index); + + if (ids == null || ids.isEmpty() || StringUtils.isBlank(index)) { + logger.info(requestContext, "ElasticSearchRestHighImpl:getEsResultByListOfIds: Invalid parameters - index: " + index + + ", ids size: " + (ids == null ? "null" : ids.size())); + promise.success(new HashMap<>()); + return promise.future(); + } + + try { + Map filters = new HashMap<>(); + filters.put(JsonKey.ID, ids); + + SearchDTO searchDTO = new SearchDTO(); + searchDTO.getAdditionalProperties().put(JsonKey.FILTERS, filters); + searchDTO.setFields(fields); + + Future> resultF = search(searchDTO, index, requestContext); + Map result = (Map) ElasticSearchHelper.getResponseFromFuture(resultF); + List> esContent = (List>) result.get(JsonKey.CONTENT); + + if (esContent != null && !esContent.isEmpty()) { + Map> resultMap = esContent.stream() + .collect(Collectors.toMap( + obj -> (String) obj.get(JsonKey.ID), + val -> val + )); + promise.success(resultMap); + logger.info(requestContext, "ElasticSearchRestHighImpl:getEsResultByListOfIds: Retrieved " + + resultMap.size() + " documents for index " + index); + } else { + promise.success(new HashMap<>()); + logger.info(requestContext, "ElasticSearchRestHighImpl:getEsResultByListOfIds: No documents found for index " + index); + } + + } catch (Exception e) { + logger.error(requestContext, "ElasticSearchRestHighImpl:getEsResultByListOfIds: Failed to retrieve documents for index: " + index, e); + promise.success(new HashMap<>()); + } + + return promise.future(); + } + + private void logUpsertEndTime(long startTime, String index, RequestContext requestContext) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:upsert: method end for Index " + index + + ", Total time elapsed = " + ElasticSearchHelper.calculateEndTime(startTime)); + } + + private void logEndTime(long startTime, String index, RequestContext requestContext) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:save: method end at ==" + System.currentTimeMillis() + + " for Index " + index + " ,Total time elapsed = " + ElasticSearchHelper.calculateEndTime(startTime)); + } + + private void logUpdateEndTime(long startTime, String index, RequestContext requestContext) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:update: method end for Index " + index + + ", Total time elapsed = " + ElasticSearchHelper.calculateEndTime(startTime)); + } + + private void logGetEndTime(long startTime, String index, RequestContext requestContext) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:getDataByIdentifier: method end for Index " + index + + ", Total time elapsed = " + ElasticSearchHelper.calculateEndTime(startTime)); + } + + private void logDeleteEndTime(long startTime, RequestContext requestContext) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:delete: method end, Total time elapsed = " + + ElasticSearchHelper.calculateEndTime(startTime)); + } + + private void logSearchEndTime(long startTime, String index, RequestContext requestContext) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:search: method end for Index " + index + + ", Total time elapsed = " + ElasticSearchHelper.calculateEndTime(startTime)); + } + + private void logBulkInsertEndTime(long startTime, String index, RequestContext requestContext) { + logger.debug(requestContext, "ElasticSearchRestHighImpl:bulkInsert: method end for Index " + index + + ", Total time elapsed = " + ElasticSearchHelper.calculateEndTime(startTime)); + } + +} diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java b/core/sunbird-es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java new file mode 100644 index 0000000000..4c9747573a --- /dev/null +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/common/factory/EsClientFactory.java @@ -0,0 +1,62 @@ +package org.sunbird.common.factory; + +import org.sunbird.common.ElasticSearchRestHighImpl; +import org.sunbird.common.inf.ElasticSearchService; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; + +/** + * Factory class to provide instances of ElasticSearchService. + * Supports creating clients for different connection types (e.g., REST). + */ +public class EsClientFactory { + + private static volatile ElasticSearchService restClient = null; + private static final LoggerUtil logger = new LoggerUtil(EsClientFactory.class); + + private EsClientFactory() { + // Private constructor to prevent instantiation + } + + /** + * Returns a REST-based ElasticSearchService instance. + * This is the default factory method. + * + * @return The singleton instance of ElasticSearchService (REST implementation). + */ + public static ElasticSearchService getInstance() { + return getRestClient(); + } + + /** + * Returns an ElasticSearchService instance based on the provided connection type. + * + * @param type The connection type (e.g., "rest"). Currently only "rest" is supported. + * @return The ElasticSearchService instance for the specified type, or null if unsupported. + */ + public static ElasticSearchService getInstance(String type) { + if (JsonKey.REST.equalsIgnoreCase(type)) { + return getRestClient(); + } + logger.info(null, "EsClientFactory:getInstance: Unsupported client type provided: " + type); + return null; + } + + /** + * Helper method to initialize and return the REST client singleton. + * Uses double-checked locking for thread safety. + * + * @return The singleton instance of ElasticSearchRestHighImpl. + */ + private static ElasticSearchService getRestClient() { + if (restClient == null) { + synchronized (EsClientFactory.class) { + if (restClient == null) { + logger.info(null, "EsClientFactory:getRestClient: Initializing new ElasticSearchRestHighImpl."); + restClient = new ElasticSearchRestHighImpl(); + } + } + } + return restClient; + } +} diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java b/core/sunbird-es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java new file mode 100644 index 0000000000..8d1b731bc5 --- /dev/null +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/common/inf/ElasticSearchService.java @@ -0,0 +1,138 @@ +package org.sunbird.common.inf; + +import java.util.List; +import java.util.Map; +import scala.concurrent.Future; +import org.sunbird.request.RequestContext; +import org.sunbird.dto.SearchDTO; + +/** + * Elasticsearch service interface defining operations for document management and search. + * All methods are asynchronous and return Scala Futures for non-blocking execution. + */ +public interface ElasticSearchService { + + /** Elasticsearch document type constant for compatibility. */ + String _DOC = "_doc"; + + /** + * Saves a new document in Elasticsearch. + * The identifier becomes the document _id in ES. + * + * @param index ES index name + * @param identifier document ID + * @param data document data + * @param requestContext request context for logging and tracking + * @return Future containing the created document identifier + */ + Future save( + String index, + String identifier, + Map data, + RequestContext requestContext); + + /** + * Updates an existing document by merging with new data. + * + * @param index ES index name + * @param identifier document ID + * @param data update data to merge + * @param requestContext request context for logging and tracking + * @return Future containing update success status + */ + Future update( + String index, + String identifier, + Map data, + RequestContext requestContext); + + /** + * Retrieves a document by identifier. + * + * @param index ES index name + * @param identifier document ID + * @param requestContext request context for logging and tracking + * @return Future containing document data or null if not found + */ + Future> getDataByIdentifier( + String index, + String identifier, + RequestContext requestContext); + + /** + * Deletes a document by identifier. + * + * @param index ES index name + * @param identifier document ID + * @param requestContext request context for logging and tracking + * @return Future containing deletion success status + */ + Future delete( + String index, + String identifier, + RequestContext requestContext); + + /** + * Performs search based on SearchDTO criteria including filters, facets, sorting, and pagination. + * + * @param searchDTO search criteria + * @param index ES index name + * @param requestContext request context for logging and tracking + * @return Future containing search results + */ + Future> search( + SearchDTO searchDTO, + String index, + RequestContext requestContext); + + /** + * Performs Elasticsearch health check. + * + * @return Future containing health status + */ + Future healthCheck(); + + /** + * Bulk inserts multiple documents in a single operation. + * + * @param index ES index name + * @param dataList list of documents to insert + * @param requestContext request context for logging and tracking + * @return Future containing bulk insert success status + */ + Future bulkInsert( + String index, + List> dataList, + RequestContext requestContext); + + /** + * Upserts a document (update if exists, insert if not). + * + * @param index ES index name + * @param identifier document ID + * @param data document data + * @param requestContext request context for logging and tracking + * @return Future containing upsert success status + */ + Future upsert( + String index, + String identifier, + Map data, + RequestContext requestContext); + + /** + * Retrieves multiple documents by IDs with specified fields. + * + * @param ids list of document IDs + * @param fields list of fields to retrieve + * @param index ES index name + * @param requestContext request context for logging and tracking + * @return Future containing map of ID to document data + */ + Future>> getEsResultByListOfIds( + List ids, + List fields, + String index, + RequestContext requestContext); + +} diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/dto/SearchDTO.java b/core/sunbird-es-utils/src/main/java/org/sunbird/dto/SearchDTO.java new file mode 100644 index 0000000000..174811b8c3 --- /dev/null +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/dto/SearchDTO.java @@ -0,0 +1,233 @@ +package org.sunbird.dto; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Data Transfer Object for Elasticsearch query operations. + * Encapsulates all parameters required for building and executing ES queries including + * search criteria, pagination, sorting, facets, and fuzzy search options. + */ +public class SearchDTO { + + /** List of property filters for the search query. */ + @SuppressWarnings("rawtypes") + private List properties; + + /** List of facet aggregations to compute. */ + private List> facets = new ArrayList<>(); + + /** Fields to include in search results. */ + private List fields; + + /** Fields to exclude from search results. */ + private List excludedFields; + + /** Sorting criteria as field-order pairs. */ + private Map sortBy = new HashMap<>(); + + /** Logical operation for combining search criteria (AND/OR). */ + private String operation; + + /** Free-text search query string. */ + private String query; + + /** Specific fields to search within for the query. */ + private List queryFields; + + /** Maximum number of results to return. Default: 1000 */ + private Integer limit = 1000; + + /** Number of results to skip for pagination. Default: 0 */ + private Integer offset = 0; + + /** Enable fuzzy matching for search queries. */ + private boolean fuzzySearch = false; + + /** Additional filter properties including filters, exists, and not-exists conditions. */ + private Map additionalProperties = new HashMap<>(); + + /** Soft constraints with priority weights for ranking. */ + private Map softConstraints = new HashMap<>(); + + /** Fuzzy search configuration parameters. */ + private Map fuzzy = new HashMap<>(); + + /** Grouped query clauses for complex boolean queries. */ + private List> groupQuery = new ArrayList<>(); + + /** Query execution modes. */ + private List mode = new ArrayList<>(); + + /** Default constructor. */ + public SearchDTO() { + super(); + } + + /** + * Constructor with basic search parameters. + * + * @param properties list of property filters + * @param operation logical operation (AND/OR) + * @param limit maximum results to return + */ + @SuppressWarnings("rawtypes") + public SearchDTO(List properties, String operation, int limit) { + super(); + this.properties = properties; + this.operation = operation; + this.limit = limit; + } + + @SuppressWarnings("rawtypes") + public List getProperties() { + return properties; + } + + @SuppressWarnings("rawtypes") + public void setProperties(List properties) { + this.properties = properties; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public Integer getLimit() { + return limit; + } + + public void setLimit(Integer limit) { + this.limit = limit; + } + + public List> getFacets() { + return facets; + } + + public void setFacets(List> facets) { + this.facets = facets; + } + + public Map getSortBy() { + return sortBy; + } + + public void setSortBy(Map sortBy) { + this.sortBy = sortBy; + } + + public boolean isFuzzySearch() { + return fuzzySearch; + } + + public void setFuzzySearch(boolean fuzzySearch) { + this.fuzzySearch = fuzzySearch; + } + + public Map getAdditionalProperties() { + return additionalProperties; + } + + public void setAdditionalProperties(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + /** + * Retrieves a specific additional property by key. + * + * @param key property key + * @return property value or null if not found + */ + public Object getAdditionalProperty(String key) { + return additionalProperties.get(key); + } + + /** + * Adds a single additional property. + * + * @param key property key + * @param value property value + */ + public void addAdditionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + } + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + + public Map getSoftConstraints() { + return softConstraints; + } + + public void setSoftConstraints(Map softConstraints) { + this.softConstraints = softConstraints; + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + + public List getMode() { + return mode; + } + + public void setMode(List mode) { + this.mode = mode; + } + + public List getExcludedFields() { + return excludedFields; + } + + public void setExcludedFields(List excludedFields) { + this.excludedFields = excludedFields; + } + + public List getQueryFields() { + return queryFields; + } + + public void setQueryFields(List queryFields) { + this.queryFields = queryFields; + } + + public Map getFuzzy() { + return fuzzy; + } + + public void setFuzzy(Map fuzzy) { + this.fuzzy = fuzzy; + } + + public List> getGroupQuery() { + return groupQuery; + } + + public void setGroupQuery(List> groupQuery) { + this.groupQuery = groupQuery; + } +} diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java b/core/sunbird-es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java new file mode 100644 index 0000000000..4a9c92a274 --- /dev/null +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/helper/ConnectionManager.java @@ -0,0 +1,201 @@ +package org.sunbird.helper; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHost; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; + +/** + * Manages Elasticsearch REST high-level client connections with thread-safe singleton access. + * Configuration is read from environment variables: SUNBIRD_ES_IP, SUNBIRD_ES_PORT, SUNBIRD_ES_CLUSTER. + */ +public class ConnectionManager { + + private static final LoggerUtil logger = new LoggerUtil(ConnectionManager.class); + + /** Singleton REST high-level client instance. */ + private static volatile RestHighLevelClient restClient = null; + + /** List of Elasticsearch host addresses. */ + private static final List hosts = new ArrayList<>(); + + /** List of Elasticsearch ports (populated from env but currently unused). */ + private static final List ports = new ArrayList<>(); + + /** Lock object for thread-safe client initialization. */ + private static final Object lock = new Object(); + + static { + // Prevent Netty from using runtime available processors check + System.setProperty("es.set.netty.runtime.available.processors", "false"); + + // Initialize connection on class loading + initialiseRestClientConnection(); + + // Register shutdown hook for cleanup + registerShutDownHook(); + } + + /** Private constructor to prevent instantiation. */ + private ConnectionManager() {} + + /** + * Initializes Elasticsearch REST client from environment variables. + * + * @return true if connection established successfully, false otherwise + */ + private static boolean initialiseRestClientConnection() { + try { + String cluster = System.getenv(JsonKey.SUNBIRD_ES_CLUSTER); + String hostName = System.getenv(JsonKey.SUNBIRD_ES_IP); + String port = System.getenv(JsonKey.SUNBIRD_ES_PORT); + + // Validate required configuration + if (StringUtils.isBlank(hostName) || StringUtils.isBlank(port)) { + logger.warn( + null, + "Elasticsearch configuration incomplete - SUNBIRD_ES_IP or SUNBIRD_ES_PORT not set", + null); + return false; + } + + // Parse comma-separated hosts + String[] splitedHost = hostName.split(","); + for (String host : splitedHost) { + String trimmedHost = host.trim(); + if (StringUtils.isNotBlank(trimmedHost)) { + hosts.add(trimmedHost); + } + } + + // Parse comma-separated ports (currently stored but not used) + String[] splitedPort = port.split(","); + for (String portStr : splitedPort) { + String trimmedPort = portStr.trim(); + if (StringUtils.isNotBlank(trimmedPort)) { + try { + ports.add(Integer.parseInt(trimmedPort)); + } catch (NumberFormatException e) { + logger.warn(null, "Invalid port number in SUNBIRD_ES_PORT: " + trimmedPort, null); + } + } + } + + // Create REST client + boolean success = createRestClient(cluster, hosts); + + if (success) { + String clusterName = cluster != null ? cluster : "default"; + String hostList = String.join(",", hosts); + logger.info( + null, + "Elasticsearch connection established successfully - cluster: " + clusterName + + ", hosts: " + hostList + ", port: 9200"); + } + + return success; + + } catch (Exception e) { + logger.error(null, "Failed to initialize Elasticsearch REST client connection", e); + return false; + } + } + + /** + * Returns the singleton REST client instance with thread-safe lazy initialization. + * + * @return RestHighLevelClient instance, or null if initialization failed + */ + public static RestHighLevelClient getRestClient() { + // First check without locking (performance optimization) + if (restClient == null) { + synchronized (lock) { + // Double-check after acquiring lock + if (restClient == null) { + logger.info(null, "REST client is null, attempting to initialize connection"); + + boolean initialized = initialiseRestClientConnection(); + + if (initialized && restClient != null) { + logger.info(null, "REST client initialized successfully"); + } else { + logger.error( + null, + "Failed to initialize REST client - check Elasticsearch configuration", + null); + } + } + } + } + return restClient; + } + + /** + * Creates Elasticsearch REST client instance using port 9200 for all hosts. + * + * @param clusterName cluster name (informational only) + * @param hostList list of host addresses + * @return true if client created successfully, false otherwise + */ + private static boolean createRestClient(String clusterName, List hostList) { + try { + if (hostList == null || hostList.isEmpty()) { + logger.warn(null, "No Elasticsearch hosts provided for client initialization", null); + return false; + } + + // Build HttpHost array for all configured hosts + HttpHost[] httpHosts = new HttpHost[hostList.size()]; + for (int i = 0; i < hostList.size(); i++) { + httpHosts[i] = new HttpHost(hostList.get(i), 9200, "http"); + logger.debug(null, "Adding Elasticsearch node: " + hostList.get(i) + ":9200"); + } + + // Create REST high-level client + restClient = new RestHighLevelClient(RestClient.builder(httpHosts)); + + logger.info( + null, + "Elasticsearch REST client created successfully with " + hostList.size() + " host(s)"); + + return true; + + } catch (Exception e) { + logger.error(null, "Failed to create Elasticsearch REST client", e); + return false; + } + } + + /** Shutdown hook for graceful Elasticsearch client cleanup. */ + static class ResourceCleanUp extends Thread { + @Override + public void run() { + if (restClient != null) { + try { + logger.info(null, "Shutting down Elasticsearch REST client"); + restClient.close(); + logger.info(null, "Elasticsearch REST client closed successfully"); + } catch (IOException e) { + logger.error( + null, + "Error occurred during Elasticsearch REST client resource cleanup: " + e.getMessage(), + e); + } + } else { + logger.debug(null, "No Elasticsearch REST client to clean up"); + } + } + } + + /** Registers JVM shutdown hook for resource cleanup. */ + static void registerShutDownHook() { + Runtime runtime = Runtime.getRuntime(); + runtime.addShutdownHook(new ResourceCleanUp()); + logger.debug(null, "Elasticsearch connection cleanup shutdown hook registered"); + } +} From c11c65e421741695002deb1a7b30df4c9be4eea9 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Sat, 24 Jan 2026 11:04:59 +0530 Subject: [PATCH 03/17] build: integrate sunbird-es-utils into core module hierarchy --- core/sunbird-cassandra-utils/pom.xml | 19 +--- core/sunbird-es-utils/pom.xml | 161 +++++++++++++++++++++++++++ 2 files changed, 165 insertions(+), 15 deletions(-) create mode 100644 core/sunbird-es-utils/pom.xml diff --git a/core/sunbird-cassandra-utils/pom.xml b/core/sunbird-cassandra-utils/pom.xml index 46563f1d22..405f026be0 100644 --- a/core/sunbird-cassandra-utils/pom.xml +++ b/core/sunbird-cassandra-utils/pom.xml @@ -10,25 +10,14 @@ org.sunbird sunbird-cassandra-utils 1.0-SNAPSHOT - sunbird-cassandra-utils - - - 11 - 11 - 11 - UTF-8 - UTF-8 - 1.1.1 - 3.7.0 - 2.13.5 - + Sunbird Cassandra Utils com.datastax.cassandra cassandra-driver-core - 3.7.0 + ${cassandra.driver.version} shaded @@ -66,12 +55,12 @@ commons-collections commons-collections - 3.2.2 + ${commons-collections.version} org.apache.commons commons-lang3 - 3.12.0 + ${commons-lang3.version} diff --git a/core/sunbird-es-utils/pom.xml b/core/sunbird-es-utils/pom.xml new file mode 100644 index 0000000000..7b03c0cb93 --- /dev/null +++ b/core/sunbird-es-utils/pom.xml @@ -0,0 +1,161 @@ + + + + + org.sunbird + core + 1.0-SNAPSHOT + + + 4.0.0 + sunbird-es-utils + 1.0-SNAPSHOT + Sunbird ElasticSearch Utils + + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + ${elasticsearch.version} + + + org.apache.httpcomponents + httpasyncclient + + + org.apache.httpcomponents + httpcore-nio + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpcore + + + + + + org.elasticsearch.client + transport + ${elasticsearch.version} + + + io.netty + * + + + + + + + org.apache.httpcomponents + httpasyncclient + ${httpcomponents.httpasyncclient.version} + + + + org.apache.httpcomponents + httpcore-nio + ${httpcomponents.httpcore.version} + + + + org.apache.httpcomponents + httpclient + ${httpcomponents.httpclient.version} + + + + org.apache.httpcomponents + httpcore + ${httpcomponents.httpcore.version} + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + ch.qos.logback + logback-core + ${logback.version} + + + + net.logstash.logback + logstash-logback-encoder + ${logstash-logback-encoder.version} + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + org.sunbird + platform-common + 1.0-SNAPSHOT + + + io.netty + * + + + + + + + junit + junit + ${junit.version} + test + + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + junit + junit + + + + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + From 4ff92a395db2e3a7422104b07c49feb69247d37d Mon Sep 17 00:00:00 2001 From: chethann007 Date: Sat, 24 Jan 2026 11:07:25 +0530 Subject: [PATCH 04/17] build: unregister legacy ES utils from service and add new ES utils to POM --- service/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/pom.xml b/service/pom.xml index cc1df5b41f..126c7842d2 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -43,7 +43,7 @@ org.sunbird - es-utils + sunbird-es-utils 1.0-SNAPSHOT compile From 2376e466a7b437a2ff7d360b0e746444e559a0c9 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Sat, 24 Jan 2026 11:18:13 +0530 Subject: [PATCH 05/17] build: integrate standardized Elasticsearch utility and update module hierarchy --- core/pom.xml | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index 5fa6c6caaa..95040c608c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -9,13 +9,56 @@ 4.0.0 + + + 11 + 11 + 11 + + + UTF-8 + UTF-8 + + + 3.7.0 + + + 7.10.2 + + + 4.5.14 + 4.4.16 + 4.1.5 + + + 2.13.5 + + + 1.2.3 + 6.6 + + + 3.2.2 + 3.12.0 + + + 4.13.1 + 2.0.9 + + + 3.8.1 + 3.0.0 + 0.8.7 + 1.1.1 + + core pom platform-common actor-core sunbird-cassandra-utils - es-utils + sunbird-es-utils notification-utils From 5fc7ef9cbf15f648dadb12f07fe9702dc31e8210 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Sat, 24 Jan 2026 11:19:18 +0530 Subject: [PATCH 06/17] feat: integrate course indices and add invalidData error handling in platform-common --- .../src/main/java/org/sunbird/exception/ResponseCode.java | 1 + .../main/java/org/sunbird/exception/ResponseMessage.java | 2 ++ .../src/main/java/org/sunbird/keys/JsonKey.java | 2 ++ .../src/main/java/org/sunbird/util/ProjectUtil.java | 8 +++++++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java b/core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java index 6741f5c13f..12c07c6f77 100644 --- a/core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java +++ b/core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java @@ -35,6 +35,7 @@ public enum ResponseCode { dbInsertionError( ResponseMessage.Key.DB_INSERTION_FAIL, ResponseMessage.Message.DB_INSERTION_FAIL), dbUpdateError(ResponseMessage.Key.DB_UPDATE_FAIL, ResponseMessage.Message.DB_UPDATE_FAIL), + invalidData(ResponseMessage.Key.INVALID_DATA, ResponseMessage.Message.INVALID_DATA), OnlyEmailorPhoneorManagedByRequired( ResponseMessage.Key.ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED, diff --git a/core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java b/core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java index 7e211949d8..260cc12f5a 100644 --- a/core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java +++ b/core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java @@ -28,6 +28,7 @@ interface Message { String USER_STATUS_MSG = "User is already {0}."; String DATA_FORMAT_ERROR = "Invalid format for given {0}."; String INVALID_CSV_FILE = "Please provide valid csv file."; + String INVALID_DATA = "Incorrect data."; String INVALID_OBJECT_TYPE = "Invalid Object Type."; String EMPTY_CSV_FILE = "CSV file is Empty."; String INTERNAL_ERROR = "Process failed, please try again later."; @@ -216,5 +217,6 @@ interface Key { String INVALID_TENANT_SECURITY_LEVEL_LOWER = "0082"; String CANNOT_DELETE_USER = "0083"; String CANNOT_TRANSFER_OWNERSHIP = "0084"; + String INVALID_DATA = "INVALID DATA"; } } diff --git a/core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java b/core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java index 59d7d22f33..591214dd22 100644 --- a/core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java +++ b/core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java @@ -261,6 +261,8 @@ public final class JsonKey { public static final String SUNBIRD_ES_CLUSTER = "sunbird_es_cluster"; public static final String SUNBIRD_ES_IP = "sunbird_es_host"; public static final String SUNBIRD_ES_PORT = "sunbird_es_port"; + public static final String ES_COURSE_INDEX = "es_course_index"; + public static final String ES_COURSE_BATCH_INDEX = "es_course_batch_index"; public static final String SUNBIRD_INSTALLATION = "sunbird_installation"; public static final String SUNBIRD_SSO_CLIENT_ID = "sunbird_sso_client_id"; public static final String SUNBIRD_SSO_CLIENT_SECRET = "sunbird_sso_client_secret"; diff --git a/core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java b/core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java index f57f02d34c..ce586cc8af 100644 --- a/core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java +++ b/core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java @@ -242,7 +242,9 @@ public enum EsType { organisation(getConfigValue(JsonKey.ES_ORG_INDEX_INDEX)), usernotes(getConfigValue(JsonKey.ES_USER_NOTES_INDEX)), location(getConfigValue(JsonKey.ES_LOCATION_INDEX)), - userfeed(getConfigValue(JsonKey.ES_USER_FEED_INDEX)); + userfeed(getConfigValue(JsonKey.ES_USER_FEED_INDEX)), + course(getConfigValue(JsonKey.ES_COURSE_INDEX)), + courseBatch(getConfigValue(JsonKey.ES_COURSE_BATCH_INDEX)); private String typeName; @@ -507,6 +509,10 @@ public static void removeUnwantedFields(Map map, String... keys) }); } + public static boolean isNotNull(Object obj) { + return null != obj ? true : false; + } + /** * Method to convert Request object to module specific POJO request. * From 6daad6a53e21a21fea3e35f977c9aaa96fd25075 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Tue, 27 Jan 2026 12:33:31 +0530 Subject: [PATCH 07/17] feat: Update Elasticsearch health check to query multiple indices and use flexible index options. --- .../java/org/sunbird/common/ElasticSearchRestHighImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java index aa1d7300a3..901e352512 100644 --- a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java @@ -14,6 +14,7 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.admin.indices.get.GetIndexRequest; +import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; @@ -455,8 +456,9 @@ public Future healthCheck() { Promise promise = Futures.promise(); try { - // Use a common index for health check (can be made configurable) - GetIndexRequest indexRequest = new GetIndexRequest().indices(ProjectUtil.EsType.courseBatch.getTypeName()); + GetIndexRequest indexRequest = new GetIndexRequest() + .indices(ProjectUtil.EsType.courseBatch.getTypeName(), ProjectUtil.EsType.user.getTypeName()) + .indicesOptions(IndicesOptions.fromOptions(true, true, true, false)); ActionListener listener = new ActionListener() { @Override From a86dfb56123b2e28d968709e005e30487ea0fb38 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Tue, 27 Jan 2026 17:40:10 +0530 Subject: [PATCH 08/17] refactor: extract telemetry utilities into new sunbird-event-utils module - Moved telemetry-related classes from platform-common to sunbird-event-utils. - Updated POM files and resolved circular dependencies via build-helper-maven-plugin. --- core/platform-common/pom.xml | 24 ++ .../collector/TelemetryAssemblerFactory.java | 18 -- .../collector/TelemetryDataAssembler.java | 15 -- .../collector/TelemetryDataAssemblerImpl.java | 28 --- .../java/org/sunbird/telemetry/dto/Actor.java | 35 --- .../org/sunbird/telemetry/dto/Producer.java | 56 ----- .../org/sunbird/telemetry/dto/Target.java | 60 ----- .../telemetry/dto/TelemetryBJREvent.java | 70 ------ .../telemetry/dto/TelemetryEnvKey.java | 15 -- .../telemetry/dto/TelemetryV3Request.java | 92 -------- .../telemetry/util/TelemetryConstant.java | 11 - .../telemetry/util/TelemetryEvents.java | 22 -- .../telemetry/util/TelemetryParams.java | 7 - .../validator/TelemetryObjectValidator.java | 13 -- core/pom.xml | 1 + core/sunbird-event-utils/pom.xml | 44 ++++ .../collector/TelemetryAssemblerFactory.java | 32 +++ .../collector/TelemetryDataAssembler.java | 45 ++++ .../collector/TelemetryDataAssemblerImpl.java | 59 +++++ .../java/org/sunbird/telemetry/dto/Actor.java | 64 ++++++ .../org/sunbird/telemetry/dto/Context.java | 83 ++++++- .../org/sunbird/telemetry/dto/Producer.java | 100 +++++++++ .../org/sunbird/telemetry/dto/Target.java | 107 +++++++++ .../org/sunbird/telemetry/dto/Telemetry.java | 133 +++++++++-- .../telemetry/dto/TelemetryBEEvent.java | 109 +++++++++ .../telemetry/dto/TelemetryBJREvent.java | 144 ++++++++++++ .../telemetry/dto/TelemetryEnvKey.java | 56 +++++ .../telemetry/util/TelemetryConstant.java | 14 ++ .../telemetry/util/TelemetryEvents.java | 40 ++++ .../telemetry/util/TelemetryGenerator.java | 208 +++++++++++++----- .../telemetry/util/TelemetryParams.java | 21 ++ .../sunbird/telemetry/util/TelemetryUtil.java | 70 +++++- .../telemetry/util/TelemetryWriter.java | 45 ++++ .../validator/TelemetryObjectValidator.java | 39 ++++ .../validator/TelemetryObjectValidatorV3.java | 117 +++++++--- 35 files changed, 1444 insertions(+), 553 deletions(-) delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryV3Request.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java create mode 100644 core/sunbird-event-utils/pom.xml create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java rename core/{platform-common => sunbird-event-utils}/src/main/java/org/sunbird/telemetry/dto/Context.java (51%) create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java rename core/{platform-common => sunbird-event-utils}/src/main/java/org/sunbird/telemetry/dto/Telemetry.java (52%) rename core/{platform-common => sunbird-event-utils}/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java (55%) create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java rename core/{platform-common => sunbird-event-utils}/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java (70%) create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java rename core/{platform-common => sunbird-event-utils}/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java (52%) rename core/{platform-common => sunbird-event-utils}/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java (80%) create mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java rename core/{platform-common => sunbird-event-utils}/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java (65%) diff --git a/core/platform-common/pom.xml b/core/platform-common/pom.xml index ddb01753c6..426749aa7f 100644 --- a/core/platform-common/pom.xml +++ b/core/platform-common/pom.xml @@ -292,4 +292,28 @@ + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + generate-sources + + add-source + + + + ../sunbird-event-utils/src/main/java + + + + + + + diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java b/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java deleted file mode 100644 index 86d4e89880..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.sunbird.telemetry.collector; - -/** Created by arvind on 16/1/18. */ -public class TelemetryAssemblerFactory { - - private static TelemetryDataAssembler telemetryDataAssembler = null; - - public static TelemetryDataAssembler get() { - if (telemetryDataAssembler == null) { - synchronized (TelemetryAssemblerFactory.class) { - if (telemetryDataAssembler == null) { - telemetryDataAssembler = new TelemetryDataAssemblerImpl(); - } - } - } - return telemetryDataAssembler; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java b/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java deleted file mode 100644 index 748b3315b8..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.sunbird.telemetry.collector; - -import java.util.Map; - -/** Created by arvind on 16/1/18. */ -public interface TelemetryDataAssembler { - - public String audit(Map context, Map params); - - public String search(Map context, Map params); - - public String log(Map context, Map params); - - public String error(Map context, Map params); -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java b/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java deleted file mode 100644 index 7047c3849a..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.sunbird.telemetry.collector; - -import java.util.Map; -import org.sunbird.telemetry.util.TelemetryGenerator; - -/** Created by arvind on 5/1/18. */ -public class TelemetryDataAssemblerImpl implements TelemetryDataAssembler { - - @Override - public String audit(Map context, Map params) { - return TelemetryGenerator.audit(context, params); - } - - @Override - public String search(Map context, Map params) { - return TelemetryGenerator.search(context, params); - } - - @Override - public String log(Map context, Map params) { - return TelemetryGenerator.log(context, params); - } - - @Override - public String error(Map context, Map params) { - return TelemetryGenerator.error(context, params); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java b/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java deleted file mode 100644 index c69b605b11..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.sunbird.telemetry.dto; - -public class Actor { - - private String id; - private String type; - - public Actor() {} - - public Actor(String id, String type) { - super(); - this.id = id; - this.type = type; - } - - /** @return the id */ - public String getId() { - return id; - } - - /** @param id the id to set */ - public void setId(String id) { - this.id = id; - } - - /** @return the type */ - public String getType() { - return type; - } - - /** @param type the type to set */ - public void setType(String type) { - this.type = type; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java b/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java deleted file mode 100644 index be56b1e05b..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.sunbird.telemetry.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -@JsonInclude(Include.NON_NULL) -public class Producer { - - private String id; - private String pid; - private String ver; - - public Producer() {} - - public Producer(String id, String ver) { - super(); - this.id = id; - this.ver = ver; - } - - public Producer(String id, String pid, String ver) { - this.id = id; - this.pid = pid; - this.ver = ver; - } - - /** @return the id */ - public String getId() { - return id; - } - - /** @param id the id to set */ - public void setId(String id) { - this.id = id; - } - - /** @return the pid */ - public String getPid() { - return pid; - } - - /** @param pid the pid to set */ - public void setPid(String pid) { - this.pid = pid; - } - - /** @return the ver */ - public String getVer() { - return ver; - } - - /** @param ver the ver to set */ - public void setVer(String ver) { - this.ver = ver; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java b/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java deleted file mode 100644 index 071311494b..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.sunbird.telemetry.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import java.util.Map; - -@JsonInclude(Include.NON_NULL) -public class Target { - - private String id; - private String type; - private String ver; - private Map rollup; - - public Target() {} - - public Target(String id, String type) { - super(); - this.id = id; - this.type = type; - } - - public Map getRollup() { - return rollup; - } - - public void setRollup(Map rollup) { - this.rollup = rollup; - } - - /** @return the id */ - public String getId() { - return id; - } - - /** @param id the id to set */ - public void setId(String id) { - this.id = id; - } - - /** @return the type */ - public String getType() { - return type; - } - - /** @param type the type to set */ - public void setType(String type) { - this.type = type; - } - - /** @return the ver */ - public String getVer() { - return ver; - } - - /** @param ver the ver to set */ - public void setVer(String ver) { - this.ver = ver; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java b/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java deleted file mode 100644 index a94a365d3a..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.sunbird.telemetry.dto; - -import java.util.Map; - -public class TelemetryBJREvent { - - private String eid; - private long ets; - private String mid; - private Map actor; - private Map context; - private Map object; - private Map edata; - - public String getEid() { - return eid; - } - - public void setEid(String eid) { - this.eid = eid; - } - - public long getEts() { - return ets; - } - - public void setEts(long ets) { - this.ets = ets; - } - - public String getMid() { - return mid; - } - - public void setMid(String mid) { - this.mid = mid; - } - - public Map getActor() { - return actor; - } - - public void setActor(Map actor) { - this.actor = actor; - } - - public Map getContext() { - return context; - } - - public void setContext(Map context) { - this.context = context; - } - - public Map getObject() { - return object; - } - - public void setObject(Map object) { - this.object = object; - } - - public Map getEdata() { - return edata; - } - - public void setEdata(Map edata) { - this.edata = edata; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java b/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java deleted file mode 100644 index 853ee5d0f8..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.sunbird.telemetry.dto; - -/** Created by arvind on 9/4/18. */ -public class TelemetryEnvKey { - - public static final String USER = "User"; - public static final String ORGANISATION = "Organisation"; - public static final String GEO_LOCATION = "GeoLocation"; - public static final String MASTER_KEY = "MasterKey"; - public static final String OBJECT_STORE = "ObjectStore"; - public static final String LOCATION = "Location"; - public static final String REQUEST_UPPER_CAMEL = "Request"; - public static final String USER_CONSENT = "UserConsent"; - public static final String EDATA_TYPE_USER_CONSENT = "user-consent"; -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryV3Request.java b/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryV3Request.java deleted file mode 100644 index f9beffa2b0..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryV3Request.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.sunbird.telemetry.dto; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** Created by arvind on 23/3/18. */ -public class TelemetryV3Request implements Serializable { - - private String id; - private String ver; - private Long ets; - private Params params; - - private List> events = new ArrayList<>(); - - public TelemetryV3Request() { - params = new Params(); - } - - class Params implements Serializable { - - private String did; - private String key; - private String msgid; - - public String getDid() { - return did; - } - - public void setDid(String did) { - this.did = did; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getMsgid() { - return msgid; - } - - public void setMsgid(String msgid) { - this.msgid = msgid; - } - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getVer() { - return ver; - } - - public void setVer(String ver) { - this.ver = ver; - } - - public Long getEts() { - return ets; - } - - public void setEts(Long ets) { - this.ets = ets; - } - - public Params getParams() { - return params; - } - - public void setParams(Params params) { - this.params = params; - } - - public List> getEvents() { - return events; - } - - public void setEvents(List> events) { - this.events = events; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java b/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java deleted file mode 100644 index b4394cc25a..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.sunbird.telemetry.util; - -/** - * Class contains Constants for telemetry. - * - * @author arvind. - */ -public class TelemetryConstant { - - public static final String LOG_LEVEL_ERROR = "error"; -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java b/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java deleted file mode 100644 index 76d8b61147..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.sunbird.telemetry.util; - -/** - * enum for telemetry events - * - * @author arvind. - */ -public enum TelemetryEvents { - AUDIT("AUDIT"), - SEARCH("SEARCH"), - LOG("LOG"), - ERROR("ERROR"); - private String name; - - TelemetryEvents(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java b/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java deleted file mode 100644 index 82df24f791..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.sunbird.telemetry.util; - -public enum TelemetryParams { - CHANNEL, - ENV, - ACTOR; -} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java b/core/platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java deleted file mode 100644 index fe5a281d5c..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.sunbird.telemetry.validator; - -/** @author arvind */ -public interface TelemetryObjectValidator { - - public boolean validateAudit(String jsonString); - - public boolean validateSearch(String jsonString); - - public boolean validateLog(String jsonString); - - public boolean validateError(String jsonString); -} diff --git a/core/pom.xml b/core/pom.xml index 95040c608c..6f1367f264 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -60,6 +60,7 @@ sunbird-cassandra-utils sunbird-es-utils notification-utils + sunbird-event-utils diff --git a/core/sunbird-event-utils/pom.xml b/core/sunbird-event-utils/pom.xml new file mode 100644 index 0000000000..5f493f867a --- /dev/null +++ b/core/sunbird-event-utils/pom.xml @@ -0,0 +1,44 @@ + + + + + core + org.sunbird + 1.0-SNAPSHOT + + + 4.0.0 + sunbird-event-utils + 1.0-SNAPSHOT + Sunbird Event Utils + + + + + + + org.sunbird + platform-common + 1.0-SNAPSHOT + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + + diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java new file mode 100644 index 0000000000..7446b11d44 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java @@ -0,0 +1,32 @@ +package org.sunbird.telemetry.collector; + +/** + * Factory class to provide an instance of TelemetryDataAssembler. + * This class follows the creation pattern to ensure a single instance of TelemetryDataAssembler is used. + */ +public class TelemetryAssemblerFactory { + + private static TelemetryDataAssembler telemetryDataAssembler = null; + + /** + * Private constructor to prevent instantiation. + */ + private TelemetryAssemblerFactory() {} + + /** + * Returns the singleton instance of TelemetryDataAssembler. + * If the instance supports lazy initialization, it creates one in a thread-safe manner. + * + * @return TelemetryDataAssembler instance + */ + public static TelemetryDataAssembler get() { + if (telemetryDataAssembler == null) { + synchronized (TelemetryAssemblerFactory.class) { + if (telemetryDataAssembler == null) { + telemetryDataAssembler = new TelemetryDataAssemblerImpl(); + } + } + } + return telemetryDataAssembler; + } +} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java new file mode 100644 index 0000000000..1b061b677e --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java @@ -0,0 +1,45 @@ +package org.sunbird.telemetry.collector; + +import java.util.Map; + +/** + * Interface defining the contract for assembling and generating various telemetry events. + */ +public interface TelemetryDataAssembler { + + /** + * Generates an AUDIT telemetry event. + * + * @param context Context map containing telemetry context information (e.g., channel, pdata, env, etc.) + * @param params Parameters map containing event-specific data + * @return The generated telemetry event as a JSON string + */ + String audit(Map context, Map params); + + /** + * Generates a SEARCH telemetry event. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing search-specific data (e.g., query, filters, sort, correlation) + * @return The generated telemetry event as a JSON string + */ + String search(Map context, Map params); + + /** + * Generates a LOG telemetry event. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing log-specific data (e.g., type, level, message, params) + * @return The generated telemetry event as a JSON string + */ + String log(Map context, Map params); + + /** + * Generates an ERROR telemetry event. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing error-specific data (e.g., err, errtype, stacktrace) + * @return The generated telemetry event as a JSON string + */ + String error(Map context, Map params); +} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java new file mode 100644 index 0000000000..9d133a8560 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java @@ -0,0 +1,59 @@ +package org.sunbird.telemetry.collector; + +import java.util.Map; +import org.sunbird.telemetry.util.TelemetryGenerator; + +/** + * Implementation of the TelemetryDataAssembler interface. + * Delegates the actual generation of telemetry events to the TelemetryGenerator utility. + */ +public class TelemetryDataAssemblerImpl implements TelemetryDataAssembler { + + /** + * Generates an AUDIT telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing event-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String audit(Map context, Map params) { + return TelemetryGenerator.audit(context, params); + } + + /** + * Generates a SEARCH telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing search-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String search(Map context, Map params) { + return TelemetryGenerator.search(context, params); + } + + /** + * Generates a LOG telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing log-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String log(Map context, Map params) { + return TelemetryGenerator.log(context, params); + } + + /** + * Generates an ERROR telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing error-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String error(Map context, Map params) { + return TelemetryGenerator.error(context, params); + } +} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java new file mode 100644 index 0000000000..8617b27714 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java @@ -0,0 +1,64 @@ +package org.sunbird.telemetry.dto; + +/** + * Represents the 'Actor' in a telemetry event. + * The Actor is the entity (User, System, etc.) that performs the action being logged. + */ +public class Actor { + + private String id; + private String type; + + /** + * Default constructor. + */ + public Actor() {} + + /** + * Parameterized constructor to initialize the Actor. + * + * @param id The unique identifier of the actor (e.g., User ID). + * @param type The type of the actor (e.g., 'User', 'System'). + */ + public Actor(String id, String type) { + super(); + this.id = id; + this.type = type; + } + + /** + * Gets the unique identifier of the actor. + * + * @return the id of the actor + */ + public String getId() { + return id; + } + + /** + * Sets the unique identifier of the actor. + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the type of the actor. + * + * @return the type of the actor + */ + public String getType() { + return type; + } + + /** + * Sets the type of the actor. + * + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } +} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Context.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Context.java similarity index 51% rename from core/platform-common/src/main/java/org/sunbird/telemetry/dto/Context.java rename to core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Context.java index 9ba76facaa..dedaaaf473 100644 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Context.java +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Context.java @@ -1,4 +1,3 @@ -/** */ package org.sunbird.telemetry.dto; import com.fasterxml.jackson.annotation.JsonInclude; @@ -8,6 +7,10 @@ import java.util.List; import java.util.Map; +/** + * Represents the context of a telemetry event. + * Contains information about the environment, actor, channel, and other contextual data. + */ @JsonInclude(Include.NON_NULL) public class Context { @@ -18,8 +21,18 @@ public class Context { private List> cdata = new ArrayList<>(); private Map rollup = new HashMap<>(); + /** + * Default constructor. + */ public Context() {} + /** + * Parameterized constructor to initialize the Context. + * + * @param channel The channel ID + * @param env The environment (e.g., 'dev', 'prod') + * @param pdata The producer data + */ public Context(String channel, String env, Producer pdata) { super(); this.channel = channel; @@ -27,58 +40,110 @@ public Context(String channel, String env, Producer pdata) { this.pdata = pdata; } + /** + * Gets the rollup data. + * + * @return a map containing rollup data + */ public Map getRollup() { return rollup; } + /** + * Sets the rollup data. + * + * @param rollup a map containing rollup data to set + */ public void setRollup(Map rollup) { this.rollup = rollup; } + /** + * Gets the correlation data (cdata). + * + * @return a list of maps containing correlation data + */ public List> getCdata() { return cdata; } + /** + * Sets the correlation data (cdata). + * + * @param cdata a list of maps containing correlation data to set + */ public void setCdata(List> cdata) { this.cdata = cdata; } - /** @return the channel */ + /** + * Gets the channel ID. + * + * @return the channel + */ public String getChannel() { return channel; } - /** @param channel the channel to set */ + /** + * Sets the channel ID. + * + * @param channel the channel to set + */ public void setChannel(String channel) { this.channel = channel; } - /** @return the pdata */ + /** + * Gets the producer data. + * + * @return the pdata + */ public Producer getPdata() { return pdata; } - /** @param pdata the pdata to set */ + /** + * Sets the producer data. + * + * @param pdata the pdata to set + */ public void setPdata(Producer pdata) { this.pdata = pdata; } - /** @return the env */ + /** + * Gets the environment. + * + * @return the env + */ public String getEnv() { return env; } - /** @param env the env to set */ + /** + * Sets the environment. + * + * @param env the env to set + */ public void setEnv(String env) { this.env = env; } - /** @return the did */ + /** + * Gets the device ID. + * + * @return the did + */ public String getDid() { return did; } - /** @param did the did to set */ + /** + * Sets the device ID. + * + * @param did the did to set + */ public void setDid(String did) { this.did = did; } diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java new file mode 100644 index 0000000000..be49c81824 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java @@ -0,0 +1,100 @@ +package org.sunbird.telemetry.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +/** + * Represents the producer of a telemetry event. + * The Producer is the system/subsystem that generated the event. + */ +@JsonInclude(Include.NON_NULL) +public class Producer { + + private String id; + private String pid; + private String ver; + + /** + * Default constructor. + */ + public Producer() {} + + /** + * Parameterized constructor. + * + * @param id The unique identifier of the producer + * @param ver The version of the producer + */ + public Producer(String id, String ver) { + super(); + this.id = id; + this.ver = ver; + } + + /** + * Parameterized constructor. + * + * @param id The unique identifier of the producer + * @param pid The producer ID (optional/alternative) + * @param ver The version of the producer + */ + public Producer(String id, String pid, String ver) { + this.id = id; + this.pid = pid; + this.ver = ver; + } + + /** + * Gets the producer ID. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the producer ID. + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the producer PID. + * + * @return the pid + */ + public String getPid() { + return pid; + } + + /** + * Sets the producer PID. + * + * @param pid the pid to set + */ + public void setPid(String pid) { + this.pid = pid; + } + + /** + * Gets the producer version. + * + * @return the ver + */ + public String getVer() { + return ver; + } + + /** + * Sets the producer version. + * + * @param ver the ver to set + */ + public void setVer(String ver) { + this.ver = ver; + } +} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java new file mode 100644 index 0000000000..75bc947d26 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java @@ -0,0 +1,107 @@ +package org.sunbird.telemetry.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Map; + +/** + * Represents the target object of a telemetry event. + * The Target identifies the object being acted upon (e.g., Content, Item, User). + */ +@JsonInclude(Include.NON_NULL) +public class Target { + + private String id; + private String type; + private String ver; + private Map rollup; + + /** + * Default constructor. + */ + public Target() {} + + /** + * Parameterized constructor to initialize the Target. + * + * @param id The unique identifier of the target object + * @param type The type of the target object + */ + public Target(String id, String type) { + super(); + this.id = id; + this.type = type; + } + + /** + * Gets the rollup data. + * + * @return a map containing rollup data + */ + public Map getRollup() { + return rollup; + } + + /** + * Sets the rollup data. + * + * @param rollup a map containing rollup data to set + */ + public void setRollup(Map rollup) { + this.rollup = rollup; + } + + /** + * Gets the target ID. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the target ID. + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the target type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the target type. + * + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the target version. + * + * @return the ver + */ + public String getVer() { + return ver; + } + + /** + * Sets the target version. + * + * @param ver the ver to set + */ + public void setVer(String ver) { + this.ver = ver; + } +} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Telemetry.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Telemetry.java similarity index 52% rename from core/platform-common/src/main/java/org/sunbird/telemetry/dto/Telemetry.java rename to core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Telemetry.java index d468b92ae9..bbe878a0e3 100644 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/Telemetry.java +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Telemetry.java @@ -6,7 +6,10 @@ import java.util.Map; import java.util.UUID; -/** Telemetry V3 POJO to generate telemetry event. */ +/** + * Telemetry V3 POJO to generate telemetry event. + * Represents the structure of a standard Sunbird telemetry event. + */ @JsonInclude(Include.NON_NULL) public class Telemetry { @@ -20,8 +23,20 @@ public class Telemetry { private Map edata; private List tags; + /** + * Default constructor. + */ public Telemetry() {} + /** + * Parameterized constructor. + * + * @param eid The event ID (e.g., AUDIT, LOG, SEARCH) + * @param actor The actor performing the event + * @param context The context of the event + * @param edata The event data + * @param object The target object of the event + */ public Telemetry( String eid, Actor actor, Context context, Map edata, Target object) { super(); @@ -32,6 +47,14 @@ public Telemetry( this.object = object; } + /** + * Parameterized constructor (without target object). + * + * @param eid The event ID + * @param actor The actor performing the event + * @param context The context of the event + * @param edata The event data + */ public Telemetry(String eid, Actor actor, Context context, Map edata) { super(); this.eid = eid; @@ -40,92 +63,164 @@ public Telemetry(String eid, Actor actor, Context context, Map e this.edata = edata; } - /** @return the eid */ + /** + * Gets the event ID. + * + * @return the eid + */ public String getEid() { return eid; } - /** @param eid the eid to set */ + /** + * Sets the event ID. + * + * @param eid the eid to set + */ public void setEid(String eid) { this.eid = eid; } - /** @return the ets */ + /** + * Gets the event timestamp. + * + * @return the ets + */ public long getEts() { return ets; } - /** @param ets the ets to set */ + /** + * Sets the event timestamp. + * + * @param ets the ets to set + */ public void setEts(long ets) { this.ets = ets; } - /** @return the ver */ + /** + * Gets the version. + * + * @return the ver + */ public String getVer() { return ver; } - /** @param ver the ver to set */ + /** + * Sets the version. + * + * @param ver the ver to set + */ public void setVer(String ver) { this.ver = ver; } - /** @return the mid */ + /** + * Gets the message ID. + * + * @return the mid + */ public String getMid() { return mid; } - /** @param mid the mid to set */ + /** + * Sets the message ID. + * + * @param mid the mid to set + */ public void setMid(String mid) { this.mid = mid; } - /** @return the actor */ + /** + * Gets the actor. + * + * @return the actor + */ public Actor getActor() { return actor; } - /** @param actor the actor to set */ + /** + * Sets the actor. + * + * @param actor the actor to set + */ public void setActor(Actor actor) { this.actor = actor; } - /** @return the context */ + /** + * Gets the context. + * + * @return the context + */ public Context getContext() { return context; } - /** @param context the context to set */ + /** + * Sets the context. + * + * @param context the context to set + */ public void setContext(Context context) { this.context = context; } - /** @return the object */ + /** + * Gets the target object. + * + * @return the object + */ public Target getObject() { return object; } - /** @param object the object to set */ + /** + * Sets the target object. + * + * @param object the object to set + */ public void setObject(Target object) { this.object = object; } - /** @return the edata */ + /** + * Gets the event data. + * + * @return the edata + */ public Map getEdata() { return edata; } - /** @param edata the edata to set */ + /** + * Sets the event data. + * + * @param edata the edata to set + */ public void setEdata(Map edata) { this.edata = edata; } - /** @return the tags */ + /** + * Gets the tags. + * + * @return the tags + */ public List getTags() { return tags; } - /** @param tags the tags to set */ + /** + * Sets the tags. + * + * @param tags the tags to set + */ public void setTags(List tags) { this.tags = tags; } diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java similarity index 55% rename from core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java rename to core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java index c82a585945..c13da222f1 100644 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java @@ -3,6 +3,10 @@ import java.util.HashMap; import java.util.Map; +/** + * Represents a Backend (BE) Telemetry Event. + * This class captures telemetry data generated by backend services. + */ public class TelemetryBEEvent { private String eid; @@ -13,47 +17,105 @@ public class TelemetryBEEvent { private Map pdata; private Map edata; + /** + * Gets the event ID. + * + * @return the eid + */ public String getEid() { return eid; } + /** + * Sets the event ID. + * + * @param eid the eid to set + */ public void setEid(String eid) { this.eid = eid; } + /** + * Gets the event timestamp. + * + * @return the ets + */ public long getEts() { return ets; } + /** + * Sets the event timestamp. + * + * @param ets the ets to set + */ public void setEts(long ets) { this.ets = ets; } + /** + * Gets the version. + * + * @return the ver + */ public String getVer() { return ver; } + /** + * Sets the version. + * + * @param ver the ver to set + */ public void setVer(String ver) { this.ver = ver; } + /** + * Gets the producer data. + * + * @return the pdata + */ public Map getPdata() { return pdata; } + /** + * Sets the producer data. + * + * @param pdata the pdata to set + */ public void setPdata(Map pdata) { this.pdata = pdata; } + /** + * Gets the event data. + * + * @return the edata + */ public Map getEdata() { return edata; } + /** + * Sets the event data with specific eks map. + * + * @param eks the eks map to be put inside edata + */ public void setEdata(Map eks) { this.edata = new HashMap<>(); edata.put("eks", eks); } + /** + * Sets the producer data with specific fields. + * + * @param id Producer ID + * @param pid Producer PID + * @param ver Producer Version + * @param uid User ID (Note: unused in implementation but present in signature) + */ public void setPdata(String id, String pid, String ver, String uid) { this.pdata = new HashMap<>(); this.pdata.put("id", id); @@ -61,6 +123,16 @@ public void setPdata(String id, String pid, String ver, String uid) { this.pdata.put("ver", ver); } + /** + * Sets edata for Content events. + * + * @param cid Content ID + * @param status Content Status + * @param prevState Previous State + * @param size Size + * @param pkgVersion Package Version + * @param concepts Concepts + */ public void setEdata( String cid, Object status, @@ -79,6 +151,15 @@ public void setEdata( edata.put("eks", eks); } + /** + * Sets edata for Search events. + * + * @param query Search query + * @param filters Search filters + * @param sort Search sort order + * @param correlationId Correlation ID + * @param size Result size + */ public void setEdata(String query, Object filters, Object sort, String correlationId, int size) { this.edata = new HashMap<>(); Map eks = new HashMap<>(); @@ -90,6 +171,14 @@ public void setEdata(String query, Object filters, Object sort, String correlati edata.put("eks", eks); } + /** + * Sets edata for Lifecycle/State change events. + * + * @param id Target ID + * @param state Current State + * @param prevState Previous State + * @param lemma Lemma (used in wordnet/language) or auxiliary data + */ public void setEdata(String id, Object state, Object prevState, Object lemma) { this.edata = new HashMap<>(); Map eks = new HashMap<>(); @@ -100,14 +189,29 @@ public void setEdata(String id, Object state, Object prevState, Object lemma) { edata.put("eks", eks); } + /** + * Gets the message ID. + * + * @return the mid + */ public String getMid() { return mid; } + /** + * Sets the message ID. + * + * @param mid the mid to set + */ public void setMid(String mid) { this.mid = mid; } + /** + * Gets the channel ID. + * + * @return the channel, or empty string if null + */ public String getChannel() { if (null == channel) { channel = ""; @@ -115,6 +219,11 @@ public String getChannel() { return channel; } + /** + * Sets the channel ID. + * + * @param channel the channel to set + */ public void setChannel(String channel) { String tempChannel = channel; if (null == channel) { diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java new file mode 100644 index 0000000000..2250dbec7e --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java @@ -0,0 +1,144 @@ +package org.sunbird.telemetry.dto; + +import java.util.Map; + +/** + * Represents a Backend Job/Request (BJR) Telemetry Event. + * This class captures telemetry data for background jobs or requests, often used for map-based telemetry structures. + */ +public class TelemetryBJREvent { + + private String eid; + private long ets; + private String mid; + private Map actor; + private Map context; + private Map object; + private Map edata; + + /** + * Gets the event ID. + * + * @return the eid + */ + public String getEid() { + return eid; + } + + /** + * Sets the event ID. + * + * @param eid the eid to set + */ + public void setEid(String eid) { + this.eid = eid; + } + + /** + * Gets the event timestamp. + * + * @return the ets + */ + public long getEts() { + return ets; + } + + /** + * Sets the event timestamp. + * + * @param ets the ets to set + */ + public void setEts(long ets) { + this.ets = ets; + } + + /** + * Gets the message ID. + * + * @return the mid + */ + public String getMid() { + return mid; + } + + /** + * Sets the message ID. + * + * @param mid the mid to set + */ + public void setMid(String mid) { + this.mid = mid; + } + + /** + * Gets the actor data map. + * + * @return the actor map + */ + public Map getActor() { + return actor; + } + + /** + * Sets the actor data map. + * + * @param actor the actor map to set + */ + public void setActor(Map actor) { + this.actor = actor; + } + + /** + * Gets the context data map. + * + * @return the context map + */ + public Map getContext() { + return context; + } + + /** + * Sets the context data map. + * + * @param context the context map to set + */ + public void setContext(Map context) { + this.context = context; + } + + /** + * Gets the object/target data map. + * + * @return the object map + */ + public Map getObject() { + return object; + } + + /** + * Sets the object/target data map. + * + * @param object the object map to set + */ + public void setObject(Map object) { + this.object = object; + } + + /** + * Gets the event data map. + * + * @return the edata map + */ + public Map getEdata() { + return edata; + } + + /** + * Sets the event data map. + * + * @param edata the edata map to set + */ + public void setEdata(Map edata) { + this.edata = edata; + } +} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java new file mode 100644 index 0000000000..6244277081 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java @@ -0,0 +1,56 @@ +package org.sunbird.telemetry.dto; + +/** + * Constants for Telemetry Environment Keys. + * Defines the environment names used in various telemetry events. + */ +public class TelemetryEnvKey { + + /** Constant for User environment */ + public static final String USER = "User"; + + /** Constant for Organisation environment */ + public static final String ORGANISATION = "Organisation"; + + /** Constant for GeoLocation environment */ + public static final String GEO_LOCATION = "GeoLocation"; + + /** Constant for MasterKey environment */ + public static final String MASTER_KEY = "MasterKey"; + + /** Constant for ObjectStore environment */ + public static final String OBJECT_STORE = "ObjectStore"; + + /** Constant for Location environment */ + public static final String LOCATION = "Location"; + + /** Constant for Request environment */ + public static final String REQUEST_UPPER_CAMEL = "Request"; + + /** Constant for UserConsent environment */ + public static final String USER_CONSENT = "UserConsent"; + + /** Constant for Edata Type User Consent */ + public static final String EDATA_TYPE_USER_CONSENT = "user-consent"; + + /** Constant for CourseBatch environment */ + public static final String BATCH = "CourseBatch"; + + /** Constant for Page environment */ + public static final String PAGE = "Page"; + + /** Constant for PageSection environment */ + public static final String PAGE_SECTION = "PageSection"; + + /** Constant for QRCodeDownload environment */ + public static final String QR_CODE_DOWNLOAD = "QRCodeDownload"; + + /** Constant for COURSE_CREATE environment */ + public static final String COURSE_CREATE = "COURSE_CREATE"; + + /** Constant for Notification Created environment */ + public static final String NOTIFICATION_CREATED = "create-notification"; + + /** Private constructor to prevent instantiation. */ + private TelemetryEnvKey() {} +} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java new file mode 100644 index 0000000000..059fa18ad7 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java @@ -0,0 +1,14 @@ +package org.sunbird.telemetry.util; + +/** + * Class contains Constants for telemetry. + * Defines standard constant values used for telemetry logging and processing. + */ +public class TelemetryConstant { + + /** Constant for Error log level */ + public static final String LOG_LEVEL_ERROR = "error"; + + /** Private constructor to prevent instantiation. */ + private TelemetryConstant() {} +} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java new file mode 100644 index 0000000000..f76f282e6d --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java @@ -0,0 +1,40 @@ +package org.sunbird.telemetry.util; + +/** + * Enumeration for telemetry events types. + * Defines the standard event names supported by the telemetry system. + */ +public enum TelemetryEvents { + + /** AUDIT Telemetry Event */ + AUDIT("AUDIT"), + + /** SEARCH Telemetry Event */ + SEARCH("SEARCH"), + + /** LOG Telemetry Event */ + LOG("LOG"), + + /** ERROR Telemetry Event */ + ERROR("ERROR"); + + private final String name; + + /** + * Private constructor for enum. + * + * @param name The name of the event + */ + TelemetryEvents(String name) { + this.name = name; + } + + /** + * Gets the name of the telemetry event. + * + * @return the name + */ + public String getName() { + return name; + } +} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java similarity index 70% rename from core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java rename to core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java index d132ed39b4..e0214658a5 100644 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java @@ -2,32 +2,32 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.util.*; -import java.util.Map.Entry; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.telemetry.dto.*; import org.sunbird.util.ProjectUtil; +import org.sunbird.telemetry.dto.*; +import org.sunbird.telemetry.dto.TelemetryEnvKey; /** - * class to transform the request data to telemetry events - * - * @author Arvind + * Utility class to generate telemetry events. + * Provides static methods to construct standard telemetry objects. */ public class TelemetryGenerator { - private static final LoggerUtil logger = new LoggerUtil(TelemetryGenerator.class); private static final ObjectMapper mapper = new ObjectMapper(); + private static final LoggerUtil logger = new LoggerUtil(TelemetryGenerator.class); + /** Private constructor to prevent instantiation. */ private TelemetryGenerator() {} /** - * To generate api_access LOG telemetry JSON string. + * Generates api_access AUDIT telemetry JSON string. * * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the telemetry event data info - * @return Telemetry event + * @param params Map contains the telemetry event data info + * @return Telemetry event as JSON string */ public static String audit(Map context, Map params) { if (!validateRequest(context, params)) { @@ -35,34 +35,49 @@ public static String audit(Map context, Map para } String actorId = (String) context.get(JsonKey.ACTOR_ID); String actorType = (String) context.get(JsonKey.ACTOR_TYPE); - Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); Target targetObject = generateTargetObject((Map) params.get(JsonKey.TARGET_OBJECT)); + + Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); Context eventContext = getContext(context); - // assign cdata into context from params correlated objects... + Map edata = generateAuditEdata(params); + + /* Assign cdata into context from params correlated objects */ if (params.containsKey(JsonKey.CORRELATED_OBJECTS)) { setCorrelatedDataToContext(params.get(JsonKey.CORRELATED_OBJECTS), eventContext); } - // assign request id into context cdata ... + /* Assign request id into context cdata */ String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (!StringUtils.isBlank(reqId)) { + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { Map map = new HashMap<>(); map.put(JsonKey.ID, reqId); map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); eventContext.getCdata().add(map); } - Map edata = generateAuditEdata(params); + /* Construct telemetry object and set message ID */ Telemetry telemetry = new Telemetry(TelemetryEvents.AUDIT.getName(), actor, eventContext, edata, targetObject); telemetry.setMid(reqId); return getTelemetry(telemetry); } + /** + * Sets correlated data (cdata) to the telemetry context. + * + * @param correlatedObjects List of correlated objects + * @param eventContext The context object to update + */ private static void setCorrelatedDataToContext(Object correlatedObjects, Context eventContext) { ArrayList> list = (ArrayList>) correlatedObjects; ArrayList> targetList = new ArrayList<>(); + + /* Convert correlated objects to standardized map format */ if (null != list && !list.isEmpty()) { for (Map m : list) { Map map = new HashMap<>(); @@ -74,8 +89,13 @@ private static void setCorrelatedDataToContext(Object correlatedObjects, Context eventContext.setCdata(targetList); } + /** + * Generates a Target object from the provided map. + * + * @param targetObject Map containing target object properties (ID, Type, Rollup) + * @return Constructed Target object + */ private static Target generateTargetObject(Map targetObject) { - Target target = new Target( (String) targetObject.get(JsonKey.ID), @@ -86,20 +106,28 @@ private static Target generateTargetObject(Map targetObject) { return target; } + /** + * Generates event data (edata) for AUDIT telemetry events. + * + * @param params Map containing event parameters (props, type, target object) + * @return Constructed edata map + */ private static Map generateAuditEdata(Map params) { - Map edata = new HashMap<>(); Map props = (Map) params.get(JsonKey.PROPS); + // TODO: need to rethink about this one .. if map is null then what to do if (null != props) { edata.put(JsonKey.PROPS, getProps(props)); } + String type = (String) params.get(JsonKey.TYPE); if (null != type) { edata.put(JsonKey.TYPE, type); } + Map target = (Map) params.get(JsonKey.TARGET_OBJECT); - if (target.get(JsonKey.CURRENT_STATE) != null) { + if (target != null && target.get(JsonKey.CURRENT_STATE) != null) { edata.put(JsonKey.STATE, StringUtils.capitalize((String) target.get(JsonKey.CURRENT_STATE))); if (JsonKey.UPDATE.equalsIgnoreCase((String) target.get(JsonKey.CURRENT_STATE)) && edata.get(props) != null) { @@ -109,12 +137,24 @@ private static Map generateAuditEdata(Map params return edata; } + /** + * Removes specified attributes from the map. + * + * @param map The map to modify + * @param properties The keys to remove + */ private static void removeAttributes(Map map, String... properties) { for (String property : properties) { map.remove(property); } } + /** + * Recursively extracts properties from a map, flattening nested keys. + * + * @param map The map to extract properties from + * @return List of property keys (dot-separated for nested keys) + */ private static List getProps(Map map) { try { return map.entrySet() @@ -139,6 +179,12 @@ private static List getProps(Map map) { return new ArrayList<>(); } + /** + * Constructs the Context object from the context map. + * + * @param context Map containing context info + * @return Constructed Context object + */ private static Context getContext(Map context) { String channel = (String) context.get(JsonKey.CHANNEL); String env = (String) context.get(JsonKey.ENV); @@ -153,6 +199,12 @@ private static Context getContext(Map context) { return eventContext; } + /** + * Constructs a Producer object from the context map. + * + * @param context Map containing producer info + * @return Constructed Producer object + */ private static Producer getProducer(Map context) { String id = ""; if (context != null && context.size() != 0) { @@ -169,27 +221,32 @@ private static Producer getProducer(Map context) { } } + /** + * Serializes the Telemetry object to a JSON string. + * + * @param telemetry Telemetry object + * @return JSON string representation + */ private static String getTelemetry(Telemetry telemetry) { String event = ""; try { event = mapper.writeValueAsString(telemetry); - logger.debug("TelemetryGenerator:getTelemetry = Telemetry Event : " + event); + logger.info("TelemetryGenerator:getTelemetry = Telemetry Event : " + event); } catch (Exception e) { logger.error( "TelemetryGenerator:getTelemetry = Telemetry Event: failed to generate audit events:", e); } return event; } - + /** - * Method to generate the search type telemetry event. + * Generates SEARCH telemetry event. * * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the telemetry event data info - * @return Search Telemetry event + * @param params Map contains the telemetry event data info + * @return Search Telemetry event as JSON string */ public static String search(Map context, Map params) { - if (!validateRequest(context, params)) { return ""; } @@ -199,13 +256,19 @@ public static String search(Map context, Map par Context eventContext = getContext(context); + /* Assign request id into context cdata */ String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (!StringUtils.isBlank(reqId)) { + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { Map map = new HashMap<>(); map.put(JsonKey.ID, reqId); map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); eventContext.getCdata().add(map); } + Map edata = generateSearchEdata(params); Telemetry telemetry = new Telemetry(TelemetryEvents.SEARCH.getName(), actor, eventContext, edata); @@ -213,8 +276,13 @@ public static String search(Map context, Map par return getTelemetry(telemetry); } + /** + * Generates event data (edata) for SEARCH telemetry events. + * + * @param params Map containing search event parameters + * @return Constructed edata map + */ private static Map generateSearchEdata(Map params) { - Map edata = new HashMap<>(); String type = (String) params.get(JsonKey.TYPE); String query = (String) params.get(JsonKey.QUERY); @@ -235,14 +303,13 @@ private static Map generateSearchEdata(Map param } /** - * Method to generate the log type telemetry event. + * Generates LOG telemetry event. * * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the telemetry event data info - * @return Search Telemetry event + * @param params Map contains the telemetry event data info + * @return Log Telemetry event as JSON string */ public static String log(Map context, Map params) { - if (!validateRequest(context, params)) { return ""; } @@ -252,9 +319,13 @@ public static String log(Map context, Map params Context eventContext = getContext(context); - // assign request id into context cdata ... + /* Assign request id into context cdata */ String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (!StringUtils.isBlank(reqId)) { + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { Map map = new HashMap<>(); map.put(JsonKey.ID, reqId); map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); @@ -267,8 +338,13 @@ public static String log(Map context, Map params return getTelemetry(telemetry); } + /** + * Generates event data (edata) for LOG telemetry events. + * + * @param params Map containing log event parameters + * @return Constructed edata map + */ private static Map generateLogEdata(Map params) { - Map edata = new HashMap<>(); String logType = (String) params.get(JsonKey.LOG_TYPE); String logLevel = (String) params.get(JsonKey.LOG_LEVEL); @@ -284,13 +360,20 @@ private static Map generateLogEdata(Map params) return edata; } + /** + * Extracts parameters from a map, excluding specified keys. + * + * @param params Map to extract parameters from + * @param ignore List of keys to exclude + * @return List of parameter maps + */ private static List> getParamsList( Map params, List ignore) { - List> paramsList = new ArrayList>(); + List> paramsList = new ArrayList<>(); if (null != params && !params.isEmpty()) { - for (Entry entry : params.entrySet()) { + for (Map.Entry entry : params.entrySet()) { if (!ignore.contains(entry.getKey())) { - Map param = new HashMap(); + Map param = new HashMap<>(); param.put(entry.getKey(), entry.getValue()); paramsList.add(param); } @@ -300,14 +383,13 @@ private static List> getParamsList( } /** - * Method to generate the error type telemetry event. + * Generates ERROR telemetry event. * * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the error event data info - * @return Search Telemetry event + * @param params Map contains the error event data info + * @return Error Telemetry event as JSON string */ public static String error(Map context, Map params) { - if (!validateRequest(context, params)) { return ""; } @@ -317,9 +399,13 @@ public static String error(Map context, Map para Context eventContext = getContext(context); - // assign request id into context cdata ... + /* Assign request id into context cdata */ String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (!StringUtils.isBlank(reqId)) { + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { Map map = new HashMap<>(); map.put(JsonKey.ID, reqId); map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); @@ -334,6 +420,12 @@ public static String error(Map context, Map para return getTelemetry(telemetry); } + /** + * Generates event data (edata) for ERROR telemetry events. + * + * @param params Map contains error event parameters + * @return Constructed edata map + */ private static Map generateErrorEdata(Map params) { Map edata = new HashMap<>(); String error = (String) params.get(JsonKey.ERROR); @@ -341,20 +433,32 @@ private static Map generateErrorEdata(Map params String stackTrace = (String) params.get(JsonKey.STACKTRACE); edata.put(JsonKey.ERROR, error); edata.put(JsonKey.ERR_TYPE, errorType); + + int stackTraceLength = 100; + try { + String lengthStr = ProjectUtil.getConfigValue(JsonKey.STACKTRACE_CHAR_LENGTH); + if (StringUtils.isNotBlank(lengthStr)) { + stackTraceLength = Integer.parseInt(lengthStr); + } + } catch (Exception e) { + logger.error("TelemetryGenerator:generateErrorEdata: Error parsing stacktrace length", e); + } + edata.put( JsonKey.STACKTRACE, - ProjectUtil.getFirstNCharacterString( - stackTrace, - Integer.parseInt(ProjectUtil.getConfigValue(JsonKey.STACKTRACE_CHAR_LENGTH)))); + ProjectUtil.getFirstNCharacterString(stackTrace, stackTraceLength)); return edata; } - + + /** + * Validates if context and params are present. + * + * @param context Telemetry context map + * @param params Telemetry params map + * @return true if valid, false otherwise + */ private static boolean validateRequest(Map context, Map params) { - - boolean flag = true; - if (null == context || context.isEmpty() || params == null || params.isEmpty()) { - flag = false; - } - return flag; + return context != null && !context.isEmpty() && params != null && !params.isEmpty(); } -} + +} \ No newline at end of file diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java new file mode 100644 index 0000000000..b761258a02 --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java @@ -0,0 +1,21 @@ +package org.sunbird.telemetry.util; + +/** + * Enum to represent standard Telemetry parameters. + */ +public enum TelemetryParams { + /** + * Represents the channel ID. + */ + CHANNEL, + + /** + * Represents the environment ID. + */ + ENV, + + /** + * Represents the actor information. + */ + ACTOR; +} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java similarity index 52% rename from core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java rename to core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java index aa8a1eb9bf..441f6a4179 100644 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java @@ -7,11 +7,23 @@ import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -/** @author arvind */ +/** + * Utility class for generating and processing telemetry events. + * Provides helper methods to construct telemetry objects and requests. + */ public final class TelemetryUtil { private TelemetryUtil() {} + /** + * Generates a target object map for telemetry. + * + * @param id The ID of the target object. + * @param type The type of the target object. + * @param currentState The current state of the object. + * @param prevState The previous state of the object. + * @return A map representing the target object. + */ public static Map generateTargetObject( String id, String type, String currentState, String prevState) { @@ -23,7 +35,17 @@ public static Map generateTargetObject( return target; } - public static Map genarateTelemetryRequest( + /** + * Generates the telemetry request map. + * + * @param targetObject The target object map. + * @param correlatedObject List of correlated objects. + * @param eventType The type of telemetry event. + * @param params Additional parameters for the event. + * @param context The context map. + * @return A map representing the telemetry request. + */ + public static Map generateTelemetryRequest( Map targetObject, List> correlatedObject, String eventType, @@ -39,22 +61,44 @@ public static Map genarateTelemetryRequest( return map; } + /** + * Generates a correlated object and adds it to the provided list. + * + * @param id The ID of the correlated object. + * @param type The type of the correlated object. + * @param correlation The relation string. + * @param correlationList The list to which the correlated object will be added. + */ public static void generateCorrelatedObject( - String id, String type, String corelation, List> correlationList) { + String id, String type, String correlation, List> correlationList) { Map correlatedObject = new HashMap<>(); correlatedObject.put(JsonKey.ID, id); correlatedObject.put(JsonKey.TYPE, StringUtils.capitalize(type)); - correlatedObject.put(JsonKey.RELATION, corelation); + correlatedObject.put(JsonKey.RELATION, correlation); correlationList.add(correlatedObject); } + /** + * Adds rollup data to the target object. + * + * @param rollUpMap The rollup map. + * @param targetObject The target object to modify. + */ public static void addTargetObjectRollUp( Map rollUpMap, Map targetObject) { targetObject.put(JsonKey.ROLLUP, rollUpMap); } + /** + * Processes the telemetry call for Audit events. + * + * @param request The request properties map. + * @param targetObject The target object map. + * @param correlatedObject List of correlated objects. + * @param context The context map. + */ public static void telemetryProcessingCall( Map request, Map targetObject, @@ -64,11 +108,20 @@ public static void telemetryProcessingCall( params.put(JsonKey.PROPS, request); Request req = new Request(); req.setRequest( - TelemetryUtil.genarateTelemetryRequest( + TelemetryUtil.generateTelemetryRequest( targetObject, correlatedObject, TelemetryEvents.AUDIT.getName(), params, context)); generateTelemetry(req); } + /** + * Processes the telemetry call for Audit events with a specific type. + * + * @param type The type of the event. + * @param request The request properties map. + * @param targetObject The target object map. + * @param correlatedObject List of correlated objects. + * @param context The context map. + */ public static void telemetryProcessingCall( String type, Map request, @@ -80,11 +133,16 @@ public static void telemetryProcessingCall( params.put(JsonKey.TYPE, type); Request req = new Request(); req.setRequest( - TelemetryUtil.genarateTelemetryRequest( + TelemetryUtil.generateTelemetryRequest( targetObject, correlatedObject, TelemetryEvents.AUDIT.getName(), params, context)); generateTelemetry(req); } + /** + * Helper method to trigger the telemetry writer. + * + * @param request The request object containing telemetry data. + */ private static void generateTelemetry(Request request) { TelemetryWriter.write(request); } diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java similarity index 80% rename from core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java rename to core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java index 90abbff993..d9e7a77fc7 100644 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java @@ -13,6 +13,10 @@ import org.sunbird.telemetry.validator.TelemetryObjectValidator; import org.sunbird.telemetry.validator.TelemetryObjectValidatorV3; +/** + * This class writes telemetry events to the configured logger. + * It processes different types of telemetry events such as AUDIT, SEARCH, ERROR, and LOG. + */ public class TelemetryWriter { private static final TelemetryDataAssembler telemetryDataAssembler = @@ -23,6 +27,16 @@ public class TelemetryWriter { private static final Logger telemetryEventLogger = LoggerFactory.getLogger("TelemetryEventLogger"); + /** + * Private constructor to prevent instantiation. + */ + private TelemetryWriter() {} + + /** + * Writes the telemetry event based on the request content. + * + * @param request The request object containing telemetry data. + */ public static void write(Request request) { try { String eventType = (String) request.getRequest().get(JsonKey.TELEMETRY_EVENT_TYPE); @@ -41,10 +55,17 @@ public static void write(Request request) { } } + /** + * Processes LOG telemetry events. + * + * @param request The request object. + */ private static void processLogEvent(Request request) { Map context = (Map) request.getRequest().get(JsonKey.CONTEXT); Map params = (Map) request.getRequest().get(JsonKey.PARAMS); String telemetry = telemetryDataAssembler.log(context, params); + + // Validate and write telemetry event if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateLog(telemetry)) { telemetryEventLogger.info(telemetry); } else { @@ -53,24 +74,43 @@ private static void processLogEvent(Request request) { } } + /** + * Processes ERROR telemetry events. + * + * @param request The request object. + */ private static void processErrorEvent(Request request) { Map context = (Map) request.get(JsonKey.CONTEXT); Map params = (Map) request.get(JsonKey.PARAMS); String telemetry = telemetryDataAssembler.error(context, params); + + // Validate and write telemetry event if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateError(telemetry)) { telemetryEventLogger.info(telemetry); } } + /** + * Processes SEARCH telemetry events. + * + * @param request The request object. + */ private static void processSearchEvent(Request request) { Map context = (Map) request.get(JsonKey.CONTEXT); Map params = (Map) request.get(JsonKey.PARAMS); String telemetry = telemetryDataAssembler.search(context, params); + + // Validate and write telemetry event if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateSearch(telemetry)) { telemetryEventLogger.info(telemetry); } } + /** + * Processes AUDIT telemetry events. + * + * @param request The request object. + */ private static void processAuditEvent(Request request) { Map context = (Map) request.get(JsonKey.CONTEXT); Map targetObject = (Map) request.get(JsonKey.TARGET_OBJECT); @@ -78,13 +118,18 @@ private static void processAuditEvent(Request request) { (List>) request.get(JsonKey.CORRELATED_OBJECTS); Map params = (Map) request.get(JsonKey.PARAMS); Map props = (Map) params.get(JsonKey.PROPS); + + // Check for type in props and add to params if present if (props != null && props.containsKey(JsonKey.TYPE)) { String type = (String) props.get(JsonKey.TYPE); params.put(JsonKey.TYPE, type); } params.put(JsonKey.TARGET_OBJECT, targetObject); params.put(JsonKey.CORRELATED_OBJECTS, correlatedObjects); + String telemetry = telemetryDataAssembler.audit(context, params); + + // Validate and write telemetry event if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateAudit(telemetry)) { telemetryEventLogger.info(telemetry); } diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java new file mode 100644 index 0000000000..7c1f79778a --- /dev/null +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java @@ -0,0 +1,39 @@ +package org.sunbird.telemetry.validator; + +/** + * Interface for validating telemetry event objects against their schemas. + */ +public interface TelemetryObjectValidator { + + /** + * Validates an AUDIT telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateAudit(String jsonString); + + /** + * Validates a SEARCH telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateSearch(String jsonString); + + /** + * Validates a LOG telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateLog(String jsonString); + + /** + * Validates an ERROR telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateError(String jsonString); +} diff --git a/core/platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java similarity index 65% rename from core/platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java rename to core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java index 75b2bc9b73..efb125f310 100644 --- a/core/platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java +++ b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java @@ -1,6 +1,5 @@ package org.sunbird.telemetry.validator; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -10,14 +9,23 @@ import org.sunbird.logging.LoggerUtil; import org.sunbird.telemetry.dto.Telemetry; import org.sunbird.telemetry.util.TelemetryEvents; +import com.fasterxml.jackson.databind.ObjectMapper; -/** @author arvind */ +/** + * Validator class for Version 3 Telemetry events. + * Implements the TelemetryObjectValidator interface to provide validation logic for various telemetry event types. + */ public class TelemetryObjectValidatorV3 implements TelemetryObjectValidator { + private static final LoggerUtil logger = new LoggerUtil(TelemetryObjectValidatorV3.class); private static TelemetryObjectValidator telemetryObjectValidator = null; - private final ObjectMapper mapper = new ObjectMapper(); + /** + * Returns the singleton instance of TelemetryObjectValidatorV3. + * + * @return The singleton instance. + */ public static TelemetryObjectValidator getInstance() { if (telemetryObjectValidator == null) { telemetryObjectValidator = new TelemetryObjectValidatorV3(); @@ -27,56 +35,69 @@ public static TelemetryObjectValidator getInstance() { @Override public boolean validateAudit(String jsonString) { - boolean validationSuccess = true; List missingFields = new ArrayList<>(); Telemetry telemetryObj = null; try { + // Parse JSON string to Telemetry object telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields validateBasics(telemetryObj, missingFields); + // Validate Audit specific data validateAuditEventData(telemetryObj.getEdata(), missingFields); + if (!missingFields.isEmpty()) { logger.info( - "Telemetry Object Creation Error for event : " + "TelemetryObjectValidatorV3:validateAudit: Validation failed for event: " + TelemetryEvents.AUDIT.getName() - + " missing required fields :" - + String.join(",", missingFields)); + + ". Missing required fields: " + + String.join(", ", missingFields)); validationSuccess = false; } } catch (IOException e) { validationSuccess = false; - logger.error(e.getMessage(), e); + logger.error("TelemetryObjectValidatorV3:validateAudit: Error parsing JSON: " + e.getMessage(), e); } return validationSuccess; } @Override public boolean validateSearch(String jsonString) { - boolean validationSuccess = true; List missingFields = new ArrayList<>(); Telemetry telemetryObj = null; try { + // Parse JSON string to Telemetry object telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields validateBasics(telemetryObj, missingFields); + // Validate Search specific data validateSearchEventData(telemetryObj.getEdata(), missingFields); + if (!missingFields.isEmpty()) { logger.info( - "Telemetry Object Creation Error for event : " + "TelemetryObjectValidatorV3:validateSearch: Validation failed for event: " + TelemetryEvents.SEARCH.getName() - + " missing required fields :" - + String.join(",", missingFields)); + + ". Missing required fields: " + + String.join(", ", missingFields)); validationSuccess = false; } } catch (IOException e) { validationSuccess = false; - logger.error("validateSearch" + e.getMessage(), e); + logger.error("TelemetryObjectValidatorV3:validateSearch: Error parsing JSON: " + e.getMessage(), e); } return validationSuccess; } + /** + * Validates search event data structure. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ private void validateSearchEventData(Map edata, List missingFields) { - if (edata == null || edata.isEmpty()) { missingFields.add("edata"); } else { @@ -92,14 +113,26 @@ private void validateSearchEventData(Map edata, List mis } } + /** + * Validates audit event data presence. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ private void validateAuditEventData(Map edata, List missingFields) { if (edata == null) { missingFields.add("edata"); } } + /** + * Validates basic telemetry fields (eid, mid, ver, actor, context). + * + * @param telemetryObj The telemetry object. + * @param missingFields List to populate with missing keys. + */ private void validateBasics(Telemetry telemetryObj, List missingFields) { - + // Check mandatory top-level fields if (StringUtils.isBlank(telemetryObj.getEid())) { missingFields.add("eid"); } @@ -110,6 +143,7 @@ private void validateBasics(Telemetry telemetryObj, List missingFields) missingFields.add("ver"); } + // Check actor details if (null == telemetryObj.getActor()) { missingFields.add("actor"); } else { @@ -121,6 +155,7 @@ private void validateBasics(Telemetry telemetryObj, List missingFields) } } + // Check context details if (null == telemetryObj.getContext()) { missingFields.add(JsonKey.CONTEXT); } else { @@ -133,31 +168,47 @@ private void validateBasics(Telemetry telemetryObj, List missingFields) } } + /** + * Validates a LOG telemetry event. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ @Override public boolean validateLog(String jsonString) { - boolean validationSuccess = true; List missingFields = new ArrayList<>(); Telemetry telemetryObj = null; try { + // Parse JSON string to Telemetry object telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields validateBasics(telemetryObj, missingFields); + // Validate Log specific data validateLogEventData(telemetryObj.getEdata(), missingFields); + if (!missingFields.isEmpty()) { logger.info( - "Telemetry Object Creation Error for event : " + "TelemetryObjectValidatorV3:validateLog: Validation failed for event: " + TelemetryEvents.LOG.getName() - + " missing required fields :" - + String.join(",", missingFields)); + + ". Missing required fields: " + + String.join(", ", missingFields)); validationSuccess = false; } } catch (IOException e) { validationSuccess = false; - logger.error("validateLog" + e.getMessage(), e); + logger.error("TelemetryObjectValidatorV3:validateLog: Error parsing JSON: " + e.getMessage(), e); } return validationSuccess; } + /** + * Validates log event data structure. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ private void validateLogEventData(Map edata, List missingFields) { if (edata == null || edata.isEmpty()) { missingFields.add("edata"); @@ -175,31 +226,47 @@ private void validateLogEventData(Map edata, List missin } } + /** + * Validates an ERROR telemetry event. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ @Override public boolean validateError(String jsonString) { - boolean validationSuccess = true; List missingFields = new ArrayList<>(); Telemetry telemetryObj = null; try { + // Parse JSON string to Telemetry object telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields validateBasics(telemetryObj, missingFields); + // Validate Error specific data validateErrorEventData(telemetryObj.getEdata(), missingFields); + if (!missingFields.isEmpty()) { logger.info( - "Telemetry Object Creation Error for event : " + "TelemetryObjectValidatorV3:validateError: Validation failed for event: " + TelemetryEvents.ERROR.getName() - + " missing required fields :" - + String.join(",", missingFields)); + + ". Missing required fields: " + + String.join(", ", missingFields)); validationSuccess = false; } } catch (IOException e) { validationSuccess = false; - logger.error("validateError" + e.getMessage(), e); + logger.error("TelemetryObjectValidatorV3:validateError: Error parsing JSON: " + e.getMessage(), e); } return validationSuccess; } + /** + * Validates error event data structure. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ private void validateErrorEventData(Map edata, List missingFields) { if (edata == null || edata.isEmpty()) { missingFields.add("edata"); From d2dbe47a7934bd21f52d4c98bb318d4f17f13607 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 13:12:03 +0530 Subject: [PATCH 09/17] refactor: remove legacy platform-common entries - Removed the old core/platform-common module files and resources as part of the transition to a unified sunbird-platform-common library. --- core/platform-common/pom.xml | 319 -------- .../auth/verifier/AccessTokenValidator.java | 185 ----- .../org/sunbird/auth/verifier/Base64Util.java | 692 ------------------ .../org/sunbird/auth/verifier/CryptoUtil.java | 38 - .../org/sunbird/auth/verifier/KeyData.java | 29 - .../org/sunbird/auth/verifier/KeyManager.java | 69 -- .../datasecurity/DataMaskingService.java | 68 -- .../datasecurity/DecryptionService.java | 60 -- .../datasecurity/EncryptionService.java | 53 -- .../sunbird/datasecurity/OneWayHashing.java | 41 -- .../datasecurity/impl/BASE64Decoder.java | 155 ---- .../datasecurity/impl/BASE64Encoder.java | 104 --- .../datasecurity/impl/CharacterDecoder.java | 205 ------ .../datasecurity/impl/CharacterEncoder.java | 322 -------- .../impl/DefaultDataMaskServiceImpl.java | 48 -- .../impl/DefaultDecryptionServiceImpl.java | 126 ---- .../impl/DefaultEncryptionServiceImpl.java | 150 ---- .../datasecurity/impl/LogMaskServiceImpl.java | 25 - .../datasecurity/impl/ServiceFactory.java | 51 -- .../exception/ProjectCommonException.java | 197 ----- .../org/sunbird/exception/ResponseCode.java | 275 ------- .../sunbird/exception/ResponseMessage.java | 222 ------ .../java/org/sunbird/http/HttpClientUtil.java | 252 ------- .../kafka/InstructionEventGenerator.java | 107 --- .../java/org/sunbird/kafka/KafkaClient.java | 110 --- .../org/sunbird/keys/BulkUploadJsonKey.java | 18 - .../org/sunbird/keys/GeoLocationJsonKey.java | 16 - .../main/java/org/sunbird/keys/JsonKey.java | 692 ------------------ .../java/org/sunbird/logging/LoggerUtil.java | 187 ----- .../org/sunbird/mail/GMailAuthenticator.java | 29 - .../main/java/org/sunbird/mail/SendEmail.java | 52 -- .../org/sunbird/mail/SendgridConnection.java | 86 --- .../sunbird/operations/ActorOperations.java | 192 ----- .../java/org/sunbird/request/HeaderParam.java | 75 -- .../java/org/sunbird/request/Request.java | 180 ----- .../org/sunbird/request/RequestContext.java | 127 ---- .../org/sunbird/request/RequestParams.java | 77 -- .../sunbird/response/ClientErrorResponse.java | 21 - .../java/org/sunbird/response/Params.java | 68 -- .../java/org/sunbird/response/Response.java | 150 ---- .../org/sunbird/response/ResponseParams.java | 114 --- .../sso/KeyCloakConnectionProvider.java | 154 ---- .../sso/KeycloakBruteForceAttackUtil.java | 72 -- .../sso/KeycloakRequiredActionLinkUtil.java | 100 --- .../java/org/sunbird/sso/KeycloakUtil.java | 51 -- .../main/java/org/sunbird/sso/SSOManager.java | 65 -- .../org/sunbird/sso/SSOServiceFactory.java | 22 - .../sso/impl/KeyCloakRsaKeyFetcher.java | 133 ---- .../sunbird/sso/impl/KeyCloakServiceImpl.java | 294 -------- .../java/org/sunbird/url/URLShortner.java | 8 - .../java/org/sunbird/url/URLShortnerImpl.java | 66 -- .../main/java/org/sunbird/util/AuditLog.java | 70 -- .../org/sunbird/util/CloudStorageUtil.java | 65 -- .../java/org/sunbird/util/ConfigUtil.java | 81 -- .../org/sunbird/util/EntryExitLogEvent.java | 46 -- .../java/org/sunbird/util/ExcelFileUtil.java | 69 -- .../main/java/org/sunbird/util/FileUtil.java | 37 - .../main/java/org/sunbird/util/Matcher.java | 19 - .../java/org/sunbird/util/ProjectUtil.java | 598 --------------- .../org/sunbird/util/PropertiesCache.java | 74 -- .../src/main/java/org/sunbird/util/Slug.java | 105 --- .../org/sunbird/util/StringFormatter.java | 56 -- .../validator/BaseRequestValidator.java | 322 -------- .../org/sunbird/validator/EmailValidator.java | 39 - .../org/sunbird/validator/PhoneValidator.java | 40 - .../sunbird/validator/RequestValidator.java | 182 ----- .../validator/UserFreeUpRequestValidator.java | 94 --- .../orgvalidator/BaseOrgRequestValidator.java | 35 - .../orgvalidator/KeyManagementValidator.java | 88 --- .../orgvalidator/OrgRequestValidator.java | 208 ------ .../org/sunbird/validator/package-info.java | 3 - .../src/main/resources/OTPSMSTemplate.vm | 1 - .../main/resources/acceptFlagMailTemplate.vm | 153 ---- .../src/main/resources/application.conf | 2 - .../resources/contentFlaggedMailTemplate.vm | 153 ---- .../resources/contentReviewMailTemplate.vm | 153 ---- .../src/main/resources/dbconfig.properties | 6 - .../resources/elasticsearch.config.properties | 3 - .../src/main/resources/emailtemplate.vm | 153 ---- .../resources/externalresource.properties | 114 --- .../main/resources/forgotPasswordWithOTP.vm | 137 ---- .../src/main/resources/forgotpassword.vm | 164 ----- .../main/resources/mailTemplates.properties | 5 - .../resources/publishContentMailTemplate.vm | 153 ---- .../resources/rejectContentMailTemplate.vm | 153 ---- .../main/resources/rejectFlagMailTemplate.vm | 153 ---- .../src/main/resources/sso.properties | 4 - .../unlistedPublishContentMailTemplate.vm | 153 ---- .../main/resources/userencryption.properties | 5 - .../src/main/resources/welcomeMailTemplate.vm | 145 ---- .../src/main/resources/welcomeSmsTemplate.vm | 1 - .../verifier/AccessTokenValidatorTest.java | 226 ------ .../sunbird/auth/verifier/CryptoUtilTest.java | 22 - .../sunbird/auth/verifier/KeyManagerTest.java | 49 -- .../impl/EncryptionDecriptionServiceTest.java | 282 ------- .../impl/LogMaskServiceImplTest.java | 60 -- .../datasecurity/impl/OnWayhashingTest.java | 30 - .../org/sunbird/exception/ExceptionTest.java | 37 - .../org/sunbird/http/HttpClientUtilTest.java | 173 ----- .../org/sunbird/logging/LoggerUtilTest.java | 71 -- .../test/java/org/sunbird/mail/EmailTest.java | 40 - .../operations/ActorOperationTest.java | 49 -- .../sunbird/request/RequestParamsTest.java | 28 - .../java/org/sunbird/request/RequestTest.java | 37 - .../response/ClientErrorResponseTest.java | 40 - .../sunbird/response/ResponseParamsTest.java | 23 - .../org/sunbird/response/ResponseTest.java | 43 -- .../sso/KeycloakBruteForceAttackUtilTest.java | 57 -- .../org/sunbird/sso/KeycloakUtilTest.java | 54 -- .../org/sunbird/sso/impl/BaseHttpTest.java | 91 --- .../sso/impl/KeyCloakRsaKeyFetcherTest.java | 104 --- .../sso/impl/KeyCloakServiceImplTest.java | 206 ------ .../util/TelemetryGeneratorTest.java | 110 --- .../TelemetryObjectValidatorV3Test.java | 384 ---------- .../org/sunbird/url/URLShortnerImplTest.java | 56 -- .../java/org/sunbird/util/AuditLogTest.java | 31 - .../sunbird/util/CloudStorageUtilTest.java | 128 ---- .../java/org/sunbird/util/ConfigUtilTest.java | 83 --- .../org/sunbird/util/ExcelFileUtilTest.java | 55 -- .../org/sunbird/util/ProjectUtilTest.java | 334 --------- .../test/java/org/sunbird/util/SlugTest.java | 26 - .../validator/BaseRequestValidatorTest.java | 173 ----- .../sunbird/validator/EmailValidatorTest.java | 25 - .../validator/NotesRequestValidatorTest.java | 134 ---- .../sunbird/validator/OrgValidatorTest.java | 254 ------- .../sunbird/validator/PhoneValidatorTest.java | 25 - .../validator/RequestValidatorTest.java | 155 ---- 127 files changed, 14689 deletions(-) delete mode 100644 core/platform-common/pom.xml delete mode 100755 core/platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java delete mode 100755 core/platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/mail/SendEmail.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/operations/ActorOperations.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/request/HeaderParam.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/request/Request.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/request/RequestContext.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/request/RequestParams.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/response/Params.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/response/Response.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/response/ResponseParams.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/KeyCloakConnectionProvider.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/KeycloakBruteForceAttackUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/KeycloakRequiredActionLinkUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/KeycloakUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/SSOManager.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/SSOServiceFactory.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcher.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakServiceImpl.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/url/URLShortner.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/AuditLog.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/CloudStorageUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/ConfigUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/EntryExitLogEvent.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/ExcelFileUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/FileUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/Matcher.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/PropertiesCache.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/Slug.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/util/StringFormatter.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/BaseRequestValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/EmailValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/PhoneValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/RequestValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/UserFreeUpRequestValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/BaseOrgRequestValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/KeyManagementValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/OrgRequestValidator.java delete mode 100644 core/platform-common/src/main/java/org/sunbird/validator/package-info.java delete mode 100644 core/platform-common/src/main/resources/OTPSMSTemplate.vm delete mode 100644 core/platform-common/src/main/resources/acceptFlagMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/application.conf delete mode 100644 core/platform-common/src/main/resources/contentFlaggedMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/contentReviewMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/dbconfig.properties delete mode 100644 core/platform-common/src/main/resources/elasticsearch.config.properties delete mode 100644 core/platform-common/src/main/resources/emailtemplate.vm delete mode 100644 core/platform-common/src/main/resources/externalresource.properties delete mode 100644 core/platform-common/src/main/resources/forgotPasswordWithOTP.vm delete mode 100644 core/platform-common/src/main/resources/forgotpassword.vm delete mode 100644 core/platform-common/src/main/resources/mailTemplates.properties delete mode 100644 core/platform-common/src/main/resources/publishContentMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/rejectContentMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/rejectFlagMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/sso.properties delete mode 100644 core/platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/userencryption.properties delete mode 100644 core/platform-common/src/main/resources/welcomeMailTemplate.vm delete mode 100644 core/platform-common/src/main/resources/welcomeSmsTemplate.vm delete mode 100644 core/platform-common/src/test/java/org/sunbird/auth/verifier/AccessTokenValidatorTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/auth/verifier/CryptoUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/auth/verifier/KeyManagerTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/datasecurity/impl/EncryptionDecriptionServiceTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/datasecurity/impl/LogMaskServiceImplTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/datasecurity/impl/OnWayhashingTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/exception/ExceptionTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/http/HttpClientUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/logging/LoggerUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/mail/EmailTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/operations/ActorOperationTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/request/RequestParamsTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/request/RequestTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/response/ClientErrorResponseTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/response/ResponseParamsTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/response/ResponseTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/sso/KeycloakBruteForceAttackUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/sso/KeycloakUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/sso/impl/BaseHttpTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcherTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakServiceImplTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/telemetry/util/TelemetryGeneratorTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/telemetry/util/validator/TelemetryObjectValidatorV3Test.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/url/URLShortnerImplTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/util/AuditLogTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/util/CloudStorageUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/util/ConfigUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/util/ExcelFileUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/util/ProjectUtilTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/util/SlugTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/validator/BaseRequestValidatorTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/validator/EmailValidatorTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/validator/NotesRequestValidatorTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/validator/OrgValidatorTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/validator/PhoneValidatorTest.java delete mode 100644 core/platform-common/src/test/java/org/sunbird/validator/RequestValidatorTest.java diff --git a/core/platform-common/pom.xml b/core/platform-common/pom.xml deleted file mode 100644 index 426749aa7f..0000000000 --- a/core/platform-common/pom.xml +++ /dev/null @@ -1,319 +0,0 @@ - - - - core - org.sunbird - 1.0-SNAPSHOT - - 4.0.0 - - org.sunbird - platform-common - 1.0-SNAPSHOT - platform-common - - - 2.13 - 2.13.12 - 11 - 11 - 11 - UTF-8 - 1.0.3 - 3.0.5 - 2.14.3 - org.sunbird - cloud-store-sdk_2.13 - 1.4.8.1 - - - - - - org.scala-lang - scala-library - ${scala.version} - - - - org.apache.commons - commons-lang3 - 3.9 - - - org.jboss.resteasy - resteasy-jackson2-provider - 4.7.9.Final - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - - com.fasterxml.jackson.module - jackson-module-scala_2.13 - 2.14.3 - - - org.apache.pekko - pekko-slf4j_${scala.major.version} - ${pekko.version} - - - net.logstash.logback - logstash-logback-encoder - 6.6 - - - com.googlecode.libphonenumber - libphonenumber - 8.12.5 - - - - org.apache.velocity - velocity-tools - 2.0 - - - commons-collections - commons-collections - - - - - commons-collections - commons-collections - 3.2.2 - - - junit - junit - 4.13.1 - test - - - - org.powermock - powermock-module-junit4 - 2.0.9 - - - - - org.powermock - powermock-api-mockito2 - 2.0.9 - - - - - org.apache.httpcomponents - httpmime - 4.5.13 - - - org.keycloak - keycloak-admin-client - 21.1.2 - - - ${CLOUD_STORE_GROUP_ID} - ${CLOUD_STORE_ARTIFACT_ID} - ${CLOUD_STORE_VERSION} - - - com.sun.jersey - jersey-core - - - com.sun.jersey - jersey-server - - - slf4j-log4j12 - org.slf4j - - - io.netty - * - - - ch.qos.reload4j - reload4j - - - org.slf4j - slf4j-reload4j - - - org.apache.avro - avro - - - org.apache.commons - commons-collections4 - - - org.apache.zookeeper - zookeeper - - - - org.scala-lang - scala-library - - - org.scala-lang - scala-reflect - - - - com.fasterxml.jackson.module - jackson-module-scala_2.12 - - - - com.fasterxml.jackson.module - jackson-module-scala_2.13 - - - - com.fasterxml.jackson.core - jackson-databind - - - - - org.apache.avro - avro - 1.11.4 - - - org.apache.zookeeper - zookeeper - 3.7.2 - - - org.apache.kafka - kafka-clients - 3.7.1 - - - org.jboss.resteasy - jaxrs-api - 3.0.12.Final - - - org.jboss.resteasy - resteasy-client - 4.7.9.Final - - - - javax.mail - javax.mail-api - 1.5.1 - - - - com.sun.mail - javax.mail - 1.6.0 - - - - com.moparisthebest - junidecode - 0.1.1 - - - - org.apache.poi - poi-ooxml - 3.15 - - - org.apache.xmlbeans - xmlbeans - - - - - org.apache.xmlbeans - xmlbeans - 3.0.0 - - - org.jvnet.mock-javamail - mock-javamail - 1.9 - test - - - org.json - json - 20231013 - - - org.playframework - play_${scala.major.version} - ${play2.version} - compile - - - org.scala-lang - scala-library - - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 3.2.0 - - - generate-sources - - add-source - - - - ../sunbird-event-utils/src/main/java - - - - - - - - diff --git a/core/platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java b/core/platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java deleted file mode 100755 index 973b872a82..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.sunbird.auth.verifier; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.Collections; -import java.util.Map; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.keycloak.common.util.Time; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; - -public class AccessTokenValidator { - private static final LoggerUtil logger = new LoggerUtil(AccessTokenValidator.class); - private static final ObjectMapper mapper = new ObjectMapper(); - private static final String sso_url = System.getenv(JsonKey.SUNBIRD_SSO_URL); - private static final String realm = System.getenv(JsonKey.SUNBIRD_SSO_RELAM); - - private static Map validateToken(String token, Map requestContext) - throws JsonProcessingException { - String[] tokenElements = token.split("\\."); - String header = tokenElements[0]; - String body = tokenElements[1]; - String signature = tokenElements[2]; - String payLoad = header + JsonKey.DOT_SEPARATOR + body; - Map headerData = - mapper.readValue(new String(decodeFromBase64(header)), Map.class); - String keyId = headerData.get("kid").toString(); - boolean isValid = - CryptoUtil.verifyRSASign( - payLoad, - decodeFromBase64(signature), - KeyManager.getPublicKey(keyId).getPublicKey(), - JsonKey.SHA_256_WITH_RSA, - requestContext); - if (isValid) { - Map tokenBody = - mapper.readValue(new String(decodeFromBase64(body)), Map.class); - boolean isExp = isExpired((Integer) tokenBody.get("exp")); - if (isExp) { - logger.info("Token is expired " + token + ", request context data :" + requestContext); - return Collections.EMPTY_MAP; - } - return tokenBody; - } - return Collections.EMPTY_MAP; - } - - /** - * managedtoken is validated and requestedByUserID, requestedForUserID values are validated - * aganist the managedEncToken - * - * @param managedEncToken - * @param requestedByUserId - * @param requestedForUserId - * @return - */ - public static String verifyManagedUserToken( - String managedEncToken, - String requestedByUserId, - String requestedForUserId, - Map requestContext) { - String managedFor = JsonKey.UNAUTHORIZED; - try { - Map payload = validateToken(managedEncToken, requestContext); - if (MapUtils.isNotEmpty(payload)) { - String parentId = (String) payload.get(JsonKey.PARENT_ID); - String muaId = (String) payload.get(JsonKey.SUB); - logger.info( - "AccessTokenValidator: parent uuid: " - + parentId - + " managedBy uuid: " - + muaId - + " requestedByUserID: " - + requestedByUserId - + " requestedForUserId: " - + requestedForUserId - + " request context data : " - + requestContext); - boolean isValid = - parentId.equalsIgnoreCase(requestedByUserId) - && muaId.equalsIgnoreCase(requestedForUserId); - if (isValid) { - managedFor = muaId; - } - } - } catch (Exception ex) { - logger.error( - "Exception in verifyManagedUserToken: Token : " - + managedEncToken - + ", request context data :" - + requestContext, - ex); - } - return managedFor; - } - - public static String verifyUserToken(String token, Map requestContext) { - String userId = JsonKey.UNAUTHORIZED; - try { - Map payload = validateToken(token, requestContext); - logger.debug( - "userorg access token validateToken() :" - + payload.toString() - + ", request context data : " - + requestContext); - if (MapUtils.isNotEmpty(payload) && checkIss((String) payload.get("iss"))) { - userId = (String) payload.get(JsonKey.SUB); - if (StringUtils.isNotBlank(userId)) { - int pos = userId.lastIndexOf(":"); - userId = userId.substring(pos + 1); - } - } - } catch (Exception ex) { - logger.error( - "Exception in verifyUserAccessToken: Token : " - + token - + ", request context data : " - + requestContext, - ex); - } - if (JsonKey.UNAUTHORIZED.equalsIgnoreCase(userId)) { - logger.info( - "verifyUserAccessToken: Invalid User Token: " - + token - + ", request context data : " - + requestContext); - } - return userId; - } - - public static String verifySourceUserToken( - String token, String url, Map requestContext) { - String userId = JsonKey.UNAUTHORIZED; - try { - Map payload = validateToken(token, requestContext); - logger.debug( - "userorg source access token validateToken() :" - + payload.toString() - + ", request context data : " - + requestContext); - if (MapUtils.isNotEmpty(payload) && checkSourceIss((String) payload.get("iss"), url)) { - userId = (String) payload.get(JsonKey.SUB); - if (StringUtils.isNotBlank(userId)) { - int pos = userId.lastIndexOf(":"); - userId = userId.substring(pos + 1); - } - } - } catch (Exception ex) { - logger.error( - "Exception in verifySourceUserToken: Token : " - + token - + ", request context data : " - + requestContext, - ex); - } - if (JsonKey.UNAUTHORIZED.equalsIgnoreCase(userId)) { - logger.info( - "verifySourceUserToken: Invalid source user Token: " - + token - + ", request context data : " - + requestContext); - } - return userId; - } - - private static boolean checkIss(String iss) { - String realmUrl = sso_url + "realms/" + realm; - return (realmUrl.equalsIgnoreCase(iss)); - } - - private static boolean checkSourceIss(String iss, String url) { - String ssoUrl = (url != null ? url : sso_url); - String realmUrl = ssoUrl + "realms/" + realm; - return (realmUrl.equalsIgnoreCase(iss)); - } - - private static boolean isExpired(Integer expiration) { - return (Time.currentTime() > expiration); - } - - private static byte[] decodeFromBase64(String data) { - return Base64Util.decode(data, 11); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java b/core/platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java deleted file mode 100644 index cfe4bba79d..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java +++ /dev/null @@ -1,692 +0,0 @@ -package org.sunbird.auth.verifier; - -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.UnsupportedEncodingException; - -/** - * Utilities for encoding and decoding the Base64 representation of binary data. See RFCs 2045 and 3548. - */ -public class Base64Util { - /** Default values for encoder/decoder flags. */ - public static final int DEFAULT = 0; - - /** Encoder flag bit to omit the padding '=' characters at the end of the output (if any). */ - public static final int NO_PADDING = 1; - - /** Encoder flag bit to omit all line terminators (i.e., the output will be on one long line). */ - public static final int NO_WRAP = 2; - - /** - * Encoder flag bit to indicate lines should be terminated with a CRLF pair instead of just an LF. - * Has no effect if {@code NO_WRAP} is specified as well. - */ - public static final int CRLF = 4; - - /** - * Encoder/decoder flag bit to indicate using the "URL and filename safe" variant of Base64 (see - * RFC 3548 section 4) where {@code -} and {@code _} are used in place of {@code +} and {@code /}. - */ - public static final int URL_SAFE = 8; - - /** - * Flag to pass to {Base64OutputStream} to indicate that it should not close the output stream it - * is wrapping when it itself is closed. - */ - public static final int NO_CLOSE = 16; - - // -------------------------------------------------------- - // shared code - // -------------------------------------------------------- - - private Base64Util() {} // don't instantiate - - // -------------------------------------------------------- - // decoding - // -------------------------------------------------------- - - /** - * Decode the Base64-encoded data in input and return the data in a new byte array. - * - *

- * - *

The padding '=' characters at the end are considered optional, but if any are present, there - * must be the correct number of them. - * - * @param str the input String to decode, which is converted to bytes using the default charset - * @param flags controls certain features of the decoded output. Pass {@code DEFAULT} to decode - * standard Base64. - * @throws IllegalArgumentException if the input contains incorrect padding - */ - public static byte[] decode(String str, int flags) { - return decode(str.getBytes(), flags); - } - - /** - * Decode the Base64-encoded data in input and return the data in a new byte array. - * - *

- * - *

The padding '=' characters at the end are considered optional, but if any are present, there - * must be the correct number of them. - * - * @param input the input array to decode - * @param flags controls certain features of the decoded output. Pass {@code DEFAULT} to decode - * standard Base64. - * @throws IllegalArgumentException if the input contains incorrect padding - */ - public static byte[] decode(byte[] input, int flags) { - return decode(input, 0, input.length, flags); - } - - /** - * Decode the Base64-encoded data in input and return the data in a new byte array. - * - *

- * - *

The padding '=' characters at the end are considered optional, but if any are present, there - * must be the correct number of them. - * - * @param input the data to decode - * @param offset the position within the input array at which to start - * @param len the number of bytes of input to decode - * @param flags controls certain features of the decoded output. Pass {@code DEFAULT} to decode - * standard Base64. - * @throws IllegalArgumentException if the input contains incorrect padding - */ - public static byte[] decode(byte[] input, int offset, int len, int flags) { - // Allocate space for the most data the input could represent. - // (It could contain less if it contains whitespace, etc.) - Decoder decoder = new Decoder(flags, new byte[len * 3 / 4]); - - if (!decoder.process(input, offset, len, true)) { - throw new IllegalArgumentException("bad base-64"); - } - - // Maybe we got lucky and allocated exactly enough output space. - if (decoder.op == decoder.output.length) { - return decoder.output; - } - - // Need to shorten the array, so allocate a new one of the - // right size and copy. - byte[] temp = new byte[decoder.op]; - System.arraycopy(decoder.output, 0, temp, 0, decoder.op); - return temp; - } - - /** - * Base64-encode the given data and return a newly allocated String with the result. - * - * @param input the data to encode - * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results - * in output that adheres to RFC 2045. - */ - public static String encodeToString(byte[] input, int flags) { - try { - return new String(encode(input, flags), "US-ASCII"); - } catch (UnsupportedEncodingException e) { - // US-ASCII is guaranteed to be available. - throw new AssertionError(e); - } - } - - // -------------------------------------------------------- - // encoding - // -------------------------------------------------------- - - /** - * Base64-encode the given data and return a newly allocated String with the result. - * - * @param input the data to encode - * @param offset the position within the input array at which to start - * @param len the number of bytes of input to encode - * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results - * in output that adheres to RFC 2045. - */ - public static String encodeToString(byte[] input, int offset, int len, int flags) { - try { - return new String(encode(input, offset, len, flags), "US-ASCII"); - } catch (UnsupportedEncodingException e) { - // US-ASCII is guaranteed to be available. - throw new AssertionError(e); - } - } - - /** - * Base64-encode the given data and return a newly allocated byte[] with the result. - * - * @param input the data to encode - * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results - * in output that adheres to RFC 2045. - */ - public static byte[] encode(byte[] input, int flags) { - return encode(input, 0, input.length, flags); - } - - /** - * Base64-encode the given data and return a newly allocated byte[] with the result. - * - * @param input the data to encode - * @param offset the position within the input array at which to start - * @param len the number of bytes of input to encode - * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results - * in output that adheres to RFC 2045. - */ - public static byte[] encode(byte[] input, int offset, int len, int flags) { - Encoder encoder = new Encoder(flags, null); - - // Compute the exact length of the array we will produce. - int output_len = len / 3 * 4; - - // Account for the tail of the data and the padding bytes, if any. - if (encoder.do_padding) { - if (len % 3 > 0) { - output_len += 4; - } - } else { - switch (len % 3) { - case 0: - break; - case 1: - output_len += 2; - break; - case 2: - output_len += 3; - break; - } - } - - // Account for the newlines, if any. - if (encoder.do_newline && len > 0) { - output_len += (((len - 1) / (3 * Encoder.LINE_GROUPS)) + 1) * (encoder.do_cr ? 2 : 1); - } - - encoder.output = new byte[output_len]; - encoder.process(input, offset, len, true); - - assert encoder.op == output_len; - - return encoder.output; - } - - /* package */ abstract static class Coder { - public byte[] output; - public int op; - - /** - * Encode/decode another block of input data. this.output is provided by the caller, and must be - * big enough to hold all the coded data. On exit, this.opwill be set to the length of the coded - * data. - * - * @param finish true if this is the final call to process for this object. Will finalize the - * coder state and include any final bytes in the output. - * @return true if the input so far is good; false if some error has been detected in the input - * stream.. - */ - public abstract boolean process(byte[] input, int offset, int len, boolean finish); - - /** - * @return the maximum number of bytes a call to process() could produce for the given number of - * input bytes. This may be an overestimate. - */ - public abstract int maxOutputSize(int len); - } - - /* package */ static class Decoder extends Coder { - /** Lookup table for turning bytes into their position in the Base64 alphabet. */ - private static final int DECODE[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; - - /** - * Decode lookup table for the "web safe" variant (RFC 3548 sec. 4) where - and _ replace + and - * /. - */ - private static final int DECODE_WEBSAFE[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; - - /** Non-data values in the DECODE arrays. */ - private static final int SKIP = -1; - - private static final int EQUALS = -2; - private final int[] alphabet; - /** - * States 0-3 are reading through the next input tuple. State 4 is having read one '=' and - * expecting exactly one more. State 5 is expecting no more data or padding characters in the - * input. State 6 is the error state; an error has been detected in the input and no future - * input can "fix" it. - */ - private int state; // state number (0 to 6) - - private int value; - - public Decoder(int flags, byte[] output) { - this.output = output; - - alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE; - state = 0; - value = 0; - } - - /** @return an overestimate for the number of bytes {@code len} bytes could decode to. */ - public int maxOutputSize(int len) { - return len * 3 / 4 + 10; - } - - /** - * Decode another block of input data. - * - * @return true if the state machine is still healthy. false if bad base-64 data has been - * detected in the input stream. - */ - public boolean process(byte[] input, int offset, int len, boolean finish) { - if (this.state == 6) return false; - - int p = offset; - len += offset; - - // Using local variables makes the decoder about 12% - // faster than if we manipulate the member variables in - // the loop. (Even alphabet makes a measurable - // difference, which is somewhat surprising to me since - // the member variable is final.) - int state = this.state; - int value = this.value; - int op = 0; - final byte[] output = this.output; - final int[] alphabet = this.alphabet; - - while (p < len) { - // Try the fast path: we're starting a new tuple and the - // next four bytes of the input stream are all data - // bytes. This corresponds to going through states - // 0-1-2-3-0. We expect to use this method for most of - // the data. - // - // If any of the next four bytes of input are non-data - // (whitespace, etc.), value will end up negative. (All - // the non-data values in decode are small negative - // numbers, so shifting any of them up and or'ing them - // together will result in a value with its top bit set.) - // - // You can remove this whole block and the output should - // be the same, just slower. - if (state == 0) { - while (p + 4 <= len - && (value = - ((alphabet[input[p] & 0xff] << 18) - | (alphabet[input[p + 1] & 0xff] << 12) - | (alphabet[input[p + 2] & 0xff] << 6) - | (alphabet[input[p + 3] & 0xff]))) - >= 0) { - output[op + 2] = (byte) value; - output[op + 1] = (byte) (value >> 8); - output[op] = (byte) (value >> 16); - op += 3; - p += 4; - } - if (p >= len) break; - } - - // The fast path isn't available -- either we've read a - // partial tuple, or the next four input bytes aren't all - // data, or whatever. Fall back to the slower state - // machine implementation. - - int d = alphabet[input[p++] & 0xff]; - - switch (state) { - case 0: - if (d >= 0) { - value = d; - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 1: - if (d >= 0) { - value = (value << 6) | d; - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 2: - if (d >= 0) { - value = (value << 6) | d; - ++state; - } else if (d == EQUALS) { - // Emit the last (partial) output tuple; - // expect exactly one more padding character. - output[op++] = (byte) (value >> 4); - state = 4; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 3: - if (d >= 0) { - // Emit the output triple and return to state 0. - value = (value << 6) | d; - output[op + 2] = (byte) value; - output[op + 1] = (byte) (value >> 8); - output[op] = (byte) (value >> 16); - op += 3; - state = 0; - } else if (d == EQUALS) { - // Emit the last (partial) output tuple; - // expect no further data or padding characters. - output[op + 1] = (byte) (value >> 2); - output[op] = (byte) (value >> 10); - op += 2; - state = 5; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 4: - if (d == EQUALS) { - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 5: - if (d != SKIP) { - this.state = 6; - return false; - } - break; - } - } - - if (!finish) { - // We're out of input, but a future call could provide - // more. - this.state = state; - this.value = value; - this.op = op; - return true; - } - - // Done reading input. Now figure out where we are left in - // the state machine and finish up. - - switch (state) { - case 0: - // Output length is a multiple of three. Fine. - break; - case 1: - // Read one extra input byte, which isn't enough to - // make another output byte. Illegal. - this.state = 6; - return false; - case 2: - // Read two extra input bytes, enough to emit 1 more - // output byte. Fine. - output[op++] = (byte) (value >> 4); - break; - case 3: - // Read three extra input bytes, enough to emit 2 more - // output bytes. Fine. - output[op++] = (byte) (value >> 10); - output[op++] = (byte) (value >> 2); - break; - case 4: - // Read one padding '=' when we expected 2. Illegal. - this.state = 6; - return false; - case 5: - // Read all the padding '='s we expected and no more. - // Fine. - break; - } - - this.state = state; - this.op = op; - return true; - } - } - - /* package */ static class Encoder extends Coder { - /** - * Emit a new line every this many output tuples. Corresponds to a 76-character line length (the - * maximum allowable according to RFC 2045). - */ - public static final int LINE_GROUPS = 19; - - /** Lookup table for turning Base64 alphabet positions (6 bits) into output bytes. */ - private static final byte ENCODE[] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', - }; - - /** Lookup table for turning Base64 alphabet positions (6 bits) into output bytes. */ - private static final byte ENCODE_WEBSAFE[] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', - }; - - public final boolean do_padding; - public final boolean do_newline; - public final boolean do_cr; - private final byte[] tail; - private final byte[] alphabet; - /* package */ int tailLen; - private int count; - - public Encoder(int flags, byte[] output) { - this.output = output; - - do_padding = (flags & NO_PADDING) == 0; - do_newline = (flags & NO_WRAP) == 0; - do_cr = (flags & CRLF) != 0; - alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE; - - tail = new byte[2]; - tailLen = 0; - - count = do_newline ? LINE_GROUPS : -1; - } - - /** @return an overestimate for the number of bytes {@code len} bytes could encode to. */ - public int maxOutputSize(int len) { - return len * 8 / 5 + 10; - } - - public boolean process(byte[] input, int offset, int len, boolean finish) { - // Using local variables makes the encoder about 9% faster. - final byte[] alphabet = this.alphabet; - final byte[] output = this.output; - int op = 0; - int count = this.count; - - int p = offset; - len += offset; - int v = -1; - - // First we need to concatenate the tail of the previous call - // with any input bytes available now and see if we can empty - // the tail. - - switch (tailLen) { - case 0: - // There was no tail. - break; - - case 1: - if (p + 2 <= len) { - // A 1-byte tail with at least 2 bytes of - // input available now. - v = ((tail[0] & 0xff) << 16) | ((input[p++] & 0xff) << 8) | (input[p++] & 0xff); - tailLen = 0; - } - ; - break; - - case 2: - if (p + 1 <= len) { - // A 2-byte tail with at least 1 byte of input. - v = ((tail[0] & 0xff) << 16) | ((tail[1] & 0xff) << 8) | (input[p++] & 0xff); - tailLen = 0; - } - break; - } - - if (v != -1) { - output[op++] = alphabet[(v >> 18) & 0x3f]; - output[op++] = alphabet[(v >> 12) & 0x3f]; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (--count == 0) { - if (do_cr) output[op++] = '\r'; - output[op++] = '\n'; - count = LINE_GROUPS; - } - } - - // At this point either there is no tail, or there are fewer - // than 3 bytes of input available. - - // The main loop, turning 3 input bytes into 4 output bytes on - // each iteration. - while (p + 3 <= len) { - v = ((input[p] & 0xff) << 16) | ((input[p + 1] & 0xff) << 8) | (input[p + 2] & 0xff); - output[op] = alphabet[(v >> 18) & 0x3f]; - output[op + 1] = alphabet[(v >> 12) & 0x3f]; - output[op + 2] = alphabet[(v >> 6) & 0x3f]; - output[op + 3] = alphabet[v & 0x3f]; - p += 3; - op += 4; - if (--count == 0) { - if (do_cr) output[op++] = '\r'; - output[op++] = '\n'; - count = LINE_GROUPS; - } - } - - if (finish) { - // Finish up the tail of the input. Note that we need to - // consume any bytes in tail before any bytes - // remaining in input; there should be at most two bytes - // total. - - if (p - tailLen == len - 1) { - int t = 0; - v = ((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 4; - tailLen -= t; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (do_padding) { - output[op++] = '='; - output[op++] = '='; - } - if (do_newline) { - if (do_cr) output[op++] = '\r'; - output[op++] = '\n'; - } - } else if (p - tailLen == len - 2) { - int t = 0; - v = - (((tailLen > 1 ? tail[t++] : input[p++]) & 0xff) << 10) - | (((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 2); - tailLen -= t; - output[op++] = alphabet[(v >> 12) & 0x3f]; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (do_padding) { - output[op++] = '='; - } - if (do_newline) { - if (do_cr) output[op++] = '\r'; - output[op++] = '\n'; - } - } else if (do_newline && op > 0 && count != LINE_GROUPS) { - if (do_cr) output[op++] = '\r'; - output[op++] = '\n'; - } - - assert tailLen == 0; - assert p == len; - } else { - // Save the leftovers in tail to be consumed on the next - // call to encodeInternal. - - if (p == len - 1) { - tail[tailLen++] = input[p]; - } else if (p == len - 2) { - tail[tailLen++] = input[p]; - tail[tailLen++] = input[p + 1]; - } - } - - this.op = op; - this.count = count; - - return true; - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java b/core/platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java deleted file mode 100755 index 3460c17926..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.sunbird.auth.verifier; - -import java.nio.charset.Charset; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.PublicKey; -import java.security.Signature; -import java.security.SignatureException; -import java.util.Map; -import org.sunbird.logging.LoggerUtil; - -public class CryptoUtil { - private static final Charset US_ASCII = Charset.forName("US-ASCII"); - private static final LoggerUtil logger = new LoggerUtil(CryptoUtil.class); - - public static boolean verifyRSASign( - String payLoad, - byte[] signature, - PublicKey key, - String algorithm, - Map requestContext) { - Signature sign; - try { - sign = Signature.getInstance(algorithm); - sign.initVerify(key); - sign.update(payLoad.getBytes(US_ASCII)); - return sign.verify(signature); - } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { - logger.error( - "verifyRSASign: Exception occurred while token verification: " - + e.getMessage() - + ", request context data :" - + requestContext, - e); - return false; - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java b/core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java deleted file mode 100644 index af4589cfea..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.sunbird.auth.verifier; - -import java.security.PublicKey; - -public class KeyData { - private String keyId; - private PublicKey publicKey; - - public KeyData(String keyId, PublicKey publicKey) { - this.keyId = keyId; - this.publicKey = publicKey; - } - - public String getKeyId() { - return keyId; - } - - public void setKeyId(String keyId) { - this.keyId = keyId; - } - - public PublicKey getPublicKey() { - return publicKey; - } - - public void setPublicKey(PublicKey publicKey) { - this.publicKey = publicKey; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java b/core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java deleted file mode 100644 index 939df1fc91..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.sunbird.auth.verifier; - -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.PropertiesCache; - -public class KeyManager { - - private static final LoggerUtil logger = new LoggerUtil(KeyManager.class); - private static final PropertiesCache propertiesCache = PropertiesCache.getInstance(); - - private static final Map keyMap = new HashMap<>(); - - public static void init() { - String basePath = propertiesCache.getProperty(JsonKey.ACCESS_TOKEN_PUBLICKEY_BASEPATH); - try (Stream walk = Files.walk(Paths.get(basePath))) { - List result = - walk.filter(Files::isRegularFile).map(x -> x.toString()).collect(Collectors.toList()); - result.forEach( - file -> { - try { - StringBuilder contentBuilder = new StringBuilder(); - Path path = Paths.get(file); - Files.lines(path, StandardCharsets.UTF_8) - .forEach( - x -> { - contentBuilder.append(x); - }); - KeyData keyData = - new KeyData( - path.getFileName().toString(), loadPublicKey(contentBuilder.toString())); - keyMap.put(path.getFileName().toString(), keyData); - } catch (Exception e) { - logger.error("KeyManager:init: exception in reading public keys ", e); - } - }); - } catch (Exception e) { - logger.error("KeyManager:init: exception in loading publickeys ", e); - } - } - - public static KeyData getPublicKey(String keyId) { - return keyMap.get(keyId); - } - - public static PublicKey loadPublicKey(String key) throws Exception { - String publicKey = new String(key.getBytes(), StandardCharsets.UTF_8); - publicKey = publicKey.replaceAll("(-+BEGIN PUBLIC KEY-+)", ""); - publicKey = publicKey.replaceAll("(-+END PUBLIC KEY-+)", ""); - publicKey = publicKey.replaceAll("[\\r\\n]+", ""); - byte[] keyBytes = Base64Util.decode(publicKey.getBytes("UTF-8"), Base64Util.DEFAULT); - - X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(keyBytes); - KeyFactory kf = KeyFactory.getInstance("RSA"); - return kf.generatePublic(X509publicKey); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java deleted file mode 100644 index 524b314272..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java +++ /dev/null @@ -1,68 +0,0 @@ -/** */ -package org.sunbird.datasecurity; - -import org.apache.commons.lang3.StringUtils; -import org.sunbird.keys.JsonKey; - -/** @author Manzarul */ -public interface DataMaskingService { - - /** - * This method will check the string is a masked characters - * - * @param data String - * @return boolean - */ - default boolean isMasked(String data) { - return data.contains(JsonKey.REPLACE_WITH_ASTERISK); - } - /** - * This method will allow to mask user phone number. - * - * @param phone String - * @return String - */ - String maskPhone(String phone); - - /** - * This method will allow user to mask email. - * - * @param email String - * @return String - */ - String maskEmail(String email); - - /** - * @param data - * @return - */ - default String maskData(String data) { - if (StringUtils.isBlank(data) || data.length() <= 3) { - return data; - } - int lenght = data.length() - 4; - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < data.length(); i++) { - if (i < lenght) { - builder.append(JsonKey.REPLACE_WITH_ASTERISK); - } else { - builder.append(data.charAt(i)); - } - } - return builder.toString(); - } - - /** - * Mask an OTP - * - * @param otp - * @return Depending on the length - 6, 4, masks character - */ - default String maskOTP(String otp) { - if (otp.length() >= 6) { - return otp.replaceAll("(^[^*]{4}|(?!^)\\G)[^*]", "$1*"); - } else { - return otp.replaceAll("(^[^*]{2}|(?!^)\\G)[^*]", "$1*"); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java deleted file mode 100644 index 6c4d745760..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.sunbird.datasecurity; - -import java.util.List; -import java.util.Map; -import org.sunbird.request.RequestContext; - -/** - * This service will have data decryption methods. decryption logic will differ based on imp - * classes. - * - * @author Manzarul - */ -public interface DecryptionService { - - String ALGORITHM = "AES"; - int ITERATIONS = 3; - byte[] keyValue = - new byte[] {'T', 'h', 'i', 's', 'A', 's', 'I', 'S', 'e', 'r', 'c', 'e', 'K', 't', 'e', 'y'}; - - /** - * This method will take input as key value pair , value can be any primitive or String or both or - * can have another map as values. inner map will also have values as primitive or String or both - * - * @param data Map - * @param context - * @return Map - * @throws Exception - */ - Map decryptData(Map data, RequestContext context); - - /** - * This method will take list of map as an input to decrypt the data, after decryption it will - * return same map with decrypted values. values in side map can have primitive , String or - * another map have primitive , String values. - * - * @param data List> - * @param context - * @return List> - * @throws Exception - */ - List> decryptData(List> data, RequestContext context); - - /** - * Decrypt given data. - * - * @param data Input data - * @param context - * @return Decrypted data - */ - String decryptData(String data, RequestContext context); - - /** - * Decrypt given data. - * - * @param data Input data - * @param context - * @return Decrypted data - */ - String decryptData(String data, boolean throwExceptionOnFailure, RequestContext context); -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java deleted file mode 100644 index 6f66cae657..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java +++ /dev/null @@ -1,53 +0,0 @@ -/** */ -package org.sunbird.datasecurity; - -import java.util.List; -import java.util.Map; -import org.sunbird.request.RequestContext; - -/** - * This service will have the data encryption logic. these logic will differ based on implementation - * class. - * - * @author Manzarul - */ -public interface EncryptionService { - - String ALGORITHM = "AES"; - int ITERATIONS = 3; - byte[] keyValue = - new byte[] {'T', 'h', 'i', 's', 'A', 's', 'I', 'S', 'e', 'r', 'c', 'e', 'K', 't', 'e', 'y'}; - - /** - * This method will take input as key value pair , value can be any primitive or String or both or - * can have another map as values. inner map will also have values as primitive or String or both - * - * @param data Map - * @param context - * @return Map - * @throws Exception - */ - Map encryptData(Map data, RequestContext context); - - /** - * This method will take list of map as an input to encrypt the data, after encryption it will - * return same map with encrypted values. values in side map can have primitive , String or - * another map have primitive , String values. - * - * @param data List> - * @param context - * @return List> - * @throws Exception - */ - List> encryptData(List> data, RequestContext context); - - /** - * This method will take String as an input and encrypt the String and return back. - * - * @param data String - * @param context - * @return String - * @throws Exception - */ - String encryptData(String data, RequestContext context); -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java deleted file mode 100644 index 1b1300091a..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java +++ /dev/null @@ -1,41 +0,0 @@ -/** */ -package org.sunbird.datasecurity; - -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import org.sunbird.logging.LoggerUtil; - -/** - * This class will do one way data hashing. - * - * @author Manzarul - */ -public class OneWayHashing { - - public static LoggerUtil logger = new LoggerUtil(OneWayHashing.class); - - private OneWayHashing() {} - - /** - * This method will encrypt value using SHA-256 . it is one way encryption. - * - * @param val String - * @return String encrypted value or empty in case of exception - */ - public static String encryptVal(String val) { - try { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - md.update(val.getBytes(StandardCharsets.UTF_8)); - byte byteData[] = md.digest(); - // convert the byte to hex format method 1 - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < byteData.length; i++) { - sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); - } - return sb.toString(); - } catch (Exception e) { - logger.error("Error while encrypting", e); - } - return ""; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java deleted file mode 100644 index 79abf2a94c..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.sunbird.datasecurity.impl; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PushbackInputStream; - -/** - * This class implements a BASE64 Character decoder as specified in RFC1521. - * - *

This RFC is part of the MIME specification which is published by the Internet Engineering Task - * Force (IETF). Unlike some other encoding schemes there is nothing in this encoding that tells the - * decoder where a buffer starts or stops, so to use it you will need to isolate your encoded data - * into a single chunk and then feed them this decoder. The simplest way to do that is to read all - * of the encoded data into a string and then use: - * - *

- *      byte    mydata[];
- *      BASE64Decoder base64 = new BASE64Decoder();
- *
- *      mydata = base64.decodeBuffer(bufferString);
- * 
- * - * This will decode the String in bufferString and give you an array of bytes in the array - * myData. - * - *

On errors, this class throws a CEFormatException with the following detail strings: - * - *

- *    "BASE64Decoder: Not enough bytes for an atom."
- * 
- * - * @author Chuck McManis - * @see CharacterEncoder - * @see BASE64Decoder - */ -public class BASE64Decoder extends CharacterDecoder { - /** This class has 4 bytes per atom */ - protected int bytesPerAtom() { - return (4); - } - - /** Any multiple of 4 will do, 72 might be common */ - protected int bytesPerLine() { - return (72); - } - - /** This character array provides the character to value map based on RFC1521. */ - private static final char pem_array[] = { - // 0 1 2 3 4 5 6 7 - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 1 - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 2 - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 3 - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 4 - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 5 - 'w', 'x', 'y', 'z', '0', '1', '2', '3', // 6 - '4', '5', '6', '7', '8', '9', '+', '/' // 7 - }; - - private static final byte pem_convert_array[] = new byte[256]; - - static { - for (int i = 0; i < 255; i++) { - pem_convert_array[i] = -1; - } - for (int i = 0; i < pem_array.length; i++) { - pem_convert_array[pem_array[i]] = (byte) i; - } - } - - byte decode_buffer[] = new byte[4]; - - /** Decode one BASE64 atom into 1, 2, or 3 bytes of data. */ - @SuppressWarnings("fallthrough") - protected void decodeAtom(PushbackInputStream inStream, OutputStream outStream, int rem) - throws java.io.IOException { - int i; - byte a = -1, b = -1, c = -1, d = -1; - - if (rem < 2) { - throw new IOException("BASE64Decoder: Not enough bytes for an atom."); - } - do { - i = inStream.read(); - if (i == -1) { - throw new IOException(); - } - } while (i == '\n' || i == '\r'); - decode_buffer[0] = (byte) i; - - i = readFully(inStream, decode_buffer, 1, rem - 1); - if (i == -1) { - throw new IOException(); - } - - if (rem > 3 && decode_buffer[3] == '=') { - rem = 3; - } - if (rem > 2 && decode_buffer[2] == '=') { - rem = 2; - } - switch (rem) { - case 4: - d = pem_convert_array[decode_buffer[3] & 0xff]; - // NOBREAK - case 3: - c = pem_convert_array[decode_buffer[2] & 0xff]; - // NOBREAK - case 2: - b = pem_convert_array[decode_buffer[1] & 0xff]; - a = pem_convert_array[decode_buffer[0] & 0xff]; - break; - } - - switch (rem) { - case 2: - outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3))); - break; - case 3: - outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3))); - outStream.write((byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf))); - break; - case 4: - outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3))); - outStream.write((byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf))); - outStream.write((byte) (((c << 6) & 0xc0) | (d & 0x3f))); - break; - } - return; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java deleted file mode 100644 index 92ba523146..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.sunbird.datasecurity.impl; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * This class implements a BASE64 Character encoder as specified in RFC1521. This RFC is part of the - * MIME specification as published by the Internet Engineering Task Force (IETF). Unlike some other - * encoding schemes there is nothing in this encoding that indicates where a buffer starts or ends. - * - *

This means that the encoded text will simply start with the first line of encoded text and end - * with the last line of encoded text. - * - * @author Chuck McManis - * @see CharacterEncoder - * @see BASE64Decoder - */ -public class BASE64Encoder extends CharacterEncoder { - /** this class encodes three bytes per atom. */ - protected int bytesPerAtom() { - return (3); - } - - /** - * this class encodes 57 bytes per line. This results in a maximum of 57/3 * 4 or 76 characters - * per output line. Not counting the line termination. - */ - protected int bytesPerLine() { - return (57); - } - - /** This array maps the characters to their 6 bit values */ - private static final char pem_array[] = { - // 0 1 2 3 4 5 6 7 - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 1 - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 2 - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 3 - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 4 - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 5 - 'w', 'x', 'y', 'z', '0', '1', '2', '3', // 6 - '4', '5', '6', '7', '8', '9', '+', '/' // 7 - }; - - /** - * encodeAtom - Take three bytes of input and encode it as 4 printable characters. Note that if - * the length in len is less than three is encodes either one or two '=' signs to indicate padding - * characters. - */ - protected void encodeAtom(OutputStream outStream, byte data[], int offset, int len) - throws IOException { - byte a, b, c; - - if (len == 1) { - a = data[offset]; - b = 0; - c = 0; - outStream.write(pem_array[(a >>> 2) & 0x3F]); - outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); - outStream.write('='); - outStream.write('='); - } else if (len == 2) { - a = data[offset]; - b = data[offset + 1]; - c = 0; - outStream.write(pem_array[(a >>> 2) & 0x3F]); - outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); - outStream.write(pem_array[((b << 2) & 0x3c) + ((c >>> 6) & 0x3)]); - outStream.write('='); - } else { - a = data[offset]; - b = data[offset + 1]; - c = data[offset + 2]; - outStream.write(pem_array[(a >>> 2) & 0x3F]); - outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); - outStream.write(pem_array[((b << 2) & 0x3c) + ((c >>> 6) & 0x3)]); - outStream.write(pem_array[c & 0x3F]); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java deleted file mode 100644 index 8d2cfc9076..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package org.sunbird.datasecurity.impl; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PushbackInputStream; -import java.nio.ByteBuffer; - -/** - * This class defines the decoding half of character encoders. A character decoder is an algorithim - * for transforming 8 bit binary data that has been encoded into text by a character encoder, back - * into original binary form. - * - *

The character encoders, in general, have been structured around a central theme that binary - * data can be encoded into text that has the form: - * - *

- *      [Buffer Prefix]
- *      [Line Prefix][encoded data atoms][Line Suffix]
- *      [Buffer Suffix]
- * 
- * - * Of course in the simplest encoding schemes, the buffer has no distinct prefix of suffix, however - * all have some fixed relationship between the text in an 'atom' and the binary data itself. - * - *

In the CharacterEncoder and CharacterDecoder classes, one complete chunk of data is referred - * to as a buffer. Encoded buffers are all text, and decoded buffers (sometimes just referred - * to as buffers) are binary octets. - * - *

To create a custom decoder, you must, at a minimum, overide three abstract methods in this - * class. - * - *

- *
bytesPerAtom which tells the decoder how many bytes to expect from decodeAtom - *
decodeAtom which decodes the bytes sent to it as text. - *
bytesPerLine which tells the encoder the maximum number of bytes per line. - *
- * - * In general, the character decoders return error in the form of a CEFormatException. The syntax of - * the detail string is - * - *
- *      DecoderClassName: Error message.
- * 
- * - * Several useful decoders have already been written and are referenced in the See Also list below. - * - * @author Chuck McManis - * @see CharacterEncoder - * @see BASE64Decoder - */ -public abstract class CharacterDecoder { - public CharacterDecoder() {} - /** Return the number of bytes per atom of decoding */ - protected abstract int bytesPerAtom(); - - /** Return the maximum number of bytes that can be encoded per line */ - protected abstract int bytesPerLine(); - - /** decode the beginning of the buffer, by default this is a NOP. */ - protected void decodeBufferPrefix(PushbackInputStream aStream, OutputStream bStream) - throws IOException {} - - /** decode the buffer suffix, again by default it is a NOP. */ - protected void decodeBufferSuffix(PushbackInputStream aStream, OutputStream bStream) - throws IOException {} - - /** - * This method should return, if it knows, the number of bytes that will be decoded. Many formats - * such as uuencoding provide this information. By default we return the maximum bytes that could - * have been encoded on the line. - */ - protected int decodeLinePrefix(PushbackInputStream aStream, OutputStream bStream) - throws IOException { - return (bytesPerLine()); - } - - /** - * This method post processes the line, if there are error detection or correction codes in a - * line, they are generally processed by this method. The simplest version of this method looks - * for the (newline) character. - */ - protected void decodeLineSuffix(PushbackInputStream aStream, OutputStream bStream) - throws IOException {} - - /** - * This method does an actual decode. It takes the decoded bytes and writes them to the - * OutputStream. The integer l tells the method how many bytes are required. This is always - * <= bytesPerAtom(). - */ - protected void decodeAtom(PushbackInputStream aStream, OutputStream bStream, int l) - throws IOException { - throw new IOException(); - } - - /** This method works around the bizarre semantics of BufferedInputStream's read method. */ - protected int readFully(InputStream in, byte buffer[], int offset, int len) - throws java.io.IOException { - for (int i = 0; i < len; i++) { - int q = in.read(); - if (q == -1) return ((i == 0) ? -1 : i); - buffer[i + offset] = (byte) q; - } - return len; - } - - /** - * Decode the text from the InputStream and write the decoded octets to the OutputStream. This - * method runs until the stream is exhausted. - * - * @exception IOException An error has occurred while decoding - * @exception IOException The input stream is unexpectedly out of data - */ - public void decodeBuffer(InputStream aStream, OutputStream bStream) throws IOException { - int i; - int totalBytes = 0; - - PushbackInputStream ps = new PushbackInputStream(aStream); - decodeBufferPrefix(ps, bStream); - while (true) { - int length; - - try { - length = decodeLinePrefix(ps, bStream); - for (i = 0; (i + bytesPerAtom()) < length; i += bytesPerAtom()) { - decodeAtom(ps, bStream, bytesPerAtom()); - totalBytes += bytesPerAtom(); - } - if ((i + bytesPerAtom()) == length) { - decodeAtom(ps, bStream, bytesPerAtom()); - totalBytes += bytesPerAtom(); - } else { - decodeAtom(ps, bStream, length - i); - totalBytes += (length - i); - } - decodeLineSuffix(ps, bStream); - } catch (IOException e) { - break; - } - } - decodeBufferSuffix(ps, bStream); - } - - /** - * Alternate decode interface that takes a String containing the encoded buffer and returns a byte - * array containing the data. - * - * @exception IOException An error has occurred while decoding - */ - public byte decodeBuffer(String inputString)[] throws IOException { - byte inputBuffer[] = new byte[inputString.length()]; - ByteArrayInputStream inStream; - ByteArrayOutputStream outStream; - - inputString.getBytes(0, inputString.length(), inputBuffer, 0); - inStream = new ByteArrayInputStream(inputBuffer); - outStream = new ByteArrayOutputStream(); - decodeBuffer(inStream, outStream); - return (outStream.toByteArray()); - } - - /** Decode the contents of the inputstream into a buffer. */ - public byte decodeBuffer(InputStream in)[] throws IOException { - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - decodeBuffer(in, outStream); - return (outStream.toByteArray()); - } - - /** Decode the contents of the String into a ByteBuffer. */ - public ByteBuffer decodeBufferToByteBuffer(String inputString) throws IOException { - return ByteBuffer.wrap(decodeBuffer(inputString)); - } - - /** Decode the contents of the inputStream into a ByteBuffer. */ - public ByteBuffer decodeBufferToByteBuffer(InputStream in) throws IOException { - return ByteBuffer.wrap(decodeBuffer(in)); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java deleted file mode 100644 index 2df46c6310..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (c) 1995, 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.sunbird.datasecurity.impl; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.nio.ByteBuffer; - -/** - * This class defines the encoding half of character encoders. A character encoder is an algorithim - * for transforming 8 bit binary data into text (generally 7 bit ASCII or 8 bit ISO-Latin-1 text) - * for transmition over text channels such as e-mail and network news. - * - *

The character encoders have been structured around a central theme that, in general, the - * encoded text has the form: - * - *

- *      [Buffer Prefix]
- *      [Line Prefix][encoded data atoms][Line Suffix]
- *      [Buffer Suffix]
- * 
- * - * In the CharacterEncoder and CharacterDecoder classes, one complete chunk of data is referred to - * as a buffer. Encoded buffers are all text, and decoded buffers (sometimes just referred to - * as buffers) are binary octets. - * - *

To create a custom encoder, you must, at a minimum, overide three abstract methods in this - * class. - * - *

- *
bytesPerAtom which tells the encoder how many bytes to send to encodeAtom - *
encodeAtom which encodes the bytes sent to it as text. - *
bytesPerLine which tells the encoder the maximum number of bytes per line. - *
- * - * Several useful encoders have already been written and are referenced in the See Also list below. - * - * @author Chuck McManis - * @see CharacterDecoder; - * @see BASE64Encoder - */ -public abstract class CharacterEncoder { - /** Stream that understands "printing" */ - protected PrintStream pStream; - - /** Return the number of bytes per atom of encoding */ - protected abstract int bytesPerAtom(); - - /** Return the number of bytes that can be encoded per line */ - protected abstract int bytesPerLine(); - - /** - * Encode the prefix for the entire buffer. By default is simply opens the PrintStream for use by - * the other functions. - */ - protected void encodeBufferPrefix(OutputStream aStream) throws IOException { - pStream = new PrintStream(aStream); - } - - /** Encode the suffix for the entire buffer. */ - protected void encodeBufferSuffix(OutputStream aStream) throws IOException {} - - /** Encode the prefix that starts every output line. */ - protected void encodeLinePrefix(OutputStream aStream, int aLength) throws IOException {} - - /** - * Encode the suffix that ends every output line. By default this method just prints a - * into the output stream. - */ - protected void encodeLineSuffix(OutputStream aStream) throws IOException { - pStream.println(); - } - - /** Encode one "atom" of information into characters. */ - protected abstract void encodeAtom( - OutputStream aStream, byte someBytes[], int anOffset, int aLength) throws IOException; - - /** This method works around the bizarre semantics of BufferedInputStream's read method. */ - protected int readFully(InputStream in, byte buffer[]) throws java.io.IOException { - for (int i = 0; i < buffer.length; i++) { - int q = in.read(); - if (q == -1) return i; - buffer[i] = (byte) q; - } - return buffer.length; - } - - /** - * Encode bytes from the input stream, and write them as text characters to the output stream. - * This method will run until it exhausts the input stream, but does not print the line suffix for - * a final line that is shorter than bytesPerLine(). - */ - public void encode(InputStream inStream, OutputStream outStream) throws IOException { - int j; - int numBytes; - byte tmpbuffer[] = new byte[bytesPerLine()]; - - encodeBufferPrefix(outStream); - - while (true) { - numBytes = readFully(inStream, tmpbuffer); - if (numBytes == 0) { - break; - } - encodeLinePrefix(outStream, numBytes); - for (j = 0; j < numBytes; j += bytesPerAtom()) { - - if ((j + bytesPerAtom()) <= numBytes) { - encodeAtom(outStream, tmpbuffer, j, bytesPerAtom()); - } else { - encodeAtom(outStream, tmpbuffer, j, (numBytes) - j); - } - } - if (numBytes < bytesPerLine()) { - break; - } else { - encodeLineSuffix(outStream); - } - } - encodeBufferSuffix(outStream); - } - - /** - * Encode the buffer in aBuffer and write the encoded result to the OutputStream - * aStream. - */ - public void encode(byte aBuffer[], OutputStream aStream) throws IOException { - ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); - encode(inStream, aStream); - } - - /** - * A 'streamless' version of encode that simply takes a buffer of bytes and returns a string - * containing the encoded buffer. - */ - public String encode(byte aBuffer[]) { - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); - String retVal = null; - try { - encode(inStream, outStream); - // explicit ascii->unicode conversion - retVal = outStream.toString("8859_1"); - } catch (Exception IOException) { - // This should never happen. - throw new Error("CharacterEncoder.encode internal error"); - } - return (retVal); - } - - /** - * Return a byte array from the remaining bytes in this ByteBuffer. - * - *

The ByteBuffer's position will be advanced to ByteBuffer's limit. - * - *

To avoid an extra copy, the implementation will attempt to return the byte array backing the - * ByteBuffer. If this is not possible, a new byte array will be created. - */ - private byte[] getBytes(ByteBuffer bb) { - /* - * This should never return a BufferOverflowException, as we're - * careful to allocate just the right amount. - */ - byte[] buf = null; - - /* - * If it has a usable backing byte buffer, use it. Use only - * if the array exactly represents the current ByteBuffer. - */ - if (bb.hasArray()) { - byte[] tmp = bb.array(); - if ((tmp.length == bb.capacity()) && (tmp.length == bb.remaining())) { - buf = tmp; - bb.position(bb.limit()); - } - } - - if (buf == null) { - /* - * This class doesn't have a concept of encode(buf, len, off), - * so if we have a partial buffer, we must reallocate - * space. - */ - buf = new byte[bb.remaining()]; - - /* - * position() automatically updated - */ - bb.get(buf); - } - - return buf; - } - - /** - * Encode the aBuffer ByteBuffer and write the encoded result to the OutputStream - * aStream. - * - *

The ByteBuffer's position will be advanced to ByteBuffer's limit. - */ - public void encode(ByteBuffer aBuffer, OutputStream aStream) throws IOException { - byte[] buf = getBytes(aBuffer); - encode(buf, aStream); - } - - /** - * A 'streamless' version of encode that simply takes a ByteBuffer and returns a string containing - * the encoded buffer. - * - *

The ByteBuffer's position will be advanced to ByteBuffer's limit. - */ - public String encode(ByteBuffer aBuffer) { - byte[] buf = getBytes(aBuffer); - return encode(buf); - } - - /** - * Encode bytes from the input stream, and write them as text characters to the output stream. - * This method will run until it exhausts the input stream. It differs from encode in that it will - * add the line at the end of a final line that is shorter than bytesPerLine(). - */ - public void encodeBuffer(InputStream inStream, OutputStream outStream) throws IOException { - int j; - int numBytes; - byte tmpbuffer[] = new byte[bytesPerLine()]; - - encodeBufferPrefix(outStream); - - while (true) { - numBytes = readFully(inStream, tmpbuffer); - if (numBytes == 0) { - break; - } - encodeLinePrefix(outStream, numBytes); - for (j = 0; j < numBytes; j += bytesPerAtom()) { - if ((j + bytesPerAtom()) <= numBytes) { - encodeAtom(outStream, tmpbuffer, j, bytesPerAtom()); - } else { - encodeAtom(outStream, tmpbuffer, j, (numBytes) - j); - } - } - encodeLineSuffix(outStream); - if (numBytes < bytesPerLine()) { - break; - } - } - encodeBufferSuffix(outStream); - } - - /** - * Encode the buffer in aBuffer and write the encoded result to the OutputStream - * aStream. - */ - public void encodeBuffer(byte aBuffer[], OutputStream aStream) throws IOException { - ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); - encodeBuffer(inStream, aStream); - } - - /** - * A 'streamless' version of encode that simply takes a buffer of bytes and returns a string - * containing the encoded buffer. - */ - public String encodeBuffer(byte aBuffer[]) { - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); - try { - encodeBuffer(inStream, outStream); - } catch (Exception IOException) { - // This should never happen. - throw new Error("CharacterEncoder.encodeBuffer internal error"); - } - return (outStream.toString()); - } - - /** - * Encode the aBuffer ByteBuffer and write the encoded result to the OutputStream - * aStream. - * - *

The ByteBuffer's position will be advanced to ByteBuffer's limit. - */ - public void encodeBuffer(ByteBuffer aBuffer, OutputStream aStream) throws IOException { - byte[] buf = getBytes(aBuffer); - encodeBuffer(buf, aStream); - } - - /** - * A 'streamless' version of encode that simply takes a ByteBuffer and returns a string containing - * the encoded buffer. - * - *

The ByteBuffer's position will be advanced to ByteBuffer's limit. - */ - public String encodeBuffer(ByteBuffer aBuffer) { - byte[] buf = getBytes(aBuffer); - return encodeBuffer(buf); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java deleted file mode 100644 index 2593525a37..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -/** */ -package org.sunbird.datasecurity.impl; - -import org.apache.commons.lang3.StringUtils; -import org.sunbird.datasecurity.DataMaskingService; -import org.sunbird.keys.JsonKey; -import org.sunbird.util.ProjectUtil; - -/** @author Manzarul */ -public class DefaultDataMaskServiceImpl implements DataMaskingService { - - @Override - public String maskPhone(String phone) { - if (StringUtils.isBlank(phone) || phone.length() < 10) { - return phone; - } - String tempPhone = ""; - StringBuilder builder = new StringBuilder(); - tempPhone = phone.trim().replace("-", ""); - int length = tempPhone.length(); - for (int i = 0; i < length; i++) { - if (i < length - 4) { - builder.append(JsonKey.REPLACE_WITH_ASTERISK); - } else { - builder.append(tempPhone.charAt(i)); - } - } - return builder.toString(); - } - - @Override - public String maskEmail(String email) { - if ((StringUtils.isBlank(email)) || (!ProjectUtil.isEmailvalid(email))) { - return email; - } - StringBuilder builder = new StringBuilder(); - String[] emails = email.split("@"); - int length = emails[0].length(); - for (int i = 0; i < email.length(); i++) { - if (i < 2 || i >= length) { - builder.append(email.charAt(i)); - } else { - builder.append(JsonKey.REPLACE_WITH_ASTERISK); - } - } - return builder.toString(); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java deleted file mode 100644 index 0707f99d71..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.sunbird.datasecurity.impl; - -import java.nio.charset.StandardCharsets; -import java.security.Key; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import javax.crypto.Cipher; -import javax.crypto.spec.SecretKeySpec; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.datasecurity.DecryptionService; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; - -public class DefaultDecryptionServiceImpl implements DecryptionService { - private static final LoggerUtil logger = new LoggerUtil(DefaultDecryptionServiceImpl.class); - - private static String sunbird_encryption = ""; - - private String sunbirdEncryption = ""; - - private static Cipher c; - - static { - try { - sunbird_encryption = DefaultEncryptionServiceImpl.getSalt(); - Key key = generateKey(); - c = Cipher.getInstance(ALGORITHM); - c.init(Cipher.DECRYPT_MODE, key); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - } - - public DefaultDecryptionServiceImpl() { - sunbirdEncryption = System.getenv(JsonKey.SUNBIRD_ENCRYPTION); - if (StringUtils.isBlank(sunbirdEncryption)) { - sunbirdEncryption = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_ENCRYPTION); - } - } - - @Override - public Map decryptData(Map data, RequestContext context) { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - if (data == null) { - return data; - } - Iterator> itr = data.entrySet().iterator(); - while (itr.hasNext()) { - Entry entry = itr.next(); - if (!(entry.getValue() instanceof Map || entry.getValue() instanceof List) - && null != entry.getValue()) { - data.put(entry.getKey(), decrypt(entry.getValue() + "", false, context)); - } - } - } - return data; - } - - @Override - public List> decryptData( - List> data, RequestContext context) { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - if (data == null || data.isEmpty()) { - return data; - } - - for (Map map : data) { - decryptData(map, context); - } - } - return data; - } - - @Override - public String decryptData(String data, RequestContext context) { - return decryptData(data, false, context); - } - - @Override - public String decryptData(String data, boolean throwExceptionOnFailure, RequestContext context) { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - if (StringUtils.isBlank(data)) { - return data; - } else { - return decrypt(data, throwExceptionOnFailure, context); - } - } else { - return data; - } - } - - public static String decrypt( - String value, boolean throwExceptionOnFailure, RequestContext context) { - try { - String dValue = null; - String valueToDecrypt = value.trim(); - for (int i = 0; i < ITERATIONS; i++) { - byte[] decordedValue = new BASE64Decoder().decodeBuffer(valueToDecrypt); - byte[] decValue = c.doFinal(decordedValue); - dValue = - new String(decValue, StandardCharsets.UTF_8).substring(sunbird_encryption.length()); - valueToDecrypt = dValue; - } - return dValue; - } catch (Exception ex) { - // This could happen with masked email and phone number. Not others. - logger.error(context, "DefaultDecryptionServiceImpl:decrypt: ignorable errorMsg = ", ex); - if (throwExceptionOnFailure) { - logger.info( - context, "Throwing exception error upon explicit ask by callers for value " + value); - ProjectCommonException.throwServerErrorException(ResponseCode.SERVER_ERROR); - } - } - return value; - } - - private static Key generateKey() { - return new SecretKeySpec(keyValue, ALGORITHM); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java deleted file mode 100644 index 57aab571c3..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.sunbird.datasecurity.impl; - -import java.nio.charset.StandardCharsets; -import java.security.Key; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import javax.crypto.Cipher; -import javax.crypto.spec.SecretKeySpec; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.datasecurity.EncryptionService; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; - -/** - * Default data encryption service - * - * @author Manzarul - */ -public class DefaultEncryptionServiceImpl implements EncryptionService { - private static final LoggerUtil logger = new LoggerUtil(DefaultEncryptionServiceImpl.class); - - private static String encryption_key = ""; - - private String sunbirdEncryption = ""; - - private static Cipher c; - - static { - try { - encryption_key = getSalt(); - Key key = generateKey(); - c = Cipher.getInstance(ALGORITHM); - c.init(Cipher.ENCRYPT_MODE, key); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - } - - public DefaultEncryptionServiceImpl() { - sunbirdEncryption = System.getenv(JsonKey.SUNBIRD_ENCRYPTION); - if (StringUtils.isBlank(sunbirdEncryption)) { - sunbirdEncryption = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_ENCRYPTION); - } - } - - @Override - public Map encryptData(Map data, RequestContext context) { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - if (data == null) { - return data; - } - Iterator> itr = data.entrySet().iterator(); - while (itr.hasNext()) { - Entry entry = itr.next(); - if (!(entry.getValue() instanceof Map || entry.getValue() instanceof List) - && null != entry.getValue()) { - data.put(entry.getKey(), encrypt(entry.getValue() + "", context)); - } - } - } - return data; - } - - @Override - public List> encryptData( - List> data, RequestContext context) { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - if (data == null || data.isEmpty()) { - return data; - } - for (Map map : data) { - encryptData(map, context); - } - } - return data; - } - - @Override - public String encryptData(String data, RequestContext context) { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - if (StringUtils.isNotBlank(data)) { - return encrypt(data, context); - } else { - return data; - } - } else { - return data; - } - } - - /** - * this method is used to encrypt the password. - * - * @param value String password - * @return encrypted password. - */ - @SuppressWarnings("restriction") - public static String encrypt(String value, RequestContext context) { - String valueToEnc = null; - String eValue = value; - for (int i = 0; i < ITERATIONS; i++) { - valueToEnc = encryption_key + eValue; - byte[] encValue = new byte[0]; - try { - encValue = c.doFinal(valueToEnc.getBytes(StandardCharsets.UTF_8)); - } catch (Exception e) { - logger.error( - context, "Exception while encrypting user data, with message : " + e.getMessage(), e); - throw new ProjectCommonException( - ResponseCode.serverError, - ResponseCode.serverError.getErrorMessage(), - ResponseCode.SERVER_ERROR.getResponseCode()); - } - eValue = new BASE64Encoder().encode(encValue); - } - return eValue; - } - - private static Key generateKey() { - return new SecretKeySpec(keyValue, ALGORITHM); - } - - /** @return */ - public static String getSalt() { - if (!StringUtils.isBlank(encryption_key)) { - return encryption_key; - } else { - encryption_key = System.getenv(JsonKey.ENCRYPTION_KEY); - if (StringUtils.isBlank(encryption_key)) { - logger.info("Salt value is not provided by Env"); - encryption_key = ProjectUtil.getConfigValue(JsonKey.ENCRYPTION_KEY); - } - } - if (StringUtils.isBlank(encryption_key)) { - logger.info("throwing exception for invalid salt"); - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - String.format( - ResponseCode.invalidParameterValue.getErrorMessage(), JsonKey.ENCRYPTION_KEY), - ResponseCode.SERVER_ERROR.getResponseCode()); - } - return encryption_key; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java deleted file mode 100644 index 2545b4ed93..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.sunbird.datasecurity.impl; - -import org.sunbird.datasecurity.DataMaskingService; - -public class LogMaskServiceImpl implements DataMaskingService { - /** - * Mask an email - * - * @param email - * @return the first 2 characters in plain and masks the rest. The domain is still in plain - */ - public String maskEmail(String email) { - return email.replaceAll("(^[^@]{2}|(?!^)\\G)[^@]", "$1*"); - } - - /** - * Mask a phone number - * - * @param phone - * @return a string with the last 5 digit masked - */ - public String maskPhone(String phone) { - return phone.replaceAll("(^[^*]{5}|(?!^)\\G)[^*]", "$1*"); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java b/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java deleted file mode 100644 index 45ac114cae..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/** */ -package org.sunbird.datasecurity.impl; - -import org.sunbird.datasecurity.DataMaskingService; -import org.sunbird.datasecurity.DecryptionService; -import org.sunbird.datasecurity.EncryptionService; - -/** - * This factory will provide encryption service instance and decryption service instance with - * default implementation. - * - * @author Manzarul - */ -public class ServiceFactory { - - private static EncryptionService encryptionService; - private static DecryptionService decryptionService; - private static DataMaskingService maskingService; - - static { - encryptionService = new DefaultEncryptionServiceImpl(); - decryptionService = new DefaultDecryptionServiceImpl(); - maskingService = new DefaultDataMaskServiceImpl(); - } - - /** - * this method will provide encryptionServiceImple instance. by default it will provide - * DefaultEncryptionServiceImpl instance to get a particular service impl instance , need to - * change the object creation and provided logic. - * - * @return EncryptionService - */ - public static EncryptionService getEncryptionServiceInstance() { - return encryptionService; - } - - /** - * this method will provide decryptionServiceImple instance. by default it will provide - * DefaultDecryptionServiceImpl instance to get a particular service impl instance , need to - * change the object creation and provided logic. - * - * @return DecryptionService - */ - public static DecryptionService getDecryptionServiceInstance() { - return decryptionService; - } - - public static DataMaskingService getMaskingServiceInstance() { - return maskingService; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java b/core/platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java deleted file mode 100644 index 66ed3cfbe6..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java +++ /dev/null @@ -1,197 +0,0 @@ -/** */ -package org.sunbird.exception; - -import java.text.MessageFormat; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.keys.JsonKey; - -/** - * This exception will be used across all backend code. This will send status code and error message - * - * @author Manzarul.Haque - */ -public class ProjectCommonException extends RuntimeException { - - /** serialVersionUID. */ - private static final long serialVersionUID = 1L; - /** code String code ResponseCode. */ - private String errorCode; - /** message String ResponseCode. */ - private String errorMessage; - /** responseCode int ResponseCode. */ - private int errorResponseCode; - - private ResponseCode responseCode; - - /** - * This code is for client to identify the error and based on that do the message localization. - * - * @return String - */ - public String getErrorCode() { - return errorCode; - } - - /** - * To set the client code. - * - * @param code String - */ - public void setErrorCode(String code) { - this.errorCode = code; - } - - /** - * message for client in english. - * - * @return String - */ - @Override - public String getMessage() { - return errorMessage; - } - - /** @param message String */ - public void setMessage(String message) { - this.errorMessage = message; - } - - /** - * This method will provide response code, this code will be used in response header. - * - * @return int - */ - public int getErrorResponseCode() { - return errorResponseCode; - } - - /** @param responseCode int */ - public void setErrorResponseCode(int responseCode) { - this.errorResponseCode = responseCode; - } - - public ResponseCode getResponseCode() { - return responseCode; - } - - public void setResponseCode(ResponseCode responseCode) { - this.responseCode = responseCode; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - /** - * three argument constructor. - * - * @param code String - * @param message String - * @param responseCode int - */ - public ProjectCommonException(ResponseCode code, String message, int responseCode) { - super(); - this.responseCode = code; - this.errorCode = code.getErrorCode(); - this.errorMessage = message; - this.errorResponseCode = responseCode; - } - - /** - * Backward-compatible constructor that accepts String error code. - * This is for legacy code compatibility. - * - * @param errorCode String error code - * @param message String error message - * @param responseCode int HTTP response code - */ - public ProjectCommonException(String errorCode, String message, int responseCode) { - super(); - this.errorCode = errorCode; - this.errorMessage = message; - this.errorResponseCode = responseCode; - // Try to find matching ResponseCode enum - this.responseCode = null; - } - - public ProjectCommonException(ProjectCommonException pce, String actorOperation) { - super(); - super.setStackTrace(pce.getStackTrace()); - this.errorCode = - new StringBuilder(JsonKey.USER_ORG_SERVICE_PREFIX) - .append(actorOperation) - .append(pce.getErrorCode()) - .toString(); - this.errorResponseCode = pce.getErrorResponseCode(); - this.errorMessage = pce.getMessage(); - this.responseCode = pce.getResponseCode(); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append(errorCode).append(": "); - builder.append(errorMessage); - return builder.toString(); - } - - public ProjectCommonException( - ResponseCode code, - String messageWithPlaceholder, - int responseCode, - String... placeholderValue) { - super(); - this.errorCode = code.getErrorCode(); - this.errorMessage = MessageFormat.format(messageWithPlaceholder, placeholderValue); - this.errorResponseCode = responseCode; - this.responseCode = code; - } - - public static void throwClientErrorException(ResponseCode responseCode, String exceptionMessage) { - throw new ProjectCommonException( - responseCode, - StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - - public static void throwResourceNotFoundException() { - throw new ProjectCommonException( - ResponseCode.resourceNotFound, - MessageFormat.format(ResponseCode.resourceNotFound.getErrorMessage(), ""), - ResponseCode.RESOURCE_NOT_FOUND.getResponseCode()); - } - - public static void throwResourceNotFoundException( - ResponseCode responseCode, String exceptionMessage) { - throw new ProjectCommonException( - responseCode, - StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, - ResponseCode.RESOURCE_NOT_FOUND.getResponseCode()); - } - - public static void throwServerErrorException(ResponseCode responseCode, String exceptionMessage) { - throw new ProjectCommonException( - responseCode, - StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, - ResponseCode.SERVER_ERROR.getResponseCode()); - } - - public static void throwServerErrorException(ResponseCode responseCode) { - throwServerErrorException(responseCode, responseCode.getErrorMessage()); - } - - public static void throwClientErrorException(ResponseCode responseCode) { - throwClientErrorException(responseCode, responseCode.getErrorMessage()); - } - - public static void throwUnauthorizedErrorException() { - throw new ProjectCommonException( - ResponseCode.unAuthorized, - ResponseCode.unAuthorized.getErrorMessage(), - ResponseCode.UNAUTHORIZED.getResponseCode()); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java b/core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java deleted file mode 100644 index 12c07c6f77..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/exception/ResponseCode.java +++ /dev/null @@ -1,275 +0,0 @@ -package org.sunbird.exception; - -import java.util.HashMap; -import java.util.Map; - -/** @author Manzarul */ -public enum ResponseCode { - unAuthorized(ResponseMessage.Key.UNAUTHORIZED_USER, ResponseMessage.Message.UNAUTHORIZED_USER), - invalidOperationName( - ResponseMessage.Key.INVALID_OPERATION_NAME, ResponseMessage.Message.INVALID_OPERATION_NAME), - invalidRequestData( - ResponseMessage.Key.INVALID_REQUESTED_DATA, ResponseMessage.Message.INVALID_REQUESTED_DATA), - success(ResponseMessage.Key.SUCCESS_MESSAGE, ResponseMessage.Message.SUCCESS_MESSAGE), - errorDuplicateEntry( - ResponseMessage.Key.ERROR_DUPLICATE_ENTRY, ResponseMessage.Message.ERROR_DUPLICATE_ENTRY), - errorParamExists( - ResponseMessage.Key.ERROR_PARAM_EXISTS, ResponseMessage.Message.ERROR_PARAM_EXISTS), - errorInvalidOTP(ResponseMessage.Key.ERROR_INVALID_OTP, ResponseMessage.Message.ERROR_INVALID_OTP), - dataTypeError(ResponseMessage.Key.DATA_TYPE_ERROR, ResponseMessage.Message.DATA_TYPE_ERROR), - errorAttributeConflict( - ResponseMessage.Key.ERROR_ATTRIBUTE_CONFLICT, - ResponseMessage.Message.ERROR_ATTRIBUTE_CONFLICT), - invalidPropertyError( - ResponseMessage.Key.INVALID_PROPERTY_ERROR, ResponseMessage.Message.INVALID_PROPERTY_ERROR), - dataSizeError(ResponseMessage.Key.DATA_SIZE_EXCEEDED, ResponseMessage.Message.DATA_SIZE_EXCEEDED), - userAccountlocked( - ResponseMessage.Key.USER_ACCOUNT_BLOCKED, ResponseMessage.Message.USER_ACCOUNT_BLOCKED), - userStatusError(ResponseMessage.Key.USER_STATUS_MSG, ResponseMessage.Message.USER_STATUS_MSG), - csvError(ResponseMessage.Key.INVALID_CSV_FILE, ResponseMessage.Message.INVALID_CSV_FILE), - invalidObjectType( - ResponseMessage.Key.INVALID_OBJECT_TYPE, ResponseMessage.Message.INVALID_OBJECT_TYPE), - csvFileEmpty(ResponseMessage.Key.EMPTY_CSV_FILE, ResponseMessage.Message.EMPTY_CSV_FILE), - dataFormatError(ResponseMessage.Key.DATA_FORMAT_ERROR, ResponseMessage.Message.DATA_FORMAT_ERROR), - internalError(ResponseMessage.Key.INTERNAL_ERROR, ResponseMessage.Message.INTERNAL_ERROR), - dbInsertionError( - ResponseMessage.Key.DB_INSERTION_FAIL, ResponseMessage.Message.DB_INSERTION_FAIL), - dbUpdateError(ResponseMessage.Key.DB_UPDATE_FAIL, ResponseMessage.Message.DB_UPDATE_FAIL), - invalidData(ResponseMessage.Key.INVALID_DATA, ResponseMessage.Message.INVALID_DATA), - - OnlyEmailorPhoneorManagedByRequired( - ResponseMessage.Key.ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED, - ResponseMessage.Message.ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED), - channelRegFailed( - ResponseMessage.Key.CHANNEL_REG_FAILED, ResponseMessage.Message.CHANNEL_REG_FAILED), - resourceNotFound( - ResponseMessage.Key.RESOURCE_NOT_FOUND, ResponseMessage.Message.RESOURCE_NOT_FOUND), - sizeLimitExceed( - ResponseMessage.Key.MAX_ALLOWED_SIZE_LIMIT_EXCEED, - ResponseMessage.Message.MAX_ALLOWED_SIZE_LIMIT_EXCEED), - inactiveUser(ResponseMessage.Key.INACTIVE_USER, ResponseMessage.Message.INACTIVE_USER), - invalidValue(ResponseMessage.Key.INVALID_VALUE, ResponseMessage.Message.INVALID_VALUE), - invalidParameter( - ResponseMessage.Key.INVALID_PARAMETER, ResponseMessage.Message.INVALID_PARAMETER), - invalidLocationDeleteRequest( - ResponseMessage.Key.INVALID_LOCATION_DELETE_REQUEST, - ResponseMessage.Message.INVALID_LOCATION_DELETE_REQUEST), - mandatoryParamsMissing( - ResponseMessage.Key.MANDATORY_PARAMETER_MISSING, - ResponseMessage.Message.MANDATORY_PARAMETER_MISSING), - errorMandatoryParamsEmpty( - ResponseMessage.Key.ERROR_MANDATORY_PARAMETER_EMPTY, - ResponseMessage.Message.ERROR_MANDATORY_PARAMETER_EMPTY), - errorNoFrameworkFound( - ResponseMessage.Key.ERROR_NO_FRAMEWORK_FOUND, - ResponseMessage.Message.ERROR_NO_FRAMEWORK_FOUND), - unupdatableField( - ResponseMessage.Key.UPDATE_NOT_ALLOWED, ResponseMessage.Message.UPDATE_NOT_ALLOWED), - invalidParameterValue( - ResponseMessage.Key.INVALID_PARAMETER_VALUE, ResponseMessage.Message.INVALID_PARAMETER_VALUE), - parentNotAllowed( - ResponseMessage.Key.PARENT_NOT_ALLOWED, ResponseMessage.Message.PARENT_NOT_ALLOWED), - missingFileAttachment( - ResponseMessage.Key.MISSING_FILE_ATTACHMENT, ResponseMessage.Message.MISSING_FILE_ATTACHMENT), - fileAttachmentSizeNotConfigured( - ResponseMessage.Key.FILE_ATTACHMENT_SIZE_NOT_CONFIGURED, - ResponseMessage.Message.FILE_ATTACHMENT_SIZE_NOT_CONFIGURED), - emptyFile(ResponseMessage.Key.EMPTY_FILE, ResponseMessage.Message.EMPTY_FILE), - invalidColumns(ResponseMessage.Key.INVALID_COLUMNS, ResponseMessage.Message.INVALID_COLUMNS), - conflictingOrgLocations( - ResponseMessage.Key.CONFLICTING_ORG_LOCATIONS, - ResponseMessage.Message.CONFLICTING_ORG_LOCATIONS), - emptyHeaderLine(ResponseMessage.Key.EMPTY_HEADER_LINE, ResponseMessage.Message.EMPTY_HEADER_LINE), - invalidRequestParameter( - ResponseMessage.Key.INVALID_REQUEST_PARAMETER, - ResponseMessage.Message.INVALID_REQUEST_PARAMETER), - rootOrgAssociationError( - ResponseMessage.Key.ROOT_ORG_ASSOCIATION_ERROR, - ResponseMessage.Message.ROOT_ORG_ASSOCIATION_ERROR), - dependentParameterMissing( - ResponseMessage.Key.DEPENDENT_PARAMETER_MISSING, - ResponseMessage.Message.DEPENDENT_PARAMETER_MISSING), - externalIdAssignedToOtherUser( - ResponseMessage.Key.EXTERNALID_ASSIGNED_TO_OTHER_USER, - ResponseMessage.Message.EXTERNALID_ASSIGNED_TO_OTHER_USER), - duplicateExternalIds( - ResponseMessage.Key.DUPLICATE_EXTERNAL_IDS, ResponseMessage.Message.DUPLICATE_EXTERNAL_IDS), - emailNotSentRecipientsExceededMaxLimit( - ResponseMessage.Key.EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT, - ResponseMessage.Message.EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT), - parameterMismatch( - ResponseMessage.Key.PARAMETER_MISMATCH, ResponseMessage.Message.PARAMETER_MISMATCH), - errorForbidden(ResponseMessage.Key.FORBIDDEN, ResponseMessage.Message.FORBIDDEN), - errorConfigLoadEmptyString( - ResponseMessage.Key.ERROR_CONFIG_LOAD_EMPTY_STRING, - ResponseMessage.Message.ERROR_CONFIG_LOAD_EMPTY_STRING), - errorConfigLoadParseString( - ResponseMessage.Key.ERROR_CONFIG_LOAD_PARSE_STRING, - ResponseMessage.Message.ERROR_CONFIG_LOAD_PARSE_STRING), - errorConfigLoadEmptyConfig( - ResponseMessage.Key.ERROR_CONFIG_LOAD_EMPTY_CONFIG, - ResponseMessage.Message.ERROR_CONFIG_LOAD_EMPTY_CONFIG), - errorNoRootOrgAssociated( - ResponseMessage.Key.ERROR_NO_ROOT_ORG_ASSOCIATED, - ResponseMessage.Message.ERROR_NO_ROOT_ORG_ASSOCIATED), - errorUnsupportedCloudStorage( - ResponseMessage.Key.ERROR_UNSUPPORTED_CLOUD_STORAGE, - ResponseMessage.Message.ERROR_UNSUPPORTED_CLOUD_STORAGE), - errorUnsupportedField( - ResponseMessage.Key.ERROR_UNSUPPORTED_FIELD, ResponseMessage.Message.ERROR_UNSUPPORTED_FIELD), - errorInactiveOrg( - ResponseMessage.Key.ERROR_INACTIVE_ORG, ResponseMessage.Message.ERROR_INACTIVE_ORG), - errorDuplicateEntries( - ResponseMessage.Key.ERROR_DUPLICATE_ENTRIES, ResponseMessage.Message.ERROR_DUPLICATE_ENTRIES), - errorConflictingValues( - ResponseMessage.Key.ERROR_CONFLICTING_VALUES, - ResponseMessage.Message.ERROR_CONFLICTING_VALUES), - errorConflictingRootOrgId( - ResponseMessage.Key.ERROR_CONFLICTING_ROOT_ORG_ID, - ResponseMessage.Message.ERROR_CONFLICTING_ROOT_ORG_ID), - errorInvalidParameterSize( - ResponseMessage.Key.ERROR_INVALID_PARAMETER_SIZE, - ResponseMessage.Message.ERROR_INVALID_PARAMETER_SIZE), - errorRateLimitExceeded( - ResponseMessage.Key.ERROR_RATE_LIMIT_EXCEEDED, - ResponseMessage.Message.ERROR_RATE_LIMIT_EXCEEDED), - invalidRequestTimeout( - ResponseMessage.Key.INVALID_REQUEST_TIMEOUT, ResponseMessage.Message.INVALID_REQUEST_TIMEOUT), - errorUserMigrationFailed( - ResponseMessage.Key.ERROR_USER_MIGRATION_FAILED, - ResponseMessage.Message.ERROR_USER_MIGRATION_FAILED), - invalidIdentifier( - ResponseMessage.Key.VALID_IDENTIFIER_ABSENSE, - ResponseMessage.Message.IDENTIFIER_VALIDATION_FAILED), - mandatoryHeaderParamsMissing( - ResponseMessage.Key.MANDATORY_HEADER_PARAMETER_MISSING, - ResponseMessage.Message.MANDATORY_HEADER_PARAMETER_MISSING), - recoveryParamsMatchException( - ResponseMessage.Key.RECOVERY_PARAM_MATCH_EXCEPTION, - ResponseMessage.Message.RECOVERY_PARAM_MATCH_EXCEPTION), - passwordValidation( - ResponseMessage.Key.INVALID_PASSWORD, ResponseMessage.Message.INVALID_PASSWORD), - otpVerificationFailed( - ResponseMessage.Key.OTP_VERIFICATION_FAILED, ResponseMessage.Message.OTP_VERIFICATION_FAILED), - serviceUnAvailable( - ResponseMessage.Key.SERVICE_UNAVAILABLE, ResponseMessage.Message.SERVICE_UNAVAILABLE), - managedByNotAllowed( - ResponseMessage.Key.MANAGED_BY_NOT_ALLOWED, ResponseMessage.Message.MANAGED_BY_NOT_ALLOWED), - managedUserLimitExceeded( - ResponseMessage.Key.MANAGED_USER_LIMIT_EXCEEDED, - ResponseMessage.Message.MANAGED_USER_LIMIT_EXCEEDED), - invalidCaptcha(ResponseMessage.Key.INVALID_CAPTCHA, ResponseMessage.Message.INVALID_CAPTCHA), - declaredUserErrorStatusNotUpdated( - ResponseMessage.Key.DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED, - ResponseMessage.Message.DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED), - declaredUserValidatedStatusNotUpdated( - ResponseMessage.Key.DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED, - ResponseMessage.Message.DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED), - invalidConsentStatus( - ResponseMessage.Key.INVALID_CONSENT_STATUS, ResponseMessage.Message.INVALID_CONSENT_STATUS), - serverError(ResponseMessage.Key.SERVER_ERROR, ResponseMessage.Message.SERVER_ERROR), - invalidFileExtension( - ResponseMessage.Key.INVALID_FILE_EXTENSION, ResponseMessage.Message.INVALID_FILE_EXTENSION), - invalidEncryptionFile( - ResponseMessage.Key.INVALID_ENCRYPTION_FILE, ResponseMessage.Message.INVALID_ENCRYPTION_FILE), - invalidSecurityLevel( - ResponseMessage.Key.INVALID_SECURITY_LEVEL, ResponseMessage.Message.INVALID_SECURITY_LEVEL), - invalidSecurityLevelLower( - ResponseMessage.Key.INVALID_SECURITY_LEVEL_LOWER, - ResponseMessage.Message.INVALID_SECURITY_LEVEL_LOWER), - defaultSecurityLevelConfigMissing( - ResponseMessage.Key.MISSING_DEFAULT_SECURITY_LEVEL, - ResponseMessage.Message.MISSING_DEFAULT_SECURITY_LEVEL), - invalidTenantSecurityLevelLower( - ResponseMessage.Key.INVALID_TENANT_SECURITY_LEVEL_LOWER, - ResponseMessage.Message.INVALID_TENANT_SECURITY_LEVEL_LOWER), - cannotDeleteUser( - ResponseMessage.Key.CANNOT_DELETE_USER, ResponseMessage.Message.CANNOT_DELETE_USER), - - cannotTransferOwnership( - ResponseMessage.Key.CANNOT_TRANSFER_OWNERSHIP, ResponseMessage.Message.CANNOT_TRANSFER_OWNERSHIP), - OK(200), - SUCCESS(200), - CLIENT_ERROR(400), - SERVER_ERROR(500), - RESOURCE_NOT_FOUND(404), - UNAUTHORIZED(401), - FORBIDDEN(403), - REDIRECTION_REQUIRED(302), - TOO_MANY_REQUESTS(429), - SERVICE_UNAVAILABLE(503), - PARTIAL_SUCCESS_RESPONSE(206), - IM_A_TEAPOT(418), - extendUserProfileNotLoaded( - ResponseMessage.Key.EXTENDED_USER_PROFILE_NOT_LOADED, - ResponseMessage.Message.EXTENDED_USER_PROFILE_NOT_LOADED), - roleProcessingInvalidOrgError( - ResponseMessage.Key.ROLE_PROCESSING_INVALID_ORG, - ResponseMessage.Message.ROLE_PROCESSING_INVALID_ORG); - private int responseCode; - /** error code contains String value */ - private String errorCode; - /** errorMessage contains proper error message. */ - private String errorMessage; - - /** - * @param errorCode String - * @param errorMessage String - */ - ResponseCode(String errorCode, String errorMessage) { - this.errorCode = errorCode; - this.errorMessage = errorMessage; - } - - /** @return */ - public String getErrorCode() { - return errorCode; - } - - /** @param errorCode */ - public void setErrorCode(String errorCode) { - this.errorCode = errorCode; - } - - /** @return */ - public String getErrorMessage() { - return errorMessage; - } - - ResponseCode(int responseCode) { - this.responseCode = responseCode; - } - - public int getResponseCode() { - return responseCode; - } - - public void setResponseCode(int responseCode) { - this.responseCode = responseCode; - } - - private static final Map responseCodeByCode = new HashMap<>(); - - static { - responseCodeByCode.put(200, ResponseCode.OK); - responseCodeByCode.put(400, ResponseCode.CLIENT_ERROR); - responseCodeByCode.put(500, ResponseCode.SERVER_ERROR); - responseCodeByCode.put(404, ResponseCode.RESOURCE_NOT_FOUND); - responseCodeByCode.put(401, ResponseCode.UNAUTHORIZED); - responseCodeByCode.put(403, ResponseCode.FORBIDDEN); - responseCodeByCode.put(302, ResponseCode.REDIRECTION_REQUIRED); - responseCodeByCode.put(429, ResponseCode.TOO_MANY_REQUESTS); - responseCodeByCode.put(503, ResponseCode.SERVICE_UNAVAILABLE); - responseCodeByCode.put(206, ResponseCode.PARTIAL_SUCCESS_RESPONSE); - responseCodeByCode.put(418, ResponseCode.IM_A_TEAPOT); - } - - public static ResponseCode getResponseCodeByCode(Integer code) { - ResponseCode responseCode = responseCodeByCode.get(code); - if (null != responseCode) { - return responseCode; - } else { - return ResponseCode.OK; - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java b/core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java deleted file mode 100644 index 260cc12f5a..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/exception/ResponseMessage.java +++ /dev/null @@ -1,222 +0,0 @@ -package org.sunbird.exception; - -import org.sunbird.keys.JsonKey; - -/** - * This interface will hold all the response key and message - * - * @author Manzarul - */ -public interface ResponseMessage { - - interface Message { - - String UNAUTHORIZED_USER = "You are not authorized."; - String INVALID_OPERATION_NAME = - "Operation name is invalid. Please provide a valid operation name"; - String INVALID_REQUESTED_DATA = "Requested data for this operation is not valid."; - String SUCCESS_MESSAGE = "Success"; - String ERROR_DUPLICATE_ENTRY = "Value {0} for {1} is already in use."; - String ERROR_PARAM_EXISTS = "{0} already exists"; - String ERROR_INVALID_OTP = "Invalid OTP."; - String DATA_TYPE_ERROR = "Data type of {0} should be {1}."; - String ERROR_ATTRIBUTE_CONFLICT = "Either pass attribute {0} or {1} but not both."; - String CHANNEL_REG_FAILED = "Channel Registration failed."; - String INVALID_PROPERTY_ERROR = "Invalid property {0}."; - String USER_ACCOUNT_BLOCKED = "User account has been blocked ."; - String DATA_SIZE_EXCEEDED = "Maximum upload data size should be {0}"; - String USER_STATUS_MSG = "User is already {0}."; - String DATA_FORMAT_ERROR = "Invalid format for given {0}."; - String INVALID_CSV_FILE = "Please provide valid csv file."; - String INVALID_DATA = "Incorrect data."; - String INVALID_OBJECT_TYPE = "Invalid Object Type."; - String EMPTY_CSV_FILE = "CSV file is Empty."; - String INTERNAL_ERROR = "Process failed, please try again later."; - String DB_INSERTION_FAIL = "DB Insertion Failed."; - String DB_UPDATE_FAIL = "DB Update Failed."; - String ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED = - "Please provide only email or phone or managed by"; - String ERROR_DUPLICATE_ENTRIES = "System contains duplicate entry for {0}."; - String RESOURCE_NOT_FOUND = "Requested {0} resource not found"; - String MAX_ALLOWED_SIZE_LIMIT_EXCEED = "Max allowed size is {0}"; - String INACTIVE_USER = "User is Inactive. Please make it active to proceed."; - String INVALID_VALUE = "Invalid {0}: {1}. Valid values are: {2}."; - String INVALID_PARAMETER = "Please provide valid {0}."; - String INVALID_LOCATION_DELETE_REQUEST = - "One or more locations have a parent reference to given location and hence cannot be deleted."; - String MANDATORY_PARAMETER_MISSING = "Mandatory parameter {0} is missing."; - String ERROR_MANDATORY_PARAMETER_EMPTY = "Mandatory parameter {0} is empty."; - String ERROR_NO_FRAMEWORK_FOUND = "No framework found."; - String UPDATE_NOT_ALLOWED = "Update of {0} is not allowed."; - String INVALID_PARAMETER_VALUE = - "Invalid value {0} for parameter {1}. Please provide a valid value."; - String PARENT_NOT_ALLOWED = "For top level location, {0} is not allowed."; - String MISSING_FILE_ATTACHMENT = "Missing file attachment."; - String FILE_ATTACHMENT_SIZE_NOT_CONFIGURED = "File attachment max size is not configured."; - String EMPTY_FILE = "Attached file is empty."; - String INVALID_COLUMNS = "Invalid column: {0}. Valid columns are: {1}."; - String CONFLICTING_ORG_LOCATIONS = - "An organisation cannot be associated to two conflicting locations ({0}, {1}) at {2} level. "; - String EMPTY_HEADER_LINE = "Missing header line in CSV file."; - String INVALID_REQUEST_PARAMETER = "Invalid parameter {0} in request."; - String ROOT_ORG_ASSOCIATION_ERROR = - "No root organisation found which is associated with given {0}."; - String OR_FORMAT = "{0} or {1}"; - String AND_FORMAT = "{0} and {1}"; - String DEPENDENT_PARAMETER_MISSING = "Missing parameter {0} which is dependent on {1}."; - String EXTERNALID_NOT_FOUND = - "External ID (id: {0}, idType: {1}, provider: {2}) not found for given user."; - String EXTERNAL_ID_FORMAT = "externalId (id: {0}, idType: {1}, provider: {2})"; - String EXTERNALID_ASSIGNED_TO_OTHER_USER = - "External ID (id: {0}, idType: {1}, provider: {2}) already assigned to another user."; - String DUPLICATE_EXTERNAL_IDS = - "Duplicate external IDs for given idType ({0}) and provider ({1})."; - String EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT = - "Email notification is not sent as the number of recipients exceeded configured limit ({0})."; - String PARAMETER_MISMATCH = "Mismatch of given parameters: {0}."; - String FORBIDDEN = "You are forbidden from accessing specified resource."; - String ERROR_CONFIG_LOAD_EMPTY_STRING = - "Loading {0} configuration failed as empty string is passed as parameter."; - String ERROR_CONFIG_LOAD_PARSE_STRING = - "Loading {0} configuration failed due to parsing error."; - String ERROR_CONFIG_LOAD_EMPTY_CONFIG = "Loading {0} configuration failed."; - String ERROR_NO_ROOT_ORG_ASSOCIATED = "Not able to associate with root org"; - String ERROR_UNSUPPORTED_CLOUD_STORAGE = "Unsupported cloud storage type {0}."; - String ERROR_UNSUPPORTED_FIELD = "Unsupported field {0}."; - String ERROR_INACTIVE_ORG = "Organisation corresponding to given {0} ({1}) is inactive."; - String ERROR_CONFLICTING_VALUES = "Conflicting values for {0} ({1}) and {2} ({3})."; - String ERROR_CONFLICTING_ROOT_ORG_ID = - "Root organisation channel of uploader user is conflicting with that of specified organisation ID/orgExternalId channel value."; - String ERROR_INVALID_PARAMETER_SIZE = - "Parameter {0} is of invalid size (expected: {1}, actual: {2})."; - String ERROR_RATE_LIMIT_EXCEEDED = - "Your per {0} rate limit has exceeded. You can retry after some time."; - String INVALID_REQUEST_TIMEOUT = "Invalid request timeout value {0}."; - String ERROR_USER_UPDATE_PASSWORD = "User is created but password couldn't be updated."; - String ERROR_USER_MIGRATION_FAILED = "User migration failed."; - String IDENTIFIER_VALIDATION_FAILED = - "Valid identifier is not present in List, Valid supported identifiers are "; - String PARAM_NOT_MATCH = "%s-NOT-MATCH"; - String MANDATORY_HEADER_PARAMETER_MISSING = "Mandatory header parameter {0} is missing."; - String RECOVERY_PARAM_MATCH_EXCEPTION = "{0} could not be same as {1}"; - String INVALID_PASSWORD = - "Password must contain a minimum of 8 characters including numerals, lower and upper case alphabets and special characters"; - String OTP_VERIFICATION_FAILED = "OTP verification failed. Remaining attempt count is {0}."; - String SERVICE_UNAVAILABLE = "SERVICE UNAVAILABLE"; - String MANAGED_BY_NOT_ALLOWED = "managedBy cannot be updated."; - String MANAGED_USER_LIMIT_EXCEEDED = "Managed user creation limit exceeded"; - String INVALID_CAPTCHA = "Captcha is invalid"; - String DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED = "Declared user error status is not updated"; - String DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED = - "Declared user validated status is not updated"; - String INVALID_CONSENT_STATUS = "Consent status is invalid"; - String USER_TYPE_CONFIG_IS_EMPTY = "userType config is empty for the statecode {0}"; - String SERVER_ERROR = "server error"; - String EXTENDED_USER_PROFILE_NOT_LOADED = - "Failed to load extendedProfileSchemaConfig from System_Settings table"; - String ROLE_PROCESSING_INVALID_ORG = - "Error while processing assign role. Invalid Organisation Id"; - String INVALID_FILE_EXTENSION = "Please provide a valid file. File expected of format: {0}"; - String INVALID_ENCRYPTION_FILE = "Please provide valid public key file."; - String INVALID_SECURITY_LEVEL = - "Invalid data security level {0} provided for job {1}. Please provide a valid data security level."; - String INVALID_SECURITY_LEVEL_LOWER = - "Invalid data security level {0} provided for job {1}. Cannot be set lower than the default security level: {2}"; - String MISSING_DEFAULT_SECURITY_LEVEL = - "Default data security policy settings is missing for the job: {0}"; - String INVALID_TENANT_SECURITY_LEVEL_LOWER = - "Tenant level's security {0} cannot be lower than system level's security {1}. Please provide a valid data security level."; - String CANNOT_DELETE_USER = "User is restricted from deleting account based on roles!"; - String CANNOT_TRANSFER_OWNERSHIP = "User is restricted from transfering the ownership based on roles!"; - } - - interface Key { - String SUCCESS_MESSAGE = "0001"; - String ERROR_PARAM_EXISTS = "0002"; - String DATA_TYPE_ERROR = "0003"; - String ERROR_DUPLICATE_ENTRY = "0004"; - String ERROR_ATTRIBUTE_CONFLICT = "0005"; - String USER_ACCOUNT_BLOCKED = "0006"; - String DATA_SIZE_EXCEEDED = "0007"; - String USER_STATUS_MSG = "0008"; - String DATA_FORMAT_ERROR = "0009"; - String EMPTY_CSV_FILE = "0010"; - String ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED = "0011"; - String CHANNEL_REG_FAILED = "0012"; - String RESOURCE_NOT_FOUND = "0013"; - String MAX_ALLOWED_SIZE_LIMIT_EXCEED = "0014"; - String INTERNAL_ERROR = "0015"; - String DB_INSERTION_FAIL = "0016"; - String DB_UPDATE_FAIL = "0017"; - - String INVALID_PARAMETER_VALUE = "0018"; - String INVALID_VALUE = "0019"; - String INVALID_PARAMETER = "0020"; - String INVALID_COLUMNS = "0021"; - String INVALID_REQUEST_PARAMETER = "0022"; - String INVALID_REQUEST_TIMEOUT = "0023"; - String VALID_IDENTIFIER_ABSENSE = "0024"; - String INVALID_PASSWORD = "0025"; - String INVALID_CAPTCHA = "0026"; - String INVALID_CONSENT_STATUS = "0027"; - String INVALID_OPERATION_NAME = "0028"; - String INVALID_REQUESTED_DATA = "0029"; - String INVALID_LOCATION_DELETE_REQUEST = "0030"; - String MANDATORY_PARAMETER_MISSING = "0031"; - String ERROR_MANDATORY_PARAMETER_EMPTY = "0031"; - String ERROR_NO_FRAMEWORK_FOUND = "0032"; - String UPDATE_NOT_ALLOWED = "0033"; - String PARENT_NOT_ALLOWED = "0034"; - String MISSING_FILE_ATTACHMENT = "0035"; - String FILE_ATTACHMENT_SIZE_NOT_CONFIGURED = "0036"; - String EMPTY_FILE = "0037"; - String CONFLICTING_ORG_LOCATIONS = "0038"; - String EMPTY_HEADER_LINE = "0039"; - String ROOT_ORG_ASSOCIATION_ERROR = "0040"; - String DEPENDENT_PARAMETER_MISSING = "0041"; - String EXTERNALID_ASSIGNED_TO_OTHER_USER = "0042"; - String DUPLICATE_EXTERNAL_IDS = "0043"; - String EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT = "0044"; - String PARAMETER_MISMATCH = "0045"; - String ERROR_CONFIG_LOAD_EMPTY_STRING = "0046"; - String ERROR_CONFIG_LOAD_PARSE_STRING = "0047"; - String ERROR_CONFIG_LOAD_EMPTY_CONFIG = "0048"; - String ERROR_NO_ROOT_ORG_ASSOCIATED = "0049"; - String ERROR_UNSUPPORTED_CLOUD_STORAGE = "0050"; - String ERROR_UNSUPPORTED_FIELD = "0051"; - String INVALID_PROPERTY_ERROR = "0052"; - String ERROR_INACTIVE_ORG = "0053"; - String ERROR_DUPLICATE_ENTRIES = "0054"; - String ERROR_CONFLICTING_VALUES = "0055"; - String ERROR_CONFLICTING_ROOT_ORG_ID = "0056"; - String ERROR_INVALID_OTP = "0057"; - String ERROR_INVALID_PARAMETER_SIZE = "0058"; - String ERROR_RATE_LIMIT_EXCEEDED = "0059"; - String ERROR_USER_MIGRATION_FAILED = "0060"; - String MANDATORY_HEADER_PARAMETER_MISSING = "0061"; - String RECOVERY_PARAM_MATCH_EXCEPTION = "0062"; - String OTP_VERIFICATION_FAILED = "0063"; - String SERVICE_UNAVAILABLE = "0064"; - String MANAGED_BY_NOT_ALLOWED = "0065"; - String MANAGED_USER_LIMIT_EXCEEDED = "0066"; - String DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED = "0067"; - String DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED = "0068"; - String SERVER_ERROR = JsonKey.USER_ORG_SERVICE_PREFIX + "0069"; - String UNAUTHORIZED_USER = JsonKey.USER_ORG_SERVICE_PREFIX + "0070"; - String FORBIDDEN = "0071"; - String INVALID_OBJECT_TYPE = "0072"; - String INACTIVE_USER = "0073"; - String INVALID_CSV_FILE = "0074"; - String EXTENDED_USER_PROFILE_NOT_LOADED = "0075"; - String ROLE_PROCESSING_INVALID_ORG = "0076"; - String INVALID_FILE_EXTENSION = "0077"; - String INVALID_ENCRYPTION_FILE = "0078"; - String INVALID_SECURITY_LEVEL = "0079"; - String INVALID_SECURITY_LEVEL_LOWER = "0080"; - String MISSING_DEFAULT_SECURITY_LEVEL = "0081"; - String INVALID_TENANT_SECURITY_LEVEL_LOWER = "0082"; - String CANNOT_DELETE_USER = "0083"; - String CANNOT_TRANSFER_OWNERSHIP = "0084"; - String INVALID_DATA = "INVALID DATA"; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java b/core/platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java deleted file mode 100644 index 5f3c2314af..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java +++ /dev/null @@ -1,252 +0,0 @@ -package org.sunbird.http; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import org.apache.commons.collections.MapUtils; -import org.apache.http.*; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpDelete; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPatch; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.conn.ConnectionKeepAliveStrategy; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.message.BasicHeaderElementIterator; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.protocol.HTTP; -import org.apache.http.util.EntityUtils; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; - -public class HttpClientUtil { - private static final LoggerUtil logger = new LoggerUtil(HttpClientUtil.class); - - private static CloseableHttpClient httpclient = null; - private static HttpClientUtil httpClientUtil; - - private HttpClientUtil() { - ConnectionKeepAliveStrategy keepAliveStrategy = - (response, context) -> { - HeaderElementIterator it = - new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE)); - while (it.hasNext()) { - HeaderElement he = it.nextElement(); - String param = he.getName(); - String value = he.getValue(); - if (value != null && param.equalsIgnoreCase("timeout")) { - return Long.parseLong(value) * 1000; - } - } - return 180 * 1000; - }; - - PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); - connectionManager.setMaxTotal(200); - connectionManager.setDefaultMaxPerRoute(150); - connectionManager.closeIdleConnections(180, TimeUnit.SECONDS); - httpclient = - HttpClients.custom() - .setConnectionManager(connectionManager) - .useSystemProperties() - .setKeepAliveStrategy(keepAliveStrategy) - .build(); - } - - public static HttpClientUtil getInstance() { - if (httpClientUtil == null) { - synchronized (HttpClientUtil.class) { - if (httpClientUtil == null) { - httpClientUtil = new HttpClientUtil(); - } - } - } - return httpClientUtil; - } - - public static String get(String requestURL, Map headers, RequestContext context) { - CloseableHttpResponse response = null; - try { - HttpGet httpGet = new HttpGet(requestURL); - if (MapUtils.isNotEmpty(headers)) { - for (Map.Entry entry : headers.entrySet()) { - httpGet.addHeader(entry.getKey(), entry.getValue()); - } - } - response = httpclient.execute(httpGet); - return getResponse(response, context, "GET"); - } catch (Exception ex) { - logger.error(context, "Exception occurred while calling get method", ex); - return ""; - } finally { - closeResponse(response, context, "GET"); - } - } - - public static String post( - String requestURL, String params, Map headers, RequestContext context) { - CloseableHttpResponse response = null; - try { - HttpPost httpPost = new HttpPost(requestURL); - if (MapUtils.isNotEmpty(headers)) { - for (Map.Entry entry : headers.entrySet()) { - httpPost.addHeader(entry.getKey(), entry.getValue()); - } - } - StringEntity entity = new StringEntity(params,ContentType.APPLICATION_JSON); - httpPost.setEntity(entity); - - response = httpclient.execute(httpPost); - return getResponse(response, context, "POST"); - } catch (Exception ex) { - logger.error(context, "Exception occurred while calling Post method", ex); - return ""; - } finally { - closeResponse(response, context, "POST"); - } - } - - public static String postFormData( - String requestURL, - Map params, - Map headers, - RequestContext context) { - CloseableHttpResponse response = null; - try { - HttpPost httpPost = new HttpPost(requestURL); - if (MapUtils.isNotEmpty(headers)) { - for (Map.Entry entry : headers.entrySet()) { - httpPost.addHeader(entry.getKey(), entry.getValue()); - } - } - - List form = new ArrayList<>(); - for (Map.Entry entry : params.entrySet()) { - form.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); - } - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form, Consts.UTF_8); - - httpPost.setEntity(entity); - - response = httpclient.execute(httpPost); - return getResponse(response, context, "postFormData"); - } catch (Exception ex) { - logger.error(context, "Exception occurred while calling postFormData method", ex); - return ""; - } finally { - closeResponse(response, context, "postFormData"); - } - } - - public static String patch( - String requestURL, String params, Map headers, RequestContext context) { - CloseableHttpResponse response = null; - try { - HttpPatch httpPatch = new HttpPatch(requestURL); - if (MapUtils.isNotEmpty(headers)) { - for (Map.Entry entry : headers.entrySet()) { - httpPatch.addHeader(entry.getKey(), entry.getValue()); - } - } - StringEntity entity = new StringEntity(params, ContentType.APPLICATION_JSON); - httpPatch.setEntity(entity); - - response = httpclient.execute(httpPatch); - return getResponse(response, context, "PATCH"); - } catch (Exception ex) { - logger.error(context, "Exception occurred while calling patch method", ex); - return ""; - } finally { - closeResponse(response, context, "PATCH"); - } - } - - public static String delete( - String requestURL, Map headers, RequestContext context) { - CloseableHttpResponse response = null; - try { - HttpDelete httpDelete = new HttpDelete(requestURL); - if (MapUtils.isNotEmpty(headers)) { - for (Map.Entry entry : headers.entrySet()) { - httpDelete.addHeader(entry.getKey(), entry.getValue()); - } - } - response = httpclient.execute(httpDelete); - return getResponse(response, context, "DELETE"); - } catch (Exception ex) { - logger.error(context, "Exception occurred while calling delete method", ex); - return ""; - } finally { - closeResponse(response, context, "DELETE"); - } - } - - private static String getResponse( - CloseableHttpResponse response, RequestContext context, String method) throws IOException { - int status = response.getStatusLine().getStatusCode(); - if (status >= 200 && status < 300) { - HttpEntity httpEntity = response.getEntity(); - StatusLine sl = response.getStatusLine(); - logger.debug( - context, - "Response from " - + method - + " call : " - + sl.getStatusCode() - + " - " - + sl.getReasonPhrase()); - if (null != httpEntity) { - byte[] bytes = EntityUtils.toByteArray(httpEntity); - String resp = new String(bytes); - logger.info(context, "Got response from " + method + " call : " + resp); - return resp; - } else { - return ""; - } - } else { - getErrorResponse(response, method, context); - return ""; - } - } - - private static void getErrorResponse( - CloseableHttpResponse response, String method, RequestContext context) { - try { - HttpEntity httpEntity = response.getEntity(); - byte[] bytes = EntityUtils.toByteArray(httpEntity); - StatusLine sl = response.getStatusLine(); - String resp = new String(bytes); - logger.info( - context, - "Response from : " - + method - + " call " - + resp - + " status " - + sl.getStatusCode() - + " - " - + sl.getReasonPhrase()); - } catch (Exception ex) { - logger.error(context, "Exception occurred while fetching response for method " + method, ex); - } - } - - private static void closeResponse( - CloseableHttpResponse response, RequestContext context, String method) { - if (null != response) { - try { - response.close(); - } catch (Exception ex) { - logger.error( - context, "Exception occurred while closing " + method + " response object", ex); - } - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java b/core/platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java deleted file mode 100644 index be78a220ef..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.sunbird.kafka; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.telemetry.dto.TelemetryBJREvent; - -public class InstructionEventGenerator { - - private static LoggerUtil logger = new LoggerUtil(InstructionEventGenerator.class); - - private static ObjectMapper mapper = new ObjectMapper(); - private static String beJobRequesteventId = "BE_JOB_REQUEST"; - private static int iteration = 1; - - private static String actorId = "Sunbird LMS Flink Job"; - private static String actorType = "System"; - private static String pdataId = "org.sunbird.platform"; - private static String pdataVersion = "1.0"; - - public static void pushInstructionEvent(String topic, Map data) throws Exception { - pushInstructionEvent("", topic, data); - } - - public static void pushInstructionEvent(String key, String topic, Map data) - throws Exception { - String beJobRequestEvent = generateInstructionEventMetadata(data); - if (StringUtils.isBlank(beJobRequestEvent)) { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - "Event is not generated properly.", - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - if (StringUtils.isNotBlank(topic)) { - if (StringUtils.isNotBlank(key)) KafkaClient.send(key, beJobRequestEvent, topic); - else KafkaClient.send(beJobRequestEvent, topic); - } else { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - "Invalid topic id.", - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - private static String generateInstructionEventMetadata(Map data) { - Map actor = new HashMap<>(); - Map context = new HashMap<>(); - Map object = new HashMap<>(); - Map edata = new HashMap<>(); - if (MapUtils.isNotEmpty((Map) data.get("actor"))) { - actor.putAll((Map) data.get("actor")); - } else { - actor.put("id", actorId); - actor.put("type", actorType); - } - - if (MapUtils.isNotEmpty((Map) data.get("context"))) { - context.putAll((Map) data.get("context")); - } - Map pdata = new HashMap<>(); - pdata.put("id", pdataId); - pdata.put("ver", pdataVersion); - context.put("pdata", pdata); - context.put(JsonKey.CDATA,data.get(JsonKey.CDATA)); - if (MapUtils.isNotEmpty((Map) data.get("object"))) object.putAll((Map) data.get("object")); - - if (MapUtils.isNotEmpty((Map) data.get("edata"))) edata.putAll((Map) data.get("edata")); - if (StringUtils.isNotBlank((String) data.get("action"))) - edata.put("action", data.get("action")); - return logInstructionEvent(actor, context, object, edata); - } - - private static String logInstructionEvent( - Map actor, - Map context, - Map object, - Map edata) { - - TelemetryBJREvent te = new TelemetryBJREvent(); - long unixTime = System.currentTimeMillis(); - String mid = "LP." + System.currentTimeMillis() + "." + UUID.randomUUID(); - edata.put("iteration", iteration); - - te.setEid(beJobRequesteventId); - te.setEts(unixTime); - te.setMid(mid); - te.setActor(actor); - te.setContext(context); - te.setObject(object); - te.setEdata(edata); - - String jsonMessage = null; - try { - jsonMessage = mapper.writeValueAsString(te); - } catch (Exception e) { - logger.error("Error logging BE_JOB_REQUEST event: " + e.getMessage(), e); - } - return jsonMessage; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java b/core/platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java deleted file mode 100644 index 2564c01ca1..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.sunbird.kafka; - -import java.util.List; -import java.util.Map; -import java.util.Properties; -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.consumer.ConsumerConfig; -import org.apache.kafka.clients.consumer.KafkaConsumer; -import org.apache.kafka.clients.producer.KafkaProducer; -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.common.PartitionInfo; -import org.apache.kafka.common.serialization.StringDeserializer; -import org.apache.kafka.common.serialization.StringSerializer; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.ProjectUtil; - -/** - * Helper class for creating a Kafka consumer and producer. - * - * @author Pradyumna - */ -public class KafkaClient { - - public static LoggerUtil logger = new LoggerUtil(KafkaClient.class); - - private static final String BOOTSTRAP_SERVERS = ProjectUtil.getConfigValue("kafka_urls"); - private static Producer producer; - private static Consumer consumer; - private static volatile Map> topics; - - static { - loadProducerProperties(); - loadConsumerProperties(); - loadTopics(); - } - - private static void loadProducerProperties() { - Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); - props.put(ProducerConfig.CLIENT_ID_CONFIG, "KafkaClientProducer"); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); - props.put(ProducerConfig.LINGER_MS_CONFIG, ProjectUtil.getConfigValue("kafka_linger_ms")); - producer = new KafkaProducer(props); - } - - private static void loadTopics() { - if (consumer == null) { - loadConsumerProperties(); - } - topics = consumer.listTopics(); - logger.info("KafkaClient:loadTopics Kafka topic info" + topics); - } - - private static void loadConsumerProperties() { - Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); - props.put(ConsumerConfig.CLIENT_ID_CONFIG, "KafkaClientConsumer"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); - consumer = new KafkaConsumer<>(props); - } - - public static Producer getProducer() { - return producer; - } - - public static Consumer getConsumer() { - return consumer; - } - - public static void send(String event, String topic) throws Exception { - if (validate(topic)) { - final Producer producer = getProducer(); - ProducerRecord record = new ProducerRecord(topic, event); - producer.send(record); - } else { - logger.info("Topic id: " + topic + ", does not exists."); - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - "Topic id: " + topic + ", does not exists.", - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - public static void send(String key, String event, String topic) { - if (validate(topic)) { - final Producer producer = getProducer(); - ProducerRecord record = new ProducerRecord(topic, key, event); - producer.send(record); - } else { - logger.info("Topic id: " + topic + ", does not exists."); - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - "Topic id: " + topic + ", does not exists.", - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - private static boolean validate(String topic) { - if (topics == null) { - loadTopics(); - } - return topics.keySet().contains(topic); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java b/core/platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java deleted file mode 100644 index ec028b3e2b..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.sunbird.keys; - -/** - * Constants for Bulk Upload service. - * - * @author Arvind - */ -public class BulkUploadJsonKey { - - private BulkUploadJsonKey() {} - - public static final String TASK_COUNT = "taskCount"; - public static final String SEQUENCE_ID = "sequenceId"; - public static final String OPERATION_STATUS_MSG = "Operation is {0}."; - public static final String NOT_STARTED = "NOT STARTED"; - public static final String IN_PROGRESS = "IN PROGRESS"; - public static final String COMPLETED = "COMPLETED"; -} diff --git a/core/platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java b/core/platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java deleted file mode 100644 index 4f3dee01cd..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.sunbird.keys; - -/** Created by arvind on 19/4/18. */ -public class GeoLocationJsonKey { - - private GeoLocationJsonKey() {} - - public static final String PARENT_CODE = "parentCode"; - public static final String CODE = "code"; - public static final String LOCATION_TYPE = "type"; - public static final String PARENT_ID = "parentId"; - public static final String SUNBIRD_VALID_LOCATION_TYPES = "sunbird_valid_location_types"; - public static final String PROPERTY_NAME = "name"; - public static final String PROPERTY_VALUE = "value"; - public static final String ID = "id"; -} diff --git a/core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java b/core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java deleted file mode 100644 index 591214dd22..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/keys/JsonKey.java +++ /dev/null @@ -1,692 +0,0 @@ -package org.sunbird.keys; - -import java.util.Arrays; -import java.util.List; - -/** - * This class will contains all the key related to request and response. - * - * @author Manzarul - */ -public final class JsonKey { - public static final String ANONYMOUS = "Anonymous"; - public static final String UNAUTHORIZED = "Unauthorized"; - public static final String AUTH_ENABLED = "AuthenticationEnabled"; - public static final String ACCOUNT_KEY = "sunbird_account_key"; - public static final String IS_FORM_VALIDATION_REQUIRED = "isFormValidationRequired"; - public static final String USER_PROFILE_CONFIG_MAP = "userProfileConfigMap"; - public static final String ACCOUNT_NAME = "sunbird_account_name"; - - public static final String ACCOUNT_ENDPOINT = "sunbird_account_endpoint"; - public static final String DOWNLOAD_LINK_EXPIRY_TIMEOUT = "download_link_expiry_timeout"; - public static final String ACTION_GROUP = "action_group"; - public static final String ACTION_GROUPS = "actionGroups"; - public static final String ACTION_NAME = "actionName"; - public static final String ACTION_URL = "actionUrl"; - public static final String ACTIONS = "actions"; - public static final String ACTIVE = "active"; - public static final String ACTOR_ID = "actorId"; - public static final String ACTOR_SERVICE = "Actor service"; - public static final String ACTOR_TYPE = "actorType"; - public static final String ADDITIONAL_INFO = "ADDITIONAL_INFO"; - public static final String ADDRESS = "address"; - public static final String ALLOWED_LOGIN = "allowedLogin"; - public static final String API_ACCESS = "api_access"; - public static final String API_CALL = "API_CALL"; - public static final String ASSOCIATION_TYPE = "associationType"; - public static final String ATTEMPTED_COUNT = "attemptedCount"; - public static final String AUTH_WITH_MASTER_KEY = "authWithMasterKey"; - public static final String BEARER = "Bearer "; - public static final String BODY = "body"; - public static final String BULK_OP_DB = "BulkOpDb"; - public static final String BULK_UPLOAD_ORG_DATA_SIZE = "bulk_upload_org_data_size"; - public static final String BULK_UPLOAD_USER_DATA_SIZE = "sunbird_user_bulk_upload_size"; - public static final String BULK_USER_UPLOAD = "bulkUserUpload"; - public static final String BULK_LOCATION_UPLOAD = "bulkLocationUpload"; - public static final String CASSANDRA_SERVICE = "Cassandra service"; - public static final String CATEGORIES = "categories"; - public static final String CHANNEL = "channel"; - public static final String CHECKS = "checks"; - public static final String CLASS = "class"; - public static final String CODE = "code"; - public static final String COMPLETENESS = "completeness"; - public static final String CONSUMER = "consumer"; - public static final String CONTACT_DETAILS = "contactDetail"; - public static final String CONTAINER = "container"; - public static final String CONTENT = "content"; - public static final String CONTENT_ID = "contentId"; - public static final String CONTEXT = "context"; - public static final String CORRELATED_OBJECTS = "correlatedObjects"; - public static final String COUNT = "count"; - public static final String COUNTRY_CODE = "countryCode"; - public static final String COURSE_ID = "courseId"; - public static final String COURSE_NAME = "courseName"; - public static final String CREATE = "create"; - public static final String CREATED_BY = "createdBy"; - public static final String CREATED_DATE = "createdDate"; - public static final String CURRENT_STATE = "CURRENT_STATE"; - public static final String DATA = "data"; - public static final String KEY = "key"; - public static final String KEYS = "keys"; - public static final String DATE_HISTOGRAM = "DATE_HISTOGRAM"; - public static final String DEFAULT_CONSUMER_ID = "internal"; - public static final String DEFAULT_ROOT_ORG_ID = "ORG_001"; - public static final String DELETE = "delete"; - public static final String DESCRIPTION = "description"; - public static final String DOB = "dob"; - public static final String EDUCATION = "education"; - public static final String ANALYTICS_API_BASE_URL = "sunbird_analytics_api_base_url"; - public static final String SUNBIRD_CONTENT_SERVICE_API_BASE_URL = - "sunbird_content_service_api_base_url"; - public static final String SUNBIRD_CHANNEL_CREATE_API_URL = "sunbird.channel.create.api.url"; - public static final String SUNBIRD_CHANNEL_UPDATE_API_URL = "sunbird.channel.update.api.url"; - public static final String EKSTEP_TAG_API_URL = "ekstep.tag.api.url"; - public static final String EMAIL = "email"; - public static final String EMAIL_REQUEST = "emailReq"; - public static final String EMAIL_SERVER_FROM = "sunbird_mail_server_from_email"; - public static final String EMAIL_SERVER_HOST = "sunbird_mail_server_host"; - public static final String EMAIL_SERVER_PASSWORD = "sunbird_mail_server_password"; - public static final String EMAIL_SERVER_PORT = "sunbird_mail_server_port"; - public static final String EMAIL_SERVER_USERNAME = "sunbird_mail_server_username"; - public static final String EMAIL_TEMPLATE_TYPE = "emailTemplateType"; - public static final String EMAIL_UNIQUE = "emailUnique"; - public static final String EMAIL_VERIFIED = "emailVerified"; - public static final String ENC_EMAIL = "encEmail"; - public static final String ENC_PHONE = "encPhone"; - public static final String ENCRYPTION_KEY = "sunbird_encryption_key"; - public static final String END_DATE = "endDate"; - public static final String ENV = "env"; - public static final String ERR_TYPE = "errtype"; - public static final String ERROR = "err"; - public static final String ERROR_MSG = "err_msg"; - public static final String ERRORMSG = "errmsg"; - public static final String ES_SERVICE = "Elastic search service"; - public static final String EXISTS = "exists"; - public static final String EXTERNAL_ID = "externalId"; - public static final String FACETS = "facets"; - public static final String FAILED = "FAILED"; - public static final String FAILURE_RESULT = "failureResult"; - public static final String FIELD = "field"; - public static final String FIELDS = "fields"; - public static final String FILE = "file"; - public static final String FILE_NAME = "fileName"; - public static final String FILTERS = "filters"; - public static final String FIRST_NAME = "firstName"; - public static final String FRAMEWORK = "framework"; - public static final String FROM_EMAIL = "fromEmail"; - public static final String GROUP_QUERY = "groupQuery"; - public static final String HASHTAGID = "hashTagId"; - public static final String HEADER = "header"; - public static final String Healthy = "healthy"; - public static final String HOME_URL = "homeUrl"; - public static final String ID = "id"; - public static final String IDENTIFIER = "identifier"; - public static final String INACTIVE = "inactive"; - public static final String INFO = "info"; - public static final String INSERT = "insert"; - public static final String IS_SSO = "isSSO"; - public static final String IS_SELF_DECLARATION = "isSelfDeclaration"; - public static final String IS_SYSTEM_UPLOAD = "isSystemUpload"; - public static final String IS_AUTH_REQ = "isAuthReq"; - public static final String IS_BLOCKED = "isBlocked"; - public static final String IS_DELETED = "isDeleted"; - public static final String JOB_PROFILE = "jobProfile"; - public static final String LANGUAGE = "language"; - public static final String LAST_LOGIN_TIME = "lastLoginTime"; - public static final String LAST_NAME = "lastName"; - public static final String LEARNER_SERVICE = "UserOrg service"; - public static final String LEVEL = "level"; - public static final String LIMIT = "limit"; - public static final String LIST = "List"; - public static final String LOC_ID = "locationId"; - public static final String LOCATION = "location"; - public static final String LOCATION_NAME = "locationName"; - public static final String LOCATION_ID = "locationId"; - public static final String LOCATION_IDS = "locationIds"; - public static final String LOCATIONS = "locations"; - public static final String LOG_LEVEL = "logLevel"; - public static final String LOG_TYPE = "logType"; - public static final String LOGIN_ID = "loginId"; - public static final String MAIL_NOTE = "mail_note"; - public static final String MANDATORY_FIELDS = "mandatoryFields"; - public static final String MAP = "map"; - public static final String MASKED_EMAIL = "maskedEmail"; - public static final String MASKED_PHONE = "maskedPhone"; - public static final String MESSAGE = "message"; - public static final String MESSAGE_ID = "X-msgId"; - public static final String METHOD = "method"; - public static final String MISSING_FIELDS = "missingFields"; - public static final String MOBILE = "mobile"; - public static final String NAME = "name"; - public static final String NOT_EXISTS = "not_exists"; - public static final String NOTE = "note"; - public static final String NOTE_ID = "noteId"; - public static final String NOTIFICATION = "notification"; - public static final String OBJECT_IDS = "objectIds"; - public static final String OBJECT_TYPE = "objectType"; - public static final String OFFSET = "offset"; - public static final String ON = "ON"; - public static final String ONBOARDING_WELCOME_MAIL_BODY = "onboarding_welcome_mail_body"; - public static final String OPERATION = "operation"; - public static final String OPERATION_FOR = "operationFor"; - public static final String OPERATION_TYPE = "operationType"; - public static final String ORDER = "order"; - public static final String ORG_EXT_ID_DB = "org_external_identity"; - public static final String ORG_DB = "org_db"; - public static final String ORG_ID = "orgId"; - public static final String ORG_IMAGE_URL = "orgImageUrl"; - public static final String ORG_JOIN_DATE = "orgJoinDate"; - public static final String ORG_NAME = "orgName"; - public static final String ORG_TYPE = "organisationType"; - public static final String ORGANISATION = "organisation"; - public static final String ORGANISATION_ID = "organisationId"; - public static final String ORGANISATION_NAME = "orgName"; - public static final String ORGANISATIONS = "organisations"; - public static final String OTP = "otp"; - public static final String OTP_EMAIL_RESET_PASSWORD_TEMPLATE = "otpEmailResetPasswordTemplate"; - public static final String OTP_PHONE_RESET_PASSWORD_TEMPLATE = "otpPhoneResetPasswordTemplate"; - public static final String VERIFY_PHONE_OTP_TEMPLATE = "verifyPhoneOtpTemplate"; - public static final String OTP_DELETE_USER_EMAIL_TEMPLATE = "otpEmailDeleteUserTemplate"; - public static final String OTP_DELETE_USER_TEMPLATE_ID = "otpDeleteUserTemplate"; - public static final String PARAMS = "params"; - public static final String PASSWORD = "password"; - - public static final String PHONE = "phone"; - public static final String PHONE_UNIQUE = "phoneUnique"; - public static final String PHONE_VERIFIED = "phoneVerified"; - public static final String POSITION = "position"; - public static final String PREV_STATE = "PREV_STATE"; - public static final String PRIVATE = "private"; - public static final String PROCESS_ID = "processId"; - public static final String PROFILE_CONFIG = "profileConfig_v2"; - - public static final String PROCESS_START_TIME = "processStartTime"; - public static final String PDATA_ID = "telemetry_pdata_id"; - public static final String PDATA_PID = "telemetry_pdata_pid"; - public static final String PDATA_VERSION = "telemetry_pdata_ver"; - public static final String PROFILE_SUMMARY = "profileSummary"; - public static final String PROFILE_VISIBILITY = "profileVisibility"; - public static final String PROPS = "props"; - public static final String PROVIDER = "provider"; - public static final String PUBLIC = "public"; - public static final String QUERY = "query"; - public static final String QUERY_FIELDS = "queryFields"; - public static final String RECIPIENT_EMAILS = "recipientEmails"; - public static final String RECIPIENT_USERIDS = "recipientUserIds"; - public static final String REGISTERED_ORG = "registeredOrg"; - public static final String REGISTERED_ORG_ID = "regOrgId"; - public static final String RELATION = "relation"; - public static final String REPLACE_WITH_ASTERISK = "*"; - public static final String REQUEST = "request"; - public static final String REQUEST_TYPE = "requestType"; - public static final String REQUESTED_BY = "requestedBy"; - public static final String RESPONSE = "response"; - public static final String RESULT = "result"; - public static final String ROLE = "role"; - public static final String ROLE_GROUP = "role_group"; - public static final String ROLES = "roles"; - public static final String ROLLUP = "rollup"; - public static final String ROOT_ORG = "rootOrg"; - public static final String ROOT_ORG_ID = "rootOrgId"; - public static final String SEARCH_TOP_N = "searchTopN"; - public static final String SIZE = "size"; - public static final String SLUG = "slug"; - public static final String SORT = "sort"; - public static final String SORT_BY = "sort_by"; - public static final String SOURCE = "source"; - public static final String SSO_CLIENT_ID = "sso.client.id"; - public static final String SSO_CLIENT_SECRET = "sso.client.secret"; - public static final String SSO_PASSWORD = "sso.password"; - public static final String SSO_POOL_SIZE = "sso.connection.pool.size"; - public static final String SSO_PUBLIC_KEY = "sunbird_sso_publickey"; - public static final String SSO_REALM = "sso.realm"; - public static final String SSO_URL = "sso.url"; - public static final String SSO_USERNAME = "sso.username"; - public static final String STACKTRACE = "stacktrace"; - public static final String STACKTRACE_CHAR_LENGTH = "stacktrace_char_length"; - public static final String START_DATE = "startDate"; - public static final String START_TIME = "startTime"; - public static final String STATE = "state"; - public static final String STATUS = "status"; - public static final String SUBJECT = "subject"; - public static final String SUCCESS = "SUCCESS"; - public static final String SUCCESS_RESULT = "successResult"; - public static final String SUNBIRD = "sunbird"; - public static final String SUNBIRD_ALLOWED_LOGIN = "sunbird_allowed_login"; - public static final String SUNBIRD_API_BASE_URL = "sunbird_api_base_url"; - public static final String SUNBIRD_CASSANDRA_IP = "sunbird_cassandra_host"; - public static final String SUNBIRD_ENCRYPTION = "sunbird_encryption"; - public static final String SUNBIRD_ENV_LOGO_URL = "sunbird_env_logo_url"; - public static final String SUNBIRD_ES_CHANNEL = "es.channel.name"; - public static final String SUNBIRD_ES_CLUSTER = "sunbird_es_cluster"; - public static final String SUNBIRD_ES_IP = "sunbird_es_host"; - public static final String SUNBIRD_ES_PORT = "sunbird_es_port"; - public static final String ES_COURSE_INDEX = "es_course_index"; - public static final String ES_COURSE_BATCH_INDEX = "es_course_batch_index"; - public static final String SUNBIRD_INSTALLATION = "sunbird_installation"; - public static final String SUNBIRD_SSO_CLIENT_ID = "sunbird_sso_client_id"; - public static final String SUNBIRD_SSO_CLIENT_SECRET = "sunbird_sso_client_secret"; - public static final String SUNBIRD_SSO_PASSWORD = "sunbird_sso_password"; - public static final String SUNBIRD_SSO_RELAM = "sunbird_sso_realm"; - public static final String SUNBIRD_SSO_URL = "sunbird_sso_url"; - public static final String SUNBIRD_SSO_USERNAME = "sunbird_sso_username"; - public static final String SUNBIRD_FRAMEWORK_READ_API = "sunbird_framework_read_api"; - public static final String SUNBIRD_USERNAME_NUM_DIGITS = "sunbird_username_num_digits"; - public static final String SYSTEM = "system"; - public static final String SYSTEM_SETTINGS_DB = "system_settings"; - public static final String TAGS = "tags"; - public static final String TARGET_OBJECT = "targetObject"; - public static final String TELEMETRY_EVENT_TYPE = "telemetryEventType"; - public static final String TEMPORARY_PASSWORD = "tempPassword"; - public static final String TENANT_PREFERENCE = "tenantPreference"; - public static final String TENANT_PREFERENCE_DB = "tenantPreferenceDb"; - public static final String TERM_AND_CONDITION_STATUS = "tcStatus"; - public static final String TERMS = "terms"; - public static final String TITLE = "title"; - public static final String TOKEN = "token"; - public static final String TOPIC = "topic"; - public static final String TOPICS = "topics"; - public static final String TOPN = "topn"; - public static final String TYPE = "type"; - public static final String SUB_TYPE = "subType"; - public static final String TNC_TYPE = "tncType"; - public static final String UNDEFINED_IDENTIFIER = "Undefined column name "; - public static final String UNKNOWN_IDENTIFIER = "Unknown identifier "; - public static final String UPDATE = "update"; - public static final String UPDATED_BY = "updatedBy"; - public static final String UPDATED_DATE = "updatedDate"; - public static final String UPLOADED_BY = "uploadedBy"; - public static final String UPLOADED_DATE = "uploadedDate"; - public static final String URL = "url"; - public static final String URL_ACTION = "url_action"; - public static final String URL_ACTION_ID = "url_action_ids"; - public static final String USER = "user"; - public static final String USER_OWNERSHIP_TRANSFER = "user_ownership_transfer"; - public static final String USER_ACTION_ROLE = "user_action_role"; - public static final String USER_DB = "user_db"; - public static final String USER_ID = "userId"; - public static final String USER_IDs = "userIds"; - public static final String USER_NAME = "username"; - public static final String USER_NOTES_DB = "userNotes_db"; - public static final String USER_ORG = "user_organisation"; - public static final String USER_ORG_DB = "user_org_db"; - public static final String USERIDS = "userIds"; - public static final String USERNAME = "userName"; - public static final String USER_DECLARATION_DB = "user_declarations"; - public static final String VALUE = "value"; - public static final String VERSION = "version"; - public static final String WELCOME_MESSAGE = "welcomeMessage"; - public static final String SUNBIRD_HEALTH_CHECK_ENABLE = "sunbird_health_check_enable"; - public static final String HEALTH = "health"; - public static final String SERVICE = "service"; - public static final String SOFT_CONSTRAINTS = "softConstraints"; - public static final String SUNBIRD_AUTHORIZATION = "sunbird_authorization"; - public static final String DURATION = "duration"; - public static final String LOCATION_CODE = "locationCode"; - public static final String UPLOAD_FILE_MAX_SIZE = "file_upload_max_size"; - public static final String PRIMARY_KEY = "PK"; - public static final String NON_PRIMARY_KEY = "NonPK"; - public static final String PARENT_ID = "parentId"; - public static final String CREATED_ON = "createdOn"; - public static final String UPDATED_ON = "updatedOn"; - public static final String LAST_UPDATED_ON = "lastUpdatedOn"; - public static final String LAST_UPDATED_BY = "lastUpdatedBy"; - public static final String CASSANDRA_WRITE_BATCH_SIZE = "cassandra_write_batch_size"; - public static final String ORG_EXTERNAL_ID = "orgExternalId"; - public static final String ORG_PROVIDER = "orgProvider"; - public static final String EXTERNAL_IDS = "externalIds"; - public static final String EXTERNAL_ID_TYPE = "externalIdType"; - public static final String ID_TYPE = "idType"; - public static final String ADD = "add"; - public static final String REMOVE = "remove"; - public static final String EDIT = "edit"; - public static final String DEFAULT_FRAMEWORK = "defaultFramework"; - public static final String EXTERNAL_ID_PROVIDER = "externalIdProvider"; - public static final String SUNBIRD_INSTALLATION_DISPLAY_NAME = "sunbird_installation_display_name_for_sms"; - public static final String SUNBIRD_SUPPORT_EMAIL = "sunbird_support_email"; - public static final String USR_EXT_IDNT_TABLE = "usr_external_identity"; - public static final String RESPONSE_CODE = "responseCode"; - public static final String OK = "ok"; - public static final String SUNBIRD_DEFAULT_COUNTRY_CODE = "sunbird_default_country_code"; - public static final String ONBOARDING_MAIL_SUBJECT = "onboarding_mail_subject"; - public static final String ONBOARDING_MAIL_MESSAGE = "onboarding_welcome_message"; - public static final String SUNBIRD_DEFAULT_WELCOME_MSG = "sunbird_default_welcome_sms"; - public static final String RECIPIENT_SEARCH_QUERY = "recipientSearchQuery"; - public static final String SUNBIRD_EMAIL_MAX_RECEPIENT_LIMIT = - "sunbird_email_max_recipients_limit"; - public static final String ORIGINAL_EXTERNAL_ID = "originalExternalId"; - public static final String ORIGINAL_ID_TYPE = "originalIdType"; - public static final String ORIGINAL_PROVIDER = "originalProvider"; - public static final String SUNBIRD_CASSANDRA_CONSISTENCY_LEVEL = - "sunbird_cassandra_consistency_level"; - public static final String VERSION_2 = "v2"; - public static final String CUSTODIAN_ORG_CHANNEL = "custodianOrgChannel"; - public static final String CUSTODIAN_ORG_ID = "custodianOrgId"; - public static final String APP_ID = "appId"; - public static final String REDIRECT_URI = "redirectUri"; - public static final String SET_PASSWORD_LINK = "set_password_link"; - public static final String VERIFY_EMAIL_LINK = "verify_email_link"; - public static final String LINK = "link"; - public static final String SET_PW_LINK = "setPasswordLink"; - public static final String SUNBIRD_URL_SHORTNER_ENABLE = "sunbird_url_shortner_enable"; - public static final String USER_PROFILE_CONFIG = "userProfileConfig"; - public static final String PROFILE_USERTYPES = "profileUserTypes"; - public static final String PROFILE_USERTYPE = "profileUserType"; - public static final String PROFILE_LOCATION = "profileLocation"; - public static final String BATCH_START_DATE = "batchStartDate"; - public static final String BATCH_END_DATE = "batchEndDate"; - public static final String BATCH_NAME = "batchName"; - public static final String SUNBIRD_API_REQUEST_LOWER_CASE_FIELDS = - "sunbird_api_request_lower_case_fields"; - public static final String ATTRIBUTE = "attribute"; - public static final String ERRORS = "errors"; - public static final String ROLE_LIST = "roleList"; - public static final String CALLER_ID = "callerId"; - public static final String USER_TYPE = "userType"; - public static final String USER_SUB_TYPE = "userSubType"; - public static final String MANAGED_BY = "managedBy"; - public static final String MANAGED_FOR = "managedFor"; - public static final String COURSE_BATCH_URL = "courseBatchUrl"; - public static final String SIGNATURE = "signature"; - public static final String TTL = "ttl"; - public static final String MODE = "mode"; - public static final String TNC_ACCEPTED_ON = "tncAcceptedOn"; - public static final String TNC_ACCEPTED_VERSION = "tncAcceptedVersion"; - public static final String ALL_TNC_ACCEPTED = "allTncAccepted"; - public static final String TNC_LATEST_VERSION_URL = "tncLatestVersionUrl"; - public static final String PROMPT_TNC = "promptTnC"; - public static final String TNC_LATEST_VERSION = "tncLatestVersion"; - public static final String BULK_ORG_UPLOAD = "bulkOrgUpload"; - public static final String LATEST_VERSION = "latestVersion"; - public static final String TNC_CONFIG = "tncConfig"; - public static final String ROOT_ORG_NAME = "rootOrgName"; - public static final String SUNBIRD_OTP_EXPIRATION = "sunbird_otp_expiration"; - public static final String SUNBIRD_OTP_LENGTH = "sunbird_otp_length"; - public static final String OTP_EXPIRATION_IN_MINUTES = "otpExpiryInMinutes"; - public static final String SUNBIRD_RATE_LIMIT_ENABLED = "sunbird_rate_limit_enabled"; - public static final String RATE_LIMIT = "rate_limit"; - public static final String RATE_LIMIT_UNIT = "unit"; - public static final String RATE = "rate"; - public static final String INSTALLATION_NAME = "installationName"; - public static final String SUPPORT_EMAIL = "supportEmail"; - public static final String LOCATION_CODES = "locationCodes"; - public static final String USER_LOCATIONS = "userLocations"; - public static final String USER_ID_TYPE = "userIdType"; - public static final String USER_PROVIDER = "userProvider"; - public static final String SORTBY = "sortBy"; - public static final String TERM = "term"; - public static final String SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID = - "sunbird_keycloak_user_federation_provider_id"; - public static final String DEVICE_ID = "did"; - public static final String SUNBIRD_GZIP_ENABLE = "sunbird_gzip_enable"; - public static final String SUNBIRD_SYNC_READ_WAIT_TIME = "sunbird_sync_read_wait_time"; - public static final String SUNBIRD_GZIP_SIZE_THRESHOLD = "sunbird_gzip_size_threshold"; - public static final String SIGNUP_TYPE = "signupType"; - public static final String REQUEST_SOURCE = "source"; - - public static final String RECIPIENT_PHONES = "recipientPhones"; - public static final String REST = "rest"; - public static final String ES_OR_OPERATION = "$or"; - public static final String PREV_USED_EMAIL = "prevUsedEmail"; - public static final String PREV_USED_PHONE = "prevUsedPhone"; - public static final String MERGE_USER = "mergeUser"; - public static final String MIGRATE_USER = "migrateUser"; - public static final String FROM_ACCOUNT_ID = "fromAccountId"; - public static final String TO_ACCOUNT_ID = "toAccountId"; - public static final String USER_MERGEE_ACCOUNT = "userMergeeAccount"; - public static final String SEARCH_FUZZY = "fuzzy"; - public static final String SUNBIRD_FUZZY_SEARCH_THRESHOLD = "sunbird_fuzzy_search_threshold"; - public static final String USER_CERT = "user_cert"; - public static final String SIGN_KEYS = "signKeys"; - public static final String ENC_KEYS = "encKeys"; - public static final String SUNBIRD_STATE_IMG_URL = "sunbird_state_img_url"; - public static final String SUNBIRD_DIKSHA_IMG_URL = "sunbird_diksha_img_url"; - public static final String SUNBIRD_CERT_COMPLETION_IMG_URL = "sunbird_cert_completion_img_url"; - public static final String stateImgUrl = "stateImgUrl"; - public static final String dikshaImgUrl = "dikshaImgUrl"; - public static final String certificateImgUrl = "certificateImgUrl"; - public static final String SUNBIRD_RESET_PASS_MAIL_SUBJECT = "sunbird_reset_pass_mail_subject"; - public static final String X_AUTHENTICATED_USER_TOKEN = "x-authenticated-user-token"; - public static final String X_SOURCE_USER_TOKEN = "x-source-user-token"; - public static final String SUNBIRD_SUBDOMAIN_KEYCLOAK_BASE_URL = - "sunbird_subdomain_keycloak_base_url"; - public static final String ACTION = "action"; - public static final String ITERATION = "iteration"; - public static final String TELEMETRY_TARGET_USER_MERGE_TYPE = "MergeUserCoursesAndCert"; - public static final String TELEMETRY_PRODUCER_USER_MERGE_ID = "org.sunbird.platform"; - public static final String TELEMETRY_EDATA_USER_MERGE_ACTION = "merge-user-courses-and-cert"; - public static final String BE_JOB_REQUEST = "BE_JOB_REQUEST"; - public static final String TELEMETRY_ACTOR_USER_MERGE_ID = "Merge User Courses and Cert"; - public static final String RECOVERY_EMAIL = "recoveryEmail"; - public static final String RECOVERY_PHONE = "recoveryPhone"; - public static final String NESTED_KEY_FILTER = "nestedFilters"; - public static final String SHADOW_USER = "shadow_user"; - public static final String USER_EXT_ID = "userExtId"; - public static final String STATE_VALIDATED = "stateValidated"; - public static final String FLAGS_VALUE = "flagsValue"; - public static final String CLAIM_STATUS = "claimStatus"; - public static final String SUNBIRD_MIGRATE_USER_BODY = "migrate_user_template"; - public static final String SMS = "sms"; - public static final String SUNBIRD_ACCOUNT_MERGE_SUBJECT = "sunbird_account_merge_subject"; - public static final String IS_SSO_ROOTORG_ENABLED = "isSSOEnabled"; - public static final String USER_FEED_DB = "user_feed"; - public static final String USER_FEED = "userFeed"; - public static final String FEED_ID = "feedId"; - public static final String LICENSE = "license"; - public static final String DEFAULT_LICENSE = "defaultLicense"; - public static final String SUNBIRD_PASS_REGEX = "sunbird_pass_regex"; - public static final String NESTED_EXISTS = "nested_exists"; - public static final String NESTED_NOT_EXISTS = "nested_not_exists"; - public static final String PROSPECT_CHANNELS = "prospectChannels"; - public static final String CATEGORY = "category"; - public static final String TEMPLATE_ID = "templateId"; - public static final String TEMPLATE_OPTIONS = "templateOptions"; - public static final String RESET_PASSWORD_TEMPLATE_ID = "resetPasswordWithOtp"; - public static final String VERSION_3 = "v3"; - public static final String VERSION_4 = "v4"; - public static final String VERSION_5 = "v5"; - - public static final String WARD_LOGIN_OTP_TEMPLATE_ID = "wardLoginOTP"; - public static final String OTP_PHONE_WARD_LOGIN_TEMPLATE = "verifyPhoneOtpTemplateWard"; - public static final String OTP_EMAIL_WARD_LOGIN_TEMPLATE = "verifyEmailOtpTemplateWard"; - public static final String LIMIT_MANAGED_USER_CREATION = "limit_managed_user_creation"; - public static final String MANAGED_USER_LIMIT = "managed_user_limit"; - public static final String ACCESS_TOKEN_PUBLICKEY_BASEPATH = "accesstoken.publickey.basepath"; - public static final String SHA_256_WITH_RSA = "SHA256withRSA"; - public static final String SUB = "sub"; - public static final String DOT_SEPARATOR = "."; - public static final List USER_UNAUTH_STATES = - Arrays.asList(JsonKey.UNAUTHORIZED, JsonKey.ANONYMOUS); - public static final String EKSTEP_SIGNING_SIGN_PAYLOAD = "ekstep.signing.sign.payload"; - public static final String EKSTEP_SIGNING_SIGN_PAYLOAD_VER = "ekstep.signing.sign.payload.ver"; - public static final String ADMINUTIL_BASE_URL = "adminutil_base_url"; - public static final String ADMINUTIL_SIGN_ENDPOINT = "adminutil_sign_endpoint"; - public static final String FORM_API_ENDPOINT = "form_api_endpoint"; - public static final String MANAGED_TOKEN = "managedToken"; - public static final String WITH_TOKENS = "withTokens"; - public static final String DECLARED_EMAIL = "declared-email"; - public static final String DECLARED_PHONE = "declared-phone"; - public static final String DECLARED_SCHOOL_UDISE_CODE = "declared-school-udise-code"; - public static final String DECLARED_SCHOOL_NAME = "declared-school-name"; - public static final String GOOGLE_CAPTCHA_PRIVATE_KEY = "google_captcha_private_key"; - public static final String GOOGLE_CAPTCHA_MOBILE_PRIVATE_KEY = - "google_captcha_mobile_private_key"; - public static final String MOBILE_APP = "app"; - public static final String CAPTCHA_RESPONSE = "captchaResponse"; - public static final String ENABLE_CAPTCHA = "enable_captcha"; - public static final String DECLARED_STATE = "declared-state"; - public static final String DECLARED_DISTRICT = "declared-district"; - public static final String SUBMITTED = "SUBMITTED"; - public static final String VALIDATED = "VALIDATED"; - public static final String SELF_DECLARED_ERROR = "ERROR"; - public static final String USER_INFO = "userInfo"; - public static final String USR_DECLARATION_TABLE = "user_declarations"; - public static final String ERROR_TYPE = "errorType"; - public static final String DECLARATIONS = "declarations"; - public static final String PERSONA = "persona"; - public static final String SUB_PERSONA = "subPersona"; - // This denotes the persona of the user in self declaration and - // is different from role or user type = TEACHER - public static final String TEACHER_PERSONA = "teacher"; - public static final String DEFAULT_PERSONA = "default"; - public static final String TENANT_PREFERENCE_V2 = "tenantPreferenceV2"; - public static final String X_Session_ID = "x-session-id"; - public static final String X_APP_VERSION = "x-app-ver"; - public static final String X_TRACE_ENABLED = "x-trace-enabled"; - public static final String X_REQUEST_ID = "x-request-id"; - public static final String USER_LOOKUP = "user_lookup"; - // this fields are being stored in type column in user_lookup table - public static final String USER_LOOKUP_FILED_USER_NAME = "username"; - public static final String USER_LOOKUP_FILED_EXTERNAL_ID = "externalid"; - public static final String CONSENT_EXPIRY_IN_DAYS = "consent_expiry_in_days"; - public static final String CONSENT_EXPIRY = "expiry"; - public static final String CONSENT_BODY = "consent"; - public static final String CONSENT_RESPONSE = "consents"; - public static final String CONSENT_SUCCESS_MESSAGE = "User Consent updated successfully."; - // user consent req-response attributes listing - started - public static final String CONSENT_CONSUMERID = "consumerId"; - public static final String CONSENT_OBJECTID = "objectId"; - public static final String CONSENT_CONSUMERTYPE = "consumerType"; - public static final String CONSENT_OBJECTTYPE = "objectType"; - public static final String CONSENT_OBJECTTYPE_ORG = "Organisation"; - public static final String CONSENT_STATUS_REVOKED = "REVOKED"; - public static final String CONSENT_STATUS_DELETED = "DELETED"; - - // user consent req-response attributes listing - ended - // user consent table columns listing - started - public static final String CONSENT_CONSUMER_ID = "consumer_id"; - public static final String CONSENT_OBJECT_ID = "object_id"; - public static final String CONSENT_USER_ID = "user_id"; - public static final String CONSENT_CONSUMER_TYPE = "consumer_type"; - public static final String CONSENT_OBJECT_TYPE = "object_type"; - public static final String CONSENT_LAST_UPDATED_ON = "last_updated_on"; - public static final String CONSENT_CREATED_ON = "created_on"; - public static final String CONSENT_OBJECT = "object"; - // user consent table columns listing - ended - public static final String PRIORITY = "priority"; - public static final String ORG_ADMIN = "ORG_ADMIN"; - public static final String ORG_ADMIN_TNC = "orgAdminTnc"; - public static final String REPORT_VIEWER = "REPORT_VIEWER"; - public static final String REPORT_ADMIN = "REPORT_ADMIN"; - public static final String REPORT_VIEWER_TNC = "reportViewerTnc"; - public static final String REQUEST_ID = "requestid"; - public static final String LOCATION_TYPE_SCHOOL = "school"; - public static final String GET = "get"; - public static final String FORM = "form"; - public static final String CHILDREN = "children"; - public static final String OPTIONS = "options"; - public static final String DISTRICT = "district"; - public static final String PORTAL_SERVICE_PORT = "PORTAL_SERVICE_PORT"; - public static final String LOCATION_TYPE = "type"; - public static final String SUNBIRD_VALID_LOCATION_TYPES = "sunbird_valid_location_types"; - public static final String PARENT_CODE = "parentCode"; - public static final String PROPERTY_NAME = "name"; - public static final String PROPERTY_VALUE = "value"; - public static final String SMS_TEMPLATE_CONFIG = "smsTemplateConfig"; - public static final String IS_MINOR = "isMinor"; - public static final String DEFAULT_MONTH_DATE = "defaultMonthDate"; - public static final String DOB_VALIDATION_DONE = "dobValidationDone"; - public static final String IS_TENANT = "isTenant"; - public static final String ORG_LOCATION = "orgLocation"; - public static final String IS_SCHOOL = "isSchool"; - public static final String ORGANISATION_TYPE = "organisationType"; - public static final String SYNC = "sync"; - public static final String ES_SYNC_RESPONSE = "esSyncResponse"; - public static final String USER_ROLES = "user_roles"; - public static final String SCOPE = "scope"; - public static final String IS_ROOT_ORG = "isRootOrg"; - public static final String STATE_ID = "stateId"; - public static final String BLOCK_USER = "BlockUser"; - public static final String UNBLOCK_USER = "UnblockUser"; - public static final String DELETE_USER = "DeleteUser"; - public static final String DELETE_USER_STATUS = "DeleteUserStatus"; - public static final String ROLE_OPERATION = "roleOperation"; - public static final String SCOPE_STR = "scopeString"; - public static final String SUNBIRD_SSO_LB_IP = "sunbird_sso_lb_ip"; - public static final String TENANT_PREFERENCE_V2_DB = "tenant_preference_v2"; - public static final String UPDATE_ORG_STATUS = "updateOrgStatus"; - public static final String SUNBIRD_WEB_URL = "sunbird_web_url"; - public static final String MSG_91 = "91SMS"; - public static final String NIC = "NIC"; - public static final String SMS_GATEWAY_PROVIDER = "sms_gateway_provider"; - public static final String WELCOME_SMS_TEMPLATE = "welcomeSmsTemplate"; - public static final String EMAIL_VERIFICATION_SUBJECT = "OTP to verify Email"; - public static final String CONTACT_UPDATE_TEMPLATE_ID = "otpContactUpdateTemplate"; - public static final String OTP_CONTACT_UPDATE_TEMPLATE_EMAIL = "otpContactUpdateTemplateEmail"; - public static final String OTP_CONTACT_UPDATE_TEMPLATE_SMS = "otpContactUpdateTemplateSms"; - public static final String OTP_DELETE_USER_TEMPLATE_SMS = "otpDeleteUserTemplateSms"; - public static final String CONTACT_DETAILS_UPDATE_VERIFICATION_SUBJECT = - "OTP to edit Profile"; - public static final String DELETE_USER_VERIFICATION_SUBJECT = - "OTP to proceed with profile deletion."; - public static final String X_Source = "x-source"; - public static final String IDS = "ids"; - public static final String NOTIFICATIONS = "notifications"; - public static final String FEEDS = "feeds"; - public static final String DEBUG = "DEBUG"; - public static final String NOTIFICATION_SERVICE_BASE_URL = "notification_service_base_url"; - public static final String NOTIFICATION_SERVICE_V2_SEND_URL = "notification_service_v2_send_url"; - public static final String NOTIFICATION_SERVICE_V1_UPDATE_URL = - "notification_service_v1_update_url"; - public static final String NOTIFICATION_SERVICE_V1_READ_URL = "notification_service_v1_read_url"; - public static final String NOTIFICATION_SERVICE_V1_DELETE_URL = - "notification_service_v1_delete_url"; - public static final String CHANNEL_REGISTRATION_DISABLED = "channel_registration_disabled"; - public static final String USER_CONSENT_TEXT = "user consent"; - public static final Object COUNTRY_CODE_TEXT = "country code"; - public static final String USER_ORG_SERVICE_PREFIX = "UOS_"; - public static final String ORG_SUB_TYPE = "organisationSubType"; - public static final String ORG_TYPE_CONFIG = "orgTypeConfig"; - public static final String ORG_TYPE_SCHOOL = "school"; - public static final String ORG_TYPE_BOARD = "board"; - public static final String SOFT_DELETE_PREVIOUS_ORG = "softDeleteOldOrg"; - public static final String FORCE_MIGRATION = "forceMigration"; - public static final String NOTIFY_USER_MIGRATION = "notifyMigration"; - public static final String PROFILE_DETAILS = "profileDetails"; - public static final String EXTENDED_PROFILE_SCHEMA_CONFIG = "extendedProfileSchemaConfig"; - public static final String MANDATORY_FIELDS_EXISTS = "mandatoryFieldsExists"; - public static final String OSID = "osid"; - public static final String DISABLE_MULTIPLE_ORG_ROLE = "sunbird_disable_multiple_org_role"; - public static final String PASSWORD_RESET_LOGIN_PAGE_URL = - "sunbird_password_reset_login_page_url"; - public static final String CLOUD_SERVICE_PROVIDER = "sunbird_cloud_service_provider"; - public static final String EXHAUST_ENCRYPTION_KEY = "exhaustEncryptionKey"; - public static final String CLOUD_SERVICE_CONTAINER = "sunbird_content_cloud_storage_container"; - public static final String DEFAULT = "default"; - public static final String DATA_SECURITY_POLICY = "dataSecurityPolicy"; - public static final String JOB = "job"; - public static final String USER_PRIVATE_FIELDS = "userPrivateFields"; - - // Release 5.4.0 LR-102 - public static final String SUNBIRD_KEYSPACE = "sunbird_userorg_keyspace"; - public static final String ES_LOCATION_INDEX = "es_location_index"; - public static final String ES_USER_FEED_INDEX = "es_user_feed_index"; - public static final String ES_USER_NOTES_INDEX = "es_user_notes_index"; - public static final String ES_USER_INDEX_ALIAS = "user_index_alias"; - public static final String ES_ORG_INDEX_INDEX = "org_index_alias"; - - public static final String USER_DELETION_STATUS = "user_deletion_status"; - public static final String CREDENTIALS_STATUS = "keycloakCredentials"; - public static final String USER_LOOK_UP_STATUS = "userLookUpTable"; - public static final String USER_EXTERNAL_ID_STATUS = "userExternalIdTable"; - public static final String USERS = "users"; - public static final String USER_TABLE_STATUS = "userTable"; - public static final String SUGGESTED_USERS = "suggested_users"; - public static final String DELETE_USER_ACTON = "delete-user"; - public static final String ACTION_BY = "actionBy"; - public static final String FROM_USER = "fromUser"; - public static final String TO_USER = "toUser"; - public static final String USER_OWNERSHIP_TRANSFER_ACTION = "ownership-transfer"; - public static final String FROM_USER_PROFILE = "fromUserProfile"; - public static final String TO_USER_PROFILE = "toUserProfile"; - public static final String ASSET_INFORMATION = "assetInformation"; - public static final String USER_OWNERSHIP_TRANSFER_TOPIC = "user-ownership-transfer-topic"; - public static final String OBJECT = "object"; - public static final String EDATA = "edata"; - public static final String CDATA = "cdata"; - public static final String MANAGED_USERS = "managed_users"; - public static final String USER_DELETION_TOPIC = "user-deletion-broadcast-topic"; - public static final String USER_DELETION_ROLES = "user-deletion-roles"; - - private JsonKey() {} -} diff --git a/core/platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java b/core/platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java deleted file mode 100644 index 2b30a9d0d3..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.sunbird.logging; - -import java.util.HashMap; -import java.util.Map; -import net.logstash.logback.marker.Markers; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.request.RequestContext; -import org.sunbird.telemetry.collector.TelemetryAssemblerFactory; -import org.sunbird.telemetry.collector.TelemetryDataAssembler; -import org.sunbird.telemetry.util.TelemetryEvents; -import org.sunbird.telemetry.util.TelemetryWriter; -import org.sunbird.telemetry.validator.TelemetryObjectValidator; -import org.sunbird.telemetry.validator.TelemetryObjectValidatorV3; - -public class LoggerUtil { - - private Logger logger; - - public LoggerUtil(Class c) { - logger = LoggerFactory.getLogger(c); - } - - public void info(RequestContext requestContext, String message) { - if (null != requestContext) { - Map context = - (Map) requestContext.getTelemetryContext().get(JsonKey.CONTEXT); - Map params = new HashMap<>(); - Map telemetryInfo = new HashMap<>(); - telemetryInfo.put(JsonKey.CONTEXT, context); - telemetryInfo.put(JsonKey.PARAMS, params); - params.put(JsonKey.LOG_TYPE, JsonKey.API_ACCESS); - params.put(JsonKey.LOG_LEVEL, JsonKey.INFO); - params.put(JsonKey.MESSAGE, message); - telemetryProcess(requestContext, telemetryInfo, null, message); - } else { - logger.info(message); - } - } - - public void info(String message) { - logger.info(message); - } - - public void error(RequestContext requestContext, String message, Throwable e) { - if (requestContext != null) { - Map context = - (Map) requestContext.getTelemetryContext().get(JsonKey.CONTEXT); - Map params = new HashMap<>(); - params.put(JsonKey.ERR_TYPE, JsonKey.API_ACCESS); - Map telemetryInfo = new HashMap<>(); - telemetryInfo.put(JsonKey.CONTEXT, context); - telemetryInfo.put(JsonKey.PARAMS, params); - error(requestContext, message, e, telemetryInfo); - } else { - error(message, e); - } - } - - public void error(String message, Throwable e) { - logger.error(message, e); - } - - public void error( - RequestContext requestContext, - String message, - Throwable e, - Map telemetryInfo) { - - telemetryProcess(requestContext, telemetryInfo, e, message); - } - - /** - * Backward-compatible error method with 5 parameters for legacy code. - * - * @param requestContext The request context - * @param message The error message - * @param object Additional object data - * @param param Additional parameters - * @param e The throwable exception - */ - public void error(RequestContext requestContext, String message, Map object, Map param, Throwable e) { - if (requestContext != null) { - Map context = - (Map) requestContext.getTelemetryContext().get(JsonKey.CONTEXT); - Map params = new HashMap<>(); - if (param != null) { - params.putAll(param); - } - params.put(JsonKey.ERR_TYPE, JsonKey.API_ACCESS); - Map telemetryInfo = new HashMap<>(); - telemetryInfo.put(JsonKey.CONTEXT, context); - telemetryInfo.put(JsonKey.PARAMS, params); - error(requestContext, message, e, telemetryInfo); - } else { - if (e != null) { - error(message, e); - } else { - logger.error(message); - } - } - } - - public void warn(RequestContext requestContext, String message, Throwable e) { - if (null != requestContext) { - logger.warn(Markers.appendEntries(requestContext.getContextMap()), message, e); - } else { - logger.warn(message, e); - } - } - - public void debug(RequestContext requestContext, String message) { - if (isDebugEnabled(requestContext)) { - TelemetryDataAssembler telemetryDataAssembler = TelemetryAssemblerFactory.get(); - TelemetryObjectValidator telemetryObjectValidator = TelemetryObjectValidatorV3.getInstance(); - Map context = - (Map) requestContext.getTelemetryContext().get(JsonKey.CONTEXT); - Map params = new HashMap<>(); - Map telemetryInfo = new HashMap<>(); - telemetryInfo.put(JsonKey.CONTEXT, context); - telemetryInfo.put(JsonKey.PARAMS, params); - params.put(JsonKey.LOG_TYPE, JsonKey.API_ACCESS); - params.put(JsonKey.LOG_LEVEL, JsonKey.DEBUG); - params.put(JsonKey.MESSAGE, message); - String telemetry = telemetryDataAssembler.log(context, params); - if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateLog(telemetry)) { - logger.debug(Markers.appendEntries(requestContext.getContextMap()), telemetry); - } else { - logger.debug(Markers.appendEntries(requestContext.getContextMap()), message); - } - } else { - logger.debug(message); - } - } - - public void debug(String message) { - logger.debug(message); - } - - private static boolean isDebugEnabled(RequestContext requestContext) { - return (null != requestContext - && StringUtils.equalsIgnoreCase("true", requestContext.getDebugEnabled())); - } - - private void telemetryProcess( - RequestContext requestContext, - Map telemetryInfo, - Throwable e, - String message) { - Request request = new Request(); - if (null != e) { - ProjectCommonException projectCommonException = null; - if (e instanceof ProjectCommonException) { - projectCommonException = (ProjectCommonException) e; - } else { - projectCommonException = - new ProjectCommonException( - ResponseCode.serverError, - ResponseCode.serverError.getErrorMessage(), - ResponseCode.SERVER_ERROR.getResponseCode()); - } - telemetryInfo.put(JsonKey.TELEMETRY_EVENT_TYPE, TelemetryEvents.ERROR.getName()); - Map params = (Map) telemetryInfo.get(JsonKey.PARAMS); - params.put(JsonKey.ERROR, projectCommonException.getErrorCode()); - params.put(JsonKey.STACKTRACE, generateStackTrace(e.getStackTrace(), message)); - request.setRequest(telemetryInfo); - } else { - telemetryInfo.put(JsonKey.TELEMETRY_EVENT_TYPE, TelemetryEvents.LOG.getName()); - request.setRequest(telemetryInfo); - } - request.setRequestContext(requestContext); - TelemetryWriter.write(request); - } - - private String generateStackTrace(StackTraceElement[] elements, String errMsg) { - StringBuilder builder = new StringBuilder(errMsg + " "); - for (StackTraceElement element : elements) { - builder.append(element.toString()); - } - return builder.toString(); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java b/core/platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java deleted file mode 100644 index a96d28aa53..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java +++ /dev/null @@ -1,29 +0,0 @@ -/** */ -package org.sunbird.mail; - -import javax.mail.Authenticator; -import javax.mail.PasswordAuthentication; - -/** @author Manzarul.Haque */ -public class GMailAuthenticator extends Authenticator { - private String user; - private String pw; - - /** - * this method is used to authenticate gmail user name and password. - * - * @param username - * @param password - */ - public GMailAuthenticator(String username, String password) { - super(); - this.user = username; - this.pw = password; - } - - /** */ - @Override - public PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(this.user, this.pw); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/mail/SendEmail.java b/core/platform-common/src/main/java/org/sunbird/mail/SendEmail.java deleted file mode 100644 index 64c5a5d094..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/mail/SendEmail.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.sunbird.mail; - -import java.io.StringWriter; -import javax.mail.Message; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; -import org.apache.velocity.VelocityContext; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; - -public class SendEmail { - - public LoggerUtil logger = new LoggerUtil(SendEmail.class); - private static final String fromEmail = System.getenv(JsonKey.EMAIL_SERVER_FROM); - - public boolean send( - String[] emailList, - String subject, - VelocityContext context, - StringWriter writer, - Session session, - Transport transport) { - boolean sentStatus = true; - try { - if (context != null) { - context.put(JsonKey.FROM_EMAIL, fromEmail); - } - MimeMessage message = new MimeMessage(session); - message.setFrom(new InternetAddress(fromEmail)); - Message.RecipientType recipientType = null; - if (emailList.length > 1) { - recipientType = Message.RecipientType.BCC; - } else { - recipientType = Message.RecipientType.TO; - } - for (String email : emailList) { - message.addRecipient(recipientType, new InternetAddress(email)); - } - if (recipientType == Message.RecipientType.BCC) - message.addRecipient(Message.RecipientType.TO, new InternetAddress(fromEmail)); - message.setSubject(subject); - message.setContent(writer.toString(), "text/html; charset=utf-8"); - transport.sendMessage(message, message.getAllRecipients()); - } catch (Exception e) { - sentStatus = false; - logger.error("SendEmail:send: Exception occurred with message = " + e.getMessage(), e); - } - return sentStatus; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java b/core/platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java deleted file mode 100644 index 7f2cb39046..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.sunbird.mail; - -import java.util.Properties; -import javax.mail.Session; -import javax.mail.Transport; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.PropertiesCache; - -public class SendgridConnection { - - public final LoggerUtil logger = new LoggerUtil(SendgridConnection.class); - - private Properties props = null; - private String host; - private String port; - private String userName; - private String password; - private String fromEmail; - private Session session; - private Transport transport; - - public Transport createConnection(RequestContext context) { - try { - host = System.getenv(JsonKey.EMAIL_SERVER_HOST); - port = System.getenv(JsonKey.EMAIL_SERVER_PORT); - userName = System.getenv(JsonKey.EMAIL_SERVER_USERNAME); - password = System.getenv(JsonKey.EMAIL_SERVER_PASSWORD); - fromEmail = System.getenv(JsonKey.EMAIL_SERVER_FROM); - - if (StringUtils.isBlank(host) - || StringUtils.isBlank(port) - || StringUtils.isBlank(userName) - || StringUtils.isBlank(password) - || StringUtils.isBlank(fromEmail)) { - logger.info( - context, - "Email setting value is not provided by Env variable==" - + host - + " " - + port - + " " - + fromEmail); - initialiseFromProperty(); - } - - props = System.getProperties(); - props.put("mail.smtp.host", host); - props.put("mail.smtp.socketFactory.port", port); - - props.put("mail.smtp.auth", "true"); - props.put("mail.smtp.port", port); - - session = Session.getInstance(props, new GMailAuthenticator(userName, password)); - transport = session.getTransport("smtp"); - transport.connect(host, userName, password); - return transport; - } catch (Exception e) { - logger.error( - context, "Exception occurred while smtp session and creating transport connection", e); - } - return null; - } - - public Session getSession() { - return session; - } - - public void setSession(Session session) { - this.session = session; - } - - public Transport getTransport() { - return transport; - } - - public void initialiseFromProperty() { - host = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_HOST); - port = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_PORT); - userName = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_USERNAME); - password = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_PASSWORD); - fromEmail = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_FROM); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/operations/ActorOperations.java b/core/platform-common/src/main/java/org/sunbird/operations/ActorOperations.java deleted file mode 100644 index f07066689a..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/operations/ActorOperations.java +++ /dev/null @@ -1,192 +0,0 @@ -package org.sunbird.operations; - -import java.util.HashMap; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; - -/** - * This enum will contain different operation for a userorg {addCourse, getCourse, update , - * getContent} - * - * @author Manzarul - */ -public enum ActorOperations { - CREATE_USER("createUser", "USRCRT"), - CREATE_SSO_USER("createSSOUser", "USRCRT"), - - UPDATE_USER("updateUser", "USRUPD"), - UPDATE_USER_V2("updateUserV2", "USRUPD"), - UPDATE_USER_V3("updateUserV3", "USRUPD"), - - GET_USER_PROFILE_V3("getUserProfileV3", "USRRED"), - GET_USER_PROFILE_V4("getUserProfileV4", "USRRED"), - GET_USER_PROFILE_V5("getUserProfileV5", "USRRED"), - - UPDATE_USER_INFO_ELASTIC("updateUserInfoToElastic", "UBKGUPD"), - - GET_ROLES("getRoles", "ROLERED"), - - GET_USER_DETAILS_BY_LOGINID("getUserDetailsByLoginId", "USRRED"), - GET_USER_BY_KEY("getUserByKey", "USRRED"), - BLOCK_USER("blockUser", "USRBLOK"), - BULK_UPLOAD("bulkUpload", "BLKUPLD"), - PROCESS_BULK_UPLOAD("processBulkUpload", "BLKUPLD"), - ASSIGN_ROLES("assignRoles", "ROLUPD"), - ASSIGN_ROLES_V2("assignRolesV2", "ROLUPD"), - UNBLOCK_USER("unblockUser", "USRUNBLOK"), - - UPDATE_USER_ORG_ES("updateUserOrgES", "UOBKGUPD"), - UPDATE_USER_ROLES_ES("updateUserRoles", "UBKGROLUPD"), - SYNC("sync", "ESSYNC"), - BACKGROUND_SYNC("backgroundSync", "BKGESSYNC"), - EMAIL_SERVICE("emailService", "EMAILNOTI"), - FILE_STORAGE_SERVICE("fileStorageService", "STRGSER"), - HEALTH_CHECK("healthCheck", "HLTHCHK"), - SEND_MAIL("sendMail", "NOTI"), - ACTOR("actor", "HLTHCHK"), - CASSANDRA("cassandra", "HLTHCHK"), - ES("es", "HLTHCHK"), - EKSTEP("ekstep", "HLTHCHK"), - - CREATE_NOTE("createNote", "NOTECRT"), - UPDATE_NOTE("updateNote", "NOTEUPD"), - SEARCH_NOTE("searchNote", "NOTESER"), - GET_NOTE("getNote", "NOTERED"), - DELETE_NOTE("deleteNote", "NOTEDEL"), - - INSERT_USER_NOTES_ES("insertUserNotesToElastic", "NBKGCRT"), - UPDATE_USER_NOTES_ES("updateUserNotesToElastic", "NBKGUPD"), - - CREATE_TENANT_PREFERENCE("createTenantPreference", "TPREFCRT"), - UPDATE_TENANT_PREFERENCE("updateTenantPreference", "TPREFUPD"), - GET_TENANT_PREFERENCE("getTenantPreference", "TPREFRED"), - // REG_CHANNEL("channelReg", "CHNLREG"), - - UPDATE_SYSTEM_SETTINGS("updateSystemSettings", "SYSUPD"), - GET_SYSTEM_SETTING("getSystemSetting", "SYSRED"), - GET_ALL_SYSTEM_SETTINGS("getAllSystemSettings", "SYSRED"), - SET_SYSTEM_SETTING("setSystemSetting", "SYSCRT"), - - USER_TNC_ACCEPT("userTnCAccept", "TNCACCPT"), - - GENERATE_OTP("generateOTP", "OTPCRT"), - VERIFY_OTP("verifyOTP", "OTPVERFY"), - SEND_OTP("sendOTP", "OTPNOTI"), - - GET_USER_TYPES("getUserTypes", "UTYPRED"), - - USER_TENANT_MIGRATE("userTenantMigrate", "USRMIG"), - FREEUP_USER_IDENTITY("freeUpUserIdentity", "IDNTFREE"), - RESET_PASSWORD("resetPassword", "PASSRST"), - MERGE_USER("mergeUser", "USRMRG"), - MERGE_USER_TO_ELASTIC("mergeUserToElastic", "UBKGMRG"), - - MERGE_USER_CERTIFICATE("mergeUserCertificate", "USRCRTMRG"), - USER_SELF_DECLARED_TENANT_MIGRATE("userSelfDeclaredTenantMigrate", "USDTMIG"), - // REJECT_MIGRATION("rejectMigration", "UMIGREJ"), - - GET_USER_FEED_BY_ID("getUserFeedById", "FEEDRED"), - CREATE_USER_FEED("createUserFeed", "FEEDCRT"), - DELETE_USER_FEED("deleteUserFeed", "FEEDDEL"), - UPDATE_USER_FEED("updateUserFeed", "FEEDUPD"), - - CREATE_USER_V3("createUserV3", "USRCRT"), - CREATE_SSU_USER("createSSUUser", "USRCRT"), - CREATE_USER_V4("createUserV4", "USRCRT"), - CREATE_MANAGED_USER("createManagedUser", "USRCRT"), - - V2_NOTIFICATION("v2Notification", "NOTI"), - GET_MANAGED_USERS("getManagedUsers", "USRRED"), - CHECK_USER_EXISTENCE("checkUserExistence", "UEXIST"), - CHECK_USER_EXISTENCEV2("checkUserExistenceV2", "UEXIST"), - UPDATE_USER_DECLARATIONS("updateUserDeclarations", "UDECLUPD"), - UPDATE_USER_CONSENT("updateUserConsent", "UCNSNTUPD"), - - USER_SEARCH("userSearch", "USRSER"), - USER_SEARCH_V2("userSearchV2", "USRSER"), - USER_SEARCH_V3("userSearchV3", "USRSER"), - ORG_SEARCH("orgSearch", "ORGSER"), - ORG_SEARCH_V2("orgSearchV2", "ORGSER"), - USER_LOOKUP("userLookup", "USRLKP"), - GET_USER_CONSENT("getUserConsent", "UCNSTRED"), - GET_USER_ROLES_BY_ID("getUserRolesById", "UROLERED"), - // UserActorOperations - INSERT_USER_ORG_DETAILS("insertUserOrgDetails", "UOBKGCRT"), - UPDATE_USER_ORG_DETAILS("updateUserOrgDetails", "UOBKGUPD"), - - UPSERT_USER_EXTERNAL_IDENTITY_DETAILS("upsertUserExternalIdentityDetails", "UEXTIDUPSRT"), - PROCESS_ONBOARDING_MAIL_AND_SMS("processOnBoardingMailAndSms", "WLCMNOTI"), - PROCESS_PASSWORD_RESET_MAIL_AND_SMS("processPasswordResetMailAndSms", "PASSNOTI"), - SAVE_USER_ATTRIBUTES("saveUserAttributes", "UATTRUPSRT"), - UPSERT_USER_DETAILS_TO_ES("upsertUserDetailsToES", "UBKGUPSRT"), - UPSERT_USER_ORG_DETAILS_TO_ES("upsertUserOrgDetailsToES", "UOBKGUPSRT"), - UPSERT_USER_SELF_DECLARATIONS("upsertUserSelfDeclarations", "USDUPSRT"), - UPDATE_USER_SELF_DECLARATIONS_ERROR_TYPE("updateUserSelfDeclarationsErrorType", "USDETUPD"), - LOCATION_BULK_UPLOAD("locationBulkUpload", "LOCUPLD"), - LOCATION_BULK_UPLOAD_BACKGROUND_JOB("locationBulkUploadBackground", "LBKGUPLD"), - GET_BULK_OP_STATUS("getBulkOpStatus", "BLKSTSRED"), - ORG_BULK_UPLOAD("orgBulkUpload", "ORGUPLD"), - ORG_BULK_UPLOAD_BACKGROUND_JOB("orgBulkUploadBackground", "OBKGUPLD"), - - USER_BULK_UPLOAD("userBulkUpload", "USRUPLD"), - USER_BULK_UPLOAD_BACKGROUND_JOB("userBulkUploadBackground", "UBKGUPLD"), - - CREATE_ORG("createOrg", "ORGCRT"), - UPDATE_ORG("updateOrg", "ORGUPD"), - UPDATE_ORG_STATUS("updateOrgStatus", "OSTSUPD"), - GET_ORG_DETAILS("getOrgDetails", "ORGRED"), - ASSIGN_KEYS("assignKeys", "ASSGNK"), - UPSERT_ORGANISATION_TO_ES("upsertOrganisationDataToES", "OBKGUPSRT"), - // Location Actor Operations - CREATE_LOCATION("createLocation", "LOCCRT"), - UPDATE_LOCATION("updateLocation", "LOCUPD"), - SEARCH_LOCATION("searchLocation", "LOCSER"), - DELETE_LOCATION("deleteLocation", "LOCDEL"), - GET_RELATED_LOCATION_IDS("getRelatedLocationIds", "LOCRED"), - READ_LOCATION_TYPE("readLocationType", "LOCTYPRED"), - UPSERT_LOCATION_TO_ES("upsertLocationDataToES", "LBKGUPSRT"), - DELETE_LOCATION_FROM_ES("deleteLocationDataFromES", "LBKGDEL"), - ADD_ENCRYPTION_KEY("addEncryptionKey", "ADENCKEY"), - USER_CURRENT_LOGIN("userCurrentLogin", "USRLOG"), - DELETE_USER("deleteUser", "USRDLT"), - USER_OWNERSHIP_TRANSFER("userOwnershipTransfer","UOWNTRANS"); - - private String value; - - private String operationCode; - - public String getOperationCode() { - return operationCode; - } - - ActorOperations(String value, String operationCode) { - this.value = value; - this.operationCode = operationCode; - } - - /** - * returns the enum value - * - * @return String - */ - public String getValue() { - return this.value; - } - - private static final Map opCodeByActorOption = new HashMap<>(); - - static { - for (ActorOperations actorOperation : values()) { - opCodeByActorOption.put(actorOperation.getValue(), actorOperation.getOperationCode()); - } - } - - public static String getOperationCodeByActorOperation(String actorOperation) { - String opCode = opCodeByActorOption.get(actorOperation); - if (StringUtils.isNotBlank(opCode)) { - return opCode; - } else { - return ""; - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/request/HeaderParam.java b/core/platform-common/src/main/java/org/sunbird/request/HeaderParam.java deleted file mode 100644 index 773fc3d8a2..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/request/HeaderParam.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.sunbird.request; - -/** - * The keys of the Execution Context Values. - * - * @author Manzarul - */ -public enum HeaderParam { - REQUEST_ID, - REQUEST_PATH, - REQUEST_ST_ED_PATH, - CURRENT_INVOCATION_PATH, - USER_DATA, - USER_LOCALE, - SYSTEM_LOCALE, - USER_ID, - PROXY_USER_ID, - USER_NAME, - PROXY_USER_NAME, - SCOPE_ID, - X_Consumer_ID("x-consumer-id"), - X_Session_ID("x-session-id"), - X_Device_ID("x-device-id"), - X_Authenticated_Userid("x-authenticated-userid"), - ts("ts"), - Content_Type("content-type"), - X_Authenticated_User_Token("x-authenticated-user-token"), - X_Authenticated_For("x-authenticated-for"), - X_Authenticated_Client_Token("x-authenticated-client-token"), - X_Authenticated_Client_Id("x-authenticated-client-id"), - X_APP_ID("x-app-id"), - CHANNEL_ID("x-channel-id"), - X_Trace_ID("x-trace-id"), - X_REQUEST_ID("x-request-id"), - X_TRACE_ENABLED("x-trace-enabled"), - X_APP_VERSION("x-app-ver"), - X_APP_VERSION_PORTAL("x-app-version"), - X_SOURCE("x-source"), - X_Response_Length("x-response-length"); - /** name of the parameter */ - private String name; - - /** - * 1-arg constructor - * - * @param name String - */ - private HeaderParam(String name) { - this.name = name; - } - - /** - * this will return parameter default name - * - * @return - */ - public String getParamName() { - return this.name(); - } - - private HeaderParam() {} - - /** - * This will provide name of one argument enum - * - * @return String - */ - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/request/Request.java b/core/platform-common/src/main/java/org/sunbird/request/Request.java deleted file mode 100644 index 34c12e3282..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/request/Request.java +++ /dev/null @@ -1,180 +0,0 @@ -package org.sunbird.request; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import java.io.Serializable; -import java.text.MessageFormat; -import java.util.Arrays; -import java.util.Map; -import java.util.WeakHashMap; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.util.ProjectUtil; - -/** @author Manzarul */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class Request implements Serializable { - - private static final long serialVersionUID = -2362783406031347676L; - private static final Integer MIN_TIMEOUT = 0; - private static final Integer MAX_TIMEOUT = 30; - private static final int WAIT_TIME_VALUE = 30; - - // Telemetry context - protected Map context; - // Request context - private RequestContext requestContext; - - private String id; - private String ver; - private String ts; - private RequestParams params; - - private Map request = new WeakHashMap<>(); - - private String managerName; - private String operation; - private String requestId; - private int env; - - private Integer timeout; // in seconds - - public Request() { - this.context = new WeakHashMap<>(); - this.params = new RequestParams(); - } - - public void toLower() { - Arrays.asList( - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_API_REQUEST_LOWER_CASE_FIELDS).split(",")) - .stream() - .forEach( - field -> { - if (StringUtils.isNotBlank((String) this.getRequest().get(field))) { - this.getRequest().put(field, ((String) this.getRequest().get(field)).toLowerCase()); - } - }); - } - - public String getRequestId() { - return requestId; - } - - public Map getContext() { - return context; - } - - public void setContext(Map context) { - this.context = context; - } - - /** @return the requestValueObjects */ - public Map getRequest() { - return request; - } - - public void setRequest(Map request) { - this.request = request; - } - - public Object get(String key) { - return request.get(key); - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public void put(String key, Object vo) { - request.put(key, vo); - } - - public String getManagerName() { - return managerName; - } - - public void setManagerName(String managerName) { - this.managerName = managerName; - } - - public String getOperation() { - return operation; - } - - public void setOperation(String operation) { - this.operation = operation; - } - - @Override - public String toString() { - return "Request [" - + (context != null ? "context=" + context + ", " : "") - + (request != null ? "requestValueObjects=" + request : "") - + "]"; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getVer() { - return ver; - } - - public void setVer(String ver) { - this.ver = ver; - } - - public String getTs() { - return ts; - } - - public void setTs(String ts) { - this.ts = ts; - } - - public RequestParams getParams() { - return params; - } - - public void setParams(RequestParams params) { - this.params = params; - if (this.params.getMsgid() == null && requestId != null) this.params.setMsgid(requestId); - } - - /** @return the env */ - public int getEnv() { - return env; - } - - /** @param env the env to set */ - public void setEnv(int env) { - this.env = env; - } - - public Integer getTimeout() { - return timeout == null ? WAIT_TIME_VALUE : timeout; - } - - public void setTimeout(Integer timeout) { - if (timeout < MIN_TIMEOUT && timeout > MAX_TIMEOUT) { - ProjectCommonException.throwServerErrorException( - ResponseCode.invalidRequestTimeout, - MessageFormat.format(ResponseCode.invalidRequestTimeout.getErrorMessage(), timeout)); - } - this.timeout = timeout; - } - - public RequestContext getRequestContext() { - return requestContext; - } - - public void setRequestContext(RequestContext requestContext) { - this.requestContext = requestContext; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/request/RequestContext.java b/core/platform-common/src/main/java/org/sunbird/request/RequestContext.java deleted file mode 100644 index d5f8a2fc99..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/request/RequestContext.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.sunbird.request; - -import java.util.HashMap; -import java.util.Map; - -public class RequestContext { - private String uid; - private String did; - private String sid; - private String appId; - private String appVer; - private String reqId; - private String debugEnabled; - private String op; - private String source; - private Map contextMap = new HashMap<>(); - private Map telemetryContext = new HashMap<>(); - - public RequestContext() {} - - public RequestContext( - String uid, - String did, - String sid, - String appId, - String appVer, - String reqId, - String source, - String debugEnabled, - String op) { - super(); - this.uid = uid; - this.did = did; - this.sid = sid; - this.appId = appId; - this.appVer = appVer; - this.reqId = reqId; - this.source = source; - this.debugEnabled = debugEnabled; - this.op = op; - - contextMap.put("uid", uid); - contextMap.put("did", did); - contextMap.put("sid", sid); - contextMap.put("appId", appId); - contextMap.put("appVer", appVer); - contextMap.put("reqId", reqId); - contextMap.put("source", source); - contextMap.put("op", op); - } - - public String getUid() { - return uid; - } - - public void setUid(String uid) { - this.uid = uid; - } - - public String getDid() { - return did; - } - - public void setDid(String did) { - this.did = did; - } - - public String getSid() { - return sid; - } - - public void setSid(String sid) { - this.sid = sid; - } - - public String getAppId() { - return appId; - } - - public void setAppId(String appId) { - this.appId = appId; - } - - public String getAppVer() { - return appVer; - } - - public void setAppVer(String appVer) { - this.appVer = appVer; - } - - public String getReqId() { - return reqId; - } - - public void setReqId(String reqId) { - this.reqId = reqId; - } - - public String getDebugEnabled() { - return debugEnabled; - } - - public void setDebugEnabled(String debugEnabled) { - this.debugEnabled = debugEnabled; - } - - public String getOp() { - return op; - } - - public void setOp(String op) { - this.op = op; - } - - public Map getContextMap() { - return contextMap; - } - - public Map getTelemetryContext() { - return telemetryContext; - } - - public void setTelemetryContext(Map telemetryContext) { - this.telemetryContext = telemetryContext; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/request/RequestParams.java b/core/platform-common/src/main/java/org/sunbird/request/RequestParams.java deleted file mode 100644 index 5bf9100aa9..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/request/RequestParams.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.sunbird.request; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import java.io.Serializable; - -/** @author rayulu */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class RequestParams implements Serializable { - - private static final long serialVersionUID = -759588115950763188L; - - private String did; - private String key; - private String msgid; - private String uid; - private String cid; - private String sid; - private String authToken; - - /** @return the authToken */ - public String getAuthToken() { - return authToken; - } - - /** @param authToken the authToken to set */ - public void setAuthToken(String authToken) { - this.authToken = authToken; - } - - public String getUid() { - return uid; - } - - public void setUid(String uid) { - this.uid = uid; - } - - public String getDid() { - return did; - } - - public void setDid(String did) { - this.did = did; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getMsgid() { - return msgid; - } - - public void setMsgid(String msgid) { - this.msgid = msgid; - } - - public String getCid() { - return cid; - } - - public void setCid(String cid) { - this.cid = cid; - } - - public String getSid() { - return sid; - } - - public void setSid(String sid) { - this.sid = sid; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java b/core/platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java deleted file mode 100644 index b298a71adb..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.sunbird.response; - -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; - -public class ClientErrorResponse extends Response { - - private ProjectCommonException exception = null; - - public ClientErrorResponse() { - responseCode = ResponseCode.CLIENT_ERROR; - } - - public ProjectCommonException getException() { - return exception; - } - - public void setException(ProjectCommonException exception) { - this.exception = exception; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/response/Params.java b/core/platform-common/src/main/java/org/sunbird/response/Params.java deleted file mode 100644 index 4def244c1c..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/response/Params.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.sunbird.response; - -import java.io.Serializable; - -/** - * Common response parameter bean - * - * @author Manzarul - */ -public class Params implements Serializable { - - private static final long serialVersionUID = -8786004970726124473L; - private String resmsgid; - private String msgid; - private String err; - private String status; - private String errmsg; - - /** @return String */ - public String getResmsgid() { - return resmsgid; - } - - /** @param resmsgid Stirng */ - public void setResmsgid(String resmsgid) { - this.resmsgid = resmsgid; - } - - /** @return Stirng */ - public String getMsgid() { - return msgid; - } - - /** @param msgid String */ - public void setMsgid(String msgid) { - this.msgid = msgid; - } - - /** @return String */ - public String getErr() { - return err; - } - - /** @param err String */ - public void setErr(String err) { - this.err = err; - } - - /** @return String */ - public String getStatus() { - return status; - } - - /** @param status Stirng */ - public void setStatus(String status) { - this.status = status; - } - - /** @return Stirng */ - public String getErrmsg() { - return errmsg; - } - - /** @param errmsg Stirng */ - public void setErrmsg(String errmsg) { - this.errmsg = errmsg; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/response/Response.java b/core/platform-common/src/main/java/org/sunbird/response/Response.java deleted file mode 100644 index 573f0a5de0..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/response/Response.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.sunbird.response; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; -import org.sunbird.exception.ResponseCode; - -/** - * This is a common response class for all the layer. All layer will send same response object. - * - * @author Manzarul - */ -public class Response implements Serializable, Cloneable { - - private static final long serialVersionUID = -3773253896160786443L; - protected String id; - protected String ver; - protected String ts; - protected ResponseParams params; - protected ResponseCode responseCode = ResponseCode.OK; - protected Map result = new HashMap<>(); - - /** - * This will provide request unique id. - * - * @return String - */ - public String getId() { - return id; - } - - /** - * set the unique id - * - * @param id String - */ - public void setId(String id) { - this.id = id; - } - - /** - * this will provide api version - * - * @return String - */ - public String getVer() { - return ver; - } - - /** - * set the api version - * - * @param ver String - */ - public void setVer(String ver) { - this.ver = ver; - } - - /** - * this will provide complete time value - * - * @return String - */ - public String getTs() { - return ts; - } - - /** - * set the time value - * - * @param ts String - */ - public void setTs(String ts) { - this.ts = ts; - } - - /** @return Map */ - public Map getResult() { - return result; - } - - /** - * @param key String - * @return Object - */ - public Object get(String key) { - return result.get(key); - } - - /** - * @param key String - * @param vo Object - */ - public void put(String key, Object vo) { - result.put(key, vo); - } - - /** @param map Map */ - public void putAll(Map map) { - result.putAll(map); - } - - public boolean containsKey(String key) { - return result.containsKey(key); - } - - /** - * This will provide response parameter object. - * - * @return ResponseParams - */ - public ResponseParams getParams() { - return params; - } - - /** - * set the response parameter object. - * - * @param params ResponseParams - */ - public void setParams(ResponseParams params) { - this.params = params; - } - - /** - * Set the response code for header. - * - * @param code ResponseCode - */ - public void setResponseCode(ResponseCode code) { - this.responseCode = code; - } - - /** - * get the response code - * - * @return ResponseCode - */ - public ResponseCode getResponseCode() { - return this.responseCode; - } - - public Response clone(Response response) { - try { - return (Response) response.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/response/ResponseParams.java b/core/platform-common/src/main/java/org/sunbird/response/ResponseParams.java deleted file mode 100644 index bf31ffeac8..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/response/ResponseParams.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.sunbird.response; - -import java.io.Serializable; - -/** - * This class will contains response envelop. - * - * @author Manzarul - */ -public class ResponseParams implements Serializable { - - private static final long serialVersionUID = 6772142067149203497L; - private String resmsgid; - private String msgid; - private String err; - private String status; - private String errmsg; - - public enum StatusType { - SUCCESSFUL, - WARNING, - FAILED; - } - - /** - * This will contains response message id. - * - * @return String - */ - public String getResmsgid() { - return resmsgid; - } - - /** - * set the response message id. - * - * @param resmsgid String - */ - public void setResmsgid(String resmsgid) { - this.resmsgid = resmsgid; - } - - /** - * This will provide request specific message id. - * - * @return String - */ - public String getMsgid() { - return msgid; - } - - /** - * Set the request specific message id. - * - * @param msgid - */ - public void setMsgid(String msgid) { - this.msgid = msgid; - } - - /** - * This will provide error message - * - * @return String - */ - public String getErr() { - return err; - } - - /** - * Set the error message - * - * @param err String - */ - public void setErr(String err) { - this.err = err; - } - - /** - * This will return api call status - * - * @return String - */ - public String getStatus() { - return status; - } - - /** - * Set the api call status - * - * @param status - */ - public void setStatus(String status) { - this.status = status; - } - - /** - * This will provide Error message in english - * - * @return String - */ - public String getErrmsg() { - return errmsg; - } - - /** - * Set the error message in English. - * - * @param message String - */ - public void setErrmsg(String message) { - this.errmsg = message; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/KeyCloakConnectionProvider.java b/core/platform-common/src/main/java/org/sunbird/sso/KeyCloakConnectionProvider.java deleted file mode 100644 index ff8856e5c5..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/KeyCloakConnectionProvider.java +++ /dev/null @@ -1,154 +0,0 @@ -/** */ -package org.sunbird.sso; - -import org.apache.commons.lang3.StringUtils; -import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; -import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; -import org.keycloak.admin.client.Keycloak; -import org.keycloak.admin.client.KeycloakBuilder; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.PropertiesCache; - -/** - * @author Manzarul This class will connect to key cloak server and provide the connection to do - * other operations. - */ -public class KeyCloakConnectionProvider { - - private static final LoggerUtil logger = new LoggerUtil(KeyCloakConnectionProvider.class); - - private static Keycloak keycloak; - private static final PropertiesCache cache = PropertiesCache.getInstance(); - public static String SSO_URL = null; - public static String SSO_REALM = null; - public static String CLIENT_ID = null; - - static { - try { - initialiseConnection(); - } catch (Exception e) { - logger.error( - "Exception occurred while initializing keycloak connection: " + e.getMessage(), e); - } - registerShutDownHook(); - } - - /** - * Method to initializate the Keycloak connection - * - * @return Keycloak connection - */ - public static Keycloak initialiseConnection() throws Exception { - keycloak = initialiseEnvConnection(); - if (keycloak != null) { - return keycloak; - } - KeycloakBuilder keycloakBuilder = - KeycloakBuilder.builder() - .serverUrl(cache.getProperty(JsonKey.SSO_URL)) - .realm(cache.getProperty(JsonKey.SSO_REALM)) - .username(cache.getProperty(JsonKey.SSO_USERNAME)) - .password(cache.getProperty(JsonKey.SSO_PASSWORD)) - .clientId(cache.getProperty(JsonKey.SSO_CLIENT_ID)) - .resteasyClient( - new ResteasyClientBuilderImpl() - .connectionPoolSize(Integer.parseInt(cache.getProperty(JsonKey.SSO_POOL_SIZE))) - .build()); - if (cache.getProperty(JsonKey.SSO_CLIENT_SECRET) != null - && !(cache.getProperty(JsonKey.SSO_CLIENT_SECRET).equals(JsonKey.SSO_CLIENT_SECRET))) { - keycloakBuilder.clientSecret(cache.getProperty(JsonKey.SSO_CLIENT_SECRET)); - } - SSO_URL = cache.getProperty(JsonKey.SSO_URL); - SSO_REALM = cache.getProperty(JsonKey.SSO_REALM); - CLIENT_ID = cache.getProperty(JsonKey.SSO_CLIENT_ID); - keycloak = keycloakBuilder.build(); - - logger.info("key cloak instance is created successfully."); - return keycloak; - } - - /** - * This method will provide the keycloak connection from environment variable. if environment - * variable is not set then it will return null. - * - * @return Keycloak - */ - private static Keycloak initialiseEnvConnection() throws Exception { - String url = System.getenv(JsonKey.SUNBIRD_SSO_URL); - String username = System.getenv(JsonKey.SUNBIRD_SSO_USERNAME); - String password = System.getenv(JsonKey.SUNBIRD_SSO_PASSWORD); - String cleintId = System.getenv(JsonKey.SUNBIRD_SSO_CLIENT_ID); - String clientSecret = System.getenv(JsonKey.SUNBIRD_SSO_CLIENT_SECRET); - String relam = System.getenv(JsonKey.SUNBIRD_SSO_RELAM); - if (StringUtils.isBlank(url) - || StringUtils.isBlank(username) - || StringUtils.isBlank(password) - || StringUtils.isBlank(cleintId) - || StringUtils.isBlank(relam)) { - logger.info("key cloak connection is not provided by Environment variable."); - return null; - } - SSO_URL = url; - SSO_REALM = relam; - CLIENT_ID = cleintId; - KeycloakBuilder keycloakBuilder = - KeycloakBuilder.builder() - .serverUrl(url) - .realm(relam) - .username(username) - .password(password) - .clientId(cleintId) - .resteasyClient( - new ResteasyClientBuilderImpl() - .connectionPoolSize(Integer.parseInt(cache.getProperty(JsonKey.SSO_POOL_SIZE))) - .build()); - - if (StringUtils.isNotBlank(clientSecret)) { - keycloakBuilder.clientSecret(clientSecret); - logger.info("KeyCloakConnectionProvider:initialiseEnvConnection client sceret is provided."); - } - keycloakBuilder.grantType("client_credentials"); - keycloak = keycloakBuilder.build(); - logger.info("key cloak instance is created from Environment variable settings ."); - return keycloak; - } - - /** - * This method will provide key cloak connection instance. - * - * @return Keycloak - */ - public static Keycloak getConnection() { - if (keycloak != null) { - return keycloak; - } else { - try { - return initialiseConnection(); - } catch (Exception e) { - logger.error("getConnection : " + e.getMessage(), e); - } - } - return null; - } - - /** - * This class will be called by registerShutDownHook to register the call inside jvm , when jvm - * terminate it will call the run method to clean up the resource. - * - * @author Manzarul - */ - static class ResourceCleanUp extends Thread { - public void run() { - if (null != keycloak) { - keycloak.close(); - } - } - } - - /** Register the hook for resource clean up. this will be called when jvm shut down. */ - public static void registerShutDownHook() { - Runtime runtime = Runtime.getRuntime(); - runtime.addShutdownHook(new ResourceCleanUp()); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/KeycloakBruteForceAttackUtil.java b/core/platform-common/src/main/java/org/sunbird/sso/KeycloakBruteForceAttackUtil.java deleted file mode 100644 index 4907b83b82..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/KeycloakBruteForceAttackUtil.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.sunbird.sso; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.http.HttpHeaders; -import org.sunbird.http.HttpClientUtil; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; - -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -public class KeycloakBruteForceAttackUtil { - private static final LoggerUtil logger = new LoggerUtil(KeycloakBruteForceAttackUtil.class); - - private KeycloakBruteForceAttackUtil() {} - - private static String fedUserPrefix = - "f:" + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID) + ":"; - /** - * Get status of a user in brute force detection - * - * @param userId - * @return - */ - public static boolean isUserAccountDisabled(String userId, RequestContext context) - throws Exception { - String url = - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_LB_IP) - + "/auth/admin/realms/" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) - + "/attack-detection/brute-force/users/" - + fedUserPrefix - + userId; - String response = HttpClientUtil.get(url, getHeaders(context), context); - logger.info(context, "KeycloakBruteForceAttackUtil:getUserStatus: Response = " + response); - Map attackStatus = new ObjectMapper().readValue(response, Map.class); - boolean isDisabled = ((boolean) attackStatus.get("disabled")); - if (isDisabled) { - logger.info(context, "check attack detection for userId : " + userId + ", " + attackStatus); - } - return isDisabled; - } - - /** - * @param userId - * @param context - * @return - */ - public static boolean unlockTempDisabledUser(String userId, RequestContext context) - throws Exception { - String url = - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_LB_IP) - + "/auth/admin/realms/" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) - + "/attack-detection/brute-force/users/" - + fedUserPrefix - + userId; - HttpClientUtil.delete(url, getHeaders(context), context); - logger.info(context, "clear Brute Force For User for userId : " + userId); - return true; - } - - private static Map getHeaders(RequestContext context) throws Exception { - Map headers = new HashMap<>(); - headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); - headers.put(HttpHeaders.AUTHORIZATION, JsonKey.BEARER + KeycloakUtil.getAdminAccessTokenWithoutDomain(context)); - return headers; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/KeycloakRequiredActionLinkUtil.java b/core/platform-common/src/main/java/org/sunbird/sso/KeycloakRequiredActionLinkUtil.java deleted file mode 100644 index 6706c78ee0..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/KeycloakRequiredActionLinkUtil.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.sunbird.sso; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpHeaders; -import org.sunbird.http.HttpClientUtil; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; - -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -/** - * Keycloak utility to create required action links. - * - * @author Amit Kumar - */ -public class KeycloakRequiredActionLinkUtil { - private static final LoggerUtil logger = new LoggerUtil(KeycloakRequiredActionLinkUtil.class); - public static final String VERIFY_EMAIL = "VERIFY_EMAIL"; - public static final String UPDATE_PASSWORD = "UPDATE_PASSWORD"; - private static final String CLIENT_ID = "clientId"; - private static final String REQUIRED_ACTION = "requiredAction"; - private static final String USERNAME = "userName"; - private static final String EXPIRATION_IN_SEC = "expirationInSecs"; - private static final String REDIRECT_URI = "redirectUri"; - private static final String SUNBIRD_KEYCLOAK_LINK_EXPIRATION_TIME = - "sunbird_keycloak_required_action_link_expiration_seconds"; - private static final String SUNBIRD_KEYCLOAK_REQD_ACTION_LINK = "/get-required-action-link"; - private static final String LINK = "link"; - - private static ObjectMapper mapper = new ObjectMapper(); - - /** - * Get generated link for specified type and user from Keycloak service. - * - * @param userName User name - * @param requiredAction Type of link to be generated. Supported types are UPDATE_PASSWORD and - * VERIFY_EMAIL. - * @return Generated link from Keycloak service - */ - public static String getLink( - String userName, String redirectUri, String requiredAction, RequestContext context) { - Map request = new HashMap<>(); - - request.put(CLIENT_ID, ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_ID)); - request.put(USERNAME, userName); - request.put(REQUIRED_ACTION, requiredAction); - - String expirationInSecs = ProjectUtil.getConfigValue(SUNBIRD_KEYCLOAK_LINK_EXPIRATION_TIME); - if (StringUtils.isNotBlank(expirationInSecs)) { - request.put(EXPIRATION_IN_SEC, expirationInSecs); - } - request.put(REDIRECT_URI, redirectUri); - - try { - Thread.sleep( - Integer.parseInt(ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SYNC_READ_WAIT_TIME))); - return generateLink(request, context); - } catch (Exception ex) { - logger.error( - context, - "KeycloakRequiredActionLinkUtil:getLink: Exception occurred with error message = " - + ex.getMessage(), - ex); - } - return null; - } - - private static String generateLink(Map request, RequestContext context) - throws Exception { - Map headers = new HashMap<>(); - - headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); - headers.put(HttpHeaders.AUTHORIZATION, JsonKey.BEARER + KeycloakUtil.getAdminAccessTokenWithDomain(context)); - - logger.info( - context, - "KeycloakRequiredActionLinkUtil:generateLink: complete URL " - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_URL) - + "realms/" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) - + SUNBIRD_KEYCLOAK_REQD_ACTION_LINK); - logger.info(context, "KeycloakRequiredActionLinkUtil:generateLink: request body " + mapper.writeValueAsString(request)); - String url = - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_URL) - + "realms/" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) - + SUNBIRD_KEYCLOAK_REQD_ACTION_LINK; - String response = HttpClientUtil.post(url, mapper.writeValueAsString(request), headers, context); - - logger.info(context, "KeycloakRequiredActionLinkUtil:generateLink: Response = " + response); - - Map responseMap = new ObjectMapper().readValue(response, Map.class); - return (String) responseMap.get(LINK); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/KeycloakUtil.java b/core/platform-common/src/main/java/org/sunbird/sso/KeycloakUtil.java deleted file mode 100644 index 0ec7fe55e3..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/KeycloakUtil.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.sunbird.sso; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.HashMap; -import java.util.Map; -import javax.ws.rs.core.MediaType; -import org.apache.http.HttpHeaders; -import org.sunbird.http.HttpClientUtil; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; - -public class KeycloakUtil { - private static final LoggerUtil logger = new LoggerUtil(KeycloakUtil.class); - - private KeycloakUtil() {} - - public static String getAdminAccessToken(RequestContext context, String url) throws Exception { - Map headers = new HashMap<>(); - headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); - Map fields = new HashMap<>(); - fields.put("client_id", ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_ID)); - fields.put("client_secret", ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_SECRET)); - fields.put("grant_type", "client_credentials"); - - String response = HttpClientUtil.postFormData(url, fields, headers, context); - logger.debug(context, "KeycloakUtil:getAdminAccessToken: Response = " + response); - Map responseMap = new ObjectMapper().readValue(response, Map.class); - return (String) responseMap.get("access_token"); - } - - public static String getAdminAccessTokenWithDomain(RequestContext context) throws Exception { - String url = - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_URL) - + "realms/" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) - + "/protocol/openid-connect/token"; - String token = getAdminAccessToken(context, url); - return token; - } - - public static String getAdminAccessTokenWithoutDomain(RequestContext context) throws Exception { - String url = - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_LB_IP) - + "/auth/realms/" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) - + "/protocol/openid-connect/token"; - return getAdminAccessToken(context, url); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/SSOManager.java b/core/platform-common/src/main/java/org/sunbird/sso/SSOManager.java deleted file mode 100644 index fff7ea4ce1..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/SSOManager.java +++ /dev/null @@ -1,65 +0,0 @@ -/** */ -package org.sunbird.sso; - -import java.util.Map; -import org.sunbird.request.RequestContext; - -/** @author Manzarul This interface will handle all call related to single sign out. */ -public interface SSOManager { - - /** - * This method will verify user access token and provide userId if token is valid. in case of - * invalid access token it will throw ProjectCommon exception with 401. - * - * @param token String JWT access token - * @param context - * @return String - */ - String verifyToken(String token, RequestContext context); - - /** Update password in SSO server (keycloak). */ - boolean updatePassword(String userId, String password, RequestContext context); - - /** Cleanup User PII Information * */ - boolean removePII(String userId, RequestContext context); - - /** - * Method to remove user from keycloak account on basis of userId . - * - * @param request - * @param context - * @return - */ - String removeUser(Map request, RequestContext context); - - /** - * Method to deactivate user from keycloak , it is like soft delete . - * - * @param request - * @param context - * @return - */ - String deactivateUser(Map request, RequestContext context); - - /** - * Method to activate user from keycloak , it is like soft delete . - * - * @param request - * @param context - * @return - */ - String activateUser(Map request, RequestContext context); - - void setRequiredAction(String userId, String requiredAction); - - /** - * This method will verify user access token and provide userId if token is valid. in case of - * invalid access token it will throw ProjectCommon exception with 401. - * - * @param token String JWT access token - * @param url token will be validated against this url - * @param context - * @return String - */ - String verifyToken(String token, String url, RequestContext context); -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/SSOServiceFactory.java b/core/platform-common/src/main/java/org/sunbird/sso/SSOServiceFactory.java deleted file mode 100644 index 62bf3affd8..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/SSOServiceFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.sunbird.sso; - -import org.sunbird.sso.impl.KeyCloakServiceImpl; - -/** @author Amit Kumar */ -public class SSOServiceFactory { - private static SSOManager ssoManager = null; - - private SSOServiceFactory() {} - - /** - * On call of this method , it will provide a new KeyCloakServiceImpl instance on each call. - * - * @return SSOManager - */ - public static SSOManager getInstance() { - if (null == ssoManager) { - ssoManager = new KeyCloakServiceImpl(); - } - return ssoManager; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcher.java b/core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcher.java deleted file mode 100644 index 878a5a5533..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcher.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.sunbird.sso.impl; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.math.BigInteger; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.RSAPublicKeySpec; -import java.util.Base64; -import java.util.Base64.Decoder; -import java.util.HashMap; -import java.util.Map; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.util.EntityUtils; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.PropertiesCache; - -/** Class to fetch SSO public key from Keycloak server using 'certs' HTTP API call. */ -public class KeyCloakRsaKeyFetcher { - private static LoggerUtil logger = new LoggerUtil(KeyCloakRsaKeyFetcher.class); - - private static final String MODULUS = "modulusBase64"; - private static final String EXPONENT = "exponentBase64"; - - /** - * This method will accept keycloak base URL and realm name. Based on provided values it will - * fetch public key from keycloak. - * - * @param url A string value having keycloak base URL - * @param realm Keycloak realm name - * @return Public key used to verify user access token. - */ - public PublicKey getPublicKeyFromKeyCloak(String url, String realm) { - try { - Map valueMap = null; - Decoder urlDecoder = Base64.getUrlDecoder(); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - String publicKeyString = requestKeyFromKeycloak(url, realm); - if (publicKeyString != null) { - valueMap = getValuesFromJson(publicKeyString); - if (valueMap != null) { - BigInteger modulus = new BigInteger(1, urlDecoder.decode(valueMap.get(MODULUS))); - BigInteger publicExponent = new BigInteger(1, urlDecoder.decode(valueMap.get(EXPONENT))); - PublicKey key = keyFactory.generatePublic(new RSAPublicKeySpec(modulus, publicExponent)); - saveToCache(key); - return key; - } - } - } catch (Exception e) { - logger.error( - "KeyCloakRsaKeyFetcher:getPublicKeyFromKeyCloak: Exception occurred with message = " - + e.getMessage(), - e); - } - return null; - } - - /** - * This method will save the public key string value to cache - * - * @param key Public key to save in cache - */ - private void saveToCache(PublicKey key) { - byte[] encodedPublicKey = key.getEncoded(); - String publicKey = Base64.getEncoder().encodeToString(encodedPublicKey); - PropertiesCache cache = PropertiesCache.getInstance(); - cache.saveConfigProperty(JsonKey.SSO_PUBLIC_KEY, publicKey); - } - - /** - * This method will connect to keycloak server using API call for getting public key. - * - * @param url A string value having keycloak base URL - * @param realm Keycloak realm name - * @return Public key JSON response string - */ - private String requestKeyFromKeycloak(String url, String realm) { - HttpClient client = HttpClientBuilder.create().build(); - HttpGet request = new HttpGet(url + "realms/" + realm + "/protocol/openid-connect/certs"); - - try { - HttpResponse response = client.execute(request); - HttpEntity entity = response.getEntity(); - - if (entity != null) { - return EntityUtils.toString(entity); - } else { - logger.info( - "KeyCloakRsaKeyFetcher:requestKeyFromKeycloak: Not able to fetch SSO public key from keycloak server"); - } - } catch (IOException e) { - logger.error( - "KeyCloakRsaKeyFetcher:requestKeyFromKeycloak: Exception occurred with message = " - + e.getMessage(), - e); - } - return null; - } - - /** - * This method will return a map containing values extracted from public key JSON string. - * - * @param response Public key JSON response string - */ - private Map getValuesFromJson(String response) { - ObjectMapper mapper = new ObjectMapper(); - Map values = new HashMap<>(); - try { - JsonNode res = mapper.readTree(response); - JsonNode keys = res.get("keys"); - if (keys != null) { - - JsonNode value = keys.get(0); - values.put(MODULUS, value.get("n").asText()); - values.put(EXPONENT, value.get("e").asText()); - } - } catch (Exception e) { - logger.error( - "KeyCloakRsaKeyFetcher:getValuesFromJson: Exception occurred with message = " - + e.getMessage(), - e); - return null; - } - - return values; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakServiceImpl.java b/core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakServiceImpl.java deleted file mode 100644 index 9ac0f3425f..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/sso/impl/KeyCloakServiceImpl.java +++ /dev/null @@ -1,294 +0,0 @@ -package org.sunbird.sso.impl; - -import static java.util.Arrays.asList; - -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.X509EncodedKeySpec; -import java.util.Base64; -import java.util.List; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.keycloak.RSATokenVerifier; -import org.keycloak.admin.client.Keycloak; -import org.keycloak.admin.client.resource.UserResource; -import org.keycloak.representations.AccessToken; -import org.keycloak.representations.idm.CredentialRepresentation; -import org.keycloak.representations.idm.UserRepresentation; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.sso.KeyCloakConnectionProvider; -import org.sunbird.sso.SSOManager; -import org.sunbird.util.ProjectUtil; - -/** - * Single sign out service implementation with Key Cloak. - * - * @author Manzarul - */ -public class KeyCloakServiceImpl implements SSOManager { - private final LoggerUtil logger = new LoggerUtil(KeyCloakServiceImpl.class); - private final Keycloak keycloak = KeyCloakConnectionProvider.getConnection(); - - private static PublicKey SSO_PUBLIC_KEY = null; - - public PublicKey getPublicKey() { - if (null == SSO_PUBLIC_KEY) { - SSO_PUBLIC_KEY = toPublicKey(System.getenv(JsonKey.SSO_PUBLIC_KEY)); - } - return SSO_PUBLIC_KEY; - } - - @Override - public String verifyToken(String accessToken, RequestContext context) { - return verifyToken(accessToken, null, context); - } - - /** - * This method will generate Public key form keycloak realm publickey String - * - * @param publicKeyString String - * @return PublicKey - */ - private PublicKey toPublicKey(String publicKeyString) { - try { - byte[] publicBytes = Base64.getDecoder().decode(publicKeyString); - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - return keyFactory.generatePublic(keySpec); - } catch (Exception e) { - return null; - } - } - - @Override - public boolean updatePassword(String userId, String password, RequestContext context) { - try { - String fedUserId = getFederatedUserId(userId); - UserResource ur = keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); - CredentialRepresentation cr = new CredentialRepresentation(); - cr.setType(CredentialRepresentation.PASSWORD); - cr.setValue(password); - ur.resetPassword(cr); - return true; - } catch (Exception e) { - logger.error(context, "updatePassword: Exception occurred: ", e); - } - return false; - } - - @Override - public boolean removePII(String userId, RequestContext context) { - try { - String fedUserId = getFederatedUserId(userId); - UserResource userResource = - keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); - UserRepresentation user = userResource.toRepresentation(); - user.setEmailVerified(false); - user.setEmail(""); - user.setFirstName(""); - user.setLastName(""); - user.setEnabled(false); - logger.info("KeyCloakServiceImpl::removePII:: userId:: " + fedUserId); - userResource.update(user); - List userSessions = userResource.getUserSessions(); - for (Object userSession : userSessions) - userSessions.remove(userSession); - return true; - } catch (Exception e) { - logger.error(context, "removePII: Exception occurred: ", e); - } - return false; - } - - /** - * Method to remove the user on basis of user id. - * - * @param request Map - * @param context RequestContext - * @return boolean true if success otherwise false . - */ - @Override - public String removeUser(Map request, RequestContext context) { - Keycloak keycloak = KeyCloakConnectionProvider.getConnection(); - String userId = (String) request.get(JsonKey.USER_ID); - logger.info("KeycloakServiceImpl:: removeUser:: userId:: " + userId); - try { - String fedUserId = getFederatedUserId(userId); - logger.info("KeycloakServiceImpl:: removeUser:: fedUserId:: " + fedUserId); - UserResource resource = - keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); - if (null != (resource)) { - logger.info("KeycloakServiceImpl:: removeUser:: resource:: " + resource.toRepresentation()); - resource.remove(); - } - } catch (Exception ex) { - logger.error(context, "Error occurred : ", ex); - String exMsg = - String.format(ResponseMessage.Message.INVALID_PARAMETER_VALUE, userId, JsonKey.USER_ID); - ProjectCommonException.throwClientErrorException(ResponseCode.invalidParameterValue, exMsg); - } - return JsonKey.SUCCESS; - } - - /** - * Method to deactivate the user on basis of user id. - * - * @param request Map - * @param context - * @return boolean true if success otherwise false . - */ - @Override - public String deactivateUser(Map request, RequestContext context) { - String userId = (String) request.get(JsonKey.USER_ID); - makeUserActiveOrInactive(userId, false, context); - return JsonKey.SUCCESS; - } - - /** - * Method to activate the user on basis of user id. - * - * @param request Map - * @param context - * @return boolean true if success otherwise false . - */ - @Override - public String activateUser(Map request, RequestContext context) { - String userId = (String) request.get(JsonKey.USER_ID); - makeUserActiveOrInactive(userId, true, context); - return JsonKey.SUCCESS; - } - - /** - * This method will take userid and boolean status to update user status - * - * @param userId String - * @param status boolean - * @throws ProjectCommonException - */ - private void makeUserActiveOrInactive(String userId, boolean status, RequestContext context) { - try { - String fedUserId = getFederatedUserId(userId); - logger.info(context, "makeUserActiveOrInactive: federation id formed: " + fedUserId); - validateUserId(fedUserId); - logger.info(context, "makeUserActiveOrInactive: user validated: "); - Keycloak keycloak = KeyCloakConnectionProvider.getConnection(); - - logger.info( - context, - "makeUserActiveOrInactive: keycloak: " - + keycloak.toString() - + " || " - + keycloak.serverInfo()); - UserResource resource = - keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); - logger.info("makeUserActiveOrInactive: resource: " + resource.toString()); - UserRepresentation ur = resource.toRepresentation(); - logger.info("makeUserActiveOrInactive: ur: " + ur.isEnabled()); - ur.setEnabled(status); - resource.update(ur); - } catch (Exception e) { - logger.info( - "makeUserActiveOrInactive:error occurred while blocking or unblocking user: " - + e.getCause() - + " || " - + e.getMessage()); - logger.error( - context, - "makeUserActiveOrInactive:error occurred while blocking or unblocking user: ", - e); - String exMsg = - String.format(ResponseMessage.Message.INVALID_PARAMETER_VALUE, userId, JsonKey.USER_ID); - ProjectCommonException.throwClientErrorException(ResponseCode.invalidParameterValue, exMsg); - } - } - - /** - * This method will check userId value, if value is null or empty then it will throw - * ProjectCommonException - * - * @param userId String - * @throws ProjectCommonException - */ - private void validateUserId(String userId) { - if (StringUtils.isBlank(userId)) { - String exMsg = - String.format(ResponseMessage.Message.INVALID_PARAMETER_VALUE, userId, JsonKey.USER_ID); - ProjectCommonException.throwClientErrorException(ResponseCode.invalidParameterValue, exMsg); - } - } - - private String getFederatedUserId(String userId) { - return String.join( - ":", - "f", - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID), - userId); - } - - @Override - public void setRequiredAction(String userId, String requiredAction) { - String fedUserId = getFederatedUserId(userId); - UserResource resource = - keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); - - UserRepresentation userRepresentation = resource.toRepresentation(); - userRepresentation.setRequiredActions(asList(requiredAction)); - resource.update(userRepresentation); - } - - @Override - public String verifyToken(String accessToken, String url, RequestContext context) { - - try { - PublicKey publicKey = getPublicKey(); - if (publicKey != null) { - String ssoUrl = (url != null ? url : KeyCloakConnectionProvider.SSO_URL); - AccessToken token = - RSATokenVerifier.verifyToken( - accessToken, - publicKey, - ssoUrl + "realms/" + KeyCloakConnectionProvider.SSO_REALM, - true, - true); - logger.info( - context, - token.getId() - + " " - + token.issuedFor - + " " - + token.getProfile() - + " " - + token.getSubject() - + " Active: " - + token.isActive() - + " isExpired: " - + token.isExpired() - + " " - + token.issuedNow().getExpiration()); - String tokenSubject = token.getSubject(); - if (StringUtils.isNotBlank(tokenSubject)) { - int pos = tokenSubject.lastIndexOf(":"); - return tokenSubject.substring(pos + 1); - } - return token.getSubject(); - } else { - logger.info(context, "verifyToken: SSO_PUBLIC_KEY is NULL."); - throw new ProjectCommonException( - ResponseCode.serverError, - ResponseCode.serverError.getErrorMessage(), - ResponseCode.SERVER_ERROR.getResponseCode()); - } - } catch (Exception e) { - logger.error(context, "verifyToken: Exception occurred: ", e); - throw new ProjectCommonException( - ResponseCode.unAuthorized, - ResponseCode.unAuthorized.getErrorMessage(), - ResponseCode.UNAUTHORIZED.getResponseCode()); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/url/URLShortner.java b/core/platform-common/src/main/java/org/sunbird/url/URLShortner.java deleted file mode 100644 index eac3f7bcfc..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/url/URLShortner.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.sunbird.url; - -import org.sunbird.request.RequestContext; - -public interface URLShortner { - - public String shortUrl(String url, RequestContext context); -} diff --git a/core/platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java b/core/platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java deleted file mode 100644 index a0b986d5fe..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.sunbird.url; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.http.HttpClientUtil; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; - -/** @author Amit Kumar */ -public class URLShortnerImpl implements URLShortner { - private static final LoggerUtil logger = new LoggerUtil(URLShortnerImpl.class); - - private static String resUrl = null; - private static final String SUNBIRD_WEB_URL = "sunbird_web_url"; - - @Override - public String shortUrl(String url, RequestContext context) { - boolean flag = false; - try { - flag = Boolean.parseBoolean(ProjectUtil.getConfigValue(JsonKey.SUNBIRD_URL_SHORTNER_ENABLE)); - } catch (Exception ex) { - logger.error(context, "Exception occurred while parsing sunbird_url_shortner_enable key", ex); - } - if (flag) { - String baseUrl = PropertiesCache.getInstance().getProperty("sunbird_url_shortner_base_url"); - String accessToken = System.getenv("url_shortner_access_token"); - if (StringUtils.isBlank(accessToken)) { - accessToken = - PropertiesCache.getInstance().getProperty("sunbird_url_shortner_access_token"); - } - String requestURL = baseUrl + accessToken + "&longUrl=" + url; - String response = HttpClientUtil.get(requestURL, null, context); - ObjectMapper mapper = new ObjectMapper(); - Map map = null; - if (!StringUtils.isBlank(response)) { - try { - map = mapper.readValue(response, HashMap.class); - Map dataMap = (Map) map.get("data"); - return dataMap.get("url"); - } catch (IOException | ClassCastException e) { - logger.error(context, "Exception occurred while parsing " + e.getMessage(), e); - } - } - } - return url; - } - - /** @return the url */ - public String getUrl(RequestContext context) { - if (StringUtils.isBlank(resUrl)) { - String webUrl = System.getenv(SUNBIRD_WEB_URL); - if (StringUtils.isBlank(webUrl)) { - webUrl = PropertiesCache.getInstance().getProperty(SUNBIRD_WEB_URL); - } - return shortUrl(webUrl, context); - } else { - return resUrl; - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/AuditLog.java b/core/platform-common/src/main/java/org/sunbird/util/AuditLog.java deleted file mode 100644 index e2ac3e5717..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/AuditLog.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.sunbird.util; - -import java.util.Map; - -public class AuditLog { - - private String requestId; - private String objectId; - private String objectType; - private String operationType; - private String date; - private String userId; - private Map logRecord; - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public String getObjectId() { - return objectId; - } - - public void setObjectId(String objectId) { - this.objectId = objectId; - } - - public String getObjectType() { - return objectType; - } - - public void setObjectType(String objectType) { - this.objectType = objectType; - } - - public String getOperationType() { - return operationType; - } - - public void setOperationType(String operationType) { - this.operationType = operationType; - } - - public String getDate() { - return date; - } - - public void setDate(String date) { - this.date = date; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public Map getLogRecord() { - return logRecord; - } - - public void setLogRecord(Map logRecord) { - this.logRecord = logRecord; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/CloudStorageUtil.java b/core/platform-common/src/main/java/org/sunbird/util/CloudStorageUtil.java deleted file mode 100644 index 91fd21b1d0..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/CloudStorageUtil.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.sunbird.util; - -import java.util.HashMap; -import java.util.Map; -import org.sunbird.cloud.storage.IStorageService; -import org.sunbird.cloud.storage.factory.StorageConfig; -import org.sunbird.cloud.storage.factory.StorageServiceFactory; -import org.sunbird.keys.JsonKey; -import scala.Option; -import scala.Some; - -public class CloudStorageUtil { - private static final int STORAGE_SERVICE_API_RETRY_COUNT = 3; - private static final Map storageServiceMap = new HashMap<>(); - - public static String upload(String storageType, String container, String objectKey, String filePath) { - IStorageService storageService = getStorageService(storageType); - return storageService.upload(container, filePath, objectKey, Option.apply(false), Option.apply(1), Option.apply(STORAGE_SERVICE_API_RETRY_COUNT), Option.empty()); - } - - public static String getSignedUrl(String storageType, String container, String objectKey) { - IStorageService storageService = getStorageService(storageType); - return getSignedUrl(storageService, container, objectKey,storageType); - } - - public static String getSignedUrl(IStorageService storageService, String container, String objectKey,String cloudType) { - int timeoutInSeconds = getTimeoutInSeconds(); - return storageService.getSignedURLV2(container, objectKey, Some.apply(timeoutInSeconds), Some.apply("r"), Some.apply("application/pdf"), Option.empty()); - } - - public static void deleteFile(String storageType, String container, String objectKey) { - IStorageService storageService = getStorageService(storageType); - storageService.deleteObject(container, objectKey, Option.apply(false)); - } - - private static IStorageService getStorageService(String storageType) { - String storageKey = PropertiesCache.getInstance().getProperty(JsonKey.ACCOUNT_NAME); - String storageSecret = PropertiesCache.getInstance().getProperty(JsonKey.ACCOUNT_KEY); - scala.Option storageEndpoint = scala.Option.apply(PropertiesCache.getInstance().getProperty(JsonKey.ACCOUNT_ENDPOINT)); - scala.Option storageRegion = scala.Option.apply(""); - return getStorageService(storageType, storageKey, storageSecret,storageEndpoint,storageRegion); - } - - - private static IStorageService getStorageService( - String storageType, String storageKey, String storageSecret,scala.Option storageEndpoint, scala.Option storageRegion ) { - String compositeKey = storageType + "-" + storageKey; - if (storageServiceMap.containsKey(compositeKey)) { - return storageServiceMap.get(compositeKey); - } - synchronized (CloudStorageUtil.class) { - - StorageConfig storageConfig = - new StorageConfig(storageType, storageKey, storageSecret, storageEndpoint, storageRegion); - IStorageService storageService = StorageServiceFactory.getStorageService(storageConfig); - storageServiceMap.put(compositeKey, storageService); - } - return storageServiceMap.get(compositeKey); - } - - private static int getTimeoutInSeconds() { - String timeoutInSecondsStr = ProjectUtil.getConfigValue(JsonKey.DOWNLOAD_LINK_EXPIRY_TIMEOUT); - return Integer.parseInt(timeoutInSecondsStr); - } -} \ No newline at end of file diff --git a/core/platform-common/src/main/java/org/sunbird/util/ConfigUtil.java b/core/platform-common/src/main/java/org/sunbird/util/ConfigUtil.java deleted file mode 100644 index 06262b2915..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/ConfigUtil.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.sunbird.util; - -import com.typesafe.config.Config; -import com.typesafe.config.ConfigFactory; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.logging.LoggerUtil; - -/** - * This util class for providing type safe config to any service that requires it. - * - * @author Manzarul - */ -public class ConfigUtil { - - public static LoggerUtil logger = new LoggerUtil(ConfigUtil.class); - private static Config config; - private static final String DEFAULT_TYPE_SAFE_CONFIG_FILE_NAME = "service.conf"; - - /** Private default constructor. */ - private ConfigUtil() {} - - /** - * This method will create a type safe config object and return to caller. It will read the config - * value from System env first and as a fall back it will use service.conf file. - * - * @return Type safe config object - */ - public static Config getConfig() { - if (config == null) { - synchronized (ConfigUtil.class) { - config = createConfig(DEFAULT_TYPE_SAFE_CONFIG_FILE_NAME); - } - } - return config; - } - - private static Config createConfig(String fileName) { - Config defaultConf = ConfigFactory.load(fileName); - Config envConf = ConfigFactory.systemEnvironment(); - return envConf.withFallback(defaultConf); - } - - /* - * Parse configuration in JSON format and return a type safe config object. - * - * @param jsonString Configuration in JSON format - * @return Type safe config object - */ - public static Config getConfigFromJsonString(String jsonString, String configType) { - if (null == jsonString || StringUtils.isBlank(jsonString)) { - ProjectCommonException.throwServerErrorException( - ResponseCode.errorConfigLoadEmptyString, - ProjectUtil.formatMessage( - ResponseCode.errorConfigLoadEmptyString.getErrorMessage(), configType)); - } - - Config jsonConfig = null; - try { - jsonConfig = ConfigFactory.parseString(jsonString); - } catch (Exception e) { - logger.error( - "ConfigUtil:getConfigFromJsonString: Exception occurred during parse with error message = " - + e.getMessage(), - e); - ProjectCommonException.throwServerErrorException( - ResponseCode.errorConfigLoadParseString, - ProjectUtil.formatMessage( - ResponseCode.errorConfigLoadParseString.getErrorMessage(), configType)); - } - - if (null == jsonConfig || jsonConfig.isEmpty()) { - ProjectCommonException.throwServerErrorException( - ResponseCode.errorConfigLoadEmptyConfig, - ProjectUtil.formatMessage( - ResponseCode.errorConfigLoadEmptyConfig.getErrorMessage(), configType)); - } - return jsonConfig; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/EntryExitLogEvent.java b/core/platform-common/src/main/java/org/sunbird/util/EntryExitLogEvent.java deleted file mode 100644 index c514ce4a16..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/EntryExitLogEvent.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.sunbird.util; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.sunbird.keys.JsonKey; - -public class EntryExitLogEvent { - private String eid; - - private Map edata = new HashMap<>(); - - public String getEid() { - return eid; - } - - public void setEid(String eid) { - this.eid = eid; - } - - public Map getEdata() { - return edata; - } - - public void setEdata( - String type, - String level, - String requestid, - String message, - List> params) { - this.edata.put(JsonKey.TYPE, type); - this.edata.put(JsonKey.LEVEL, level); - this.edata.put(JsonKey.REQUEST_ID, requestid); - this.edata.put(JsonKey.MESSAGE, message); - this.edata.put(JsonKey.PARAMS, params); - } - - public void setEdataParams(List> params) { - this.edata.put(JsonKey.PARAMS, params); - } - - @Override - public String toString() { - return "{" + "eid='" + eid + '\'' + ", edata=" + edata + '}'; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/ExcelFileUtil.java b/core/platform-common/src/main/java/org/sunbird/util/ExcelFileUtil.java deleted file mode 100644 index 0e8de24b60..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/ExcelFileUtil.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.sunbird.util; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.List; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.sunbird.logging.LoggerUtil; - -public class ExcelFileUtil extends FileUtil { - - private static LoggerUtil logger = new LoggerUtil(ExcelFileUtil.class); - - @SuppressWarnings({"resource", "unused"}) - public File writeToFile(String fileName, List> dataValues) { - // Blank workbook - XSSFWorkbook workbook = new XSSFWorkbook(); - // Create a blank sheet - XSSFSheet sheet = workbook.createSheet("Data"); - FileOutputStream out = null; - File file = null; - int rownum = 0; - for (Object key : dataValues) { - Row row = sheet.createRow(rownum); - List objArr = dataValues.get(rownum); - int cellnum = 0; - for (Object obj : objArr) { - Cell cell = row.createCell(cellnum++); - if (obj instanceof String) { - cell.setCellValue((String) obj); - } else if (obj instanceof Integer) { - cell.setCellValue((Integer) obj); - } else if (obj instanceof List) { - cell.setCellValue(getListValue(obj)); - } else if (obj instanceof Double) { - cell.setCellValue((Double) obj); - } else { - if (null != (obj)) { - cell.setCellValue(obj.toString()); - } - } - } - rownum++; - } - - try { - // Write the workbook in file system - file = new File(fileName + ".xlsx"); - out = new FileOutputStream(file); - workbook.write(out); - logger.info("File " + fileName + " created successfully"); - - } catch (Exception e) { - logger.error("writeToFile: " + e.getMessage(), e); - } finally { - if (null != out) { - try { - out.close(); - } catch (IOException e) { - logger.error("writeToFile: " + e.getMessage(), e); - } - } - } - return file; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/FileUtil.java b/core/platform-common/src/main/java/org/sunbird/util/FileUtil.java deleted file mode 100644 index fe4bab9c88..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/FileUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.sunbird.util; - -import java.io.File; -import java.util.List; -import org.apache.commons.lang3.StringUtils; - -public abstract class FileUtil { - - public abstract File writeToFile(String fileName, List> dataValues); - - @SuppressWarnings("unchecked") - protected static String getListValue(Object obj) { - List data = (List) obj; - if (!(data.isEmpty())) { - StringBuilder sb = new StringBuilder(); - for (Object value : data) { - sb.append((String) value).append(","); - } - sb.deleteCharAt(sb.length() - 1); - return sb.toString(); - } - return ""; - } - - public static FileUtil getFileUtil(String format) { - String tempformat = ""; - if (!StringUtils.isBlank(format)) { - tempformat = format.toLowerCase(); - } - switch (tempformat) { - case "excel": - return (new ExcelFileUtil()); - default: - return (new ExcelFileUtil()); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/Matcher.java b/core/platform-common/src/main/java/org/sunbird/util/Matcher.java deleted file mode 100644 index 1b4196c1eb..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/Matcher.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.sunbird.util; - -import org.apache.commons.lang3.StringUtils; - -/** this class is used to match the identifiers. */ -public class Matcher { - - /** - * this method will match the two arguments , equal or not if two string is null or empty this - * method will return true - * - * @param firstVal - * @param secondVal - * @return boolean - */ - public static boolean matchIdentifiers(String firstVal, String secondVal) { - return StringUtils.equalsIgnoreCase(firstVal, secondVal); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java b/core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java deleted file mode 100644 index ce586cc8af..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/ProjectUtil.java +++ /dev/null @@ -1,598 +0,0 @@ -package org.sunbird.util; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.i18n.phonenumbers.NumberParseException; -import com.google.i18n.phonenumbers.PhoneNumberUtil; -import com.google.i18n.phonenumbers.Phonenumber; -import org.apache.commons.lang3.StringUtils; -import org.apache.velocity.VelocityContext; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.Request; -import org.sunbird.request.RequestContext; - -import java.io.IOException; -import java.text.MessageFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * This class will contains all the common utility methods. - * - * @author Manzarul - */ -public class ProjectUtil { - private static LoggerUtil logger = new LoggerUtil(ProjectUtil.class); - - /** format the date in YYYY-MM-DD hh:mm:ss:SSZ */ - private static AtomicInteger atomicInteger = new AtomicInteger(); - - public static final String YEAR_MONTH_DATE_FORMAT = "yyyy-MM-dd"; - public static PropertiesCache propertiesCache; - private static Pattern pattern; - public static final String EMAIL_PATTERN = - "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" - + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; - public static final String[] excludes = - new String[] { - JsonKey.COMPLETENESS, JsonKey.MISSING_FIELDS, JsonKey.PROFILE_VISIBILITY, JsonKey.LOGIN_ID - }; - - private static ObjectMapper mapper = new ObjectMapper(); - - static { - pattern = Pattern.compile(EMAIL_PATTERN); - propertiesCache = PropertiesCache.getInstance(); - } - - public enum Environment { - dev(1), - qa(2), - prod(3); - int value; - - Environment(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - } - - public enum Status { - ACTIVE(1), - INACTIVE(0), - DELETED(2); - - private int value; - - Status(int value) { - this.value = value; - } - - public int getValue() { - return this.value; - } - } - - public enum BulkProcessStatus { - NEW(0), - IN_PROGRESS(1), - INTERRUPT(2), - COMPLETED(3), - FAILED(9); - - private int value; - - BulkProcessStatus(int value) { - this.value = value; - } - - public int getValue() { - return this.value; - } - } - - public enum OrgStatus { - INACTIVE(0), - ACTIVE(1), - BLOCKED(2), - RETIRED(3); - - private Integer value; - - OrgStatus(Integer value) { - this.value = value; - } - - public Integer getValue() { - return this.value; - } - } - - public enum ProgressStatus { - NOT_STARTED(0), - STARTED(1), - COMPLETED(2); - - private int value; - - ProgressStatus(int value) { - this.value = value; - } - - public int getValue() { - return this.value; - } - } - - public enum ActiveStatus { - ACTIVE(true), - INACTIVE(false); - - private boolean value; - - ActiveStatus(boolean value) { - this.value = value; - } - - public boolean getValue() { - return this.value; - } - } - - public enum UserLookupType { - USERNAME(JsonKey.USER_LOOKUP_FILED_USER_NAME), - EMAIL(JsonKey.EMAIL), - PHONE(JsonKey.PHONE); - - private String type; - - UserLookupType(String type) { - this.type = type; - } - - public String getType() { - return this.type; - } - } - - /** - * This method will provide formatted date - * - * @return - */ - public static String getFormattedDate() { - return getDateFormatter().format(new Date()); - } - - /** - * Validate email with regular expression - * - * @param email - * @return true valid email, false invalid email - */ - public static boolean isEmailvalid(final String email) { - if (StringUtils.isBlank(email)) { - return false; - } - Matcher matcher = pattern.matcher(email); - return matcher.matches(); - } - - public enum UserRole { - PUBLIC("PUBLIC"); - - private String value; - - UserRole(String value) { - this.value = value; - } - - public String getValue() { - return this.value; - } - } - - /** - * This method will generate unique id based on current time stamp and some random value mixed up. - * - * @param environmentId int - * @return String - */ - public static String getUniqueIdFromTimestamp(int environmentId) { - Random random = new Random(); - long env = (environmentId + random.nextInt(99999)) / 10000000; - long uid = System.currentTimeMillis() + random.nextInt(999999); - uid = uid << 13; - return env + "" + uid + "" + atomicInteger.getAndIncrement(); - } - - /** - * This method will generate the unique id . - * - * @return - */ - public static synchronized String generateUniqueId() { - return UUID.randomUUID().toString(); - } - - public enum Method { - GET, - POST, - PUT, - DELETE, - PATCH - } - - /** - * This enum will hold all the ES type name. - * - * @author Manzarul - */ - public enum EsType { - user(getConfigValue(JsonKey.ES_USER_INDEX_ALIAS)), - organisation(getConfigValue(JsonKey.ES_ORG_INDEX_INDEX)), - usernotes(getConfigValue(JsonKey.ES_USER_NOTES_INDEX)), - location(getConfigValue(JsonKey.ES_LOCATION_INDEX)), - userfeed(getConfigValue(JsonKey.ES_USER_FEED_INDEX)), - course(getConfigValue(JsonKey.ES_COURSE_INDEX)), - courseBatch(getConfigValue(JsonKey.ES_COURSE_BATCH_INDEX)); - - private String typeName; - - EsType(String name) { - this.typeName = name; - } - - public String getTypeName() { - return typeName; - } - } - - public static String formatMessage(String exceptionMsg, Object... fieldValue) { - return MessageFormat.format(exceptionMsg, fieldValue); - } - - public static SimpleDateFormat getDateFormatter() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSSZ"); - simpleDateFormat.setLenient(false); - return simpleDateFormat; - } - - public static VelocityContext getContext(Map map) { - propertiesCache = PropertiesCache.getInstance(); - VelocityContext context = new VelocityContext(); - if (StringUtils.isNotBlank((String) map.get(JsonKey.ACTION_URL))) { - context.put(JsonKey.ACTION_URL, getValue(map, JsonKey.ACTION_URL)); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.NAME))) { - context.put(JsonKey.NAME, getValue(map, JsonKey.NAME)); - } - context.put(JsonKey.BODY, getValue(map, JsonKey.BODY)); - String fromEmail = getFromEmail(map); - if (StringUtils.isNotBlank(fromEmail)) { - context.put(JsonKey.FROM_EMAIL, fromEmail); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.ORG_NAME))) { - context.put(JsonKey.ORG_NAME, getValue(map, JsonKey.ORG_NAME)); - } - String logoUrl = getSunbirdLogoUrl(map); - if (StringUtils.isNotBlank(logoUrl)) { - context.put(JsonKey.ORG_IMAGE_URL, logoUrl); - } - context.put(JsonKey.ACTION_NAME, getValue(map, JsonKey.ACTION_NAME)); - context.put(JsonKey.USERNAME, getValue(map, JsonKey.USERNAME)); - context.put(JsonKey.TEMPORARY_PASSWORD, getValue(map, JsonKey.TEMPORARY_PASSWORD)); - - if (StringUtils.isNotBlank((String) map.get(JsonKey.COURSE_NAME))) { - context.put(JsonKey.COURSE_NAME, map.remove(JsonKey.COURSE_NAME)); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.START_DATE))) { - context.put(JsonKey.BATCH_START_DATE, map.remove(JsonKey.START_DATE)); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.END_DATE))) { - context.put(JsonKey.BATCH_END_DATE, map.remove(JsonKey.END_DATE)); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.BATCH_NAME))) { - context.put(JsonKey.BATCH_NAME, map.remove(JsonKey.BATCH_NAME)); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.FIRST_NAME))) { - context.put(JsonKey.NAME, map.remove(JsonKey.FIRST_NAME)); - } else { - context.put(JsonKey.NAME, ""); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.SIGNATURE))) { - context.put(JsonKey.SIGNATURE, map.remove(JsonKey.SIGNATURE)); - } - if (StringUtils.isNotBlank((String) map.get(JsonKey.COURSE_BATCH_URL))) { - context.put(JsonKey.COURSE_BATCH_URL, map.remove(JsonKey.COURSE_BATCH_URL)); - } - context.put(JsonKey.ALLOWED_LOGIN, propertiesCache.getProperty(JsonKey.SUNBIRD_ALLOWED_LOGIN)); - map = addCertStaticResource(map); - for (Map.Entry entry : map.entrySet()) { - context.put(entry.getKey(), entry.getValue()); - } - return context; - } - - private static String getSunbirdLogoUrl(Map map) { - String logoUrl = (String) getValue(map, JsonKey.ORG_IMAGE_URL); - if (StringUtils.isBlank(logoUrl)) { - logoUrl = getConfigValue(JsonKey.SUNBIRD_ENV_LOGO_URL); - } - return logoUrl; - } - - private static Map addCertStaticResource(Map map) { - map.putIfAbsent( - JsonKey.certificateImgUrl, - ProjectUtil.getConfigValue(JsonKey.SUNBIRD_CERT_COMPLETION_IMG_URL)); - map.putIfAbsent( - JsonKey.dikshaImgUrl, ProjectUtil.getConfigValue(JsonKey.SUNBIRD_DIKSHA_IMG_URL)); - map.putIfAbsent(JsonKey.stateImgUrl, ProjectUtil.getConfigValue(JsonKey.SUNBIRD_STATE_IMG_URL)); - return map; - } - - private static String getFromEmail(Map map) { - String fromEmail = (String) getValue(map, JsonKey.EMAIL_SERVER_FROM); - if (StringUtils.isBlank(fromEmail)) { - fromEmail = getConfigValue(JsonKey.EMAIL_SERVER_FROM); - } - return fromEmail; - } - - private static Object getValue(Map map, String key) { - Object value = map.get(key); - map.remove(key); - return value; - } - - public static Map createCheckResponse( - String serviceName, boolean isError, Exception e) { - Map responseMap = new HashMap<>(); - responseMap.put(JsonKey.NAME, serviceName); - if (!isError) { - responseMap.put(JsonKey.Healthy, true); - responseMap.put(JsonKey.ERROR, ""); - responseMap.put(JsonKey.ERRORMSG, ""); - } else { - responseMap.put(JsonKey.Healthy, false); - if (e != null && e instanceof ProjectCommonException) { - ProjectCommonException commonException = (ProjectCommonException) e; - responseMap.put(JsonKey.ERROR, commonException.getErrorResponseCode()); - responseMap.put(JsonKey.ERRORMSG, commonException.getMessage()); - } else { - responseMap.put(JsonKey.ERROR, e != null ? e.getMessage() : "CONNECTION_ERROR"); - responseMap.put(JsonKey.ERRORMSG, e != null ? e.getMessage() : "Connection error"); - } - } - return responseMap; - } - - public static void setTraceIdInHeader(Map header, RequestContext context) { - if (null != context) { - header.put(JsonKey.X_TRACE_ENABLED, context.getDebugEnabled()); - header.put(JsonKey.X_REQUEST_ID, context.getReqId()); - } - } - - public static boolean validatePhone(String phNumber, String countryCode) { - PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); - String contryCode = countryCode; - if (!StringUtils.isBlank(countryCode) && (countryCode.charAt(0) != '+')) { - contryCode = "+" + countryCode; - } - Phonenumber.PhoneNumber phoneNumber = null; - try { - if (StringUtils.isBlank(countryCode)) { - contryCode = PropertiesCache.getInstance().getProperty("sunbird_default_country_code"); - } - String isoCode = phoneNumberUtil.getRegionCodeForCountryCode(Integer.parseInt(contryCode)); - phoneNumber = phoneNumberUtil.parse(phNumber, isoCode); - return phoneNumberUtil.isValidNumber(phoneNumber); - } catch (NumberParseException e) { - logger.error(phNumber + " :this phone no. is not a valid one.", e); - } - return false; - } - - public static boolean validateCountryCode(String countryCode) { - String pattern = "^(?:[+] ?){0,1}(?:[0-9] ?){1,3}"; - try { - Pattern patt = Pattern.compile(pattern); - Matcher matcher = patt.matcher(countryCode); - return matcher.matches(); - } catch (RuntimeException e) { - return false; - } - } - - public static boolean validateUUID(String uuidStr) { - try { - UUID.fromString(uuidStr); - return true; - } catch (Exception ex) { - return false; - } - } - - public enum ReportTrackingStatus { - NEW(0), - GENERATING_DATA(1), - UPLOADING_FILE(2), - UPLOADING_FILE_SUCCESS(3), - SENDING_MAIL(4), - SENDING_MAIL_SUCCESS(5), - FAILED(9); - - private int value; - - ReportTrackingStatus(int value) { - this.value = value; - } - - public int getValue() { - return this.value; - } - } - - public static boolean isDateValidFormat(String format, String value) { - Date date = null; - try { - SimpleDateFormat sdf = new SimpleDateFormat(format); - date = sdf.parse(value); - if (!value.equals(sdf.format(date))) { - date = null; - } - } catch (ParseException ex) { - logger.error("isDateValidFormat: " + ex.getMessage(), ex); - } - return date != null; - } - - public static String getConfigValue(String key) { - if (StringUtils.isNotBlank(System.getenv(key))) { - return System.getenv(key); - } - return propertiesCache.readProperty(key); - } - - /** - * This method will check whether Array contains only empty string or not - * - * @param strArray String[] - * @return boolean - */ - public static boolean isNotEmptyStringArray(String[] strArray) { - for (String str : strArray) { - if (StringUtils.isNotEmpty(str)) { - return false; - } - } - return true; - } - - /** - * Method to convert List of map to Json String. - * - * @param mapList List of map. - * @return String List of map converted as Json string. - */ - public static String convertMapToJsonString(List> mapList) { - try { - return mapper.writeValueAsString(mapList); - } catch (IOException e) { - logger.error("convertMapToJsonString : " + e.getMessage(), e); - } - return null; - } - - /** - * Method to remove attributes from map. - * - * @param map contains data as key value. - * @param keys list of string that has to be remove from map if presents. - */ - public static void removeUnwantedFields(Map map, String... keys) { - Arrays.stream(keys) - .forEach( - x -> { - map.remove(x); - }); - } - - public static boolean isNotNull(Object obj) { - return null != obj ? true : false; - } - - /** - * Method to convert Request object to module specific POJO request. - * - * @param request Represents the incoming request object. - * @param clazz Target POJO class. - * @param Target request object type. - * @return request object of target type. - */ - public static T convertToRequestPojo(Request request, Class clazz) { - return mapper.convertValue(request.getRequest(), clazz); - } - - /** - * This method will be used to create ProjectCommonException for all kind of client error for the - * given response code(enum). - * - * @param : An enum of all the api responses. - * @return ProjectCommonException - */ - public static ProjectCommonException createClientException(ResponseCode responseCode) { - return new ProjectCommonException( - responseCode, responseCode.getErrorMessage(), ResponseCode.CLIENT_ERROR.getResponseCode()); - } - - /** - * This method will be used to create ProjectCommonException for all kind of client error for the - * given response code(enum). - * - * @param : An enum of all the api responses. - * @return ProjectCommonException - */ - public static ProjectCommonException createClientException( - ResponseCode responseCode, String exceptionMessage) { - return new ProjectCommonException( - responseCode, - StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - - public static void throwClientErrorException(ResponseCode responseCode, String exceptionMessage) { - throw new ProjectCommonException( - responseCode, - StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - - public static String getLmsUserId(String fedUserId) { - String userId = fedUserId; - String prefix = - "f:" + getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID) + ":"; - if (StringUtils.isNotBlank(fedUserId) && fedUserId.startsWith(prefix)) { - userId = fedUserId.replace(prefix, ""); - } - return userId; - } - - public static String getFirstNCharacterString(String originalText, int noOfChar) { - if (StringUtils.isBlank(originalText)) { - return ""; - } - String firstNChars = ""; - if (originalText.length() > noOfChar) { - firstNChars = originalText.substring(0, noOfChar); - } else { - firstNChars = originalText; - } - return firstNChars; - } - - public enum MigrateAction { - ACCEPT("accept"), - REJECT("reject"); - private String value; - - MigrateAction(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/PropertiesCache.java b/core/platform-common/src/main/java/org/sunbird/util/PropertiesCache.java deleted file mode 100644 index 3e2001e0ce..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/PropertiesCache.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.sunbird.util; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.logging.LoggerUtil; - -/* - * @author Amit Kumar - * - * this class is used for reading properties file - */ -public class PropertiesCache { - - private static LoggerUtil logger = new LoggerUtil(PropertiesCache.class); - - private final String[] fileName = { - "elasticsearch.config.properties", - "dbconfig.properties", - "externalresource.properties", - "sso.properties", - "userencryption.properties", - "mailTemplates.properties" - }; - private final Properties configProp = new Properties(); - private static PropertiesCache instance; - - /** private default constructor */ - private PropertiesCache() { - for (String file : fileName) { - InputStream in = this.getClass().getClassLoader().getResourceAsStream(file); - try { - configProp.load(in); - } catch (IOException e) { - logger.error("Error in properties cache", e); - } - } - } - - public static PropertiesCache getInstance() { - if (instance == null) { - // To make thread safe - synchronized (PropertiesCache.class) { - // check again as multiple threads - // can reach above step - if (instance == null) instance = new PropertiesCache(); - } - } - return instance; - } - - public void saveConfigProperty(String key, String value) { - configProp.setProperty(key, value); - } - - public String getProperty(String key) { - String value = System.getenv(key); - if (StringUtils.isNotBlank(value)) return value; - return configProp.getProperty(key) != null ? configProp.getProperty(key) : key; - } - - /** - * Method to read value from resource file . - * - * @param key - * @return - */ - public String readProperty(String key) { - String value = System.getenv(key); - if (StringUtils.isNotBlank(value)) return value; - return configProp.getProperty(key); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/Slug.java b/core/platform-common/src/main/java/org/sunbird/util/Slug.java deleted file mode 100644 index 34b5fe080f..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/Slug.java +++ /dev/null @@ -1,105 +0,0 @@ -/** */ -package org.sunbird.util; - -import java.net.URLDecoder; -import java.text.Normalizer; -import java.text.Normalizer.Form; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Locale; -import java.util.Set; -import java.util.regex.Pattern; -import net.sf.junidecode.Junidecode; -import org.sunbird.logging.LoggerUtil; - -/** - * This class will remove the special character,space from the provided String. - * - * @author Manzarul - */ -public class Slug { - private static LoggerUtil logger = new LoggerUtil(Slug.class); - - private static final Pattern NONLATIN = Pattern.compile("[^\\w-\\.]"); - private static final Pattern WHITESPACE = Pattern.compile("[\\s]"); - private static final Pattern DUPDASH = Pattern.compile("-+"); - - public static String makeSlug(String input, boolean transliterate) { - String origInput = input; - String tempInputValue = ""; - // Validate the input - if (input == null) { - logger.debug("Provided input value is null"); - return input; - } - // Remove extra spaces - tempInputValue = input.trim(); - // Remove URL encoding - tempInputValue = urlDecode(tempInputValue); - // If transliterate is required - if (transliterate) { - // Tranlisterate & cleanup - String transliterated = transliterate(tempInputValue); - tempInputValue = transliterated; - } - // Replace all whitespace with dashes - tempInputValue = WHITESPACE.matcher(tempInputValue).replaceAll("-"); - // Remove all accent chars - tempInputValue = Normalizer.normalize(tempInputValue, Form.NFD); - // Remove all non-latin special characters - tempInputValue = NONLATIN.matcher(tempInputValue).replaceAll(""); - // Remove any consecutive dashes - tempInputValue = normalizeDashes(tempInputValue); - // Validate before returning - validateResult(tempInputValue, origInput); - // Slug is always lowercase - return tempInputValue.toLowerCase(Locale.ENGLISH); - } - - private static void validateResult(String input, String origInput) { - // Check if we are not left with a blank - if (input.length() == 0) { - logger.debug("Failed to cleanup the input " + origInput); - } - } - - public static String transliterate(String input) { - return Junidecode.unidecode(input); - } - - public static String urlDecode(String input) { - String value = ""; - try { - value = URLDecoder.decode(input, "UTF-8"); - } catch (Exception ex) { - logger.error(ex.getMessage(), ex); - } - return value; - } - - public static String removeDuplicateChars(String text) { - Set set = new LinkedHashSet<>(); - StringBuilder ret = new StringBuilder(text.length()); - if (text.length() == 0) { - return ""; - } - for (int i = 0; i < text.length(); i++) { - set.add(text.charAt(i)); - } - Iterator itr = set.iterator(); - while (itr.hasNext()) { - ret.append(itr.next()); - } - return ret.toString(); - } - - public static String normalizeDashes(String text) { - String clean = DUPDASH.matcher(text).replaceAll("-"); - // Special case that only dashes remain - if ("-".equals(clean) || "--".equals(clean)) return ""; - int startIdx = (clean.startsWith("-") ? 1 : 0); - int endIdx = (clean.endsWith("-") ? 1 : 0); - clean = clean.substring(startIdx, (clean.length() - endIdx)); - return clean; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/util/StringFormatter.java b/core/platform-common/src/main/java/org/sunbird/util/StringFormatter.java deleted file mode 100644 index b294ad1997..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/util/StringFormatter.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.sunbird.util; - -/** - * Helper class for String formatting operations. - * - * @author Amit Kumar - */ -public class StringFormatter { - - public static final String DOT = "."; - public static final String AND = " and "; - public static final String OR = " or "; - public static final String COMMA = ", "; - - private StringFormatter() {} - - /** - * Helper method to construct dot formatted string. - * - * @param params One or more strings to be joined by dot - * @return Dot formatted string - */ - public static String joinByDot(String... params) { - return String.join(DOT, params); - } - - /** - * Helper method to construct or formatted string. - * - * @param params One or more strings to be joined by or - * @return Or formatted string - */ - public static String joinByOr(String... params) { - return String.join(OR, params); - } - - /** - * Helper method to construct and formatted string. - * - * @param params One or more strings to be joined by and - * @return and formatted string - */ - public static String joinByAnd(String... params) { - return String.join(AND, params); - } - - /** - * Helper method to construct and formatted string. - * - * @param params One or more strings to be joined by comma - * @return and formatted string - */ - public static String joinByComma(String... params) { - return String.join(COMMA, params); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/BaseRequestValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/BaseRequestValidator.java deleted file mode 100644 index fef7e2cbf1..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/BaseRequestValidator.java +++ /dev/null @@ -1,322 +0,0 @@ -package org.sunbird.validator; - -import com.typesafe.config.ConfigFactory; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; - -import java.text.MessageFormat; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * Base request validator class to house common validation methods. - * - * @author B Vinaya Kumar - */ -public class BaseRequestValidator { - /** - * Helper method which throws an exception if given parameter value is blank (null or empty). - * - * @param value Request parameter value. - * @param error Error to be thrown in case of validation error. - */ - public void validateParam(String value, ResponseCode error) { - if (StringUtils.isBlank(value)) { - throw new ProjectCommonException( - error, error.getErrorMessage(), ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - /** - * Helper method which throws an exception if given parameter value is blank (null or empty). - * - * @param value Request parameter value. - * @param error Error to be thrown in case of validation error. - * @param errorMsgArgument Argument for error message. - */ - public void validateParam(String value, ResponseCode error, String errorMsgArgument) { - if (StringUtils.isBlank(value)) { - throw new ProjectCommonException( - error, - MessageFormat.format(error.getErrorMessage(), errorMsgArgument), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - /** - * Method to check whether given mandatory fields is in given map or not. - * - * @param data Map contains the key value, - * @param keys List of string represents the mandatory fields. - */ - public void checkMandatoryFieldsPresent(Map data, String... keys) { - if (MapUtils.isEmpty(data)) { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - ResponseCode.invalidRequestData.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - Arrays.stream(keys) - .forEach( - key -> { - if (StringUtils.isEmpty((String) data.get(key))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - ResponseCode.mandatoryParamsMissing.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode(), - key); - } - }); - } - /** - * Method to check whether given mandatory fields is in given map or not. also check the instance - * of request attributes - * - * @param data Map contains the key value, - * @param mandatoryParamsList List of string represents the mandatory fields. - */ - public void checkMandatoryFieldsPresent( - Map data, List mandatoryParamsList) { - if (MapUtils.isEmpty(data)) { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - ResponseCode.invalidRequestData.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - mandatoryParamsList.forEach( - key -> { - if (StringUtils.isEmpty((String) data.get(key))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - ResponseCode.mandatoryParamsMissing.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode(), - key); - } - if (!(data.get(key) instanceof String)) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, - MessageFormat.format(ResponseCode.dataTypeError.getErrorMessage(), key, "String"), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - }); - } - - /** - * Method to check whether given fields is in given map or not .If it is there throw exception. - * because in some update request cases we don't want to update some props to , if it is there in - * request , throw exception. - * - * @param data Map contains the key value - * @param keys List of string represents the must not present fields. - */ - public void checkReadOnlyAttributesAbsent(Map data, String... keys) { - - if (MapUtils.isEmpty(data)) { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - ResponseCode.invalidRequestData.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - Arrays.stream(keys) - .forEach( - key -> { - if (data.containsKey(key)) { - throw new ProjectCommonException( - ResponseCode.unupdatableField, - ResponseCode.unupdatableField.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode(), - key); - } - }); - } - - /** - * Helper method which throws an exception if each field is not of type List. - * - * @param requestMap Request information - * @param fieldPrefix Field prefix - * @param fields List of fields - */ - public void validateListParamWithPrefix( - Map requestMap, String fieldPrefix, String... fields) { - Arrays.stream(fields) - .forEach( - field -> { - if (requestMap.containsKey(field) - && null != requestMap.get(field) - && !(requestMap.get(field) instanceof List)) { - - String fieldWithPrefix = - fieldPrefix != null ? StringFormatter.joinByDot(fieldPrefix, field) : field; - - throw new ProjectCommonException( - ResponseCode.dataTypeError, - ProjectUtil.formatMessage( - ResponseCode.dataTypeError.getErrorMessage(), - fieldWithPrefix, - JsonKey.LIST), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - }); - } - - /** - * Helper method which throws an exception if each field is not of type List. - * - * @param requestMap Request information - * @param fields List of fields - */ - public void validateListParam(Map requestMap, String... fields) { - validateListParamWithPrefix(requestMap, null, fields); - } - - /** - * Helper method which throws an exception if user ID in request is not same as that in user - * token. - * - * @param request API request - * @param userIdKey Attribute name for user ID in API request - */ - public static void validateUserId(Request request, String userIdKey) { - if (ConfigFactory.load().getBoolean(JsonKey.AUTH_ENABLED) && !(request - .getRequest() - .get(userIdKey) - .equals(request.getContext().get(JsonKey.REQUESTED_BY)))) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - ResponseCode.invalidParameterValue.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode(), - (String) request.getRequest().get(JsonKey.USER_ID), - JsonKey.USER_ID); - } - } - - public void validateSearchRequest(Request request) { - if (null == request.getRequest().get(JsonKey.FILTERS)) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - MessageFormat.format( - ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.FILTERS), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - if (request.getRequest().containsKey(JsonKey.FILTERS) - && (!(request.getRequest().get(JsonKey.FILTERS) instanceof Map))) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, - MessageFormat.format( - ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FILTERS, "Map"), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - validateSearchRequestFiltersValues(request); - validateSearchRequestFieldsValues(request); - } - - private void validateSearchRequestFieldsValues(Request request) { - if (request.getRequest().containsKey(JsonKey.FIELDS) - && (!(request.getRequest().get(JsonKey.FIELDS) instanceof List))) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, - MessageFormat.format( - ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FIELDS, "List"), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - if (request.getRequest().containsKey(JsonKey.FIELDS) - && (request.getRequest().get(JsonKey.FIELDS) instanceof List)) { - for (Object obj : (List) request.getRequest().get(JsonKey.FIELDS)) { - if (!(obj instanceof String)) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, - MessageFormat.format( - ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FIELDS, "List of String"), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - } - } - - private void validateSearchRequestFiltersValues(Request request) { - if (request.getRequest().containsKey(JsonKey.FILTERS) - && ((request.getRequest().get(JsonKey.FILTERS) instanceof Map))) { - Map map = (Map) request.getRequest().get(JsonKey.FILTERS); - - map.forEach( - (key, val) -> { - if (key == null) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - MessageFormat.format( - ResponseCode.invalidParameterValue.getErrorMessage(), key, JsonKey.FILTERS), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - if (val instanceof List) { - validateListValues((List) val, key); - } else if (val instanceof Map) { - validateMapValues((Map) val); - } else if (val == null) - if (StringUtils.isEmpty((String) val)) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - MessageFormat.format( - ResponseCode.invalidParameterValue.getErrorMessage(), val, key), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - }); - } - } - - private void validateMapValues(Map val) { - val.forEach( - (k, v) -> { - if (k == null || v == null) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - MessageFormat.format(ResponseCode.invalidParameterValue.getErrorMessage(), v, k), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - }); - } - - private void validateListValues(List val, String key) { - val.forEach( - v -> { - if (v == null) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - MessageFormat.format(ResponseCode.invalidParameterValue.getErrorMessage(), v, key), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - }); - } - - public void validateEmail(String email) { - if (!EmailValidator.isEmailValid(email)) { - throw new ProjectCommonException( - ResponseCode.dataFormatError, - ResponseCode.dataFormatError.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - public void validatePhone(String phone) { - if (!ProjectUtil.validatePhone(phone, null)) { - throw new ProjectCommonException( - ResponseCode.dataFormatError, - String.format(ResponseCode.dataFormatError.getErrorMessage(), JsonKey.PHONE), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - public static void createClientError(ResponseCode responseCode, String field) { - throw new ProjectCommonException( - responseCode, - ProjectUtil.formatMessage(responseCode.getErrorMessage(), field), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/EmailValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/EmailValidator.java deleted file mode 100644 index 3d9d83b694..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/EmailValidator.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.sunbird.validator; - -import org.apache.commons.lang3.StringUtils; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Helper class for validating email. - * - * @author Amit Kumar - */ -public class EmailValidator { - - private static Pattern pattern; - private static final String EMAIL_PATTERN = - "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" - + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; - - private EmailValidator() {} - - static { - pattern = Pattern.compile(EMAIL_PATTERN); - } - - /** - * Validates format of email. - * - * @param email Email value. - * @return True, if email format is valid. Otherwise, return false. - */ - public static boolean isEmailValid(String email) { - if (StringUtils.isBlank(email)) { - return false; - } - Matcher matcher = pattern.matcher(email); - return matcher.matches(); - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/PhoneValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/PhoneValidator.java deleted file mode 100644 index 4e0fe12b4c..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/PhoneValidator.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.sunbird.validator; - -import com.google.i18n.phonenumbers.NumberParseException; -import com.google.i18n.phonenumbers.PhoneNumberUtil; -import com.google.i18n.phonenumbers.Phonenumber; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.PropertiesCache; - -/** - * This class will provide helper method to validate phone number and its country code. - * - * @author Amit Kumar - */ -public class PhoneValidator { - private static final LoggerUtil logger = new LoggerUtil(PhoneValidator.class); - - private PhoneValidator() {} - - public static boolean validatePhone(String phone, String countryCode) { - PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); - String code = countryCode; - if (StringUtils.isNotBlank(countryCode) && (countryCode.charAt(0) != '+')) { - code = "+" + countryCode; - } - Phonenumber.PhoneNumber phoneNumber = null; - try { - if (StringUtils.isBlank(countryCode)) { - code = PropertiesCache.getInstance().getProperty("sunbird_default_country_code"); - } - String isoCode = phoneNumberUtil.getRegionCodeForCountryCode(Integer.parseInt(code)); - phoneNumber = phoneNumberUtil.parse(phone, isoCode); - return phoneNumberUtil.isValidNumber(phoneNumber); - } catch (NumberParseException e) { - logger.error( - "PhoneValidator:validatePhone: Exception occurred while validating phone number = ", e); - } - return false; - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/RequestValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/RequestValidator.java deleted file mode 100644 index 65ce51c638..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/RequestValidator.java +++ /dev/null @@ -1,182 +0,0 @@ -package org.sunbird.validator; - -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; - -/** - * This call will do validation for all incoming request data. - * - * @author Manzarul - */ -public final class RequestValidator { - private static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); - - private RequestValidator() {} - - /** - * This method will validate bulk user upload requested data. - * - * @param reqObj Request - */ - public static void validateUploadUser(Map reqObj) { - if (StringUtils.isBlank((String) reqObj.get(JsonKey.ORGANISATION_ID)) - && (StringUtils.isBlank((String) reqObj.get(JsonKey.ORG_EXTERNAL_ID)) - || StringUtils.isBlank((String) reqObj.get(JsonKey.ORG_PROVIDER)))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - ProjectUtil.formatMessage( - ResponseCode.mandatoryParamsMissing.getErrorMessage(), - (ProjectUtil.formatMessage( - ResponseMessage.Message.OR_FORMAT, - JsonKey.ORGANISATION_ID, - ProjectUtil.formatMessage( - ResponseMessage.Message.AND_FORMAT, - JsonKey.ORG_EXTERNAL_ID, - JsonKey.ORG_PROVIDER)))), - ERROR_CODE); - } - if (null == reqObj.get(JsonKey.FILE)) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - ProjectUtil.formatMessage( - ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.FILE), - ERROR_CODE); - } - } - - public static void validateSyncRequest(Request request) { - if (request.getRequest().get(JsonKey.OBJECT_TYPE) == null) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, ResponseCode.dataTypeError.getErrorMessage(), ERROR_CODE); - } - List list = - new ArrayList<>( - Arrays.asList(new String[] {JsonKey.USER, JsonKey.ORGANISATION, JsonKey.LOCATION})); - if (!list.contains(request.getRequest().get(JsonKey.OBJECT_TYPE))) { - throw new ProjectCommonException( - ResponseCode.invalidObjectType, - ResponseCode.invalidObjectType.getErrorMessage(), - ERROR_CODE); - } - } - - public static void validateSendMail(Request request) { - if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.SUBJECT))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - String.format(ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.SUBJECT), - ERROR_CODE); - } - if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.BODY))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - String.format(ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.BODY), - ERROR_CODE); - } - if (CollectionUtils.isEmpty((List) (request.getRequest().get(JsonKey.RECIPIENT_EMAILS))) - && CollectionUtils.isEmpty( - (List) (request.getRequest().get(JsonKey.RECIPIENT_USERIDS))) - && MapUtils.isEmpty( - (Map) (request.getRequest().get(JsonKey.RECIPIENT_SEARCH_QUERY))) - && CollectionUtils.isEmpty( - (List) (request.getRequest().get(JsonKey.RECIPIENT_PHONES)))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - MessageFormat.format( - ResponseCode.mandatoryParamsMissing.getErrorMessage(), - StringFormatter.joinByOr( - StringFormatter.joinByComma( - JsonKey.RECIPIENT_EMAILS, - JsonKey.RECIPIENT_USERIDS, - JsonKey.RECIPIENT_PHONES), - JsonKey.RECIPIENT_SEARCH_QUERY)), - ERROR_CODE); - } - } - - public static void validateFileUpload(Request reqObj) { - - if (StringUtils.isBlank((String) reqObj.get(JsonKey.CONTAINER))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - String.format(ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.CONTAINER), - ERROR_CODE); - } - } - - /** - * Method to validate not for userId, title, note, courseId, contentId and tags - * - * @param request - */ - @SuppressWarnings("rawtypes") - public static void validateNote(Request request) { - if (StringUtils.isBlank((String) request.get(JsonKey.USER_ID))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - String.format(ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.USER_ID), - ERROR_CODE); - } - if (StringUtils.isBlank((String) request.get(JsonKey.TITLE))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - String.format(ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.TITLE), - ERROR_CODE); - } - if (StringUtils.isBlank((String) request.get(JsonKey.NOTE))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - String.format(ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.NOTE), - ERROR_CODE); - } - if (StringUtils.isBlank((String) request.get(JsonKey.CONTENT_ID)) - && StringUtils.isBlank((String) request.get(JsonKey.COURSE_ID))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - String.format( - ResponseCode.mandatoryParamsMissing.getErrorMessage(), - JsonKey.CONTENT_ID + "," + JsonKey.COURSE_ID), - ERROR_CODE); - } - if (request.getRequest().containsKey(JsonKey.TAGS) - && ((request.getRequest().get(JsonKey.TAGS) instanceof List) - && ((List) request.getRequest().get(JsonKey.TAGS)).isEmpty())) { - throw new ProjectCommonException( - ResponseCode.errorMandatoryParamsEmpty, - String.format(ResponseCode.errorMandatoryParamsEmpty.getErrorMessage(), JsonKey.TAGS), - ERROR_CODE); - } else if (request.getRequest().get(JsonKey.TAGS) instanceof String) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - String.format(ResponseCode.invalidParameterValue.getErrorMessage(), JsonKey.TAGS), - ERROR_CODE); - } - } - - /** - * Method to validate noteId - * - * @param noteId - */ - public static void validateNoteId(String noteId) { - if (StringUtils.isBlank(noteId)) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - String.format(ResponseCode.invalidParameterValue.getErrorMessage(), JsonKey.NOTE_ID), - ERROR_CODE); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/UserFreeUpRequestValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/UserFreeUpRequestValidator.java deleted file mode 100644 index 1eccd9fabf..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/UserFreeUpRequestValidator.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.sunbird.validator; - -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; - -public class UserFreeUpRequestValidator extends BaseRequestValidator { - - private Request request; - private static List identifiers = new ArrayList<>(); - - static { - identifiers.add(JsonKey.EMAIL); - identifiers.add(JsonKey.PHONE); - } - - private static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); - - /** - * this method is used to get the instance to UserFreeUpRequestValidator class - * - * @param request - * @return - */ - public static UserFreeUpRequestValidator getInstance(Request request) { - return new UserFreeUpRequestValidator(request); - } - - private UserFreeUpRequestValidator(Request request) { - this.request = request; - } - - /** this is the method we need to call to validate the IdentifierFreeUpUser request. */ - public void validate() { - validateIdPresence(); - validateIdentifier(); - } - - private void validateIdPresence() { - validateParam( - (String) request.getRequest().get(JsonKey.ID), - ResponseCode.mandatoryParamsMissing, - JsonKey.ID); - } - - private void validateIdentifier() { - validatePresence(); - validateObject(); - validateSubset(); - } - - private void validatePresence() { - if (!request.getRequest().containsKey(JsonKey.IDENTIFIER)) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - MessageFormat.format( - ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.IDENTIFIER), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - private void validateObject() { - Object identifierType = request.getRequest().get(JsonKey.IDENTIFIER); - if (!(identifierType instanceof List)) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, - ProjectUtil.formatMessage( - ResponseCode.dataTypeError.getErrorMessage(), JsonKey.IDENTIFIER, JsonKey.LIST), - ERROR_CODE); - } - } - - private void validateSubset() { - List identifierVal = (List) request.getRequest().get(JsonKey.IDENTIFIER); - if (!identifiers.containsAll(identifierVal)) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, - ProjectUtil.formatMessage( - String.format( - "%s %s", - ResponseCode.invalidIdentifier.getErrorMessage(), - Arrays.toString(identifiers.toArray())), - JsonKey.IDENTIFIER, - JsonKey.DATA), - ERROR_CODE); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/BaseOrgRequestValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/BaseOrgRequestValidator.java deleted file mode 100644 index 68618e018c..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/BaseOrgRequestValidator.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.sunbird.validator.orgvalidator; - -import java.text.MessageFormat; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; - -public class BaseOrgRequestValidator extends BaseRequestValidator { - - public static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); - - public void validateOrgReference(Request request) { - validateParam( - (String) request.getRequest().get(JsonKey.ORGANISATION_ID), - ResponseCode.mandatoryParamsMissing, - JsonKey.ORGANISATION_ID); - } - - public void validateTenantOrgChannel(Request request) { - if ((null != request.getRequest().get(JsonKey.IS_TENANT) - && (Boolean) request.getRequest().get(JsonKey.IS_TENANT)) - && StringUtils.isEmpty((String) request.getRequest().get(JsonKey.CHANNEL))) { - throw new ProjectCommonException( - ResponseCode.dependentParameterMissing, - MessageFormat.format( - ResponseCode.dependentParameterMissing.getErrorMessage(), - JsonKey.CHANNEL, - JsonKey.IS_TENANT), - ERROR_CODE); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/KeyManagementValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/KeyManagementValidator.java deleted file mode 100644 index 8d4b461f0a..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/KeyManagementValidator.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.sunbird.validator.orgvalidator; - -import java.text.MessageFormat; -import java.util.List; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; - -/** - * this class is used to validate the request of the OrgAssignKeys Controller - * - * @author anmolgupta - */ -public class KeyManagementValidator extends BaseRequestValidator { - - private Request request; - - private KeyManagementValidator(Request request) { - this.request = request; - } - - /** - * this method should be used to get the instance of the class - * - * @param request - * @return - */ - public static KeyManagementValidator getInstance(Request request) { - return new KeyManagementValidator(request); - } - - /** this method should be used to validate the OrgAssignKeysController request. */ - public void validate() { - id(); - signKeys(); - encKeys(); - } - - private void id() { - validateParam( - (String) request.getRequest().get(JsonKey.ID), - ResponseCode.mandatoryParamsMissing, - JsonKey.ID); - } - - private void signKeys() { - validateKeyPresence(JsonKey.SIGN_KEYS); - validateListTypeObject(JsonKey.SIGN_KEYS); - validateSize(JsonKey.SIGN_KEYS); - } - - private void encKeys() { - validateKeyPresence(JsonKey.ENC_KEYS); - validateListTypeObject(JsonKey.ENC_KEYS); - validateSize(JsonKey.ENC_KEYS); - } - - private void validateListTypeObject(String key) { - if (!(request.get(key) instanceof List)) { - throw new ProjectCommonException( - ResponseCode.dataTypeError, - MessageFormat.format(ResponseCode.dataTypeError.getErrorMessage(), key, "List"), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - } - - private void validateKeyPresence(String key) { - if (!request.getRequest().containsKey(key)) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - ResponseCode.mandatoryParamsMissing.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode(), - key); - } - } - - private void validateSize(String key) { - if (((List) request.get(key)).size() == 0) { - throw new ProjectCommonException( - ResponseCode.errorMandatoryParamsEmpty, - ResponseCode.errorMandatoryParamsEmpty.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode(), - key); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/OrgRequestValidator.java b/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/OrgRequestValidator.java deleted file mode 100644 index de908fc605..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/orgvalidator/OrgRequestValidator.java +++ /dev/null @@ -1,208 +0,0 @@ -package org.sunbird.validator.orgvalidator; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.security.KeyFactory; -import java.security.spec.X509EncodedKeySpec; -import java.text.MessageFormat; -import java.util.Base64; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; -import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import play.libs.Files; -import play.mvc.Http.MultipartFormData; -import play.mvc.Http.MultipartFormData.FilePart; - -public class OrgRequestValidator extends BaseOrgRequestValidator { - - private static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); - - public void validateCreateOrgRequest(Request orgRequest) { - validateParam( - (String) orgRequest.getRequest().get(JsonKey.ORG_TYPE), - ResponseCode.mandatoryParamsMissing, - JsonKey.ORG_TYPE); - validateParam( - (String) orgRequest.getRequest().get(JsonKey.ORG_NAME), - ResponseCode.mandatoryParamsMissing, - JsonKey.ORG_NAME); - if (!(orgRequest.getRequest().containsKey(JsonKey.IS_TENANT)) - || (orgRequest.getRequest().containsKey(JsonKey.IS_TENANT) - && null == orgRequest.getRequest().get(JsonKey.IS_TENANT))) { - throw new ProjectCommonException( - ResponseCode.mandatoryParamsMissing, - MessageFormat.format( - ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.IS_TENANT), - ResponseCode.CLIENT_ERROR.getResponseCode()); - } - validateTenantOrgChannel(orgRequest); - validateLicense(orgRequest); - validateLocationIdOrCode(orgRequest); - } - - private void validateLicense(Request orgRequest) { - if (orgRequest.getRequest().containsKey(JsonKey.IS_TENANT) - && (boolean) orgRequest.getRequest().get(JsonKey.IS_TENANT) - && orgRequest.getRequest().containsKey(JsonKey.LICENSE) - && StringUtils.isBlank((String) orgRequest.getRequest().get(JsonKey.LICENSE))) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - MessageFormat.format( - ResponseCode.invalidParameterValue.getErrorMessage(), - orgRequest.getRequest().get(JsonKey.LICENSE), - JsonKey.LICENSE), - ERROR_CODE); - } - } - - public void validateUpdateOrgRequest(Request request) { - validateOrgReference(request); - if (request.getRequest().containsKey(JsonKey.ROOT_ORG_ID) - && StringUtils.isEmpty((String) request.getRequest().get(JsonKey.ROOT_ORG_ID))) { - throw new ProjectCommonException( - ResponseCode.invalidParameterValue, - String.format(ResponseCode.invalidParameterValue.getErrorMessage(), JsonKey.ROOT_ORG_ID), - ERROR_CODE); - } - if (request.getRequest().get(JsonKey.STATUS) != null) { - throw new ProjectCommonException( - ResponseCode.invalidRequestParameter, - ProjectUtil.formatMessage( - ResponseCode.invalidRequestParameter.getErrorMessage(), JsonKey.STATUS), - ERROR_CODE); - } - - validateTenantOrgChannel(request); - validateLocationIdOrCode(request); - } - - public void validateUpdateOrgStatusRequest(Request request) { - validateOrgReference(request); - - if (!request.getRequest().containsKey(JsonKey.STATUS)) { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - ResponseCode.invalidRequestData.getErrorMessage(), - ERROR_CODE); - } - - if (!(request.getRequest().get(JsonKey.STATUS) instanceof Integer)) { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - ResponseCode.invalidRequestData.getErrorMessage(), - ERROR_CODE); - } - } - - private void validateLocationIdOrCode(Request orgRequest) { - validateListParam(orgRequest.getRequest(), JsonKey.LOCATION_IDS, JsonKey.LOCATION_CODE); - if (orgRequest.getRequest().get(JsonKey.LOCATION_IDS) != null - && orgRequest.getRequest().get(JsonKey.LOCATION_CODE) != null) { - ProjectCommonException.throwClientErrorException( - ResponseCode.errorAttributeConflict, - MessageFormat.format( - ResponseCode.errorAttributeConflict.getErrorMessage(), - JsonKey.LOCATION_CODE, - JsonKey.LOCATION_IDS)); - } - } - - public void validateEncryptionKeyRequest(Request reqObj, MultipartFormData body) { - Map map = new HashMap<>(); - byte[] byteArray = null; - InputStream is = null; - try { - if (body != null) { - Map data = body.asFormUrlEncoded(); - for (Map.Entry entry : data.entrySet()) { - map.put(entry.getKey(), entry.getValue()[0]); - } - List> filePart = body.getFiles(); - File f = filePart.get(0).getRef().path().toFile(); - - is = new FileInputStream(f); - byteArray = is.readAllBytes(); - - String fileName = filePart.get(0).getFilename(); - - validateFileExtension(fileName); - validatePublicKey(byteArray); - - reqObj.getRequest().putAll(map); - map.put(JsonKey.FILE_NAME, fileName); - is.close(); - } else { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - ResponseCode.invalidRequestData.getErrorMessage(), - ERROR_CODE); - } - map.put(JsonKey.FILE, byteArray); - HashMap innerMap = new HashMap<>(); - innerMap.put(JsonKey.DATA, map); - reqObj.setRequest(innerMap); - } catch (Exception e) { - throw new ProjectCommonException( - (ProjectCommonException) e, - ActorOperations.getOperationCodeByActorOperation(reqObj.getOperation())); - } finally { - if (is != null) { - try { - is.close(); - } catch (IOException ignored) { - } - } - } - } - - private void validatePublicKey(byte[] publicKeyBytes) { - try { - KeyFactory publicKeyFactory = KeyFactory.getInstance("RSA"); - String publicKeyContent = new String(publicKeyBytes); - publicKeyContent = - publicKeyContent - .replaceAll("\\n", "") - .replace("-----BEGIN PUBLIC KEY-----", "") - .replace("-----END PUBLIC KEY-----", ""); - X509EncodedKeySpec keySpecX509 = - new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyContent)); - publicKeyFactory.generatePublic(keySpecX509); - } catch (Exception se) { - throw new ProjectCommonException( - ResponseCode.invalidRequestData, - ResponseCode.invalidRequestData.getErrorMessage(), - ERROR_CODE); - } - } - - private void validateFileExtension(String fileName) { - String fileExtension = ""; - - if (!StringUtils.isBlank(fileName)) { - String[] split = fileName.split("\\."); - if (split.length > 1) { - fileExtension = split[split.length - 1]; - } - if (StringUtils.isBlank(fileExtension) || !fileExtension.equalsIgnoreCase("pem")) { - throw new ProjectCommonException( - ResponseCode.invalidFileExtension, - MessageFormat.format(ResponseCode.invalidFileExtension.getErrorMessage(), "pem"), - ERROR_CODE); - } - } else { - throw new ProjectCommonException( - ResponseCode.invalidFileExtension, - MessageFormat.format(ResponseCode.invalidFileExtension.getErrorMessage(), "pem"), - ERROR_CODE); - } - } -} diff --git a/core/platform-common/src/main/java/org/sunbird/validator/package-info.java b/core/platform-common/src/main/java/org/sunbird/validator/package-info.java deleted file mode 100644 index 63f386608d..0000000000 --- a/core/platform-common/src/main/java/org/sunbird/validator/package-info.java +++ /dev/null @@ -1,3 +0,0 @@ -/** */ -/** @author Manzarul */ -package org.sunbird.validator; diff --git a/core/platform-common/src/main/resources/OTPSMSTemplate.vm b/core/platform-common/src/main/resources/OTPSMSTemplate.vm deleted file mode 100644 index 3273ff3663..0000000000 --- a/core/platform-common/src/main/resources/OTPSMSTemplate.vm +++ /dev/null @@ -1 +0,0 @@ -One time password to verify your phone number on $installationName is $otp. This is valid for $otpExpiryInMinutes minutes only. \ No newline at end of file diff --git a/core/platform-common/src/main/resources/acceptFlagMailTemplate.vm b/core/platform-common/src/main/resources/acceptFlagMailTemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/acceptFlagMailTemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/application.conf b/core/platform-common/src/main/resources/application.conf deleted file mode 100644 index 22b3e66922..0000000000 --- a/core/platform-common/src/main/resources/application.conf +++ /dev/null @@ -1,2 +0,0 @@ -# This is the configuration file for the service folder. -AuthenticationEnabled=true \ No newline at end of file diff --git a/core/platform-common/src/main/resources/contentFlaggedMailTemplate.vm b/core/platform-common/src/main/resources/contentFlaggedMailTemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/contentFlaggedMailTemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/contentReviewMailTemplate.vm b/core/platform-common/src/main/resources/contentReviewMailTemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/contentReviewMailTemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/dbconfig.properties b/core/platform-common/src/main/resources/dbconfig.properties deleted file mode 100644 index 564bec9208..0000000000 --- a/core/platform-common/src/main/resources/dbconfig.properties +++ /dev/null @@ -1,6 +0,0 @@ -db.ip=127.0.0.1 -db.port=9042 -db.username= -db.password= -db.keyspace=sunbird - diff --git a/core/platform-common/src/main/resources/elasticsearch.config.properties b/core/platform-common/src/main/resources/elasticsearch.config.properties deleted file mode 100644 index 564aaedcb2..0000000000 --- a/core/platform-common/src/main/resources/elasticsearch.config.properties +++ /dev/null @@ -1,3 +0,0 @@ -es.cluster.name= -es.host.name=localhost -es.host.port=9300 \ No newline at end of file diff --git a/core/platform-common/src/main/resources/emailtemplate.vm b/core/platform-common/src/main/resources/emailtemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/emailtemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/externalresource.properties b/core/platform-common/src/main/resources/externalresource.properties deleted file mode 100644 index a0d0959fb2..0000000000 --- a/core/platform-common/src/main/resources/externalresource.properties +++ /dev/null @@ -1,114 +0,0 @@ -sunbird_authorization= -ekstep.tag.api.url=/tag/register -sunbird_installation=sunbird -sunbird_analytics_api_base_url=http://analytics-service:9000 -sunbird_mail_server_host= -sunbird_mail_server_port= -sunbird_mail_server_username= -sunbird_mail_server_password= -sunbird_mail_server_from_email=support@open-sunbird.org -sunbird_username_num_digits=4 -sunbird_account_name= -sunbird_account_key= -download_link_expiry_timeout=300 -sunbird_encryption_key=SunBird -sunbird_encryption=ON -sunbird_allowed_login=You can use your cellphone number to login -#size of bulk upload data is 1001 including header in csv file -sunbird_user_bulk_upload_size=1001 -bulk_upload_org_data_size=300 -sunbird_web_url=https://dev.sunbirded.org -sunbird_framework_read_api=/v1/framework/read -fcm.url=https://fcm.googleapis.com/fcm/send -sunbird_default_country_code=+91 -#put the default evn logo url here or System Env variable with -#same key. code will first search from EVN then here. -sunbird_env_logo_url=http://via.placeholder.com/100x50 -system_settings_properties=phoneUnique,emailUnique -sunbird_default_welcome_sms=Welcome to DIKSHA. -sunbird_url_shortner_base_url=https://api-ssl.bitly.com/v3/shorten?access_token= -sunbird_url_shortner_access_token= -sunbird_content_service_api_base_url=http://content-service:9000 -sunbird.channel.create.api.url=/channel/v3/create -sunbird.channel.update.api.url=/channel/v3/update -sunbird_otp_allowed_attempt=2 - -#Telemetry producer related info -telemetry_pdata_id=local.sunbird.learning.service -telemetry_pdata_pid=learning-service -telemetry_pdata_ver=5.3.0 -#elastic search top n result count for telemetry -searchTopN=5 -sunbird_valid_location_types=state,district,block,cluster,school; -# Bulk upload file max size in MB -file_upload_max_size=10 -sunbird_default_channel= -# Batch size for cassandra batch operation -cassandra_write_batch_size=100 -sunbird_sso_client_id= -sunbird_sso_username= -sunbird_sso_password= -sunbird_sso_url= -sunbird_sso_realm= -sunbird_keycloak_required_action_link_expiration_seconds=155520000 -sunbird_url_shortner_enable=false -sunbird_api_request_lower_case_fields=source,externalId,userName,provider,loginId,email,prevUsedEmail -sunbird_otp_expiration=1800 -sunbird_otp_length=6 -sunbird_otp_hour_rate_limit=5 -sunbird_otp_day_rate_limit=20 -sunbird_rate_limit_enabled=true -sunbird_health_check_enable=true -sunbird_sync_read_wait_time=1500 -sunbird_gzip_size_threshold=262144 -kafka_urls=localhost:9092 -sunbird_fuzzy_search_threshold=0.5 -sunbird_state_img_url=https://sunbirddev.blob.core.windows.net/orgemailtemplate/img/File-0128212938260643843.png -sunbird_diksha_img_url=https://sunbirddev.blob.core.windows.net/orgemailtemplate/img/File-0128212989820190722.png -sunbird_cert_completion_img_url=https://sunbirddev.blob.core.windows.net/orgemailtemplate/img/File-0128212919987568641.png -sunbird_reset_pass_msg=Your have requested to reset password. Click on the link to set a password: {0} -sunbird_reset_pass_mail_subject=Reset Password -sunbird_subdomain_keycloak_base_url=https://merge.dev.sunbirded.org/auth/ -kafka_linger_ms=5 -sunbird_user_upload_error_visualization_threshold=20001 -migrate_user_template=You can now access your {0} state teacher account using {1}. Please log out and login once again to see updated details. -sunbird_account_merge_subject=Account merged successfully -sunbird_pass_regex=(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!\"#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~])(?=\\S+$).{8,} -sunbird_user_create_sync_type=ES -sunbird_user_create_sync_topic=local.user.events -sigterm_stop_delay=40 -limit_managed_user_creation=true -managed_user_limit=30 -adminutil_base_url = http://adminutil:4000/ -adminutil_sign_endpoint = v1/sign/payload -self_declared_mandatory_fields = Diksha UUID,Status,State provided ext. ID,Channel,Persona -self_declared_optional_fields = School Name,School UDISE ID,Email ID,Phone number,Error Type -enable_captcha=true -consent_expiry_in_days=100 -feed_limit=30 -learner_in_memory_cache_ttl=14400 -#alias is actually referring the user and org index so no need to mention separately -user_index_alias=user_alias -org_index_alias=org_alias -#Release 5.4.0 LR-102 -es_user_notes_index=usernotes -es_location_index=location -es_user_feed_index=userfeed -defaultMonthDate = -12-31 -nic_sms_gateway_provider_base_url=https://smsgw.sms.gov.in/failsafe/HttpLink -sms_gateway_provider=91SMS -stacktrace_char_length=2500 -notification_service_base_url= -notification_service_v2_send_url=/private/v2/notification/send -notification_service_v1_update_url=/private/v1/notification/feed/update -notification_service_v1_read_url=/private/v1/notification/feed/read -notification_service_v1_delete_url=/private/v1/notification/feed/delete -channel_registration_disabled=false -#Login Page URL used as redirect URL in Password set / reset action. This will be suffixed with sunbird_web_url value. -sunbird_password_reset_login_page_url=/resources -isFormValidationRequired=true -userProfileConfigMap={\"type\":\"profileconfig\",\"subtype\":\"28\",\"action\":\"get\",\"component\":\"*\",\"framework\":\"*\",\"data\":{\"templateName\":\"profileConfig_v2\",\"action\":\"get\",\"fields\":[{\"code\":\"persona\",\"children\":{\"administrator\":[{\"code\":\"district\"},{\"code\":\"state\"},{\"code\":\"subPersona\",\"type\":\"select\",\"default\":null,\"templateOptions\":{\"options\":[{\"label\":\"Headmaster\",\"value\":\"hm\"},{\"label\":\"Cluster Resource Person\",\"value\":\"crp\"}]}},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"teacher\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"student\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"parent\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"other\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"subPersona\",\"templateOptions\":{\"options\":[{\"value\":\"Doctor (Allopathy)\",\"label\":\"Doctor (Allopathy)\"},{\"value\":\"AYUSH Professional\",\"label\":\"AYUSH Professional\"}]}},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}]}}]},\"created_on\":\"2022-02-10T14:16:51.852Z\",\"last_modified_on\":\"2022-11-14T05:45:02.685Z\",\"rootOrgId\":\"*\"} -sunbird_userorg_keyspace=sunbird -user-ownership-transfer-topic={{env_name}}.user.ownership.transfer -user-deletion-roles=public -user-deletion-broadcast-topic={{env_name}}.delete.user \ No newline at end of file diff --git a/core/platform-common/src/main/resources/forgotPasswordWithOTP.vm b/core/platform-common/src/main/resources/forgotPasswordWithOTP.vm deleted file mode 100644 index 66325cf607..0000000000 --- a/core/platform-common/src/main/resources/forgotPasswordWithOTP.vm +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - -
  -
- - - - - - - - - - -
- - - - - - -
- - - - - - - - - - -
-

Someone just requested to change your $realmName account's credentials. If this was you, use below OTP to reset your credentials. -

-
-

OTP : $otp

-
-

This OTP will expire within $ttl Minute.

- -
-

If you don't want to reset your credentials, just ignore this message and nothing will be changed.

-
-
-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/forgotpassword.vm b/core/platform-common/src/main/resources/forgotpassword.vm deleted file mode 100644 index d772a3a526..0000000000 --- a/core/platform-common/src/main/resources/forgotpassword.vm +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - - - - -
  -
- - - - - - - - - - -
- - - - - - -
-

Hi $name,

- - - - - - - - - -
-

Please find the temporary password below, do the password change after first login: -

- -

Password : $tempPassword

- -
-

- - - - - - - -
-

- #if ($webUrl) - Web acccess URL : Click here - #end -

-

- #if ($appUrl) - Download App : Click here - #end -

- -
-
-

Thank You,

-

Team $orgName

-

#if ($note) - $note $fromEmail. - #end -

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/mailTemplates.properties b/core/platform-common/src/main/resources/mailTemplates.properties deleted file mode 100644 index 0a2f67f88b..0000000000 --- a/core/platform-common/src/main/resources/mailTemplates.properties +++ /dev/null @@ -1,5 +0,0 @@ -orgName=Diksha -onboarding_mail_subject=Welcome to {0} -onboarding_welcome_message=Welcome to {0} -onboarding_welcome_mail_body=Please ensure that you change your password according to instructions when you log in for the first time. -mail_note=Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to diff --git a/core/platform-common/src/main/resources/publishContentMailTemplate.vm b/core/platform-common/src/main/resources/publishContentMailTemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/publishContentMailTemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/rejectContentMailTemplate.vm b/core/platform-common/src/main/resources/rejectContentMailTemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/rejectContentMailTemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/rejectFlagMailTemplate.vm b/core/platform-common/src/main/resources/rejectFlagMailTemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/rejectFlagMailTemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/sso.properties b/core/platform-common/src/main/resources/sso.properties deleted file mode 100644 index ce3a6507ae..0000000000 --- a/core/platform-common/src/main/resources/sso.properties +++ /dev/null @@ -1,4 +0,0 @@ -sso.url= -sso.realm=sunbird -sso.connection.pool.size=20 -sso.enabled=true diff --git a/core/platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm b/core/platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm deleted file mode 100644 index 50ff99ca9f..0000000000 --- a/core/platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - -
  -
- - - - - - - - -
- - - - - - - -
- - #if ($orgImageUrl) -

logo

- #end -
- #if ($name) -

Hi $name,

- #end -

$body

- - - - - - -
- - - #if ($actionUrl) - - - - #end - -
#if ($actionName) $actionName #end
-
-

Regards,

-

Team - #if ($orgName) - $orgName - #end -

-

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/userencryption.properties b/core/platform-common/src/main/resources/userencryption.properties deleted file mode 100644 index 7079140728..0000000000 --- a/core/platform-common/src/main/resources/userencryption.properties +++ /dev/null @@ -1,5 +0,0 @@ -userkey.encryption=email,phone,userName,loginId,prevUsedEmail,prevUsedPhone,recoveryEmail,recoveryPhone -userkey.decryption=encEmail,encPhone,userName,loginId,email,phone,prevUsedEmail,prevUsedPhone,recoveryEmail,recoveryPhone -userkey.masked=email,phone,recoveryEmail,recoveryPhone,prevUsedPhone,recoveryEmail,prevUsedEmail -userkey.phonetypeattributes=phone,recoveryPhone,prevUsedPhone -userkey.emailtypeattributes=email,recoveryEmail,prevUsedEmail \ No newline at end of file diff --git a/core/platform-common/src/main/resources/welcomeMailTemplate.vm b/core/platform-common/src/main/resources/welcomeMailTemplate.vm deleted file mode 100644 index 0e7ae77969..0000000000 --- a/core/platform-common/src/main/resources/welcomeMailTemplate.vm +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - -
  -
- - - - - - - - - - -
- - - - - - -
-

$welcomeMessage,

- - - - - - - - - -
-

Your user account has now been created. Click on the link below to #if ($setPasswordLink) set a password #else verify your email ID #end and start using your account: -

-

- - #if ($setPasswordLink) - Set Password - #else - Verify Email - #end - -

-
-
-

Regards,

-

Team $orgName

-

#if ($note) - $note $fromEmail. - #end -

-
-
- -
-
 
- - \ No newline at end of file diff --git a/core/platform-common/src/main/resources/welcomeSmsTemplate.vm b/core/platform-common/src/main/resources/welcomeSmsTemplate.vm deleted file mode 100644 index ab823c73b6..0000000000 --- a/core/platform-common/src/main/resources/welcomeSmsTemplate.vm +++ /dev/null @@ -1 +0,0 @@ -Welcome to $instanceName. Your user account has now been created. Click on the link below to #if ($setPasswordLink) set a password #else verify your email ID #end and start using your account:$newline$link \ No newline at end of file diff --git a/core/platform-common/src/test/java/org/sunbird/auth/verifier/AccessTokenValidatorTest.java b/core/platform-common/src/test/java/org/sunbird/auth/verifier/AccessTokenValidatorTest.java deleted file mode 100644 index 4ca9bf41b8..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/auth/verifier/AccessTokenValidatorTest.java +++ /dev/null @@ -1,226 +0,0 @@ -package org.sunbird.auth.verifier; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.security.PublicKey; -import java.util.HashMap; -import java.util.Map; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.keycloak.common.util.Time; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.util.PropertiesCache; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({CryptoUtil.class, KeyManager.class, Base64Util.class, PropertiesCache.class}) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class AccessTokenValidatorTest { - @Before - public void beforeEachTest() { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - } - - @Test - public void verifyUserAccessToken() throws JsonProcessingException { - PowerMockito.mockStatic(CryptoUtil.class); - PowerMockito.mockStatic(Base64Util.class); - PowerMockito.mockStatic(KeyManager.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - KeyData keyData = PowerMockito.mock(KeyData.class); - Mockito.when(KeyManager.getPublicKey(Mockito.anyString())).thenReturn(keyData); - PublicKey publicKey = PowerMockito.mock(PublicKey.class); - Mockito.when(keyData.getPublicKey()).thenReturn(publicKey); - Map payload = new HashMap<>(); - int expTime = Time.currentTime() + 3600000; - payload.put("exp", expTime); - payload.put("iss", "nullrealms/null"); - payload.put("kid", "kid"); - payload.put("sub", "f:ca00376d-395f-aee687d7c8ad:10cca27c-2a13-443c-9e2b-c7d9589c1f5f"); - ObjectMapper mapper = new ObjectMapper(); - Mockito.when(Base64Util.decode(Mockito.any(String.class), Mockito.anyInt())) - .thenReturn(mapper.writeValueAsString(payload).getBytes()); - Mockito.when( - CryptoUtil.verifyRSASign( - Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyMap())) - .thenReturn(true); - String userId = - AccessTokenValidator.verifyUserToken( - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9.Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA", - new HashMap<>()); - assertNotNull(userId); - } - - @Test - public void verifySourceUserAccessToken() throws JsonProcessingException { - PowerMockito.mockStatic(CryptoUtil.class); - PowerMockito.mockStatic(Base64Util.class); - PowerMockito.mockStatic(KeyManager.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - KeyData keyData = PowerMockito.mock(KeyData.class); - Mockito.when(KeyManager.getPublicKey(Mockito.anyString())).thenReturn(keyData); - PublicKey publicKey = PowerMockito.mock(PublicKey.class); - Mockito.when(keyData.getPublicKey()).thenReturn(publicKey); - Map payload = new HashMap<>(); - int expTime = Time.currentTime() + 3600000; - payload.put("exp", expTime); - payload.put("iss", "urlrealms/master"); - payload.put("kid", "kid"); - payload.put("sub", "f:ca00376d-395f-aee687d7c8ad:10cca27c-2a13-443c-9e2b-c7d9589c1f5f"); - ObjectMapper mapper = new ObjectMapper(); - Mockito.when(Base64Util.decode(Mockito.any(String.class), Mockito.anyInt())) - .thenReturn(mapper.writeValueAsString(payload).getBytes()); - Mockito.when( - CryptoUtil.verifyRSASign( - Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyMap())) - .thenReturn(true); - String userId = - AccessTokenValidator.verifySourceUserToken( - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9.Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA", - "url", - new HashMap<>()); - assertNotNull(userId); - } - - @Test - public void verifyUserAccessTokenInvalidToken() throws JsonProcessingException { - PowerMockito.mockStatic(CryptoUtil.class); - PowerMockito.mockStatic(Base64Util.class); - PowerMockito.mockStatic(KeyManager.class); - KeyData keyData = PowerMockito.mock(KeyData.class); - Mockito.when(KeyManager.getPublicKey(Mockito.anyString())).thenReturn(keyData); - PublicKey publicKey = PowerMockito.mock(PublicKey.class); - Mockito.when(keyData.getPublicKey()).thenReturn(publicKey); - Map payload = new HashMap<>(); - int expTime = Time.currentTime() + 3600000; - payload.put("exp", expTime); - payload.put("kid", "kid"); - ObjectMapper mapper = new ObjectMapper(); - Mockito.when(Base64Util.decode(Mockito.any(String.class), Mockito.anyInt())) - .thenReturn(mapper.writeValueAsString(payload).getBytes()); - Mockito.when( - CryptoUtil.verifyRSASign( - Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyMap())) - .thenReturn(false); - String userId = - AccessTokenValidator.verifyUserToken( - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9.Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA", - new HashMap<>()); - assertEquals("Unauthorized", userId); - } - - @Test - public void verifyUserAccessTokenExpiredToken() throws JsonProcessingException { - PowerMockito.mockStatic(CryptoUtil.class); - PowerMockito.mockStatic(Base64Util.class); - PowerMockito.mockStatic(KeyManager.class); - KeyData keyData = PowerMockito.mock(KeyData.class); - Mockito.when(KeyManager.getPublicKey(Mockito.anyString())).thenReturn(keyData); - PublicKey publicKey = PowerMockito.mock(PublicKey.class); - Mockito.when(keyData.getPublicKey()).thenReturn(publicKey); - Map payload = new HashMap<>(); - int expTime = Time.currentTime() - 3600000; - payload.put("exp", expTime); - payload.put("kid", "kid"); - ObjectMapper mapper = new ObjectMapper(); - Mockito.when(Base64Util.decode(Mockito.any(String.class), Mockito.anyInt())) - .thenReturn(mapper.writeValueAsString(payload).getBytes()); - Mockito.when( - CryptoUtil.verifyRSASign( - Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyMap())) - .thenReturn(true); - String userId = - AccessTokenValidator.verifyUserToken( - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9.Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA", - new HashMap<>()); - assertEquals("Unauthorized", userId); - } - - @Test - public void verifyToken() throws JsonProcessingException { - PowerMockito.mockStatic(CryptoUtil.class); - PowerMockito.mockStatic(Base64Util.class); - PowerMockito.mockStatic(KeyManager.class); - KeyData keyData = PowerMockito.mock(KeyData.class); - Mockito.when(KeyManager.getPublicKey(Mockito.anyString())).thenReturn(keyData); - PublicKey publicKey = PowerMockito.mock(PublicKey.class); - Mockito.when(keyData.getPublicKey()).thenReturn(publicKey); - Map payload = new HashMap<>(); - int expTime = Time.currentTime() + 3600000; - payload.put("exp", expTime); - payload.put("requestedByUserId", "386c7960-7f85-4a24-8131-a8aba519ce7d"); - payload.put("requestedForUserId", "386c7960-7f85-4a24-8131-a8aba519ce7e"); - payload.put("kid", "kid"); - payload.put("parentId", "386c7960-7f85-4a24-8131-a8aba519ce7d"); - payload.put("sub", "386c7960-7f85-4a24-8131-a8aba519ce7e"); - ObjectMapper mapper = new ObjectMapper(); - Mockito.when(Base64Util.decode(Mockito.any(String.class), Mockito.anyInt())) - .thenReturn(mapper.writeValueAsString(payload).getBytes()); - - Mockito.when( - CryptoUtil.verifyRSASign( - Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyMap())) - .thenReturn(true); - String userId = - AccessTokenValidator.verifyManagedUserToken( - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9.Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA", - "386c7960-7f85-4a24-8131-a8aba519ce7d", - "386c7960-7f85-4a24-8131-a8aba519ce7e", - new HashMap<>()); - assertNotNull(userId); - } - - @Test - public void verifyTokenWithNullParentId() throws JsonProcessingException { - PowerMockito.mockStatic(CryptoUtil.class); - PowerMockito.mockStatic(Base64Util.class); - PowerMockito.mockStatic(KeyManager.class); - KeyData keyData = PowerMockito.mock(KeyData.class); - Mockito.when(KeyManager.getPublicKey(Mockito.anyString())).thenReturn(keyData); - PublicKey publicKey = PowerMockito.mock(PublicKey.class); - Mockito.when(keyData.getPublicKey()).thenReturn(publicKey); - Map payload = new HashMap<>(); - int expTime = Time.currentTime() + 3600000; - payload.put("exp", expTime); - payload.put("requestedByUserId", "386c7960-7f85-4a24-8131-a8aba519ce7d"); - payload.put("requestedForUserId", "386c7960-7f85-4a24-8131-a8aba519ce7e"); - payload.put("kid", "kid"); - payload.put("sub", "386c7960-7f85-4a24-8131-a8aba519ce7e"); - ObjectMapper mapper = new ObjectMapper(); - Mockito.when(Base64Util.decode(Mockito.any(String.class), Mockito.anyInt())) - .thenReturn(mapper.writeValueAsString(payload).getBytes()); - - Mockito.when( - CryptoUtil.verifyRSASign( - Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyMap())) - .thenReturn(true); - try { - AccessTokenValidator.verifyManagedUserToken( - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9.Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA", - "386c7960-7f85-4a24-8131-a8aba519ce7d", - "386c7960-7f85-4a24-8131-a8aba519ce7e", - new HashMap<>()); - } catch (Exception e) { - assertNotNull(e); - } - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/auth/verifier/CryptoUtilTest.java b/core/platform-common/src/test/java/org/sunbird/auth/verifier/CryptoUtilTest.java deleted file mode 100644 index f62aa02266..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/auth/verifier/CryptoUtilTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.sunbird.auth.verifier; - -import java.util.HashMap; -import org.junit.Assert; -import org.junit.Test; -import org.sunbird.keys.JsonKey; - -public class CryptoUtilTest { - - @Test - public void verifyRSASignTest() { - String payLoad = - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9"; - String data = - "Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA"; - byte[] signature = Base64Util.decode(data, 11); - // PublicKey key = KeyManager.getPublicKey("keyId").getPublicKey(); - String algorithm = JsonKey.SHA_256_WITH_RSA; - Boolean bool = CryptoUtil.verifyRSASign(payLoad, signature, null, algorithm, new HashMap<>()); - Assert.assertNotNull(bool); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/auth/verifier/KeyManagerTest.java b/core/platform-common/src/test/java/org/sunbird/auth/verifier/KeyManagerTest.java deleted file mode 100644 index dea259a4b3..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/auth/verifier/KeyManagerTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.sunbird.auth.verifier; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import java.security.PublicKey; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.util.PropertiesCache; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({PropertiesCache.class}) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class KeyManagerTest { - @Before - public void beforeEachTest() { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - } - - @Test - public void testLoadPublicKey() throws Exception { - PublicKey key = - KeyManager.loadPublicKey( - "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysH/wWtg0IjBL1JZZDYvUJC42JCxVobalckr2/3d3eEiWkk7Zh/4DAPYOs4UPjAevTs5VMUjq9EZu/u4H5hNzoVmYNvhtxbhWNY3n4mxpA4Lgt4sNGiGYNNGrN34ML+7+TR3Z1dlrhA271PiuanHI11YymskQRPhBfuwK923Kl/lgI4rS9OQ4GnkvwkUPvMUIRfNt8wL9uTbWm3V9p8VTcmQbW+pPw9QhO9v95NOgXQrLnT8xwnzQE6UCTY2al3B0fc3ULmcxvK+7P1R3/0w1qJLEKSiHl0xnv4WNEfS+2UmN+8jfdSCfoyVIglQl5/tb05j89nfZZp8k24AWLxIJQIDAQAB"); - assertNotNull(key); - } - - @Test - public void testGetPublicKey() { - KeyData key = KeyManager.getPublicKey("keyId"); - assertNull(key); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/EncryptionDecriptionServiceTest.java b/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/EncryptionDecriptionServiceTest.java deleted file mode 100644 index f7e79347d3..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/EncryptionDecriptionServiceTest.java +++ /dev/null @@ -1,282 +0,0 @@ -package org.sunbird.datasecurity.impl; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.junit.BeforeClass; -import org.junit.FixMethodOrder; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.datasecurity.DataMaskingService; -import org.sunbird.datasecurity.DecryptionService; -import org.sunbird.datasecurity.EncryptionService; -import org.sunbird.keys.JsonKey; -import org.sunbird.util.PropertiesCache; - -/** @author Amit Kumar */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(PowerMockRunner.class) -@PrepareForTest({PropertiesCache.class}) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -@Ignore -public class EncryptionDecriptionServiceTest { - - private static String data = "hello sunbird"; - private static String encryptedData = ""; - private static String decryptedData = ""; - private static EncryptionService encryptionService = null; - private static DecryptionService decryptionService = null; - private static DataMaskingService maskingService = null; - private static Map map = null; - private static List> mapList = null; - private static Map map2 = null; - private static List> mapList2 = null; - private static String sunbirdEncryption = ""; - - @BeforeClass - public static void setUp() { - - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - - sunbirdEncryption = System.getenv(JsonKey.SUNBIRD_ENCRYPTION); - if (StringUtils.isBlank(sunbirdEncryption)) { - sunbirdEncryption = PropertiesCache.getInstance().getProperty(JsonKey.SUNBIRD_ENCRYPTION); - } - map = new HashMap<>(); - map.put(JsonKey.FIRST_NAME, "Amit"); - map.put(JsonKey.LAST_NAME, "KUMAR"); - mapList = new ArrayList<>(); - mapList.add(map); - map2 = new HashMap<>(); - map2.put(JsonKey.EMAIL, "amit.ec006@gmail.com"); - map2.put(JsonKey.FIRST_NAME, "Amit"); - map2.put(JsonKey.LAST_NAME, "KUMAR"); - mapList2 = new ArrayList<>(); - mapList2.add(map2); - encryptionService = ServiceFactory.getEncryptionServiceInstance(); - decryptionService = ServiceFactory.getDecryptionServiceInstance(); - maskingService = ServiceFactory.getMaskingServiceInstance(); - try { - encryptedData = encryptionService.encryptData(data, null); - decryptedData = decryptionService.decryptData(encryptedData, null); - } catch (Exception e) { - } - } - - @Test - public void testDataDecryptionFrMap() { - try { - assertEquals( - decryptionService - .decryptData(encryptionService.encryptData(map2, null), null) - .get(JsonKey.FIRST_NAME), - "Amit"); - } catch (Exception e) { - } - } - - @Test - public void testDataDecryptionFrMapWithNullValue() { - try { - map2.put(JsonKey.LOCATION, null); - assertEquals( - decryptionService - .decryptData(encryptionService.encryptData(map2, null), null) - .get(JsonKey.LOCATION), - null); - } catch (Exception e) { - } - } - - @Test - public void testDataDecryptionFrMapWithEmptyValue() { - try { - map2.put(JsonKey.LOCATION, ""); - assertEquals( - decryptionService - .decryptData(encryptionService.encryptData(map2, null), null) - .get(JsonKey.LOCATION), - ""); - } catch (Exception e) { - } - } - - @Test - public void testDataDecryptionFrMapWithMapList() { - try { - map2.put(JsonKey.LOCATION, ""); - assertEquals( - decryptionService - .decryptData(encryptionService.encryptData(mapList2, null), null) - .get(0) - .get(JsonKey.LOCATION), - ""); - } catch (Exception e) { - } - } - - @Test - public void testDataEncryptionFrMap() { - try { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - assertNotEquals(encryptionService.encryptData(map, null).get(JsonKey.FIRST_NAME), "Amit"); - } - } catch (Exception e) { - } - } - - @Test - public void testDataEncryptionFrListMap() { - try { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - assertNotEquals( - encryptionService.encryptData(mapList, null).get(0).get(JsonKey.FIRST_NAME), "Amit"); - } - } catch (Exception e) { - } - } - - @Test - public void testDataEncryptionFrMapWithNullValue() { - try { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - map.put(JsonKey.LAST_NAME, null); - assertEquals(encryptionService.encryptData(map, null).get(JsonKey.LAST_NAME), null); - } - } catch (Exception e) { - } - } - - @Test - public void testDataEncryptionFrMapWithEmptyValue() { - try { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - map.put(JsonKey.LAST_NAME, ""); - assertNotEquals(encryptionService.encryptData(map, null).get(JsonKey.LAST_NAME), ""); - } - } catch (Exception e) { - } - } - - @Test - public void testDataEncryption() { - try { - assertEquals(encryptedData, encryptionService.encryptData(data, null)); - } catch (Exception e) { - } - } - - @Test - public void testDataDecryption() { - try { - assertEquals(decryptedData, decryptionService.decryptData(encryptedData, null)); - } catch (Exception e) { - } - } - - @Test - public void testADataEncryption() { - try { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - assertNotEquals("Hello", encryptionService.encryptData("Hello", null)); - } else { - assertEquals("Hello", encryptionService.encryptData("Hello", null)); - } - } catch (Exception e) { - } - } - - @Test - public void testADataDecryption() { - try { - assertEquals( - "Hello", - decryptionService.decryptData(encryptionService.encryptData("Hello", null), null)); - } catch (Exception e) { - } - } - - @Test - public void testBDataDecryption() { - try { - if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { - assertNotEquals( - encryptionService.encryptData("Hello", null), - decryptionService.decryptData(encryptionService.encryptData("Hello", null), null)); - } - } catch (Exception e) { - } - } - - @Test - public void testEmptyPhoneMasking() { - assertEquals(maskingService.maskPhone(""), ""); - } - - @Test - public void testNullPhoneMasking() { - assertEquals(maskingService.maskPhone(null), null); - } - - @Test - public void testPhoneMasking() { - assertEquals(maskingService.maskPhone("1234567890"), "******7890"); - } - - @Test - public void testEmptyEmailMasking() { - assertEquals(maskingService.maskEmail(""), ""); - } - - @Test - public void testNullEmailMasking() { - assertEquals(maskingService.maskEmail(null), null); - } - - @Test - public void testEmailMasking() { - assertEquals(maskingService.maskEmail("amit.ec006@gmail.com"), "am********@gmail.com"); - } - - @Test - public void testEmptyDataMasking() { - assertEquals(maskingService.maskData(""), ""); - } - - @Test - public void testNullDataMasking() { - assertEquals(maskingService.maskData(null), null); - } - - @Test - public void testDataMasking() { - assertEquals(maskingService.maskData("qwerty"), "**erty"); - } - - @Test - public void testDataOfLengthLessThanEqualTo4Masking() { - assertEquals(maskingService.maskData("qwer"), "qwer"); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/LogMaskServiceImplTest.java b/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/LogMaskServiceImplTest.java deleted file mode 100644 index 16dab4e19d..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/LogMaskServiceImplTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.sunbird.datasecurity.impl; - -import static org.junit.Assert.*; - -import java.util.HashMap; -import org.junit.Test; - -public class LogMaskServiceImplTest { - private LogMaskServiceImpl logMaskService = new LogMaskServiceImpl(); - - @Test - public void maskEmail() { - HashMap emailMaskExpectations = - new HashMap<>() { - { - put("abc@gmail.com", "ab*@gmail.com"); - put("abcd@yahoo.com", "ab**@yahoo.com"); - put("abcdefgh@testmail.org", "ab******@testmail.org"); - } - }; - emailMaskExpectations.forEach( - (email, expectedResult) -> { - assertEquals(expectedResult, logMaskService.maskEmail(email)); - }); - } - - @Test - public void maskPhone() { - HashMap phoneMaskExpectations = - new HashMap<>() { - { - put("0123456789", "01234*****"); - put("123-456-789", "123-4******"); - put("123", "123"); - } - }; - phoneMaskExpectations.forEach( - (phone, expectedResult) -> { - assertEquals(expectedResult, logMaskService.maskPhone(phone)); - }); - } - - @Test - public void maskOTP() { - HashMap phoneMaskExpectations = - new HashMap<>() { - { - put("123456", "1234**"); - put("1234567", "1234***"); - - put("1234", "12**"); - put("123", "12*"); - } - }; - phoneMaskExpectations.forEach( - (otp, expectedResult) -> { - assertEquals(expectedResult, logMaskService.maskOTP(otp)); - }); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/OnWayhashingTest.java b/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/OnWayhashingTest.java deleted file mode 100644 index 0bbd378a2b..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/datasecurity/impl/OnWayhashingTest.java +++ /dev/null @@ -1,30 +0,0 @@ -/** */ -package org.sunbird.datasecurity.impl; - -import static org.junit.Assert.assertEquals; - -import org.junit.Assert; -import org.junit.Test; -import org.sunbird.datasecurity.OneWayHashing; - -/** @author Manzarul */ -public class OnWayhashingTest { - public static String data = "test1234$5"; - - @Test - public void validateDataHashingSuccess() { - String encryptval = OneWayHashing.encryptVal("test1234$5"); - Assert.assertNotEquals(encryptval.length(), 0); - assertEquals(encryptval, OneWayHashing.encryptVal(data)); - } - - @Test - public void validateDataHashingFailure() { - assertEquals(OneWayHashing.encryptVal(null).length(), 0); - } - - @Test - public void validateDataHashingWithEmptyKey() { - Assert.assertNotEquals((OneWayHashing.encryptVal("")).length(), 0); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/exception/ExceptionTest.java b/core/platform-common/src/test/java/org/sunbird/exception/ExceptionTest.java deleted file mode 100644 index dc31d25cf0..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/exception/ExceptionTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.sunbird.exception; - -import org.junit.Assert; -import org.junit.Test; - -/** @author Manzarul */ -public class ExceptionTest { - - @Test - public void testProjectCommonException() { - ProjectCommonException exception = - new ProjectCommonException( - ResponseCode.unAuthorized, - ResponseCode.unAuthorized.getErrorMessage(), - ResponseCode.UNAUTHORIZED.getResponseCode()); - Assert.assertEquals(exception.getErrorCode(), ResponseCode.unAuthorized.getErrorCode()); - Assert.assertEquals(exception.getMessage(), ResponseCode.unAuthorized.getErrorMessage()); - Assert.assertEquals( - exception.getErrorResponseCode(), ResponseCode.UNAUTHORIZED.getResponseCode()); - } - - @Test - public void testProjectCommonExceptionUsingSetters() { - ProjectCommonException exception = - new ProjectCommonException( - ResponseCode.unAuthorized, - ResponseCode.unAuthorized.getErrorMessage(), - ResponseCode.UNAUTHORIZED.getResponseCode()); - Assert.assertEquals(exception.getErrorCode(), ResponseCode.unAuthorized.getErrorCode()); - Assert.assertEquals(exception.getMessage(), ResponseCode.unAuthorized.getErrorMessage()); - exception.setErrorCode(ResponseCode.dataFormatError.getErrorCode()); - exception.setMessage(ResponseCode.dataFormatError.getErrorMessage()); - exception.setErrorResponseCode(ResponseCode.SERVER_ERROR.getResponseCode()); - Assert.assertEquals(exception.getErrorCode(), ResponseCode.dataFormatError.getErrorCode()); - Assert.assertEquals(exception.getMessage(), ResponseCode.dataFormatError.getErrorMessage()); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/http/HttpClientUtilTest.java b/core/platform-common/src/test/java/org/sunbird/http/HttpClientUtilTest.java deleted file mode 100644 index e267fb0561..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/http/HttpClientUtilTest.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.sunbird.http; - -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import org.apache.http.HttpEntity; -import org.apache.http.StatusLine; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPatch; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.conn.ConnectionKeepAliveStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.util.EntityUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.request.RequestContext; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*", - "javax.crypto.*" -}) -@PrepareForTest({ - HttpClients.class, - CloseableHttpClient.class, - ConnectionKeepAliveStrategy.class, - PoolingHttpClientConnectionManager.class, - CloseableHttpResponse.class, - HttpGet.class, - HttpPost.class, - UrlEncodedFormEntity.class, - HttpPatch.class, - EntityUtils.class -}) -public class HttpClientUtilTest { - - private Map headers() { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json"); - return headers; - } - - @Test - public void testGetFailure() throws IOException { - PowerMockito.mockStatic(HttpClients.class); - HttpClientBuilder clientBuilder = PowerMockito.mock(HttpClientBuilder.class); - CloseableHttpClient httpclient = PowerMockito.mock(CloseableHttpClient.class); - PowerMockito.when(HttpClients.custom()).thenReturn(clientBuilder); - PowerMockito.when(clientBuilder.build()).thenReturn(httpclient); - CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class); - StatusLine statusLine = PowerMockito.mock(StatusLine.class); - PowerMockito.when(response.getStatusLine()).thenReturn(statusLine); - PowerMockito.when(statusLine.getStatusCode()).thenReturn(400); - HttpEntity entity = PowerMockito.mock(HttpEntity.class); - PowerMockito.when(response.getEntity()).thenReturn(entity); - PowerMockito.mockStatic(EntityUtils.class); - byte[] bytes = "{\"message\":\"success\"}".getBytes(); - PowerMockito.when(EntityUtils.toByteArray(Mockito.any(HttpEntity.class))).thenReturn(bytes); - PowerMockito.when(httpclient.execute(Mockito.any(HttpGet.class))).thenReturn(response); - HttpClientUtil.getInstance(); - String res = HttpClientUtil.get("http://localhost:80/user/read", headers(), null); - assertNotNull(res); - } - - @Test - public void testPostSuccess() throws IOException { - PowerMockito.mockStatic(HttpClients.class); - HttpClientBuilder clientBuilder = PowerMockito.mock(HttpClientBuilder.class); - CloseableHttpClient httpclient = PowerMockito.mock(CloseableHttpClient.class); - PowerMockito.when(HttpClients.custom()).thenReturn(clientBuilder); - PowerMockito.when(clientBuilder.build()).thenReturn(httpclient); - CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class); - StatusLine statusLine = PowerMockito.mock(StatusLine.class); - PowerMockito.when(response.getStatusLine()).thenReturn(statusLine); - PowerMockito.when(statusLine.getStatusCode()).thenReturn(200); - HttpEntity entity = PowerMockito.mock(HttpEntity.class); - PowerMockito.when(response.getEntity()).thenReturn(entity); - PowerMockito.mockStatic(EntityUtils.class); - byte[] bytes = "{\"message\":\"success\"}".getBytes(); - PowerMockito.when(EntityUtils.toByteArray(Mockito.any(HttpEntity.class))).thenReturn(bytes); - PowerMockito.when(httpclient.execute(Mockito.any(HttpPost.class))).thenReturn(response); - HttpClientUtil.getInstance(); - String res = - HttpClientUtil.post( - "http://localhost:80/user/read", "{\"message\":\"success\"}", headers(), null); - assertNotNull(res); - } - - @Test - public void testPostFormSuccess() throws IOException { - PowerMockito.mockStatic(HttpClients.class); - HttpClientBuilder clientBuilder = PowerMockito.mock(HttpClientBuilder.class); - CloseableHttpClient httpclient = PowerMockito.mock(CloseableHttpClient.class); - PowerMockito.when(HttpClients.custom()).thenReturn(clientBuilder); - PowerMockito.when(clientBuilder.build()).thenReturn(httpclient); - CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class); - StatusLine statusLine = PowerMockito.mock(StatusLine.class); - PowerMockito.when(response.getStatusLine()).thenReturn(statusLine); - PowerMockito.when(statusLine.getStatusCode()).thenReturn(200); - HttpEntity entity = PowerMockito.mock(HttpEntity.class); - PowerMockito.when(response.getEntity()).thenReturn(entity); - PowerMockito.mockStatic(EntityUtils.class); - byte[] bytes = "{\"message\":\"success\"}".getBytes(); - PowerMockito.when(EntityUtils.toByteArray(Mockito.any(HttpEntity.class))).thenReturn(bytes); - PowerMockito.when(httpclient.execute(Mockito.any(HttpPost.class))).thenReturn(response); - Map fields = new HashMap<>(); - fields.put("message", "success"); - HttpClientUtil.getInstance(); - String res = HttpClientUtil.postFormData("http://localhost:80/user/read", fields, headers(), null); - assertNotNull(res); - } - - @Test - public void testPatchFailure() throws Exception { - PowerMockito.mockStatic(HttpClients.class); - HttpClientBuilder clientBuilder = PowerMockito.mock(HttpClientBuilder.class); - CloseableHttpClient httpclient = PowerMockito.mock(CloseableHttpClient.class); - PowerMockito.when(HttpClients.custom()).thenReturn(clientBuilder); - PowerMockito.when(clientBuilder.build()).thenReturn(httpclient); - CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class); - StatusLine statusLine = PowerMockito.mock(StatusLine.class); - PowerMockito.when(response.getStatusLine()).thenReturn(statusLine); - PowerMockito.when(statusLine.getStatusCode()).thenReturn(400); - HttpEntity entity = PowerMockito.mock(HttpEntity.class); - PowerMockito.when(response.getEntity()).thenReturn(entity); - PowerMockito.mockStatic(EntityUtils.class); - byte[] bytes = "{\"message\":\"success\"}".getBytes(); - PowerMockito.when(EntityUtils.toByteArray(Mockito.any(HttpEntity.class))).thenReturn(bytes); - PowerMockito.when(httpclient.execute(Mockito.any(HttpPatch.class))).thenReturn(response); - HttpClientUtil.getInstance(); - String res = - HttpClientUtil.patch( - "http://localhost:80/user/read", "{\"message\":\"success\"}", headers(), null); - assertNotNull(res); - } - - @Test - public void testDeleteFailure() throws Exception { - PowerMockito.mockStatic(HttpClients.class); - HttpClientBuilder clientBuilder = PowerMockito.mock(HttpClientBuilder.class); - CloseableHttpClient httpclient = PowerMockito.mock(CloseableHttpClient.class); - PowerMockito.when(HttpClients.custom()).thenReturn(clientBuilder); - PowerMockito.when(clientBuilder.build()).thenReturn(httpclient); - CloseableHttpResponse response = PowerMockito.mock(CloseableHttpResponse.class); - StatusLine statusLine = PowerMockito.mock(StatusLine.class); - PowerMockito.when(response.getStatusLine()).thenReturn(statusLine); - PowerMockito.when(statusLine.getStatusCode()).thenReturn(400); - HttpEntity entity = PowerMockito.mock(HttpEntity.class); - PowerMockito.when(response.getEntity()).thenReturn(entity); - PowerMockito.mockStatic(EntityUtils.class); - byte[] bytes = "{\"message\":\"success\"}".getBytes(); - PowerMockito.when(EntityUtils.toByteArray(Mockito.any(HttpEntity.class))).thenReturn(bytes); - PowerMockito.when(httpclient.execute(Mockito.any(HttpPatch.class))).thenReturn(response); - HttpClientUtil.getInstance(); - String res = HttpClientUtil.delete("http://localhost:80/user/read", headers(), null); - assertNotNull(res); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/logging/LoggerUtilTest.java b/core/platform-common/src/test/java/org/sunbird/logging/LoggerUtilTest.java deleted file mode 100644 index 58e7c47bb6..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/logging/LoggerUtilTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.sunbird.logging; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.request.RequestContext; -import org.sunbird.telemetry.collector.TelemetryAssemblerFactory; -import org.sunbird.telemetry.collector.TelemetryDataAssembler; -import org.sunbird.telemetry.validator.TelemetryObjectValidator; -import org.sunbird.telemetry.validator.TelemetryObjectValidatorV3; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*", - "javax.crypto.*" -}) -@PrepareForTest({ - TelemetryAssemblerFactory.class, - TelemetryDataAssembler.class, - TelemetryObjectValidatorV3.class -}) -public class LoggerUtilTest { - private static LoggerUtil loggerUtil; - private static TelemetryDataAssembler telemetryDataAssembler; - private static TelemetryObjectValidator telemetryObjectValidator; - private static TelemetryObjectValidatorV3 telemetryObjectValidatorV3; - - @Before - public void setup() throws Exception { - loggerUtil = Mockito.mock(LoggerUtil.class); - Mockito.mock(TelemetryAssemblerFactory.class); - PowerMockito.mockStatic(TelemetryAssemblerFactory.class); - telemetryDataAssembler = Mockito.mock(TelemetryDataAssembler.class); - telemetryObjectValidator = Mockito.mock(TelemetryObjectValidator.class); - telemetryObjectValidatorV3 = Mockito.mock(TelemetryObjectValidatorV3.class); - PowerMockito.mockStatic(TelemetryObjectValidatorV3.class); - // PowerMockito.whenNew(LoggerUtil.class).withAnyArguments().thenReturn(loggerUtil); - PowerMockito.when(TelemetryAssemblerFactory.get()).thenReturn(telemetryDataAssembler); - PowerMockito.when(TelemetryObjectValidatorV3.getInstance()) - .thenReturn(telemetryObjectValidator); - } - - @Test - public void debug() { - loggerUtil = new LoggerUtil(this.getClass()); - RequestContext requestContext = - new RequestContext( - "someUid", - "someDid", - "someSid", - "someAppId", - "someAppVer", - "someReqId", - "someSource", - "true", - "operation"); - PowerMockito.when(telemetryDataAssembler.log(Mockito.any(), Mockito.anyMap())) - .thenReturn("telemetry string"); - PowerMockito.when(telemetryObjectValidator.validateLog(Mockito.anyString())).thenReturn(true); - loggerUtil.debug(requestContext, "debug message"); - Mockito.verify(telemetryDataAssembler, Mockito.times(1)).log(Mockito.any(), Mockito.anyMap()); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/mail/EmailTest.java b/core/platform-common/src/test/java/org/sunbird/mail/EmailTest.java deleted file mode 100644 index fad4221b92..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/mail/EmailTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/** */ -package org.sunbird.mail; - -import javax.mail.PasswordAuthentication; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.jvnet.mock_javamail.Mailbox; - -/** @author Manzarul */ -public class EmailTest { - - private static GMailAuthenticator authenticator = null; - - @BeforeClass - public static void setUp() { - authenticator = new GMailAuthenticator("test123", "test"); - // clear Mock JavaMail box - Mailbox.clearAll(); - } - - @Test - public void createGmailAuthInstance() { - GMailAuthenticator authenticator = new GMailAuthenticator("test123", "test"); - Assert.assertNotEquals(null, authenticator); - } - - @Test - public void passwordAuthTest() { - PasswordAuthentication authentication = authenticator.getPasswordAuthentication(); - Assert.assertEquals("test", authentication.getPassword()); - } - - @AfterClass - public static void tearDown() { - authenticator = null; - Mailbox.clearAll(); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/operations/ActorOperationTest.java b/core/platform-common/src/test/java/org/sunbird/operations/ActorOperationTest.java deleted file mode 100644 index 6825aff7a4..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/operations/ActorOperationTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/** */ -package org.sunbird.operations; - -import org.junit.Assert; -import org.junit.Test; - -/** @author Manzarul */ -public class ActorOperationTest { - - @Test - public void testActorOperation() { - Assert.assertEquals("updateSystemSettings", ActorOperations.UPDATE_SYSTEM_SETTINGS.getValue()); - Assert.assertEquals( - "updateTenantPreference", ActorOperations.UPDATE_TENANT_PREFERENCE.getValue()); - Assert.assertEquals("getTenantPreference", ActorOperations.GET_TENANT_PREFERENCE.getValue()); - Assert.assertEquals( - "createTenantPreference", ActorOperations.CREATE_TENANT_PREFERENCE.getValue()); - Assert.assertEquals("createUser", ActorOperations.CREATE_USER.getValue()); - Assert.assertEquals("updateUser", ActorOperations.UPDATE_USER.getValue()); - Assert.assertEquals( - "updateUserInfoToElastic", ActorOperations.UPDATE_USER_INFO_ELASTIC.getValue()); - Assert.assertEquals("getRoles", ActorOperations.GET_ROLES.getValue()); - Assert.assertEquals( - "getUserDetailsByLoginId", ActorOperations.GET_USER_DETAILS_BY_LOGINID.getValue()); - Assert.assertEquals("blockUser", ActorOperations.BLOCK_USER.getValue()); - Assert.assertEquals("bulkUpload", ActorOperations.BULK_UPLOAD.getValue()); - Assert.assertEquals("processBulkUpload", ActorOperations.PROCESS_BULK_UPLOAD.getValue()); - Assert.assertEquals("assignRoles", ActorOperations.ASSIGN_ROLES.getValue()); - Assert.assertEquals("unblockUser", ActorOperations.UNBLOCK_USER.getValue()); - Assert.assertEquals("getBulkOpStatus", ActorOperations.GET_BULK_OP_STATUS.getValue()); - Assert.assertEquals("updateUserOrgES", ActorOperations.UPDATE_USER_ORG_ES.getValue()); - Assert.assertEquals("updateUserRoles", ActorOperations.UPDATE_USER_ROLES_ES.getValue()); - Assert.assertEquals("sync", ActorOperations.SYNC.getValue()); - Assert.assertEquals("fileStorageService", ActorOperations.FILE_STORAGE_SERVICE.getValue()); - Assert.assertEquals("healthCheck", ActorOperations.HEALTH_CHECK.getValue()); - Assert.assertEquals("sendMail", ActorOperations.SEND_MAIL.getValue()); - Assert.assertEquals("createNote", ActorOperations.CREATE_NOTE.getValue()); - Assert.assertEquals("updateNote", ActorOperations.UPDATE_NOTE.getValue()); - Assert.assertEquals("searchNote", ActorOperations.SEARCH_NOTE.getValue()); - Assert.assertEquals("getNote", ActorOperations.GET_NOTE.getValue()); - Assert.assertEquals("deleteNote", ActorOperations.DELETE_NOTE.getValue()); - Assert.assertEquals( - "insertUserNotesToElastic", ActorOperations.INSERT_USER_NOTES_ES.getValue()); - Assert.assertEquals( - "updateUserNotesToElastic", ActorOperations.UPDATE_USER_NOTES_ES.getValue()); - Assert.assertEquals("userSearch", ActorOperations.USER_SEARCH.getValue()); - Assert.assertEquals("orgSearch", ActorOperations.ORG_SEARCH.getValue()); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/request/RequestParamsTest.java b/core/platform-common/src/test/java/org/sunbird/request/RequestParamsTest.java deleted file mode 100644 index d1da177c6d..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/request/RequestParamsTest.java +++ /dev/null @@ -1,28 +0,0 @@ -/** */ -package org.sunbird.request; - -import org.junit.Assert; -import org.junit.Test; - -/** @author Manzarul */ -public class RequestParamsTest { - - @Test - public void testResponseParamBean() { - RequestParams params = new RequestParams(); - params.setAuthToken("auth_1233"); - params.setCid("cid"); - params.setDid("deviceId"); - params.setKey("account key"); - params.setMsgid("uniqueMsgId"); - params.setSid("sid"); - params.setUid("UUID"); - Assert.assertEquals(params.getAuthToken(), "auth_1233"); - Assert.assertEquals(params.getCid(), "cid"); - Assert.assertEquals(params.getMsgid(), "uniqueMsgId"); - Assert.assertEquals(params.getDid(), "deviceId"); - Assert.assertEquals(params.getKey(), "account key"); - Assert.assertEquals(params.getSid(), "sid"); - Assert.assertEquals(params.getUid(), "UUID"); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/request/RequestTest.java b/core/platform-common/src/test/java/org/sunbird/request/RequestTest.java deleted file mode 100644 index 15c932f3f7..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/request/RequestTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/** */ -package org.sunbird.request; - -import java.util.HashMap; -import org.junit.Assert; -import org.junit.Test; - -/** @author Manzarul */ -public class RequestTest { - - @Test - public void testRequestBeanWithDefaultConstructor() { - Request request = new Request(); - request.setEnv(1); - long val = System.currentTimeMillis(); - request.setId(val + ""); - request.setManagerName("name"); - request.setOperation("operation name"); - request.setRequestId("unique req id"); - request.setTs(val + ""); - request.setVer("v1"); - request.setContext(new HashMap<>()); - request.setRequest(new HashMap<>()); - request.setParams(new RequestParams()); - Assert.assertEquals(request.getEnv(), 1); - Assert.assertEquals(request.getId(), val + ""); - Assert.assertEquals(request.getManagerName(), "name"); - Assert.assertEquals(request.getOperation(), "operation name"); - Assert.assertEquals(request.getRequestId(), "unique req id"); - Assert.assertEquals(request.getTs(), val + ""); - Assert.assertEquals(request.getVer(), "v1"); - Assert.assertEquals(request.getContext().size(), 0); - Assert.assertEquals(request.getRequest().size(), 0); - Assert.assertNotNull(request.getParams()); - Assert.assertNotNull(request.toString()); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/response/ClientErrorResponseTest.java b/core/platform-common/src/test/java/org/sunbird/response/ClientErrorResponseTest.java deleted file mode 100644 index 10e54f6725..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/response/ClientErrorResponseTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.sunbird.response; - -import java.util.HashMap; -import org.junit.Assert; -import org.junit.Test; -import org.sunbird.exception.ResponseCode; - -public class ClientErrorResponseTest { - - @Test - public void responseCreate() { - Response response = new ClientErrorResponse(); - response.setId("test"); - response.setTs("1233444555"); - response.setVer("v1"); - ResponseParams params = new ResponseParams(); - params.setErr("Server Error"); - params.setErrmsg("test msg"); - params.setMsgid("123"); - params.setResmsgid("4566"); - params.setStatus("OK"); - response.setParams(params); - Assert.assertEquals(response.getId(), "test"); - Assert.assertEquals(response.getTs(), "1233444555"); - Assert.assertEquals(response.getVer(), "v1"); - Assert.assertEquals(response.getParams(), params); - Assert.assertEquals(response.getResponseCode(), ResponseCode.CLIENT_ERROR); - Assert.assertEquals(response.getParams().getErr(), params.getErr()); - Assert.assertEquals(response.getParams().getErrmsg(), params.getErrmsg()); - Assert.assertEquals(response.getParams().getMsgid(), params.getMsgid()); - Assert.assertEquals(response.getParams().getResmsgid(), params.getResmsgid()); - Assert.assertEquals(response.getParams().getStatus(), params.getStatus()); - Assert.assertEquals(response.getResult().size(), 0); - Assert.assertNotEquals(response.get("Test"), "test"); - response.putAll(new HashMap()); - response.put("test", "test123"); - Response responseClone = response.clone(response); - Assert.assertNotEquals(response, responseClone); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/response/ResponseParamsTest.java b/core/platform-common/src/test/java/org/sunbird/response/ResponseParamsTest.java deleted file mode 100644 index e2d31276a6..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/response/ResponseParamsTest.java +++ /dev/null @@ -1,23 +0,0 @@ -/** */ -package org.sunbird.response; - -import org.junit.Assert; -import org.junit.Test; - -/** @author Manzarul */ -public class ResponseParamsTest { - - @Test - public void testResponseParamBean() { - ResponseParams params = new ResponseParams(); - params.setMsgid("test"); - params.setResmsgid("test-1"); - params.setStatus("OK"); - Assert.assertEquals(params.getMsgid(), "test"); - Assert.assertEquals(params.getResmsgid(), "test-1"); - Assert.assertEquals(params.getStatus(), "OK"); - Assert.assertEquals(ResponseParams.StatusType.FAILED.name(), "FAILED"); - Assert.assertEquals(ResponseParams.StatusType.SUCCESSFUL.name(), "SUCCESSFUL"); - Assert.assertEquals(ResponseParams.StatusType.WARNING.name(), "WARNING"); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/response/ResponseTest.java b/core/platform-common/src/test/java/org/sunbird/response/ResponseTest.java deleted file mode 100644 index dfe5790640..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/response/ResponseTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/** */ -package org.sunbird.response; - -import java.util.HashMap; -import org.junit.Assert; -import org.junit.Test; -import org.sunbird.exception.ResponseCode; - -/** @author Manzarul */ -public class ResponseTest { - - @Test - public void responseCreate() { - Response response = new Response(); - response.setId("test"); - response.setResponseCode(ResponseCode.SERVER_ERROR); - response.setTs("1233444555"); - response.setVer("v1"); - ResponseParams params = new ResponseParams(); - params.setErr("Server Error"); - params.setErrmsg("test msg"); - params.setMsgid("123"); - params.setResmsgid("4566"); - params.setStatus("OK"); - response.setParams(params); - Assert.assertEquals(response.getId(), "test"); - Assert.assertEquals(response.getTs(), "1233444555"); - Assert.assertEquals(response.getVer(), "v1"); - Assert.assertEquals(response.getParams(), params); - Assert.assertEquals(response.getResponseCode(), ResponseCode.SERVER_ERROR); - Assert.assertEquals(response.getParams().getErr(), params.getErr()); - Assert.assertEquals(response.getParams().getErrmsg(), params.getErrmsg()); - Assert.assertEquals(response.getParams().getMsgid(), params.getMsgid()); - Assert.assertEquals(response.getParams().getResmsgid(), params.getResmsgid()); - Assert.assertEquals(response.getParams().getStatus(), params.getStatus()); - Assert.assertEquals(response.getResult().size(), 0); - Assert.assertNotEquals(response.get("Test"), "test"); - response.putAll(new HashMap()); - response.put("test", "test123"); - Response responseClone = response.clone(response); - Assert.assertNotEquals(response, responseClone); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/sso/KeycloakBruteForceAttackUtilTest.java b/core/platform-common/src/test/java/org/sunbird/sso/KeycloakBruteForceAttackUtilTest.java deleted file mode 100644 index 3633de1513..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/sso/KeycloakBruteForceAttackUtilTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.sunbird.sso; - -import static org.junit.Assert.assertTrue; -import static org.powermock.api.mockito.PowerMockito.when; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.http.HttpClientUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; - -@PrepareForTest({ProjectUtil.class, HttpClientUtil.class, KeycloakUtil.class}) -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -@Ignore -public class KeycloakBruteForceAttackUtilTest { - @Before - public void setup() throws Exception { - PowerMockito.mockStatic(ProjectUtil.class); - PowerMockito.mockStatic(HttpClientUtil.class); - PowerMockito.mockStatic(KeycloakUtil.class); - when(ProjectUtil.getConfigValue(Mockito.anyString())).thenReturn("anyString"); - when(KeycloakUtil.getAdminAccessTokenWithoutDomain(Mockito.any(RequestContext.class))) - .thenReturn("accessToken"); - when(HttpClientUtil.get(Mockito.anyString(), Mockito.anyMap(), Mockito.any(RequestContext.class))) - .thenReturn("{\"disabled\":true}"); - when(HttpClientUtil.delete(Mockito.anyString(), Mockito.anyMap(),Mockito.any(RequestContext.class))).thenReturn(""); - } - - @Test - public void testIsUserAccountDisabled() throws Exception { - boolean bool = - KeycloakBruteForceAttackUtil.isUserAccountDisabled( - "4564654-789797-121", new RequestContext()); - assertTrue(bool); - } - - @Test - public void testUnlockTempDisabledUser() throws Exception { - boolean bool = - KeycloakBruteForceAttackUtil.unlockTempDisabledUser( - "4564654-789797-121", new RequestContext()); - assertTrue(bool); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/sso/KeycloakUtilTest.java b/core/platform-common/src/test/java/org/sunbird/sso/KeycloakUtilTest.java deleted file mode 100644 index 7f0d24b10b..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/sso/KeycloakUtilTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.sunbird.sso; - -import static org.junit.Assert.assertTrue; -import static org.powermock.api.mockito.PowerMockito.when; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.http.HttpClientUtil; -import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; - -@PrepareForTest({ProjectUtil.class, HttpClientUtil.class}) -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class KeycloakUtilTest { - - @Before - public void setup() { - PowerMockito.mockStatic(HttpClientUtil.class); - PowerMockito.mockStatic(ProjectUtil.class); - when(HttpClientUtil.postFormData(Mockito.anyString(), Mockito.anyMap(), Mockito.anyMap(), Mockito.any(RequestContext.class))) - .thenReturn("{\"access_token\":\"accesstoken\"}"); - when(ProjectUtil.getConfigValue(Mockito.anyString())).thenReturn("anyString"); - } - - @Test - public void testGetAdminAccessToken() throws Exception { - String token = KeycloakUtil.getAdminAccessToken(new RequestContext(), "url"); - assertTrue(token.equals("accesstoken")); - } - - @Test - public void testGetAdminAccessTokenWithDomain() throws Exception { - String token = KeycloakUtil.getAdminAccessTokenWithDomain(new RequestContext()); - assertTrue(token.equals("accesstoken")); - } - - @Test - public void testGetAdminAccessTokenWithoutDomain() throws Exception { - String token = KeycloakUtil.getAdminAccessTokenWithoutDomain(new RequestContext()); - assertTrue(token.equals("accesstoken")); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/sso/impl/BaseHttpTest.java b/core/platform-common/src/test/java/org/sunbird/sso/impl/BaseHttpTest.java deleted file mode 100644 index 9cdbec7fea..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/sso/impl/BaseHttpTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.sunbird.sso.impl; - -import static org.powermock.api.mockito.PowerMockito.doThrow; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; -import static org.powermock.api.mockito.PowerMockito.whenNew; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.net.HttpURLConnection; -import java.net.URL; -import org.junit.Assert; -import org.junit.Before; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.sso.KeyCloakConnectionProvider; -import org.sunbird.sso.KeycloakRequiredActionLinkUtil; -import org.sunbird.util.ProjectUtil; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*", - "javax.crypto.*", - "javax.script.*", - "javax.xml.*", - "com.sun.org.apache.xerces.*", - "org.xml.*" -}) -@PrepareForTest({ - ProjectUtil.class, - OutputStreamWriter.class, - URL.class, - BufferedReader.class, - KeyCloakConnectionProvider.class, - KeyCloakServiceImpl.class, - KeycloakRequiredActionLinkUtil.class -}) -public abstract class BaseHttpTest { - - @Before - public void addMockRules() { - - mockHttpUrlResponse("content/v3/list", "not-empty-output"); - mockHttpUrlResponse("/search/health", "not-empty-output"); - mockHttpUrlResponse("/content/wrong/v3/list", null, true, null); - mockHttpUrlResponse("v1/issuer/issuers", "{\"message\":\"success\"}"); - mockHttpUrlResponse("https://dev.ekstep.in/api/data/v3", "{\"message\":\"success\"}"); - } - - protected void mockHttpUrlResponse(String urlContains, String outputExpected) { - mockHttpUrlResponse(urlContains, outputExpected, false, null); - } - - protected void mockHttpUrlResponse( - String urlContains, String outputExpected, boolean throwError, String paramContains) { - URL url = mock(URL.class); - HttpURLConnection connection = mock(HttpURLConnection.class); - OutputStream outStream = mock(OutputStream.class); - OutputStreamWriter outStreamWriter = mock(OutputStreamWriter.class); - InputStream inStream = mock(InputStream.class); - BufferedReader reader = mock(BufferedReader.class); - try { - - whenNew(URL.class).withArguments(Mockito.contains(urlContains)).thenReturn(url); - whenNew(OutputStreamWriter.class).withAnyArguments().thenReturn(outStreamWriter); - when(url.openConnection()).thenReturn(connection); - when(connection.getOutputStream()).thenReturn(outStream); - if (paramContains != null && throwError) { - doThrow(new FileNotFoundException()).when(outStreamWriter).write(Mockito.anyString()); - } - if (throwError) { - when(connection.getInputStream()).thenThrow(FileNotFoundException.class); - } else { - when(connection.getInputStream()).thenReturn(inStream); - } - whenNew(BufferedReader.class).withAnyArguments().thenReturn(reader); - when(reader.readLine()).thenReturn(outputExpected, null); - } catch (Exception e) { - Assert.fail("Mock rules addition failed " + e.getMessage()); - } - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcherTest.java b/core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcherTest.java deleted file mode 100644 index 4946130f99..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakRsaKeyFetcherTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.sunbird.sso.impl; - -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import java.security.PublicKey; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.util.EntityUtils; -import org.junit.Assert; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.sso.KeyCloakConnectionProvider; -import org.sunbird.util.PropertiesCache; - -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -// ** @author kirti. Junit test cases *//* - -@RunWith(PowerMockRunner.class) -@PrepareForTest({ - HttpClientBuilder.class, - CloseableHttpClient.class, - HttpGet.class, - CloseableHttpResponse.class, - HttpResponse.class, - HttpEntity.class, - EntityUtils.class, - PropertiesCache.class -}) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class KeyCloakRsaKeyFetcherTest { - - public static final String FALSE_REALM = "false-realm"; - private static final HttpClientBuilder httpClientBuilder = - PowerMockito.mock(HttpClientBuilder.class); - private static CloseableHttpClient client = null; - private static CloseableHttpResponse response; - private static HttpEntity httpEntity; - - @Before - public void setUp() throws Exception { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - - client = PowerMockito.mock(CloseableHttpClient.class); - PowerMockito.mockStatic(HttpClientBuilder.class); - when(HttpClientBuilder.create()).thenReturn(httpClientBuilder); - when(httpClientBuilder.build()).thenReturn(client); - httpEntity = PowerMockito.mock(HttpEntity.class); - PowerMockito.mockStatic(EntityUtils.class); - } - - @Test - public void testGetPublicKeyFromKeyCloakSuccess() throws Exception { - - response = PowerMockito.mock(CloseableHttpResponse.class); - when(client.execute(Mockito.any())).thenReturn(response); - when(response.getEntity()).thenReturn(httpEntity); - - String jsonString = - "{\"keys\":[{\"kid\":\"YOw4KbDjM0_HIdGkf_QhRfKc9qHc4W_8Bni91nKFyck\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"use\":\"sig\",\"n\":\"" - + "5OwCfx4UZTUfUDSBjOg65HuE4ReOg9GhZyoDJNqbWFrsY3dz7C12lmM3rewBHoY0F5_KW0A7rniS9LcqDg2RODvV8pRtJZ_Ge-jsnPMBY5nDJeEW35PH9ewaBhbY3Dj0bZQda2KdHGwiQ" - + "zItMT4vw0uITKsFq9o1bcYj0QvPq10AE_wOx3T5xsysuTTkcvQ6evbbs6P5yz_SHhQFRTk7_ZhMwhBeTolvg9wF4yl4qwr220A1ORsLAwwydpmfMHU9RD97nzHDlhXTBAOhDoA3Z3wA8KG6V" - + "i3LxqTLNRVS4hgq310fHzWfCX7shFQxygijW9zit-X1WVXaS1NxazuLJw\",\"e\":\"AQAB\"}]}"; - - when(EntityUtils.toString(httpEntity)).thenReturn(jsonString); - - PublicKey key = - new KeyCloakRsaKeyFetcher() - .getPublicKeyFromKeyCloak( - KeyCloakConnectionProvider.SSO_URL, KeyCloakConnectionProvider.SSO_REALM); - - Assert.assertNotNull(key); - } - - @Test - public void testGetPublicKeyFromKeyCloakFailure() throws Exception { - - PublicKey key = - new KeyCloakRsaKeyFetcher() - .getPublicKeyFromKeyCloak(KeyCloakConnectionProvider.SSO_URL, FALSE_REALM); - - Assert.assertEquals(key, null); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakServiceImplTest.java b/core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakServiceImplTest.java deleted file mode 100644 index 27c11b9464..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/sso/impl/KeyCloakServiceImplTest.java +++ /dev/null @@ -1,206 +0,0 @@ -package org.sunbird.sso.impl; - -import static org.powermock.api.mockito.PowerMockito.doNothing; -import static org.powermock.api.mockito.PowerMockito.doReturn; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import javax.ws.rs.core.Response; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; -import org.keycloak.admin.client.Keycloak; -import org.keycloak.admin.client.resource.RealmResource; -import org.keycloak.admin.client.resource.UserResource; -import org.keycloak.admin.client.resource.UsersResource; -import org.keycloak.representations.idm.UserRepresentation; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.RequestContext; -import org.sunbird.sso.KeyCloakConnectionProvider; -import org.sunbird.sso.KeycloakRequiredActionLinkUtil; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; - -@PrepareForTest({ - ProjectUtil.class, - KeyCloakConnectionProvider.class, - KeycloakRequiredActionLinkUtil.class, - PropertiesCache.class -}) -public class KeyCloakServiceImplTest extends BaseHttpTest { - - private SSOManager keyCloakService = SSOServiceFactory.getInstance(); - - private static Map userId = new HashMap<>(); - private static final String userName = UUID.randomUUID().toString().replaceAll("-", ""); - private static Class t = null; - - private static final Map USER_SUCCESS = new HashMap<>(); - - static { - userId.put(JsonKey.USER_ID, UUID.randomUUID().toString()); - USER_SUCCESS.put(JsonKey.USERNAME, userName); - USER_SUCCESS.put(JsonKey.PASSWORD, "password"); - USER_SUCCESS.put(JsonKey.FIRST_NAME, "A"); - USER_SUCCESS.put(JsonKey.LAST_NAME, "B"); - USER_SUCCESS.put(JsonKey.PHONE, "9870060000"); - USER_SUCCESS.put(JsonKey.EMAIL, userName.substring(0, 10)); - } - - private static final Map USER_SAME_EMAIL = new HashMap<>(); - - static { - USER_SAME_EMAIL.put(JsonKey.USERNAME, userName); - USER_SAME_EMAIL.put(JsonKey.PASSWORD, "password"); - USER_SAME_EMAIL.put(JsonKey.FIRST_NAME, "A"); - USER_SAME_EMAIL.put(JsonKey.LAST_NAME, "B"); - USER_SAME_EMAIL.put(JsonKey.PHONE, "9870060000"); - USER_SAME_EMAIL.put(JsonKey.EMAIL, userName.substring(0, 10)); - } - - private static UsersResource usersRes = mock(UsersResource.class); - - @BeforeClass - public static void init() { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - - PowerMockito.mockStatic(ProjectUtil.class); - PowerMockito.when(ProjectUtil.getConfigValue(Mockito.anyString())).thenReturn("somestring"); - try { - t = Class.forName("org.sunbird.sso.SSOServiceFactory"); - } catch (ClassNotFoundException e) { - } - Keycloak kcp = mock(Keycloak.class); - RealmResource realmRes = mock(RealmResource.class); - UserResource userRes = mock(UserResource.class); - UserRepresentation userRep = mock(UserRepresentation.class); - Response response = mock(Response.class); - PowerMockito.mockStatic(KeyCloakConnectionProvider.class); - try { - KeyCloakConnectionProvider.SSO_REALM = "sunbird"; - doReturn(kcp).when(KeyCloakConnectionProvider.class, "getConnection"); - doReturn(realmRes).when(kcp).realm(Mockito.anyString()); - doReturn(usersRes).when(realmRes).users(); - doReturn(201).when(response).getStatus(); - doReturn("userdata").when(response).getHeaderString(Mockito.eq("Location")); - - doReturn(userRes).when(usersRes).get(Mockito.anyString()); - doReturn(userRep).when(userRes).toRepresentation(); - doNothing().when(userRes).update(Mockito.any(UserRepresentation.class)); - - doNothing().when(userRes).remove(); - - Map map = new HashMap<>(); - map.put(JsonKey.LAST_LOGIN_TIME, Arrays.asList(String.valueOf(System.currentTimeMillis()))); - doReturn(map).when(userRep).getAttributes(); - when(userRep.getUsername()).thenReturn("userName"); - } catch (Exception e) { - e.printStackTrace(); - Assert.fail( - "Failed in initialization of mock rules, underlying error: " + e.getLocalizedMessage()); - } - } - - @Test - public void testNewInstanceSucccess() { - Exception exp = null; - try { - Constructor constructor = t.getDeclaredConstructor(); - constructor.setAccessible(true); - SSOServiceFactory application = constructor.newInstance(); - Assert.assertNotNull(application); - } catch (Exception e) { - exp = e; - } - Assert.assertNull(exp); - } - -// @Test(expected = ProjectCommonException.class) - @Ignore - public void testDeactivateUserSuccess() { - Map request = new HashMap<>(); - request.put(JsonKey.USER_ID, "1reter23"); - keyCloakService.deactivateUser(request, null); - } - - @Test(expected = ProjectCommonException.class) - public void testRemoveUserSuccess() { - - Map request = new HashMap<>(); - request.put(JsonKey.USER_ID, "123"); - keyCloakService.removeUser(request, null); - } - - @Test(expected = ProjectCommonException.class) - public void testVerifyTokenSuccess() { - keyCloakService.verifyToken( - "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5emhhVnZDbl81OEtheHpldHBzYXNZQ2lEallkemJIX3U2LV93SDk4SEc0In0.eyJqdGkiOiI5ZmQzNzgzYy01YjZmLTQ3OWQtYmMzYy0yZWEzOGUzZmRmYzgiLCJleHAiOjE1MDUxMTQyNDYsIm5iZiI6MCwiaWF0IjoxNTA1MTEzNjQ2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoic2VjdXJpdHktYWRtaW4tY29uc29sZSIsInN1YiI6ImIzYTZkMTY4LWJjZmQtNDE2MS1hYzVmLTljZjYyODIyNzlmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6InNlY3VyaXR5LWFkbWluLWNvbnNvbGUiLCJub25jZSI6ImMxOGVlMDM2LTAyMWItNGVlZC04NWVhLTc0MjMyYzg2ZmI4ZSIsImF1dGhfdGltZSI6MTUwNTExMzY0Niwic2Vzc2lvbl9zdGF0ZSI6ImRiZTU2NDlmLTY4MDktNDA3NS05Njk5LTVhYjIyNWMwZTkyMiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOltdLCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiTWFuemFydWwgaGFxdWUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0MTIzNDU2NyIsImdpdmVuX25hbWUiOiJNYW56YXJ1bCBoYXF1ZSIsImVtYWlsIjoidGVzdDEyM0B0LmNvbSJ9.Xdjqe16MSkiR94g-Uj_pVZ2L3gnIdKpkJ6aB82W_w_c3yEmx1mXYBdkxe4zMz3ks4OX_PWwSFEbJECHcnujUwF6Ula0xtXTfuESB9hFyiWHtVAhuh5UlCCwPnsihv5EqK6u-Qzo0aa6qZOiQK3Zo7FLpnPUDxn4yHyo3mRZUiWf76KTl8PhSMoXoWxcR2vGW0b-cPixILTZPV0xXUZoozCui70QnvTgOJDWqr7y80EWDkS4Ptn-QM3q2nJlw63mZreOG3XTdraOlcKIP5vFK992dyyHlYGqWVzigortS9Ah4cprFVuLlX8mu1cQvqHBtW-0Dq_JlcTMaztEnqvJ6XA", - null); - } - - @Ignore - public void testActiveUserSuccess() { - Map reqMap = new HashMap<>(); - reqMap.put(JsonKey.USER_ID, userId.get(JsonKey.USER_ID)); - String response = keyCloakService.activateUser(reqMap, null); - Assert.assertEquals(JsonKey.SUCCESS, response); - } - - @Test - public void testActivateUserFailureWithEmptyUserId() { - Map reqMap = new HashMap<>(); - reqMap.put(JsonKey.USER_ID, ""); - try { - keyCloakService.activateUser(reqMap, null); - } catch (ProjectCommonException e) { - Assert.assertEquals(ResponseCode.invalidParameterValue.getErrorCode(), e.getErrorCode()); - Assert.assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - } - } - - @Test - public void testGetFederatedUserId() - throws IllegalAccessException, NoSuchMethodException, SecurityException, - IllegalArgumentException, InvocationTargetException { - KeyCloakServiceImpl.class.getDeclaredMethods(); - Method m = KeyCloakServiceImpl.class.getDeclaredMethod("getFederatedUserId", String.class); - m.setAccessible(true); - SSOManager keyCloakService = SSOServiceFactory.getInstance(); - String fedUserId = (String) m.invoke(keyCloakService, "userId"); - Assert.assertEquals( - "f:" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID) - + ":userId", - fedUserId); - } - - @Test - public void testUpdatePassword() throws Exception { - boolean updated = keyCloakService.updatePassword(userId.get(JsonKey.USER_ID), "password", null); - Assert.assertTrue(updated); - } - - @Test - public void testRemovePII() { - boolean piiRemoved = keyCloakService.removePII(userId.get(JsonKey.USER_ID), new RequestContext()); - Assert.assertTrue(piiRemoved); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/telemetry/util/TelemetryGeneratorTest.java b/core/platform-common/src/test/java/org/sunbird/telemetry/util/TelemetryGeneratorTest.java deleted file mode 100644 index 3b3f0109cb..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/telemetry/util/TelemetryGeneratorTest.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.sunbird.telemetry.util; - -import static org.junit.Assert.assertNotNull; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import java.util.HashMap; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.keys.JsonKey; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({PropertiesCache.class, ProjectUtil.class}) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class TelemetryGeneratorTest { - - private static Map context; - private static Map rollup; - private static Map params; - - @Before - public void setUp() throws Exception { - context = new HashMap(); - rollup = new HashMap(); - rollup.put("managedToken", "123456789012345678901234567890"); - context.put("actorType", "consumer"); - context.put("telemetry_pdata_pid", "learning-service"); - context.put("telemetry_pdata_id", "local.sunbird.learning.service"); - context.put("actorId", "Internal"); - context.put("requestId", "8e27cbf5-e299-43b0-bca7-8347f7e5abcf"); - context.put("channel", "ORG_001"); - context.put("telemetry_pdata_ver", "1.15"); - context.put("x-request-id", "8e27cbf5-e299-43b0-bca7-8347f7e5abcf"); - context.put("env", "User"); - context.put("rollup", rollup); - context.put("did", "postman"); - - Map target = new HashMap<>(); - target.put(JsonKey.ID, "1324567897564"); - target.put(JsonKey.TYPE, StringUtils.capitalize(JsonKey.USER)); - target.put(JsonKey.CURRENT_STATE, null); - target.put(JsonKey.PREV_STATE, null); - - params = new HashMap<>(); - params.put(JsonKey.FIRST_NAME, "Name"); - params.put(JsonKey.LAST_NAME, "LName"); - params.put(JsonKey.ID, "1234785963014789564123"); - params.put(JsonKey.USER_ID, "9512357468214597623"); - params.put("targetObject", target); - params.put(JsonKey.QUERY, "hello"); - params.put(JsonKey.FILTERS, new HashMap<>()); - params.put(JsonKey.LOG_TYPE, "INFO"); - params.put(JsonKey.LOG_LEVEL, "Level"); - params.put(JsonKey.MESSAGE, "message"); - params.put(JsonKey.ERROR, "Error"); - params.put(JsonKey.ERR_TYPE, "type"); - params.put(JsonKey.STACKTRACE, "stacktrace"); - } - - @Test - public void testAudit() { - String audit = TelemetryGenerator.audit(context, params); - assertNotNull(audit); - } - - @Test - public void testSearch() { - String audit = TelemetryGenerator.search(context, params); - assertNotNull(audit); - } - - @Test - public void testLog() { - String audit = TelemetryGenerator.log(context, params); - assertNotNull(audit); - } - - @Test - public void testError() { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - PowerMockito.mockStatic(ProjectUtil.class); - when(ProjectUtil.getConfigValue("stacktrace_char_length")).thenReturn("2500"); - String audit = TelemetryGenerator.error(context, params); - assertNotNull(audit); - } - - @AfterClass - public static void tearDown() throws Exception { - context.clear(); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/telemetry/util/validator/TelemetryObjectValidatorV3Test.java b/core/platform-common/src/test/java/org/sunbird/telemetry/util/validator/TelemetryObjectValidatorV3Test.java deleted file mode 100644 index d8713276e2..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/telemetry/util/validator/TelemetryObjectValidatorV3Test.java +++ /dev/null @@ -1,384 +0,0 @@ -package org.sunbird.telemetry.util.validator; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.junit.Assert; -import org.junit.Test; -import org.sunbird.keys.JsonKey; -import org.sunbird.telemetry.dto.Actor; -import org.sunbird.telemetry.dto.Context; -import org.sunbird.telemetry.dto.Telemetry; -import org.sunbird.telemetry.util.TelemetryEvents; -import org.sunbird.telemetry.validator.TelemetryObjectValidatorV3; - -/** Created by arvind on 30/1/18. */ -public class TelemetryObjectValidatorV3Test { - - private TelemetryObjectValidatorV3 validatorV3 = new TelemetryObjectValidatorV3(); - private ObjectMapper mapper = new ObjectMapper(); - - @Test - public void testAuditWithValidData() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.AUDIT.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - Map auditEdata = new HashMap<>(); - List props = new ArrayList<>(); - props.add("username"); - props.add("org"); - auditEdata.put(JsonKey.PROPS, props); - telemetry.setEdata(auditEdata); - - boolean result = false; - try { - result = validatorV3.validateAudit(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertTrue(result); - } - - @Test - public void testAuditWithoutActor() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.AUDIT.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - Map auditEdata = new HashMap<>(); - List props = new ArrayList<>(); - props.add("username"); - props.add("org"); - auditEdata.put(JsonKey.PROPS, props); - telemetry.setEdata(auditEdata); - - boolean result = true; - try { - result = validatorV3.validateAudit(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertFalse(result); - } - - @Test - public void testAuditWithoutChannel() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.AUDIT.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - // context.setChannel("channel"); - - telemetry.setContext(context); - - Map auditEdata = new HashMap<>(); - List props = new ArrayList<>(); - props.add("username"); - props.add("org"); - auditEdata.put(JsonKey.PROPS, props); - telemetry.setEdata(auditEdata); - - boolean result = true; - try { - result = validatorV3.validateAudit(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertFalse(result); - } - - @Test - public void testAuditWithoutEnv() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.AUDIT.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - // context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - Map auditEdata = new HashMap<>(); - List props = new ArrayList<>(); - props.add("username"); - props.add("org"); - auditEdata.put(JsonKey.PROPS, props); - telemetry.setEdata(auditEdata); - - boolean result = true; - try { - result = validatorV3.validateAudit(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertFalse(result); - } - - @Test - public void testAuditWithoutEData() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.AUDIT.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - boolean result = true; - try { - result = validatorV3.validateAudit(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertFalse(result); - } - - @Test - public void testSearchWithValidData() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.SEARCH.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - Map searchEdata = new HashMap<>(); - searchEdata.put(JsonKey.TYPE, "user"); - searchEdata.put( - JsonKey.QUERY, - "\"filters\":{\n" + " \"lastName\": \"Test\"\n" + " \n" + " }"); - searchEdata.put(JsonKey.SIZE, new Long(10)); - searchEdata.put(JsonKey.TOPN, new ArrayList<>()); - telemetry.setEdata(searchEdata); - - boolean result = false; - try { - result = validatorV3.validateSearch(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertTrue(result); - } - - @Test - public void testSearchWithoutQuerySize() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.SEARCH.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - Map searchEdata = new HashMap<>(); - searchEdata.put(JsonKey.TYPE, "user"); - telemetry.setEdata(searchEdata); - - boolean result = true; - try { - result = validatorV3.validateSearch(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertFalse(result); - } - - @Test - public void testLogWithValidData() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.LOG.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - Map logEdata = new HashMap<>(); - logEdata.put(JsonKey.TYPE, "info"); - logEdata.put(JsonKey.LEVEL, JsonKey.API_ACCESS); - logEdata.put(JsonKey.MESSAGE, ""); - telemetry.setEdata(logEdata); - - boolean result = false; - try { - result = validatorV3.validateLog(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertTrue(result); - } - - @Test - public void testLogWithoutLogLevelType() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.LOG.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - - telemetry.setContext(context); - - Map logEdata = new HashMap<>(); - logEdata.put(JsonKey.MESSAGE, ""); - telemetry.setEdata(logEdata); - - boolean result = true; - try { - result = validatorV3.validateLog(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertFalse(result); - } - - @Test - public void testErrorWithValidData() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.ERROR.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - telemetry.setContext(context); - - Map errorEdata = new HashMap<>(); - errorEdata.put(JsonKey.ERROR, "invalid user"); - errorEdata.put(JsonKey.ERR_TYPE, JsonKey.API_ACCESS); - errorEdata.put(JsonKey.STACKTRACE, "error msg"); - telemetry.setEdata(errorEdata); - - boolean result = false; - try { - result = validatorV3.validateError(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertTrue(result); - } - - @Test - public void testErrorWithoutErrorTypeStackTrace() { - - Telemetry telemetry = new Telemetry(); - telemetry.setEid(TelemetryEvents.ERROR.getName()); - telemetry.setMid("dummy msg id"); - telemetry.setVer("3.0"); - - Actor actor = new Actor(); - actor.setId("1"); - actor.setType(JsonKey.USER); - telemetry.setActor(actor); - - Context context = new Context(); - context.setEnv(JsonKey.ORGANISATION); - context.setChannel("channel"); - telemetry.setContext(context); - - Map errorEdata = new HashMap<>(); - telemetry.setEdata(errorEdata); - - boolean result = true; - try { - result = validatorV3.validateError(mapper.writeValueAsString(telemetry)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertFalse(result); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/url/URLShortnerImplTest.java b/core/platform-common/src/test/java/org/sunbird/url/URLShortnerImplTest.java deleted file mode 100644 index 7292f0c962..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/url/URLShortnerImplTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.sunbird.url; - -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import org.apache.commons.lang3.StringUtils; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.util.PropertiesCache; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({PropertiesCache.class}) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class URLShortnerImplTest { - @Before - public void beforeEachTest() { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - } - - @Test - public void urlShortTest() { - URLShortner shortner = new URLShortnerImpl(); - String url = shortner.shortUrl("https://staging.open-sunbird.org/", null); - Assert.assertNotNull(url); - } - - @Test - public void getShortUrlTest() { - - String SUNBIRD_WEB_URL = "sunbird_web_url"; - - String webUrl = System.getenv(SUNBIRD_WEB_URL); - if (StringUtils.isBlank(webUrl)) { - webUrl = PropertiesCache.getInstance().getProperty(SUNBIRD_WEB_URL); - } - - URLShortnerImpl shortnerImpl = new URLShortnerImpl(); - String url = shortnerImpl.getUrl(null); - Assert.assertEquals(url, webUrl); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/util/AuditLogTest.java b/core/platform-common/src/test/java/org/sunbird/util/AuditLogTest.java deleted file mode 100644 index 709c03c42f..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/util/AuditLogTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/** */ -package org.sunbird.util; - -import java.util.HashMap; -import java.util.Map; -import org.junit.Assert; -import org.junit.Test; - -/** @author Manzarul */ -public class AuditLogTest { - - @Test - public void createAuditLog() { - AuditLog log = new AuditLog(); - log.setDate("2017-12-29"); - log.setObjectId("objectId"); - log.setObjectType("User"); - log.setOperationType("create"); - log.setRequestId("requesterId"); - log.setUserId("userId"); - Map map = new HashMap<>(); - log.setLogRecord(map); - Assert.assertEquals("2017-12-29", log.getDate()); - Assert.assertEquals("objectId", log.getObjectId()); - Assert.assertEquals("User", log.getObjectType()); - Assert.assertEquals("create", log.getOperationType()); - Assert.assertEquals("requesterId", log.getRequestId()); - Assert.assertEquals("userId", log.getUserId()); - Assert.assertEquals(0, log.getLogRecord().size()); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/util/CloudStorageUtilTest.java b/core/platform-common/src/test/java/org/sunbird/util/CloudStorageUtilTest.java deleted file mode 100644 index 4d07840559..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/util/CloudStorageUtilTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.sunbird.util; - -import static org.junit.Assert.assertTrue; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.mockStatic; -import static org.powermock.api.mockito.PowerMockito.when; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.cloud.storage.BaseStorageService; -import org.sunbird.cloud.storage.factory.StorageServiceFactory; -import scala.Option; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -@PrepareForTest({StorageServiceFactory.class, CloudStorageUtil.class, PropertiesCache.class}) -public class CloudStorageUtilTest { - - private static final String SIGNED_URL = "singedUrl"; - private static final String UPLOAD_URL = "uploadUrl"; - private static final String PUT_SIGNED_URL = "gcpSignedUrl"; - - @Before - public void initTest() { - BaseStorageService service = mock(BaseStorageService.class); - mockStatic(StorageServiceFactory.class); - - try { - when(StorageServiceFactory.class, "getStorageService", Mockito.any()).thenReturn(service); - - when(service.upload( - Mockito.anyString(), - Mockito.anyString(), - Mockito.anyString(), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class))) - .thenReturn(UPLOAD_URL); - - when(service.getSignedURL( - Mockito.anyString(), - Mockito.anyString(), - Mockito.any(Option.class), - Mockito.any(Option.class))) - .thenReturn(SIGNED_URL); - - when(service.getPutSignedURL( - Mockito.anyString(), - Mockito.anyString(), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class))) - .thenReturn(PUT_SIGNED_URL); - - when(service.getSignedURLV2( - Mockito.eq("azurecontainer"), - Mockito.anyString(), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class))) - .thenReturn(SIGNED_URL); - - when(service.getSignedURLV2( - Mockito.eq("gcpcontainer"), - Mockito.anyString(), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class))) - .thenReturn(PUT_SIGNED_URL); - - when(service.getSignedURLV2( - Mockito.eq("awscontainer"), - Mockito.anyString(), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class), - Mockito.any(Option.class))) - .thenReturn(SIGNED_URL); - - } catch (Exception e) { - Assert.fail(e.getMessage()); - } - } - - @Test - public void testUploadSuccess() { - String result = CloudStorageUtil.upload("azure", "container", "key", "/file/path"); - assertTrue(UPLOAD_URL.equals(result)); - } - - @Test - public void testGetSignedUrlAZURESuccess() { - String signedUrl = CloudStorageUtil.getSignedUrl("azure", "azurecontainer", "key"); - assertTrue(SIGNED_URL.equals(signedUrl)); - } - - @Test - public void testGetSignedUrlGCPSuccess() { - String signedUrl = CloudStorageUtil.getSignedUrl("gcloud", "gcpcontainer", "key"); - assertTrue(PUT_SIGNED_URL.equals(signedUrl)); - } - - @Test - public void testGetSignedUrlAWSSuccess() { - String signedUrl = CloudStorageUtil.getSignedUrl("aws", "awscontainer", "key"); - assertTrue(SIGNED_URL.equals(signedUrl)); - } - - @Test - public void testDeleteFileAWSSuccess() { - CloudStorageUtil.deleteFile("aws", "awscontainer", "key"); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/util/ConfigUtilTest.java b/core/platform-common/src/test/java/org/sunbird/util/ConfigUtilTest.java deleted file mode 100644 index 94c61fd1b3..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/util/ConfigUtilTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.sunbird.util; - -import static org.junit.Assert.assertTrue; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import com.typesafe.config.Config; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; - -@PrepareForTest({ConfigUtil.class, PropertiesCache.class}) -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class ConfigUtilTest { - - private String configType = "user"; - private String validJson = "{\"key\" : \"value\"}"; - private static ConfigUtil configUtilMock; - - @BeforeClass - public static void setup() throws Exception { - configUtilMock = Mockito.mock(ConfigUtil.class); - PowerMockito.whenNew(ConfigUtil.class).withAnyArguments().thenReturn(configUtilMock); - } - - @Before - public void beforeEachTest() { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - } - - @Test(expected = ProjectCommonException.class) - public void testGetConfigFromJsonStringFailureWithNullString() { - try { - ConfigUtil.getConfigFromJsonString(null, configType); - } catch (ProjectCommonException e) { - assertTrue(e.getErrorCode().equals(ResponseCode.errorConfigLoadEmptyString.getErrorCode())); - throw e; - } - } - - @Test(expected = ProjectCommonException.class) - public void testGetConfigFromJsonStringFailureWithEmptyString() { - try { - ConfigUtil.getConfigFromJsonString("", configType); - } catch (ProjectCommonException e) { - assertTrue(e.getErrorCode().equals(ResponseCode.errorConfigLoadEmptyString.getErrorCode())); - throw e; - } - } - - @Test(expected = ProjectCommonException.class) - public void testGetConfigFromJsonStringFailureWithInvalidJsonString() { - try { - ConfigUtil.getConfigFromJsonString("{dummy}", configType); - } catch (ProjectCommonException e) { - assertTrue(e.getErrorCode().equals(ResponseCode.errorConfigLoadParseString.getErrorCode())); - throw e; - } - } - - @Test - public void testGetConfigFromJsonStringSuccess() { - Config config = ConfigUtil.getConfigFromJsonString(validJson, configType); - assertTrue("value".equals(config.getString("key"))); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/util/ExcelFileUtilTest.java b/core/platform-common/src/test/java/org/sunbird/util/ExcelFileUtilTest.java deleted file mode 100644 index 1826e7175c..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/util/ExcelFileUtilTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.sunbird.util; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.junit.After; -import org.junit.Assert; -import org.junit.Test; - -public class ExcelFileUtilTest { - - @Test - public void testWriteToFile() { - String fileName = "test"; - List> data = new ArrayList<>(); - List dataObjects = new ArrayList<>(); - dataObjects.add("test1"); - dataObjects.add(new ArrayList<>()); - dataObjects.add(1); - dataObjects.add(2.0D); - data.add(dataObjects); - ExcelFileUtil excelFileUtil = new ExcelFileUtil(); - File file = excelFileUtil.writeToFile(fileName, data); - String[] expectedFileName = StringUtils.split(file.getName(), '.'); - Assert.assertEquals("test", expectedFileName[0]); - Assert.assertEquals("xlsx", expectedFileName[1]); - } - - @Test - public void testgetFileUtil() { - FileUtil util = FileUtil.getFileUtil("Excel"); - Assert.assertNotNull(util); - } - - @Test - public void testgetListValue() { - List list = new ArrayList<>(); - list.add("column1"); - list.add("column2"); - String response = FileUtil.getListValue(list); - Assert.assertEquals("column1,column2", response); - list.clear(); - response = FileUtil.getListValue(list); - Assert.assertEquals("", response); - } - - @After - public void deleteFileGenerated() { - File file = new File("test.xlsx"); - if (file.exists()) { - file.delete(); - } - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/util/ProjectUtilTest.java b/core/platform-common/src/test/java/org/sunbird/util/ProjectUtilTest.java deleted file mode 100644 index e3efc9c18d..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/util/ProjectUtilTest.java +++ /dev/null @@ -1,334 +0,0 @@ -package org.sunbird.util; - -import org.apache.commons.lang3.StringUtils; -import org.apache.velocity.VelocityContext; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.request.RequestContext; -import org.sunbird.sso.impl.BaseHttpTest; - -import java.util.HashMap; -import java.util.Map; - -import static org.junit.Assert.*; - -/** Created by arvind on 6/10/17. */ -public class ProjectUtilTest extends BaseHttpTest { - - private final PropertiesCache propertiesCache = ProjectUtil.propertiesCache; - - @Ignore - public void testGetContextFailureWithNameAbsent() { - Map templateMap = new HashMap<>(); - templateMap.put(JsonKey.ACTION_URL, "googli.com"); - - VelocityContext context = ProjectUtil.getContext(templateMap); - assertFalse(context.internalContainsKey(JsonKey.NAME)); - } - - @Test - public void testGetContextFailureWithoutActionUrl() { - Map templateMap = new HashMap<>(); - templateMap.put(JsonKey.ORG_NAME, "orgName"); - templateMap.put(JsonKey.COURSE_NAME, "courseName"); - templateMap.put(JsonKey.BATCH_START_DATE, "2020"); - templateMap.put(JsonKey.BATCH_END_DATE, "2019"); - templateMap.put(JsonKey.BATCH_NAME, "name"); - templateMap.put(JsonKey.NAME, "firstName"); - templateMap.put(JsonKey.SIGNATURE, "signature"); - templateMap.put(JsonKey.COURSE_BATCH_URL, "url"); - VelocityContext context = ProjectUtil.getContext(templateMap); - assertFalse(context.internalContainsKey(JsonKey.ACTION_URL)); - } - - @Test - public void testGetContextSuccessWithFromMail() { - Map templateMap = new HashMap<>(); - templateMap.put(JsonKey.ACTION_URL, "googli.com"); - templateMap.put(JsonKey.NAME, "userName"); - - boolean envVal = !StringUtils.isBlank(System.getenv(JsonKey.EMAIL_SERVER_FROM)); - boolean cacheVal = propertiesCache.getProperty(JsonKey.EMAIL_SERVER_FROM) != null; - - VelocityContext context = ProjectUtil.getContext(templateMap); - if (envVal) { - assertEquals(System.getenv(JsonKey.EMAIL_SERVER_FROM), context.internalGet(JsonKey.FROM_EMAIL)); - } else if (cacheVal) { - assertEquals(propertiesCache.getProperty(JsonKey.EMAIL_SERVER_FROM), context.internalGet(JsonKey.FROM_EMAIL)); - } - } - - @Test - public void testGetContextSuccessWithOrgImageUrl() { - Map templateMap = new HashMap<>(); - templateMap.put(JsonKey.ACTION_URL, "googli.com"); - templateMap.put(JsonKey.NAME, "userName"); - - boolean envVal = !StringUtils.isBlank(System.getenv(JsonKey.SUNBIRD_ENV_LOGO_URL)); - boolean cacheVal = propertiesCache.getProperty(JsonKey.SUNBIRD_ENV_LOGO_URL) != null; - - VelocityContext context = ProjectUtil.getContext(templateMap); - if (envVal) { - assertEquals(System.getenv(JsonKey.SUNBIRD_ENV_LOGO_URL), context.internalGet(JsonKey.ORG_IMAGE_URL)); - } else if (cacheVal) { - assertEquals(propertiesCache.getProperty(JsonKey.SUNBIRD_ENV_LOGO_URL), context.internalGet(JsonKey.ORG_IMAGE_URL)); - } - } - - @Test - public void testCreateCheckResponseSuccess() { - Map responseMap = ProjectUtil.createCheckResponse("UserOrgService", false, null); - assertEquals(true, responseMap.get(JsonKey.Healthy)); - } - - @Test - public void testCreateCheckResponseFailureWithException() { - Map responseMap = - ProjectUtil.createCheckResponse( - "UserOrgService", - true, - new ProjectCommonException( - ResponseCode.invalidObjectType, - ResponseCode.invalidObjectType.getErrorMessage(), - ResponseCode.CLIENT_ERROR.getResponseCode())); - assertEquals(false, responseMap.get(JsonKey.Healthy)); - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), responseMap.get(JsonKey.ERROR)); - assertEquals(ResponseCode.invalidObjectType.getErrorMessage(), responseMap.get(JsonKey.ERRORMSG)); - } - - @Ignore - public void testSetRequestSuccessWithLowerCaseValues() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.SOURCE, "Test"); - requestObj.put(JsonKey.LOGIN_ID, "SunbirdUser"); - requestObj.put(JsonKey.EXTERNAL_ID, "testExternal"); - requestObj.put(JsonKey.USER_NAME, "username"); - requestObj.put(JsonKey.USERNAME, "userName"); - requestObj.put(JsonKey.PROVIDER, "Provider"); - requestObj.put(JsonKey.ID, "TEST123"); - request.setRequest(requestObj); - assertEquals("test", requestObj.get(JsonKey.SOURCE)); - assertEquals("sunbirduser", requestObj.get(JsonKey.LOGIN_ID)); - assertEquals("testexternal", requestObj.get(JsonKey.EXTERNAL_ID)); - assertEquals("username", requestObj.get(JsonKey.USER_NAME)); - assertEquals("username", requestObj.get(JsonKey.USERNAME)); - assertEquals("provider", requestObj.get(JsonKey.PROVIDER)); - assertEquals("TEST123", requestObj.get(JsonKey.ID)); - } - - @Test - public void testFormatMessageSuccess() { - String msg = ProjectUtil.formatMessage("Hello {0}", "user"); - assertEquals("Hello user", msg); - } - - @Test - public void testFormatMessageFailureWithInvalidVariable() { - String msg = ProjectUtil.formatMessage("Hello ", "user"); - assertNotEquals("Hello user", msg); - } - - @Test - public void testIsEmailValidFailureWithWrongEmail() { - boolean msg = ProjectUtil.isEmailvalid("Hello "); - assertFalse(msg); - } - - @Test - public void testSetTraceIdInHeader() { - ProjectUtil.setTraceIdInHeader(new HashMap<>(), new RequestContext()); - assertTrue(true); - } - - @Test - public void testValidatePhone() { - boolean bool = ProjectUtil.validatePhone("9742500121", "91"); - assertTrue(bool); - } - - @Test - public void testIsDateValidFormatSuccess() { - boolean bool = ProjectUtil.isDateValidFormat("yyyy-MM-dd", "2017-12-18"); - assertTrue(bool); - } - - @Test - public void testIsDateValidFormatFailureWithEmptyDate() { - boolean bool = ProjectUtil.isDateValidFormat("yyyy-MM-dd", ""); - assertFalse(bool); - } - - @Test - public void testUserRoleSuccess() { - assertEquals("PUBLIC", ProjectUtil.UserRole.PUBLIC.getValue()); - } - - @Test - public void testIsDateValidFormatFailureWithInvalidDate() { - boolean bool = ProjectUtil.isDateValidFormat("yyyy-MM-dd", "2017-12-18"); - assertTrue(bool); - } - - @Test - public void testIsDateValidFormatFailureWithEmptyDateTime() { - boolean bool = ProjectUtil.isDateValidFormat("yyyy-MM-dd HH:mm:ss:SSSZ", ""); - assertFalse(bool); - } - - @Test - public void testReportTrackingStatusSuccess() { - assertEquals(0, ProjectUtil.ReportTrackingStatus.NEW.getValue()); - assertEquals(1, ProjectUtil.ReportTrackingStatus.GENERATING_DATA.getValue()); - assertEquals(2, ProjectUtil.ReportTrackingStatus.UPLOADING_FILE.getValue()); - assertEquals(3, ProjectUtil.ReportTrackingStatus.UPLOADING_FILE_SUCCESS.getValue()); - assertEquals(4, ProjectUtil.ReportTrackingStatus.SENDING_MAIL.getValue()); - assertEquals(5, ProjectUtil.ReportTrackingStatus.SENDING_MAIL_SUCCESS.getValue()); - assertEquals(9, ProjectUtil.ReportTrackingStatus.FAILED.getValue()); - } - - @Test - public void testEsTypeSuccess() { - assertEquals(ProjectUtil.getConfigValue("user_index_alias"), ProjectUtil.EsType.user.getTypeName()); - assertEquals(ProjectUtil.getConfigValue("org_index_alias"), ProjectUtil.EsType.organisation.getTypeName()); - assertEquals("usernotes", ProjectUtil.EsType.usernotes.getTypeName()); - } - - @Test - public void testBulkProcessStatusSuccess() { - assertEquals(0, ProjectUtil.BulkProcessStatus.NEW.getValue()); - assertEquals(1, ProjectUtil.BulkProcessStatus.IN_PROGRESS.getValue()); - assertEquals(2, ProjectUtil.BulkProcessStatus.INTERRUPT.getValue()); - assertEquals(3, ProjectUtil.BulkProcessStatus.COMPLETED.getValue()); - assertEquals(9, ProjectUtil.BulkProcessStatus.FAILED.getValue()); - } - - @Test - public void testOrgStatusSuccess() { - assertEquals(Integer.valueOf(0), ProjectUtil.OrgStatus.INACTIVE.getValue()); - assertEquals(Integer.valueOf(1), ProjectUtil.OrgStatus.ACTIVE.getValue()); - assertEquals(Integer.valueOf(2), ProjectUtil.OrgStatus.BLOCKED.getValue()); - assertEquals(Integer.valueOf(3), ProjectUtil.OrgStatus.RETIRED.getValue()); - } - - @Test - public void testProgressStatusSuccess() { - assertEquals(0, ProjectUtil.ProgressStatus.NOT_STARTED.getValue()); - assertEquals(1, ProjectUtil.ProgressStatus.STARTED.getValue()); - assertEquals(2, ProjectUtil.ProgressStatus.COMPLETED.getValue()); - } - - @Test - public void testEnvironmentSuccess() { - assertEquals(1, ProjectUtil.Environment.dev.getValue()); - assertEquals(2, ProjectUtil.Environment.qa.getValue()); - assertEquals(3, ProjectUtil.Environment.prod.getValue()); - } - - @Test - public void testStatusSuccess() { - assertEquals(1, ProjectUtil.Status.ACTIVE.getValue()); - assertEquals(0, ProjectUtil.Status.INACTIVE.getValue()); - assertFalse(ProjectUtil.ActiveStatus.INACTIVE.getValue()); - assertTrue(ProjectUtil.ActiveStatus.ACTIVE.getValue()); - - assertEquals("username", ProjectUtil.UserLookupType.USERNAME.getType()); - assertEquals("email", ProjectUtil.UserLookupType.EMAIL.getType()); - assertEquals("phone", ProjectUtil.UserLookupType.PHONE.getType()); - } - - @Test - public void testGetFormattedDate() { - Assert.assertNotNull(ProjectUtil.getFormattedDate()); - } - - @Test - public void testGetUniqueIdFromTimestamp() { - Assert.assertNotNull(ProjectUtil.getUniqueIdFromTimestamp(1)); // generateUniqueId - } - - @Test - public void testGenerateUniqueId() { - Assert.assertNotNull(ProjectUtil.generateUniqueId()); - } - - @Test - public void testGetDateFormatter() { - Assert.assertNotNull(ProjectUtil.getDateFormatter()); - } - - @Test - public void testIsEmailvalid() { - Assert.assertTrue(ProjectUtil.isEmailvalid("xyz@xyz.com")); - Assert.assertFalse(ProjectUtil.isEmailvalid("xy@z@xyz.com")); - Assert.assertFalse(ProjectUtil.isEmailvalid("")); - } - - @Test - public void testIsEmailValidFailureWithInvalidFormat() { - boolean bool = ProjectUtil.isEmailvalid("xyz.com"); - Assert.assertFalse(bool); - } - - @Test - public void testIsEmailValidSuccess() { - boolean bool = ProjectUtil.isEmailvalid("xyz@xyz.com"); - assertTrue(bool); - } - - @Test - public void testGetLmsUserIdSuccessWithoutFedUserId() { - String userid = ProjectUtil.getLmsUserId("1234567890"); - assertEquals("1234567890", userid); - } - - @Test - public void testGetLmsUserIdSuccessWithFedUserId() { - String userid = - ProjectUtil.getLmsUserId( - "f:" - + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID) - + ":" - + "1234567890"); - assertEquals("1234567890", userid); - } - - @Test - public void testMigrateActionAcceptValueFailure() { - Assert.assertNotEquals("ok", ProjectUtil.MigrateAction.ACCEPT.getValue()); - } - - @Test - public void testMigrateActionRejectValueFailure() { - Assert.assertNotEquals("no", ProjectUtil.MigrateAction.REJECT.getValue()); - } - - @Test - public void testMigrateActionAcceptValueSuccess() { - Assert.assertEquals("accept", ProjectUtil.MigrateAction.ACCEPT.getValue()); - } - - @Test - public void testMigrateActionRejectValueSuccess() { - Assert.assertEquals("reject", ProjectUtil.MigrateAction.REJECT.getValue()); - } - - @Test - public void testValidateCountryCode() { - boolean isValid = ProjectUtil.validateCountryCode("+91"); - assertTrue(isValid); - isValid = ProjectUtil.validateCountryCode("9a"); - assertFalse(isValid); - } - - @Test - public void testValidateUUID() { - boolean isValid = ProjectUtil.validateUUID("1df03f56-ceba-4f2d-892c-2b1609e7b05f"); - assertTrue(isValid); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/util/SlugTest.java b/core/platform-common/src/test/java/org/sunbird/util/SlugTest.java deleted file mode 100644 index 13edf677b0..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/util/SlugTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.sunbird.util; - -import org.junit.Assert; -import org.junit.Test; - -public class SlugTest { - - @Test - public void createSlugWithNullValue() { - String slug = Slug.makeSlug(null, true); - Assert.assertEquals(null, slug); - } - - @Test - public void createSlug() { - String val = "NTP@#Test"; - String slug = Slug.makeSlug(val, true); - Assert.assertEquals("ntptest", slug); - } - - @Test - public void removeDuplicateChar() { - String val = Slug.removeDuplicateChars("ntpntest"); - Assert.assertEquals("ntpes", val); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/validator/BaseRequestValidatorTest.java b/core/platform-common/src/test/java/org/sunbird/validator/BaseRequestValidatorTest.java deleted file mode 100644 index bb8811df6a..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/validator/BaseRequestValidatorTest.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.sunbird.validator; - -import static org.junit.Assert.assertEquals; -import static org.sunbird.validator.BaseRequestValidator.validateUserId; - -import java.text.MessageFormat; -import java.util.*; -import org.junit.Test; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; - -/** Created by rajatgupta on 20/03/19. */ -public class BaseRequestValidatorTest { - private static final BaseRequestValidator baseRequestValidator = new BaseRequestValidator(); - - @Test - public void testValidateSearchRequestFailureWithInvalidFieldType() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.FILTERS, new HashMap<>()); - requestObj.put(JsonKey.FIELDS, "invalid"); - request.setRequest(requestObj); - try { - baseRequestValidator.validateSearchRequest(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.dataTypeError.getErrorCode(), e.getErrorCode()); - assertEquals( - MessageFormat.format( - ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FIELDS, "List"), - e.getMessage()); - } - } - - @Test - public void testCheckMandatoryFieldsPresent() { - Map request = new HashMap<>(); - try { - baseRequestValidator.checkMandatoryFieldsPresent(request, "key"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.invalidRequestData.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testCheckReadOnlyAttributesAbsent() { - Map request = new HashMap<>(); - try { - baseRequestValidator.checkReadOnlyAttributesAbsent(request, "key"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.invalidRequestData.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testCheckMandatoryFieldsPresent2() { - Map request = new HashMap<>(); - try { - baseRequestValidator.checkMandatoryFieldsPresent(request, new ArrayList<>()); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.invalidRequestData.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testValidateSearchRequestFailureWithInvalidFieldsValueInList() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.FILTERS, new HashMap<>()); - requestObj.put(JsonKey.FIELDS, Arrays.asList(1)); - request.setRequest(requestObj); - try { - baseRequestValidator.validateSearchRequest(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.dataTypeError.getErrorCode(), e.getErrorCode()); - assertEquals( - MessageFormat.format( - ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FIELDS, "List of String"), - e.getMessage()); - } - } - - @Test - public void testValidateSearchRequestFailureWithInvalidFiltersKeyAsNull() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - Map filterMap = new HashMap<>(); - filterMap.put(null, "data"); - requestObj.put(JsonKey.FILTERS, filterMap); - - request.setRequest(requestObj); - try { - baseRequestValidator.validateSearchRequest(request); - } catch (ProjectCommonException e) { - assertEquals( - MessageFormat.format( - ResponseCode.invalidParameterValue.getErrorMessage(), null, JsonKey.FILTERS), - e.getMessage()); - } - } - - @Test - public void testValidateSearchRequestFailureWithInvalidFiltersNullValueInList() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - Map filterMap = new HashMap<>(); - List data = new ArrayList<>(); - data.add(null); - filterMap.put(JsonKey.FIRST_NAME, data); - requestObj.put(JsonKey.FILTERS, filterMap); - - request.setRequest(requestObj); - try { - baseRequestValidator.validateSearchRequest(request); - } catch (ProjectCommonException e) { - assertEquals( - MessageFormat.format( - ResponseCode.invalidParameterValue.getErrorMessage(), null, JsonKey.FIRST_NAME), - e.getMessage()); - } - } - - @Test - public void testValidateSearchRequestFailureWithInvalidFiltersNullValueInMap() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - Map filterMap = new HashMap<>(); - Map data = new HashMap<>(); - data.put(JsonKey.FIRST_NAME, null); - filterMap.put(JsonKey.FIELD, data); - requestObj.put(JsonKey.FILTERS, filterMap); - - request.setRequest(requestObj); - try { - baseRequestValidator.validateSearchRequest(request); - } catch (ProjectCommonException e) { - assertEquals( - MessageFormat.format( - ResponseCode.invalidParameterValue.getErrorMessage(), null, JsonKey.FIRST_NAME), - e.getMessage()); - } - } - - @Test - public void testValidateSearchRequestFailureWithInvalidFiltersNullValueInString() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - Map data = new HashMap<>(); - data.put(JsonKey.FIRST_NAME, null); - - requestObj.put(JsonKey.FILTERS, data); - - request.setRequest(requestObj); - try { - baseRequestValidator.validateSearchRequest(request); - } catch (ProjectCommonException e) { - assertEquals( - MessageFormat.format( - ResponseCode.invalidParameterValue.getErrorMessage(), null, JsonKey.FIRST_NAME), - e.getMessage()); - } - } - - @Test(expected = ProjectCommonException.class) - public void testValidateUserIdFailure() { - Request request = new Request(); - Map reqmap = new HashMap<>(); - reqmap.put(JsonKey.USER_ID, "userId"); - request.setRequest(reqmap); - validateUserId(request, JsonKey.USER_ID); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/validator/EmailValidatorTest.java b/core/platform-common/src/test/java/org/sunbird/validator/EmailValidatorTest.java deleted file mode 100644 index 1032571661..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/validator/EmailValidatorTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.sunbird.validator; - -import org.junit.Assert; -import org.junit.Test; - -public class EmailValidatorTest { - - @Test - public void testValidateEmail() { - boolean isValid = EmailValidator.isEmailValid("xyz@xyz.com"); - Assert.assertTrue(isValid); - } - - @Test - public void testValidateEmail2() { - boolean isValid = EmailValidator.isEmailValid("xy@z@xyz.com"); - Assert.assertFalse(isValid); - } - - @Test - public void testValidateEmail3() { - boolean isValid = EmailValidator.isEmailValid(""); - Assert.assertFalse(isValid); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/validator/NotesRequestValidatorTest.java b/core/platform-common/src/test/java/org/sunbird/validator/NotesRequestValidatorTest.java deleted file mode 100644 index 9761e48c14..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/validator/NotesRequestValidatorTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.sunbird.validator; - -import static org.junit.Assert.assertEquals; - -import java.util.HashMap; -import java.util.Map; -import org.junit.Test; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; - -/** Test class for notes request validation */ -public class NotesRequestValidatorTest { - - /** Method to test create note when userId in request is empty */ - @Test - public void testCreateNoteBlankUserId() { - try { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.USER_ID, ""); - requestObj.put(JsonKey.TITLE, "test title"); - requestObj.put(JsonKey.NOTE, "This is a test Note"); - requestObj.put(JsonKey.COURSE_ID, "org.ekstep.test"); - requestObj.put(JsonKey.CONTENT_ID, "org.ekstep.test"); - request.setRequest(requestObj); - RequestValidator.validateNote(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - /** Method to test create note when title in request is empty */ - @Test - public void testCreateNoteBlankTitle() { - try { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.USER_ID, "testUser"); - requestObj.put(JsonKey.TITLE, ""); - requestObj.put(JsonKey.NOTE, "This is a test Note"); - requestObj.put(JsonKey.COURSE_ID, "org.ekstep.test"); - requestObj.put(JsonKey.CONTENT_ID, "org.ekstep.test"); - request.setRequest(requestObj); - RequestValidator.validateNote(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - /** Method to test create note when note in request is empty */ - @Test - public void testCreateNoteBlankNote() { - try { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.USER_ID, "testUser"); - requestObj.put(JsonKey.TITLE, "test title"); - requestObj.put(JsonKey.NOTE, ""); - requestObj.put(JsonKey.COURSE_ID, "org.ekstep.test"); - requestObj.put(JsonKey.CONTENT_ID, "org.ekstep.test"); - request.setRequest(requestObj); - RequestValidator.validateNote(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - /** Method to test create note without courseId and contentId in request */ - @Test - public void testCreateNoteWithoutCourseAndContentId() { - try { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.USER_ID, "testUser"); - requestObj.put(JsonKey.TITLE, "test title"); - requestObj.put(JsonKey.NOTE, "This is a test Note"); - requestObj.put(JsonKey.COURSE_ID, ""); - requestObj.put(JsonKey.CONTENT_ID, ""); - request.setRequest(requestObj); - RequestValidator.validateNote(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - /** Method to test create note when tags in request is string */ - @Test - public void testCreateNoteWithTagsAsString() { - try { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.USER_ID, "testUser"); - requestObj.put(JsonKey.TITLE, "test title"); - requestObj.put(JsonKey.NOTE, "This is a test Note"); - requestObj.put(JsonKey.COURSE_ID, "org.ekstep.test"); - requestObj.put(JsonKey.TAGS, "test tag"); - request.setRequest(requestObj); - RequestValidator.validateNote(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.invalidParameterValue.getErrorCode(), e.getErrorCode()); - } - } - - /** Method to test validate node id when note id is empty */ - @Test - public void testValidateNoteOperationWithOutNoteId() { - try { - String noteId = ""; - RequestValidator.validateNoteId(noteId); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.invalidParameterValue.getErrorCode(), e.getErrorCode()); - } - } - - /** Method to test validate node id when note id is null */ - @Test - public void testValidateNoteOperationWithNoteIdAsNull() { - try { - String noteId = null; - RequestValidator.validateNoteId(noteId); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.invalidParameterValue.getErrorCode(), e.getErrorCode()); - } - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/validator/OrgValidatorTest.java b/core/platform-common/src/test/java/org/sunbird/validator/OrgValidatorTest.java deleted file mode 100644 index a8363310fa..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/validator/OrgValidatorTest.java +++ /dev/null @@ -1,254 +0,0 @@ -/** */ -package org.sunbird.validator; - -import static org.junit.Assert.assertEquals; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import java.util.HashMap; -import java.util.Map; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; -import org.sunbird.util.PropertiesCache; -import org.sunbird.validator.orgvalidator.OrgRequestValidator; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({PropertiesCache.class}) -@PowerMockIgnore({ - "javax.management.*", - "javax.net.ssl.*", - "javax.security.*", - "jdk.internal.reflect.*" -}) -public class OrgValidatorTest { - - @Test - public void validateCreateOrgSuccess() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, "tpp"); - requestObj.put(JsonKey.ORG_TYPE, "board"); - requestObj.put(JsonKey.IS_TENANT, false); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateCreateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - Assert.assertNull(e); - } - assertEquals("success", requestObj.get("ext")); - } - - @Test - public void validateCreateRootOrgWithLicenseSuccess() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, "tpp"); - requestObj.put(JsonKey.ORG_TYPE, "board"); - requestObj.put(JsonKey.IS_TENANT, false); - requestObj.put(JsonKey.LICENSE, "Test license"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateCreateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - Assert.assertNull(e); - } - assertEquals("success", requestObj.get("ext")); - } - - @Test - public void validateCreateRootOrgWithEmptyLicenseFailure() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, "tpp"); - requestObj.put(JsonKey.LICENSE, ""); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateCreateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - Assert.assertNotNull(e); - } - assertEquals(requestObj.get("ext"), null); - } - - @Test - public void validateCreateOrgWithOutName() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, "tpp"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateCreateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - } - assertEquals(null, requestObj.get("ext")); - } - - @Test - public void validateCreateOrgWithRootOrgTrueAndWithOutChannel() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.IS_TENANT, false); - requestObj.put(JsonKey.CHANNEL, ""); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateCreateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - } - assertEquals(null, requestObj.get("ext")); - } - - @Test - public void validateUpdateCreateOrgSuccess() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.ORGANISATION_ID, "test12344"); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, "tpp"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateUpdateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - Assert.assertNull(e); - } - assertEquals("success", requestObj.get("ext")); - } - - @Test - public void validateUpdateOrgFailure() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORGANISATION_ID, "test2344"); - requestObj.put(JsonKey.ROOT_ORG_ID, ""); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, "tpp"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateUpdateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.invalidParameterValue.getErrorCode(), e.getErrorCode()); - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - } - assertEquals(null, requestObj.get("ext")); - } - - @Test - public void validateUpdateOrgWithStatus() { - PowerMockito.mockStatic(PropertiesCache.class); - PropertiesCache propertiesCache = mock(PropertiesCache.class); - when(PropertiesCache.getInstance()).thenReturn(propertiesCache); - PowerMockito.when(propertiesCache.getProperty(Mockito.anyString())).thenReturn("anyString"); - - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.STATUS, "true"); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, "tpp"); - requestObj.put(JsonKey.ORGANISATION_ID, "test123444"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateUpdateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.invalidRequestParameter.getErrorCode(), e.getErrorCode()); - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - } - assertEquals(null, requestObj.get("ext")); - } - - @Test - public void validateUpdateOrgWithEmptyChannel() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.IS_TENANT, true); - requestObj.put(JsonKey.CHANNEL, ""); - requestObj.put(JsonKey.ORGANISATION_ID, "test123444"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateUpdateOrgRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.dependentParameterMissing.getErrorCode(), e.getErrorCode()); - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - } - assertEquals(null, requestObj.get("ext")); - } - - @Test - public void validateUpdateOrgStatus() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.STATUS, 2); - requestObj.put(JsonKey.ORGANISATION_ID, "test-12334"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateUpdateOrgStatusRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - Assert.assertNull(e); - } - assertEquals("success", requestObj.get("ext")); - } - - @Test - public void validateUpdateOrgStatusWithInvalidStatus() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.ORG_NAME, "test"); - requestObj.put(JsonKey.STATUS, "true"); - requestObj.put(JsonKey.ORGANISATION_ID, "test-12334"); - request.setRequest(requestObj); - try { - // this method will either throw projectCommonException or it return void - new OrgRequestValidator().validateUpdateOrgStatusRequest(request); - requestObj.put("ext", "success"); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.invalidRequestData.getErrorCode(), e.getErrorCode()); - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - } - assertEquals(null, requestObj.get("ext")); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/validator/PhoneValidatorTest.java b/core/platform-common/src/test/java/org/sunbird/validator/PhoneValidatorTest.java deleted file mode 100644 index d6c60d360d..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/validator/PhoneValidatorTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.sunbird.validator; - -import org.junit.Assert; -import org.junit.Test; - -public class PhoneValidatorTest { - - @Test - public void testValidatePhoneWithCountryCode() { - boolean isValid = PhoneValidator.validatePhone("9742501212", "91"); - Assert.assertTrue(isValid); - } - - @Test - public void testValidatePhoneWithoutCountryCode() { - boolean isValid = PhoneValidator.validatePhone("9742501212", ""); - Assert.assertTrue(isValid); - } - - @Test - public void testValidatePhoneWithInvalidPhone() { - boolean isValid = PhoneValidator.validatePhone("00000000000", ""); - Assert.assertFalse(isValid); - } -} diff --git a/core/platform-common/src/test/java/org/sunbird/validator/RequestValidatorTest.java b/core/platform-common/src/test/java/org/sunbird/validator/RequestValidatorTest.java deleted file mode 100644 index ca3bc9770f..0000000000 --- a/core/platform-common/src/test/java/org/sunbird/validator/RequestValidatorTest.java +++ /dev/null @@ -1,155 +0,0 @@ -/** */ -package org.sunbird.validator; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.junit.Assert; -import org.junit.Test; -import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; - -/** @author Manzarul */ -public class RequestValidatorTest { - - @Test - public void testValidateFileUploadFailureWithoutContainerName() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.CONTAINER, ""); - request.setRequest(requestObj); - try { - RequestValidator.validateFileUpload(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testValidateSendEmailSuccess() { - boolean response = false; - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.SUBJECT, "test123"); - requestObj.put(JsonKey.BODY, "test"); - List data = new ArrayList<>(); - data.add("test123@gmail.com"); - requestObj.put(JsonKey.RECIPIENT_EMAILS, data); - requestObj.put(JsonKey.RECIPIENT_USERIDS, new ArrayList<>()); - request.setRequest(requestObj); - try { - RequestValidator.validateSendMail(request); - response = true; - } catch (ProjectCommonException e) { - - } - assertTrue(response); - } - - @Test - public void testValidateSendMailFailureWithNullRecipients() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.SUBJECT, "test123"); - requestObj.put(JsonKey.BODY, "test"); - requestObj.put(JsonKey.RECIPIENT_EMAILS, null); - request.setRequest(requestObj); - try { - RequestValidator.validateSendMail(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testValidateSendMailFailureWithEmptyBody() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.SUBJECT, "test123"); - requestObj.put(JsonKey.BODY, ""); - request.setRequest(requestObj); - try { - RequestValidator.validateSendMail(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testValidateSendMailFailureWithEmptySubject() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.SUBJECT, ""); - request.setRequest(requestObj); - try { - RequestValidator.validateSendMail(request); - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.mandatoryParamsMissing.getErrorCode(), e.getErrorCode()); - } - } - - @Test - public void testValidateSyncRequestSuccess() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.OPERATION_FOR, "keycloak"); - requestObj.put(JsonKey.OBJECT_TYPE, JsonKey.USER); - request.setRequest(requestObj); - boolean response = false; - try { - RequestValidator.validateSyncRequest(request); - response = true; - } catch (ProjectCommonException e) { - Assert.assertNull(e); - } - Assert.assertTrue(response); - } - - @Test - public void testValidateSyncRequestFailureWithNullObjectType() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.OPERATION_FOR, "not keycloack"); - requestObj.put(JsonKey.OBJECT_TYPE, null); - request.setRequest(requestObj); - boolean response = false; - try { - RequestValidator.validateSyncRequest(request); - response = true; - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.dataTypeError.getErrorCode(), e.getErrorCode()); - } - Assert.assertFalse(response); - } - - @Test - public void testValidateSyncRequestFailureWithInvalidObjectType() { - Request request = new Request(); - Map requestObj = new HashMap<>(); - requestObj.put(JsonKey.OPERATION_FOR, "not keycloack"); - List objectLsit = new ArrayList<>(); - objectLsit.add("testval"); - requestObj.put(JsonKey.OBJECT_TYPE, objectLsit); - request.setRequest(requestObj); - boolean response = false; - try { - RequestValidator.validateSyncRequest(request); - response = true; - } catch (ProjectCommonException e) { - assertEquals(ResponseCode.CLIENT_ERROR.getResponseCode(), e.getErrorResponseCode()); - assertEquals(ResponseCode.invalidObjectType.getErrorCode(), e.getErrorCode()); - } - Assert.assertFalse(response); - } -} From c355f4c6cfbec7bcc569ae66a76067879ad15441 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 13:13:27 +0530 Subject: [PATCH 10/17] refactor: remove legacy sunbird-event-utils module - Removed the core/sunbird-event-utils module and its telemetry utility classes as part of the ongoing unification into the sunbird-platform-common library. --- core/sunbird-event-utils/pom.xml | 44 -- .../collector/TelemetryAssemblerFactory.java | 32 -- .../collector/TelemetryDataAssembler.java | 45 -- .../collector/TelemetryDataAssemblerImpl.java | 59 --- .../java/org/sunbird/telemetry/dto/Actor.java | 64 --- .../org/sunbird/telemetry/dto/Context.java | 150 ------ .../org/sunbird/telemetry/dto/Producer.java | 100 ---- .../org/sunbird/telemetry/dto/Target.java | 107 ---- .../org/sunbird/telemetry/dto/Telemetry.java | 227 --------- .../telemetry/dto/TelemetryBEEvent.java | 234 --------- .../telemetry/dto/TelemetryBJREvent.java | 144 ------ .../telemetry/dto/TelemetryEnvKey.java | 56 --- .../telemetry/util/TelemetryConstant.java | 14 - .../telemetry/util/TelemetryEvents.java | 40 -- .../telemetry/util/TelemetryGenerator.java | 464 ------------------ .../telemetry/util/TelemetryParams.java | 21 - .../sunbird/telemetry/util/TelemetryUtil.java | 149 ------ .../telemetry/util/TelemetryWriter.java | 137 ------ .../validator/TelemetryObjectValidator.java | 39 -- .../validator/TelemetryObjectValidatorV3.java | 285 ----------- 20 files changed, 2411 deletions(-) delete mode 100644 core/sunbird-event-utils/pom.xml delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Context.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Telemetry.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java delete mode 100644 core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java diff --git a/core/sunbird-event-utils/pom.xml b/core/sunbird-event-utils/pom.xml deleted file mode 100644 index 5f493f867a..0000000000 --- a/core/sunbird-event-utils/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - core - org.sunbird - 1.0-SNAPSHOT - - - 4.0.0 - sunbird-event-utils - 1.0-SNAPSHOT - Sunbird Event Utils - - - - - - - org.sunbird - platform-common - 1.0-SNAPSHOT - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - - - diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java deleted file mode 100644 index 7446b11d44..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.sunbird.telemetry.collector; - -/** - * Factory class to provide an instance of TelemetryDataAssembler. - * This class follows the creation pattern to ensure a single instance of TelemetryDataAssembler is used. - */ -public class TelemetryAssemblerFactory { - - private static TelemetryDataAssembler telemetryDataAssembler = null; - - /** - * Private constructor to prevent instantiation. - */ - private TelemetryAssemblerFactory() {} - - /** - * Returns the singleton instance of TelemetryDataAssembler. - * If the instance supports lazy initialization, it creates one in a thread-safe manner. - * - * @return TelemetryDataAssembler instance - */ - public static TelemetryDataAssembler get() { - if (telemetryDataAssembler == null) { - synchronized (TelemetryAssemblerFactory.class) { - if (telemetryDataAssembler == null) { - telemetryDataAssembler = new TelemetryDataAssemblerImpl(); - } - } - } - return telemetryDataAssembler; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java deleted file mode 100644 index 1b061b677e..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.sunbird.telemetry.collector; - -import java.util.Map; - -/** - * Interface defining the contract for assembling and generating various telemetry events. - */ -public interface TelemetryDataAssembler { - - /** - * Generates an AUDIT telemetry event. - * - * @param context Context map containing telemetry context information (e.g., channel, pdata, env, etc.) - * @param params Parameters map containing event-specific data - * @return The generated telemetry event as a JSON string - */ - String audit(Map context, Map params); - - /** - * Generates a SEARCH telemetry event. - * - * @param context Context map containing telemetry context information - * @param params Parameters map containing search-specific data (e.g., query, filters, sort, correlation) - * @return The generated telemetry event as a JSON string - */ - String search(Map context, Map params); - - /** - * Generates a LOG telemetry event. - * - * @param context Context map containing telemetry context information - * @param params Parameters map containing log-specific data (e.g., type, level, message, params) - * @return The generated telemetry event as a JSON string - */ - String log(Map context, Map params); - - /** - * Generates an ERROR telemetry event. - * - * @param context Context map containing telemetry context information - * @param params Parameters map containing error-specific data (e.g., err, errtype, stacktrace) - * @return The generated telemetry event as a JSON string - */ - String error(Map context, Map params); -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java deleted file mode 100644 index 9d133a8560..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.sunbird.telemetry.collector; - -import java.util.Map; -import org.sunbird.telemetry.util.TelemetryGenerator; - -/** - * Implementation of the TelemetryDataAssembler interface. - * Delegates the actual generation of telemetry events to the TelemetryGenerator utility. - */ -public class TelemetryDataAssemblerImpl implements TelemetryDataAssembler { - - /** - * Generates an AUDIT telemetry event using TelemetryGenerator. - * - * @param context Context map containing telemetry context information - * @param params Parameters map containing event-specific data - * @return The generated telemetry event as a JSON string - */ - @Override - public String audit(Map context, Map params) { - return TelemetryGenerator.audit(context, params); - } - - /** - * Generates a SEARCH telemetry event using TelemetryGenerator. - * - * @param context Context map containing telemetry context information - * @param params Parameters map containing search-specific data - * @return The generated telemetry event as a JSON string - */ - @Override - public String search(Map context, Map params) { - return TelemetryGenerator.search(context, params); - } - - /** - * Generates a LOG telemetry event using TelemetryGenerator. - * - * @param context Context map containing telemetry context information - * @param params Parameters map containing log-specific data - * @return The generated telemetry event as a JSON string - */ - @Override - public String log(Map context, Map params) { - return TelemetryGenerator.log(context, params); - } - - /** - * Generates an ERROR telemetry event using TelemetryGenerator. - * - * @param context Context map containing telemetry context information - * @param params Parameters map containing error-specific data - * @return The generated telemetry event as a JSON string - */ - @Override - public String error(Map context, Map params) { - return TelemetryGenerator.error(context, params); - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java deleted file mode 100644 index 8617b27714..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Actor.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.sunbird.telemetry.dto; - -/** - * Represents the 'Actor' in a telemetry event. - * The Actor is the entity (User, System, etc.) that performs the action being logged. - */ -public class Actor { - - private String id; - private String type; - - /** - * Default constructor. - */ - public Actor() {} - - /** - * Parameterized constructor to initialize the Actor. - * - * @param id The unique identifier of the actor (e.g., User ID). - * @param type The type of the actor (e.g., 'User', 'System'). - */ - public Actor(String id, String type) { - super(); - this.id = id; - this.type = type; - } - - /** - * Gets the unique identifier of the actor. - * - * @return the id of the actor - */ - public String getId() { - return id; - } - - /** - * Sets the unique identifier of the actor. - * - * @param id the id to set - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the type of the actor. - * - * @return the type of the actor - */ - public String getType() { - return type; - } - - /** - * Sets the type of the actor. - * - * @param type the type to set - */ - public void setType(String type) { - this.type = type; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Context.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Context.java deleted file mode 100644 index dedaaaf473..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Context.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.sunbird.telemetry.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Represents the context of a telemetry event. - * Contains information about the environment, actor, channel, and other contextual data. - */ -@JsonInclude(Include.NON_NULL) -public class Context { - - private String channel; - private Producer pdata; - private String env; - private String did; - private List> cdata = new ArrayList<>(); - private Map rollup = new HashMap<>(); - - /** - * Default constructor. - */ - public Context() {} - - /** - * Parameterized constructor to initialize the Context. - * - * @param channel The channel ID - * @param env The environment (e.g., 'dev', 'prod') - * @param pdata The producer data - */ - public Context(String channel, String env, Producer pdata) { - super(); - this.channel = channel; - this.env = env; - this.pdata = pdata; - } - - /** - * Gets the rollup data. - * - * @return a map containing rollup data - */ - public Map getRollup() { - return rollup; - } - - /** - * Sets the rollup data. - * - * @param rollup a map containing rollup data to set - */ - public void setRollup(Map rollup) { - this.rollup = rollup; - } - - /** - * Gets the correlation data (cdata). - * - * @return a list of maps containing correlation data - */ - public List> getCdata() { - return cdata; - } - - /** - * Sets the correlation data (cdata). - * - * @param cdata a list of maps containing correlation data to set - */ - public void setCdata(List> cdata) { - this.cdata = cdata; - } - - /** - * Gets the channel ID. - * - * @return the channel - */ - public String getChannel() { - return channel; - } - - /** - * Sets the channel ID. - * - * @param channel the channel to set - */ - public void setChannel(String channel) { - this.channel = channel; - } - - /** - * Gets the producer data. - * - * @return the pdata - */ - public Producer getPdata() { - return pdata; - } - - /** - * Sets the producer data. - * - * @param pdata the pdata to set - */ - public void setPdata(Producer pdata) { - this.pdata = pdata; - } - - /** - * Gets the environment. - * - * @return the env - */ - public String getEnv() { - return env; - } - - /** - * Sets the environment. - * - * @param env the env to set - */ - public void setEnv(String env) { - this.env = env; - } - - /** - * Gets the device ID. - * - * @return the did - */ - public String getDid() { - return did; - } - - /** - * Sets the device ID. - * - * @param did the did to set - */ - public void setDid(String did) { - this.did = did; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java deleted file mode 100644 index be49c81824..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Producer.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.sunbird.telemetry.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -/** - * Represents the producer of a telemetry event. - * The Producer is the system/subsystem that generated the event. - */ -@JsonInclude(Include.NON_NULL) -public class Producer { - - private String id; - private String pid; - private String ver; - - /** - * Default constructor. - */ - public Producer() {} - - /** - * Parameterized constructor. - * - * @param id The unique identifier of the producer - * @param ver The version of the producer - */ - public Producer(String id, String ver) { - super(); - this.id = id; - this.ver = ver; - } - - /** - * Parameterized constructor. - * - * @param id The unique identifier of the producer - * @param pid The producer ID (optional/alternative) - * @param ver The version of the producer - */ - public Producer(String id, String pid, String ver) { - this.id = id; - this.pid = pid; - this.ver = ver; - } - - /** - * Gets the producer ID. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the producer ID. - * - * @param id the id to set - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the producer PID. - * - * @return the pid - */ - public String getPid() { - return pid; - } - - /** - * Sets the producer PID. - * - * @param pid the pid to set - */ - public void setPid(String pid) { - this.pid = pid; - } - - /** - * Gets the producer version. - * - * @return the ver - */ - public String getVer() { - return ver; - } - - /** - * Sets the producer version. - * - * @param ver the ver to set - */ - public void setVer(String ver) { - this.ver = ver; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java deleted file mode 100644 index 75bc947d26..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Target.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.sunbird.telemetry.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import java.util.Map; - -/** - * Represents the target object of a telemetry event. - * The Target identifies the object being acted upon (e.g., Content, Item, User). - */ -@JsonInclude(Include.NON_NULL) -public class Target { - - private String id; - private String type; - private String ver; - private Map rollup; - - /** - * Default constructor. - */ - public Target() {} - - /** - * Parameterized constructor to initialize the Target. - * - * @param id The unique identifier of the target object - * @param type The type of the target object - */ - public Target(String id, String type) { - super(); - this.id = id; - this.type = type; - } - - /** - * Gets the rollup data. - * - * @return a map containing rollup data - */ - public Map getRollup() { - return rollup; - } - - /** - * Sets the rollup data. - * - * @param rollup a map containing rollup data to set - */ - public void setRollup(Map rollup) { - this.rollup = rollup; - } - - /** - * Gets the target ID. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the target ID. - * - * @param id the id to set - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the target type. - * - * @return the type - */ - public String getType() { - return type; - } - - /** - * Sets the target type. - * - * @param type the type to set - */ - public void setType(String type) { - this.type = type; - } - - /** - * Gets the target version. - * - * @return the ver - */ - public String getVer() { - return ver; - } - - /** - * Sets the target version. - * - * @param ver the ver to set - */ - public void setVer(String ver) { - this.ver = ver; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Telemetry.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Telemetry.java deleted file mode 100644 index bbe878a0e3..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/Telemetry.java +++ /dev/null @@ -1,227 +0,0 @@ -package org.sunbird.telemetry.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * Telemetry V3 POJO to generate telemetry event. - * Represents the structure of a standard Sunbird telemetry event. - */ -@JsonInclude(Include.NON_NULL) -public class Telemetry { - - private String eid; - private long ets = System.currentTimeMillis(); - private String ver = "3.0"; - private String mid = System.currentTimeMillis() + "." + UUID.randomUUID(); - private Actor actor; - private Context context; - private Target object; - private Map edata; - private List tags; - - /** - * Default constructor. - */ - public Telemetry() {} - - /** - * Parameterized constructor. - * - * @param eid The event ID (e.g., AUDIT, LOG, SEARCH) - * @param actor The actor performing the event - * @param context The context of the event - * @param edata The event data - * @param object The target object of the event - */ - public Telemetry( - String eid, Actor actor, Context context, Map edata, Target object) { - super(); - this.eid = eid; - this.actor = actor; - this.context = context; - this.edata = edata; - this.object = object; - } - - /** - * Parameterized constructor (without target object). - * - * @param eid The event ID - * @param actor The actor performing the event - * @param context The context of the event - * @param edata The event data - */ - public Telemetry(String eid, Actor actor, Context context, Map edata) { - super(); - this.eid = eid; - this.actor = actor; - this.context = context; - this.edata = edata; - } - - /** - * Gets the event ID. - * - * @return the eid - */ - public String getEid() { - return eid; - } - - /** - * Sets the event ID. - * - * @param eid the eid to set - */ - public void setEid(String eid) { - this.eid = eid; - } - - /** - * Gets the event timestamp. - * - * @return the ets - */ - public long getEts() { - return ets; - } - - /** - * Sets the event timestamp. - * - * @param ets the ets to set - */ - public void setEts(long ets) { - this.ets = ets; - } - - /** - * Gets the version. - * - * @return the ver - */ - public String getVer() { - return ver; - } - - /** - * Sets the version. - * - * @param ver the ver to set - */ - public void setVer(String ver) { - this.ver = ver; - } - - /** - * Gets the message ID. - * - * @return the mid - */ - public String getMid() { - return mid; - } - - /** - * Sets the message ID. - * - * @param mid the mid to set - */ - public void setMid(String mid) { - this.mid = mid; - } - - /** - * Gets the actor. - * - * @return the actor - */ - public Actor getActor() { - return actor; - } - - /** - * Sets the actor. - * - * @param actor the actor to set - */ - public void setActor(Actor actor) { - this.actor = actor; - } - - /** - * Gets the context. - * - * @return the context - */ - public Context getContext() { - return context; - } - - /** - * Sets the context. - * - * @param context the context to set - */ - public void setContext(Context context) { - this.context = context; - } - - /** - * Gets the target object. - * - * @return the object - */ - public Target getObject() { - return object; - } - - /** - * Sets the target object. - * - * @param object the object to set - */ - public void setObject(Target object) { - this.object = object; - } - - /** - * Gets the event data. - * - * @return the edata - */ - public Map getEdata() { - return edata; - } - - /** - * Sets the event data. - * - * @param edata the edata to set - */ - public void setEdata(Map edata) { - this.edata = edata; - } - - /** - * Gets the tags. - * - * @return the tags - */ - public List getTags() { - return tags; - } - - /** - * Sets the tags. - * - * @param tags the tags to set - */ - public void setTags(List tags) { - this.tags = tags; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java deleted file mode 100644 index c13da222f1..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java +++ /dev/null @@ -1,234 +0,0 @@ -package org.sunbird.telemetry.dto; - -import java.util.HashMap; -import java.util.Map; - -/** - * Represents a Backend (BE) Telemetry Event. - * This class captures telemetry data generated by backend services. - */ -public class TelemetryBEEvent { - - private String eid; - private long ets; - private String mid; - private String ver; - private String channel; - private Map pdata; - private Map edata; - - /** - * Gets the event ID. - * - * @return the eid - */ - public String getEid() { - return eid; - } - - /** - * Sets the event ID. - * - * @param eid the eid to set - */ - public void setEid(String eid) { - this.eid = eid; - } - - /** - * Gets the event timestamp. - * - * @return the ets - */ - public long getEts() { - return ets; - } - - /** - * Sets the event timestamp. - * - * @param ets the ets to set - */ - public void setEts(long ets) { - this.ets = ets; - } - - /** - * Gets the version. - * - * @return the ver - */ - public String getVer() { - return ver; - } - - /** - * Sets the version. - * - * @param ver the ver to set - */ - public void setVer(String ver) { - this.ver = ver; - } - - /** - * Gets the producer data. - * - * @return the pdata - */ - public Map getPdata() { - return pdata; - } - - /** - * Sets the producer data. - * - * @param pdata the pdata to set - */ - public void setPdata(Map pdata) { - this.pdata = pdata; - } - - /** - * Gets the event data. - * - * @return the edata - */ - public Map getEdata() { - return edata; - } - - /** - * Sets the event data with specific eks map. - * - * @param eks the eks map to be put inside edata - */ - public void setEdata(Map eks) { - this.edata = new HashMap<>(); - edata.put("eks", eks); - } - - /** - * Sets the producer data with specific fields. - * - * @param id Producer ID - * @param pid Producer PID - * @param ver Producer Version - * @param uid User ID (Note: unused in implementation but present in signature) - */ - public void setPdata(String id, String pid, String ver, String uid) { - this.pdata = new HashMap<>(); - this.pdata.put("id", id); - this.pdata.put("pid", pid); - this.pdata.put("ver", ver); - } - - /** - * Sets edata for Content events. - * - * @param cid Content ID - * @param status Content Status - * @param prevState Previous State - * @param size Size - * @param pkgVersion Package Version - * @param concepts Concepts - */ - public void setEdata( - String cid, - Object status, - Object prevState, - Object size, - Object pkgVersion, - Object concepts) { - this.edata = new HashMap<>(); - Map eks = new HashMap<>(); - eks.put("cid", cid); - eks.put("state", status); - eks.put("prevstate", prevState); - eks.put("size", size); - eks.put("pkgVersion", pkgVersion); - eks.put("concepts", concepts); - edata.put("eks", eks); - } - - /** - * Sets edata for Search events. - * - * @param query Search query - * @param filters Search filters - * @param sort Search sort order - * @param correlationId Correlation ID - * @param size Result size - */ - public void setEdata(String query, Object filters, Object sort, String correlationId, int size) { - this.edata = new HashMap<>(); - Map eks = new HashMap<>(); - eks.put("query", query); - eks.put("filters", filters); - eks.put("sort", sort); - eks.put("correlationid", correlationId); - eks.put("size", size); - edata.put("eks", eks); - } - - /** - * Sets edata for Lifecycle/State change events. - * - * @param id Target ID - * @param state Current State - * @param prevState Previous State - * @param lemma Lemma (used in wordnet/language) or auxiliary data - */ - public void setEdata(String id, Object state, Object prevState, Object lemma) { - this.edata = new HashMap<>(); - Map eks = new HashMap<>(); - eks.put("id", id); - eks.put("state", state); - eks.put("prevstate", prevState); - eks.put("lemma", lemma); - edata.put("eks", eks); - } - - /** - * Gets the message ID. - * - * @return the mid - */ - public String getMid() { - return mid; - } - - /** - * Sets the message ID. - * - * @param mid the mid to set - */ - public void setMid(String mid) { - this.mid = mid; - } - - /** - * Gets the channel ID. - * - * @return the channel, or empty string if null - */ - public String getChannel() { - if (null == channel) { - channel = ""; - } - return channel; - } - - /** - * Sets the channel ID. - * - * @param channel the channel to set - */ - public void setChannel(String channel) { - String tempChannel = channel; - if (null == channel) { - tempChannel = ""; - } - this.channel = tempChannel; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java deleted file mode 100644 index 2250dbec7e..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.sunbird.telemetry.dto; - -import java.util.Map; - -/** - * Represents a Backend Job/Request (BJR) Telemetry Event. - * This class captures telemetry data for background jobs or requests, often used for map-based telemetry structures. - */ -public class TelemetryBJREvent { - - private String eid; - private long ets; - private String mid; - private Map actor; - private Map context; - private Map object; - private Map edata; - - /** - * Gets the event ID. - * - * @return the eid - */ - public String getEid() { - return eid; - } - - /** - * Sets the event ID. - * - * @param eid the eid to set - */ - public void setEid(String eid) { - this.eid = eid; - } - - /** - * Gets the event timestamp. - * - * @return the ets - */ - public long getEts() { - return ets; - } - - /** - * Sets the event timestamp. - * - * @param ets the ets to set - */ - public void setEts(long ets) { - this.ets = ets; - } - - /** - * Gets the message ID. - * - * @return the mid - */ - public String getMid() { - return mid; - } - - /** - * Sets the message ID. - * - * @param mid the mid to set - */ - public void setMid(String mid) { - this.mid = mid; - } - - /** - * Gets the actor data map. - * - * @return the actor map - */ - public Map getActor() { - return actor; - } - - /** - * Sets the actor data map. - * - * @param actor the actor map to set - */ - public void setActor(Map actor) { - this.actor = actor; - } - - /** - * Gets the context data map. - * - * @return the context map - */ - public Map getContext() { - return context; - } - - /** - * Sets the context data map. - * - * @param context the context map to set - */ - public void setContext(Map context) { - this.context = context; - } - - /** - * Gets the object/target data map. - * - * @return the object map - */ - public Map getObject() { - return object; - } - - /** - * Sets the object/target data map. - * - * @param object the object map to set - */ - public void setObject(Map object) { - this.object = object; - } - - /** - * Gets the event data map. - * - * @return the edata map - */ - public Map getEdata() { - return edata; - } - - /** - * Sets the event data map. - * - * @param edata the edata map to set - */ - public void setEdata(Map edata) { - this.edata = edata; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java deleted file mode 100644 index 6244277081..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.sunbird.telemetry.dto; - -/** - * Constants for Telemetry Environment Keys. - * Defines the environment names used in various telemetry events. - */ -public class TelemetryEnvKey { - - /** Constant for User environment */ - public static final String USER = "User"; - - /** Constant for Organisation environment */ - public static final String ORGANISATION = "Organisation"; - - /** Constant for GeoLocation environment */ - public static final String GEO_LOCATION = "GeoLocation"; - - /** Constant for MasterKey environment */ - public static final String MASTER_KEY = "MasterKey"; - - /** Constant for ObjectStore environment */ - public static final String OBJECT_STORE = "ObjectStore"; - - /** Constant for Location environment */ - public static final String LOCATION = "Location"; - - /** Constant for Request environment */ - public static final String REQUEST_UPPER_CAMEL = "Request"; - - /** Constant for UserConsent environment */ - public static final String USER_CONSENT = "UserConsent"; - - /** Constant for Edata Type User Consent */ - public static final String EDATA_TYPE_USER_CONSENT = "user-consent"; - - /** Constant for CourseBatch environment */ - public static final String BATCH = "CourseBatch"; - - /** Constant for Page environment */ - public static final String PAGE = "Page"; - - /** Constant for PageSection environment */ - public static final String PAGE_SECTION = "PageSection"; - - /** Constant for QRCodeDownload environment */ - public static final String QR_CODE_DOWNLOAD = "QRCodeDownload"; - - /** Constant for COURSE_CREATE environment */ - public static final String COURSE_CREATE = "COURSE_CREATE"; - - /** Constant for Notification Created environment */ - public static final String NOTIFICATION_CREATED = "create-notification"; - - /** Private constructor to prevent instantiation. */ - private TelemetryEnvKey() {} -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java deleted file mode 100644 index 059fa18ad7..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.sunbird.telemetry.util; - -/** - * Class contains Constants for telemetry. - * Defines standard constant values used for telemetry logging and processing. - */ -public class TelemetryConstant { - - /** Constant for Error log level */ - public static final String LOG_LEVEL_ERROR = "error"; - - /** Private constructor to prevent instantiation. */ - private TelemetryConstant() {} -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java deleted file mode 100644 index f76f282e6d..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.sunbird.telemetry.util; - -/** - * Enumeration for telemetry events types. - * Defines the standard event names supported by the telemetry system. - */ -public enum TelemetryEvents { - - /** AUDIT Telemetry Event */ - AUDIT("AUDIT"), - - /** SEARCH Telemetry Event */ - SEARCH("SEARCH"), - - /** LOG Telemetry Event */ - LOG("LOG"), - - /** ERROR Telemetry Event */ - ERROR("ERROR"); - - private final String name; - - /** - * Private constructor for enum. - * - * @param name The name of the event - */ - TelemetryEvents(String name) { - this.name = name; - } - - /** - * Gets the name of the telemetry event. - * - * @return the name - */ - public String getName() { - return name; - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java deleted file mode 100644 index e0214658a5..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java +++ /dev/null @@ -1,464 +0,0 @@ -package org.sunbird.telemetry.util; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.*; -import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.ProjectUtil; -import org.sunbird.telemetry.dto.*; -import org.sunbird.telemetry.dto.TelemetryEnvKey; - -/** - * Utility class to generate telemetry events. - * Provides static methods to construct standard telemetry objects. - */ -public class TelemetryGenerator { - - private static final ObjectMapper mapper = new ObjectMapper(); - private static final LoggerUtil logger = new LoggerUtil(TelemetryGenerator.class); - - /** Private constructor to prevent instantiation. */ - private TelemetryGenerator() {} - - /** - * Generates api_access AUDIT telemetry JSON string. - * - * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the telemetry event data info - * @return Telemetry event as JSON string - */ - public static String audit(Map context, Map params) { - if (!validateRequest(context, params)) { - return ""; - } - String actorId = (String) context.get(JsonKey.ACTOR_ID); - String actorType = (String) context.get(JsonKey.ACTOR_TYPE); - Target targetObject = - generateTargetObject((Map) params.get(JsonKey.TARGET_OBJECT)); - - Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); - Context eventContext = getContext(context); - Map edata = generateAuditEdata(params); - - /* Assign cdata into context from params correlated objects */ - if (params.containsKey(JsonKey.CORRELATED_OBJECTS)) { - setCorrelatedDataToContext(params.get(JsonKey.CORRELATED_OBJECTS), eventContext); - } - - /* Assign request id into context cdata */ - String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (StringUtils.isBlank(reqId)) { - reqId = (String) context.get(JsonKey.REQUEST_ID); - } - - if (StringUtils.isNotBlank(reqId)) { - Map map = new HashMap<>(); - map.put(JsonKey.ID, reqId); - map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); - eventContext.getCdata().add(map); - } - - /* Construct telemetry object and set message ID */ - Telemetry telemetry = - new Telemetry(TelemetryEvents.AUDIT.getName(), actor, eventContext, edata, targetObject); - telemetry.setMid(reqId); - return getTelemetry(telemetry); - } - - /** - * Sets correlated data (cdata) to the telemetry context. - * - * @param correlatedObjects List of correlated objects - * @param eventContext The context object to update - */ - private static void setCorrelatedDataToContext(Object correlatedObjects, Context eventContext) { - ArrayList> list = (ArrayList>) correlatedObjects; - ArrayList> targetList = new ArrayList<>(); - - /* Convert correlated objects to standardized map format */ - if (null != list && !list.isEmpty()) { - for (Map m : list) { - Map map = new HashMap<>(); - map.put(JsonKey.ID, m.get(JsonKey.ID)); - map.put(JsonKey.TYPE, StringUtils.capitalize((String) m.get(JsonKey.TYPE))); - targetList.add(map); - } - } - eventContext.setCdata(targetList); - } - - /** - * Generates a Target object from the provided map. - * - * @param targetObject Map containing target object properties (ID, Type, Rollup) - * @return Constructed Target object - */ - private static Target generateTargetObject(Map targetObject) { - Target target = - new Target( - (String) targetObject.get(JsonKey.ID), - StringUtils.capitalize((String) targetObject.get(JsonKey.TYPE))); - if (targetObject.get(JsonKey.ROLLUP) != null) { - target.setRollup((Map) targetObject.get(JsonKey.ROLLUP)); - } - return target; - } - - /** - * Generates event data (edata) for AUDIT telemetry events. - * - * @param params Map containing event parameters (props, type, target object) - * @return Constructed edata map - */ - private static Map generateAuditEdata(Map params) { - Map edata = new HashMap<>(); - Map props = (Map) params.get(JsonKey.PROPS); - - // TODO: need to rethink about this one .. if map is null then what to do - if (null != props) { - edata.put(JsonKey.PROPS, getProps(props)); - } - - String type = (String) params.get(JsonKey.TYPE); - if (null != type) { - edata.put(JsonKey.TYPE, type); - } - - Map target = (Map) params.get(JsonKey.TARGET_OBJECT); - if (target != null && target.get(JsonKey.CURRENT_STATE) != null) { - edata.put(JsonKey.STATE, StringUtils.capitalize((String) target.get(JsonKey.CURRENT_STATE))); - if (JsonKey.UPDATE.equalsIgnoreCase((String) target.get(JsonKey.CURRENT_STATE)) - && edata.get(props) != null) { - removeAttributes((Map) edata.get(props), JsonKey.ID); - } - } - return edata; - } - - /** - * Removes specified attributes from the map. - * - * @param map The map to modify - * @param properties The keys to remove - */ - private static void removeAttributes(Map map, String... properties) { - for (String property : properties) { - map.remove(property); - } - } - - /** - * Recursively extracts properties from a map, flattening nested keys. - * - * @param map The map to extract properties from - * @return List of property keys (dot-separated for nested keys) - */ - private static List getProps(Map map) { - try { - return map.entrySet() - .stream() - .map(entry -> entry.getKey()) - .map( - key -> { - if (map.get(key) instanceof Map) { - List keys = getProps((Map) map.get(key)); - return keys.stream() - .map(childKey -> key + "." + childKey) - .collect(Collectors.toList()); - } else { - return Arrays.asList(key); - } - }) - .flatMap(List::stream) - .collect(Collectors.toList()); - } catch (Exception e) { - logger.error("TelemetryGenerator:getProps error =", e); - } - return new ArrayList<>(); - } - - /** - * Constructs the Context object from the context map. - * - * @param context Map containing context info - * @return Constructed Context object - */ - private static Context getContext(Map context) { - String channel = (String) context.get(JsonKey.CHANNEL); - String env = (String) context.get(JsonKey.ENV); - String did = (String) context.get(JsonKey.DEVICE_ID); - Producer producer = getProducer(context); - Context eventContext = new Context(channel, StringUtils.capitalize(env), producer); - eventContext.setDid(did); - if (context.get(JsonKey.ROLLUP) != null - && !((Map) context.get(JsonKey.ROLLUP)).isEmpty()) { - eventContext.setRollup((Map) context.get(JsonKey.ROLLUP)); - } - return eventContext; - } - - /** - * Constructs a Producer object from the context map. - * - * @param context Map containing producer info - * @return Constructed Producer object - */ - private static Producer getProducer(Map context) { - String id = ""; - if (context != null && context.size() != 0) { - if (StringUtils.isNotBlank((String) context.get(JsonKey.APP_ID))) { - id = (String) context.get(JsonKey.APP_ID); - } else { - id = (String) context.get(JsonKey.PDATA_ID); - } - String pid = (String) context.get(JsonKey.PDATA_PID); - String ver = (String) context.get(JsonKey.PDATA_VERSION); - return new Producer(id, pid, ver); - } else { - return new Producer("", "", ""); - } - } - - /** - * Serializes the Telemetry object to a JSON string. - * - * @param telemetry Telemetry object - * @return JSON string representation - */ - private static String getTelemetry(Telemetry telemetry) { - String event = ""; - try { - event = mapper.writeValueAsString(telemetry); - logger.info("TelemetryGenerator:getTelemetry = Telemetry Event : " + event); - } catch (Exception e) { - logger.error( - "TelemetryGenerator:getTelemetry = Telemetry Event: failed to generate audit events:", e); - } - return event; - } - - /** - * Generates SEARCH telemetry event. - * - * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the telemetry event data info - * @return Search Telemetry event as JSON string - */ - public static String search(Map context, Map params) { - if (!validateRequest(context, params)) { - return ""; - } - String actorId = (String) context.get(JsonKey.ACTOR_ID); - String actorType = (String) context.get(JsonKey.ACTOR_TYPE); - Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); - - Context eventContext = getContext(context); - - /* Assign request id into context cdata */ - String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (StringUtils.isBlank(reqId)) { - reqId = (String) context.get(JsonKey.REQUEST_ID); - } - - if (StringUtils.isNotBlank(reqId)) { - Map map = new HashMap<>(); - map.put(JsonKey.ID, reqId); - map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); - eventContext.getCdata().add(map); - } - - Map edata = generateSearchEdata(params); - Telemetry telemetry = - new Telemetry(TelemetryEvents.SEARCH.getName(), actor, eventContext, edata); - telemetry.setMid(reqId); - return getTelemetry(telemetry); - } - - /** - * Generates event data (edata) for SEARCH telemetry events. - * - * @param params Map containing search event parameters - * @return Constructed edata map - */ - private static Map generateSearchEdata(Map params) { - Map edata = new HashMap<>(); - String type = (String) params.get(JsonKey.TYPE); - String query = (String) params.get(JsonKey.QUERY); - Map filters = (Map) params.get(JsonKey.FILTERS); - Map sort = (Map) params.get(JsonKey.SORT); - List topn = (List) params.get(JsonKey.TOPN); - - edata.put(JsonKey.TYPE, StringUtils.capitalize(type)); - if (null == query) { - query = ""; - } - edata.put(JsonKey.QUERY, query); - edata.put(JsonKey.FILTERS, filters); - edata.put(JsonKey.SORT, sort); - edata.put(JsonKey.SIZE, params.get(JsonKey.SIZE)); - edata.put(JsonKey.TOPN, topn); - return edata; - } - - /** - * Generates LOG telemetry event. - * - * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the telemetry event data info - * @return Log Telemetry event as JSON string - */ - public static String log(Map context, Map params) { - if (!validateRequest(context, params)) { - return ""; - } - String actorId = (String) context.get(JsonKey.ACTOR_ID); - String actorType = (String) context.get(JsonKey.ACTOR_TYPE); - Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); - - Context eventContext = getContext(context); - - /* Assign request id into context cdata */ - String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (StringUtils.isBlank(reqId)) { - reqId = (String) context.get(JsonKey.REQUEST_ID); - } - - if (StringUtils.isNotBlank(reqId)) { - Map map = new HashMap<>(); - map.put(JsonKey.ID, reqId); - map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); - eventContext.getCdata().add(map); - } - - Map edata = generateLogEdata(params); - Telemetry telemetry = new Telemetry(TelemetryEvents.LOG.getName(), actor, eventContext, edata); - telemetry.setMid(reqId); - return getTelemetry(telemetry); - } - - /** - * Generates event data (edata) for LOG telemetry events. - * - * @param params Map containing log event parameters - * @return Constructed edata map - */ - private static Map generateLogEdata(Map params) { - Map edata = new HashMap<>(); - String logType = (String) params.get(JsonKey.LOG_TYPE); - String logLevel = (String) params.get(JsonKey.LOG_LEVEL); - String message = (String) params.get(JsonKey.MESSAGE); - - edata.put(JsonKey.TYPE, StringUtils.capitalize(logType)); - edata.put(JsonKey.LEVEL, logLevel); - edata.put(JsonKey.MESSAGE, message != null ? message : ""); - - edata.put( - JsonKey.PARAMS, - getParamsList(params, Arrays.asList(JsonKey.LOG_TYPE, JsonKey.LOG_LEVEL, JsonKey.MESSAGE))); - return edata; - } - - /** - * Extracts parameters from a map, excluding specified keys. - * - * @param params Map to extract parameters from - * @param ignore List of keys to exclude - * @return List of parameter maps - */ - private static List> getParamsList( - Map params, List ignore) { - List> paramsList = new ArrayList<>(); - if (null != params && !params.isEmpty()) { - for (Map.Entry entry : params.entrySet()) { - if (!ignore.contains(entry.getKey())) { - Map param = new HashMap<>(); - param.put(entry.getKey(), entry.getValue()); - paramsList.add(param); - } - } - } - return paramsList; - } - - /** - * Generates ERROR telemetry event. - * - * @param context Map contains the telemetry context info like actor info, env info etc. - * @param params Map contains the error event data info - * @return Error Telemetry event as JSON string - */ - public static String error(Map context, Map params) { - if (!validateRequest(context, params)) { - return ""; - } - String actorId = (String) context.get(JsonKey.ACTOR_ID); - String actorType = (String) context.get(JsonKey.ACTOR_TYPE); - Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); - - Context eventContext = getContext(context); - - /* Assign request id into context cdata */ - String reqId = (String) context.get(JsonKey.X_REQUEST_ID); - if (StringUtils.isBlank(reqId)) { - reqId = (String) context.get(JsonKey.REQUEST_ID); - } - - if (StringUtils.isNotBlank(reqId)) { - Map map = new HashMap<>(); - map.put(JsonKey.ID, reqId); - map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); - eventContext.getCdata().add(map); - } - - Map edata = generateErrorEdata(params); - edata.put(JsonKey.REQUEST_ID, reqId); - Telemetry telemetry = - new Telemetry(TelemetryEvents.ERROR.getName(), actor, eventContext, edata); - telemetry.setMid(reqId); - return getTelemetry(telemetry); - } - - /** - * Generates event data (edata) for ERROR telemetry events. - * - * @param params Map contains error event parameters - * @return Constructed edata map - */ - private static Map generateErrorEdata(Map params) { - Map edata = new HashMap<>(); - String error = (String) params.get(JsonKey.ERROR); - String errorType = (String) params.get(JsonKey.ERR_TYPE); - String stackTrace = (String) params.get(JsonKey.STACKTRACE); - edata.put(JsonKey.ERROR, error); - edata.put(JsonKey.ERR_TYPE, errorType); - - int stackTraceLength = 100; - try { - String lengthStr = ProjectUtil.getConfigValue(JsonKey.STACKTRACE_CHAR_LENGTH); - if (StringUtils.isNotBlank(lengthStr)) { - stackTraceLength = Integer.parseInt(lengthStr); - } - } catch (Exception e) { - logger.error("TelemetryGenerator:generateErrorEdata: Error parsing stacktrace length", e); - } - - edata.put( - JsonKey.STACKTRACE, - ProjectUtil.getFirstNCharacterString(stackTrace, stackTraceLength)); - return edata; - } - - /** - * Validates if context and params are present. - * - * @param context Telemetry context map - * @param params Telemetry params map - * @return true if valid, false otherwise - */ - private static boolean validateRequest(Map context, Map params) { - return context != null && !context.isEmpty() && params != null && !params.isEmpty(); - } - -} \ No newline at end of file diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java deleted file mode 100644 index b761258a02..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.sunbird.telemetry.util; - -/** - * Enum to represent standard Telemetry parameters. - */ -public enum TelemetryParams { - /** - * Represents the channel ID. - */ - CHANNEL, - - /** - * Represents the environment ID. - */ - ENV, - - /** - * Represents the actor information. - */ - ACTOR; -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java deleted file mode 100644 index 441f6a4179..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.sunbird.telemetry.util; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.keys.JsonKey; -import org.sunbird.request.Request; - -/** - * Utility class for generating and processing telemetry events. - * Provides helper methods to construct telemetry objects and requests. - */ -public final class TelemetryUtil { - - private TelemetryUtil() {} - - /** - * Generates a target object map for telemetry. - * - * @param id The ID of the target object. - * @param type The type of the target object. - * @param currentState The current state of the object. - * @param prevState The previous state of the object. - * @return A map representing the target object. - */ - public static Map generateTargetObject( - String id, String type, String currentState, String prevState) { - - Map target = new HashMap<>(); - target.put(JsonKey.ID, id); - target.put(JsonKey.TYPE, StringUtils.capitalize(type)); - target.put(JsonKey.CURRENT_STATE, currentState); - target.put(JsonKey.PREV_STATE, prevState); - return target; - } - - /** - * Generates the telemetry request map. - * - * @param targetObject The target object map. - * @param correlatedObject List of correlated objects. - * @param eventType The type of telemetry event. - * @param params Additional parameters for the event. - * @param context The context map. - * @return A map representing the telemetry request. - */ - public static Map generateTelemetryRequest( - Map targetObject, - List> correlatedObject, - String eventType, - Map params, - Map context) { - - Map map = new HashMap<>(); - map.put(JsonKey.TARGET_OBJECT, targetObject); - map.put(JsonKey.CORRELATED_OBJECTS, correlatedObject); - map.put(JsonKey.TELEMETRY_EVENT_TYPE, eventType); - map.put(JsonKey.PARAMS, params); - map.put(JsonKey.CONTEXT, context); - return map; - } - - /** - * Generates a correlated object and adds it to the provided list. - * - * @param id The ID of the correlated object. - * @param type The type of the correlated object. - * @param correlation The relation string. - * @param correlationList The list to which the correlated object will be added. - */ - public static void generateCorrelatedObject( - String id, String type, String correlation, List> correlationList) { - - Map correlatedObject = new HashMap<>(); - correlatedObject.put(JsonKey.ID, id); - correlatedObject.put(JsonKey.TYPE, StringUtils.capitalize(type)); - correlatedObject.put(JsonKey.RELATION, correlation); - - correlationList.add(correlatedObject); - } - - /** - * Adds rollup data to the target object. - * - * @param rollUpMap The rollup map. - * @param targetObject The target object to modify. - */ - public static void addTargetObjectRollUp( - Map rollUpMap, Map targetObject) { - targetObject.put(JsonKey.ROLLUP, rollUpMap); - } - - /** - * Processes the telemetry call for Audit events. - * - * @param request The request properties map. - * @param targetObject The target object map. - * @param correlatedObject List of correlated objects. - * @param context The context map. - */ - public static void telemetryProcessingCall( - Map request, - Map targetObject, - List> correlatedObject, - Map context) { - Map params = new HashMap<>(); - params.put(JsonKey.PROPS, request); - Request req = new Request(); - req.setRequest( - TelemetryUtil.generateTelemetryRequest( - targetObject, correlatedObject, TelemetryEvents.AUDIT.getName(), params, context)); - generateTelemetry(req); - } - - /** - * Processes the telemetry call for Audit events with a specific type. - * - * @param type The type of the event. - * @param request The request properties map. - * @param targetObject The target object map. - * @param correlatedObject List of correlated objects. - * @param context The context map. - */ - public static void telemetryProcessingCall( - String type, - Map request, - Map targetObject, - List> correlatedObject, - Map context) { - Map params = new HashMap<>(); - params.put(JsonKey.PROPS, request); - params.put(JsonKey.TYPE, type); - Request req = new Request(); - req.setRequest( - TelemetryUtil.generateTelemetryRequest( - targetObject, correlatedObject, TelemetryEvents.AUDIT.getName(), params, context)); - generateTelemetry(req); - } - - /** - * Helper method to trigger the telemetry writer. - * - * @param request The request object containing telemetry data. - */ - private static void generateTelemetry(Request request) { - TelemetryWriter.write(request); - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java deleted file mode 100644 index d9e7a77fc7..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java +++ /dev/null @@ -1,137 +0,0 @@ -package org.sunbird.telemetry.util; - -import java.util.List; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.request.Request; -import org.sunbird.telemetry.collector.TelemetryAssemblerFactory; -import org.sunbird.telemetry.collector.TelemetryDataAssembler; -import org.sunbird.telemetry.validator.TelemetryObjectValidator; -import org.sunbird.telemetry.validator.TelemetryObjectValidatorV3; - -/** - * This class writes telemetry events to the configured logger. - * It processes different types of telemetry events such as AUDIT, SEARCH, ERROR, and LOG. - */ -public class TelemetryWriter { - - private static final TelemetryDataAssembler telemetryDataAssembler = - TelemetryAssemblerFactory.get(); - private static final TelemetryObjectValidator telemetryObjectValidator = - new TelemetryObjectValidatorV3(); - private static final LoggerUtil logger = new LoggerUtil(TelemetryWriter.class); - private static final Logger telemetryEventLogger = - LoggerFactory.getLogger("TelemetryEventLogger"); - - /** - * Private constructor to prevent instantiation. - */ - private TelemetryWriter() {} - - /** - * Writes the telemetry event based on the request content. - * - * @param request The request object containing telemetry data. - */ - public static void write(Request request) { - try { - String eventType = (String) request.getRequest().get(JsonKey.TELEMETRY_EVENT_TYPE); - - if (TelemetryEvents.AUDIT.getName().equalsIgnoreCase(eventType)) { - processAuditEvent(request); - } else if (TelemetryEvents.SEARCH.getName().equalsIgnoreCase(eventType)) { - processSearchEvent(request); - } else if (TelemetryEvents.ERROR.getName().equalsIgnoreCase(eventType)) { - processErrorEvent(request); - } else if (TelemetryEvents.LOG.getName().equalsIgnoreCase(eventType)) { - processLogEvent(request); - } - } catch (Exception ex) { - logger.info("Exception occurred while writing telemetry"); - } - } - - /** - * Processes LOG telemetry events. - * - * @param request The request object. - */ - private static void processLogEvent(Request request) { - Map context = (Map) request.getRequest().get(JsonKey.CONTEXT); - Map params = (Map) request.getRequest().get(JsonKey.PARAMS); - String telemetry = telemetryDataAssembler.log(context, params); - - // Validate and write telemetry event - if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateLog(telemetry)) { - telemetryEventLogger.info(telemetry); - } else { - logger.info( - "TelemetryWriter:processLogEvent: Audit Telemetry validation failed: " + telemetry); - } - } - - /** - * Processes ERROR telemetry events. - * - * @param request The request object. - */ - private static void processErrorEvent(Request request) { - Map context = (Map) request.get(JsonKey.CONTEXT); - Map params = (Map) request.get(JsonKey.PARAMS); - String telemetry = telemetryDataAssembler.error(context, params); - - // Validate and write telemetry event - if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateError(telemetry)) { - telemetryEventLogger.info(telemetry); - } - } - - /** - * Processes SEARCH telemetry events. - * - * @param request The request object. - */ - private static void processSearchEvent(Request request) { - Map context = (Map) request.get(JsonKey.CONTEXT); - Map params = (Map) request.get(JsonKey.PARAMS); - String telemetry = telemetryDataAssembler.search(context, params); - - // Validate and write telemetry event - if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateSearch(telemetry)) { - telemetryEventLogger.info(telemetry); - } - } - - /** - * Processes AUDIT telemetry events. - * - * @param request The request object. - */ - private static void processAuditEvent(Request request) { - Map context = (Map) request.get(JsonKey.CONTEXT); - Map targetObject = (Map) request.get(JsonKey.TARGET_OBJECT); - List> correlatedObjects = - (List>) request.get(JsonKey.CORRELATED_OBJECTS); - Map params = (Map) request.get(JsonKey.PARAMS); - Map props = (Map) params.get(JsonKey.PROPS); - - // Check for type in props and add to params if present - if (props != null && props.containsKey(JsonKey.TYPE)) { - String type = (String) props.get(JsonKey.TYPE); - params.put(JsonKey.TYPE, type); - } - params.put(JsonKey.TARGET_OBJECT, targetObject); - params.put(JsonKey.CORRELATED_OBJECTS, correlatedObjects); - - String telemetry = telemetryDataAssembler.audit(context, params); - - // Validate and write telemetry event - if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateAudit(telemetry)) { - telemetryEventLogger.info(telemetry); - } - } -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java deleted file mode 100644 index 7c1f79778a..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.sunbird.telemetry.validator; - -/** - * Interface for validating telemetry event objects against their schemas. - */ -public interface TelemetryObjectValidator { - - /** - * Validates an AUDIT telemetry event JSON string. - * - * @param jsonString The JSON string representation of the telemetry event. - * @return true if valid, false otherwise. - */ - boolean validateAudit(String jsonString); - - /** - * Validates a SEARCH telemetry event JSON string. - * - * @param jsonString The JSON string representation of the telemetry event. - * @return true if valid, false otherwise. - */ - boolean validateSearch(String jsonString); - - /** - * Validates a LOG telemetry event JSON string. - * - * @param jsonString The JSON string representation of the telemetry event. - * @return true if valid, false otherwise. - */ - boolean validateLog(String jsonString); - - /** - * Validates an ERROR telemetry event JSON string. - * - * @param jsonString The JSON string representation of the telemetry event. - * @return true if valid, false otherwise. - */ - boolean validateError(String jsonString); -} diff --git a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java b/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java deleted file mode 100644 index efb125f310..0000000000 --- a/core/sunbird-event-utils/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java +++ /dev/null @@ -1,285 +0,0 @@ -package org.sunbird.telemetry.validator; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import org.apache.commons.lang3.StringUtils; -import org.sunbird.keys.JsonKey; -import org.sunbird.logging.LoggerUtil; -import org.sunbird.telemetry.dto.Telemetry; -import org.sunbird.telemetry.util.TelemetryEvents; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Validator class for Version 3 Telemetry events. - * Implements the TelemetryObjectValidator interface to provide validation logic for various telemetry event types. - */ -public class TelemetryObjectValidatorV3 implements TelemetryObjectValidator { - - private static final LoggerUtil logger = new LoggerUtil(TelemetryObjectValidatorV3.class); - private static TelemetryObjectValidator telemetryObjectValidator = null; - private final ObjectMapper mapper = new ObjectMapper(); - - /** - * Returns the singleton instance of TelemetryObjectValidatorV3. - * - * @return The singleton instance. - */ - public static TelemetryObjectValidator getInstance() { - if (telemetryObjectValidator == null) { - telemetryObjectValidator = new TelemetryObjectValidatorV3(); - } - return telemetryObjectValidator; - } - - @Override - public boolean validateAudit(String jsonString) { - boolean validationSuccess = true; - List missingFields = new ArrayList<>(); - Telemetry telemetryObj = null; - try { - // Parse JSON string to Telemetry object - telemetryObj = mapper.readValue(jsonString, Telemetry.class); - - // Validate basic fields - validateBasics(telemetryObj, missingFields); - // Validate Audit specific data - validateAuditEventData(telemetryObj.getEdata(), missingFields); - - if (!missingFields.isEmpty()) { - logger.info( - "TelemetryObjectValidatorV3:validateAudit: Validation failed for event: " - + TelemetryEvents.AUDIT.getName() - + ". Missing required fields: " - + String.join(", ", missingFields)); - validationSuccess = false; - } - } catch (IOException e) { - validationSuccess = false; - logger.error("TelemetryObjectValidatorV3:validateAudit: Error parsing JSON: " + e.getMessage(), e); - } - return validationSuccess; - } - - @Override - public boolean validateSearch(String jsonString) { - boolean validationSuccess = true; - List missingFields = new ArrayList<>(); - Telemetry telemetryObj = null; - try { - // Parse JSON string to Telemetry object - telemetryObj = mapper.readValue(jsonString, Telemetry.class); - - // Validate basic fields - validateBasics(telemetryObj, missingFields); - // Validate Search specific data - validateSearchEventData(telemetryObj.getEdata(), missingFields); - - if (!missingFields.isEmpty()) { - logger.info( - "TelemetryObjectValidatorV3:validateSearch: Validation failed for event: " - + TelemetryEvents.SEARCH.getName() - + ". Missing required fields: " - + String.join(", ", missingFields)); - validationSuccess = false; - } - } catch (IOException e) { - validationSuccess = false; - logger.error("TelemetryObjectValidatorV3:validateSearch: Error parsing JSON: " + e.getMessage(), e); - } - return validationSuccess; - } - - /** - * Validates search event data structure. - * - * @param edata The event data map. - * @param missingFields List to populate with missing keys. - */ - private void validateSearchEventData(Map edata, List missingFields) { - if (edata == null || edata.isEmpty()) { - missingFields.add("edata"); - } else { - if (null == edata.get(JsonKey.QUERY)) { - missingFields.add(JsonKey.QUERY); - } - if (null == edata.get(JsonKey.SIZE)) { - missingFields.add(JsonKey.SIZE); - } - if (null == edata.get(JsonKey.TOPN)) { - missingFields.add(JsonKey.TOPN); - } - } - } - - /** - * Validates audit event data presence. - * - * @param edata The event data map. - * @param missingFields List to populate with missing keys. - */ - private void validateAuditEventData(Map edata, List missingFields) { - if (edata == null) { - missingFields.add("edata"); - } - } - - /** - * Validates basic telemetry fields (eid, mid, ver, actor, context). - * - * @param telemetryObj The telemetry object. - * @param missingFields List to populate with missing keys. - */ - private void validateBasics(Telemetry telemetryObj, List missingFields) { - // Check mandatory top-level fields - if (StringUtils.isBlank(telemetryObj.getEid())) { - missingFields.add("eid"); - } - if (StringUtils.isBlank(telemetryObj.getMid())) { - missingFields.add("mid"); - } - if (StringUtils.isBlank(telemetryObj.getVer())) { - missingFields.add("ver"); - } - - // Check actor details - if (null == telemetryObj.getActor()) { - missingFields.add("actor"); - } else { - if (StringUtils.isBlank(telemetryObj.getActor().getId())) { - missingFields.add("actor.id"); - } - if (StringUtils.isBlank(telemetryObj.getActor().getType())) { - missingFields.add("actor.type"); - } - } - - // Check context details - if (null == telemetryObj.getContext()) { - missingFields.add(JsonKey.CONTEXT); - } else { - if (StringUtils.isBlank(telemetryObj.getContext().getChannel())) { - missingFields.add(JsonKey.CONTEXT + "." + JsonKey.CHANNEL); - } - if (StringUtils.isBlank(telemetryObj.getContext().getEnv())) { - missingFields.add(JsonKey.CONTEXT + "." + JsonKey.ENV); - } - } - } - - /** - * Validates a LOG telemetry event. - * - * @param jsonString The JSON string representation of the telemetry event. - * @return true if valid, false otherwise. - */ - @Override - public boolean validateLog(String jsonString) { - boolean validationSuccess = true; - List missingFields = new ArrayList<>(); - Telemetry telemetryObj = null; - try { - // Parse JSON string to Telemetry object - telemetryObj = mapper.readValue(jsonString, Telemetry.class); - - // Validate basic fields - validateBasics(telemetryObj, missingFields); - // Validate Log specific data - validateLogEventData(telemetryObj.getEdata(), missingFields); - - if (!missingFields.isEmpty()) { - logger.info( - "TelemetryObjectValidatorV3:validateLog: Validation failed for event: " - + TelemetryEvents.LOG.getName() - + ". Missing required fields: " - + String.join(", ", missingFields)); - validationSuccess = false; - } - } catch (IOException e) { - validationSuccess = false; - logger.error("TelemetryObjectValidatorV3:validateLog: Error parsing JSON: " + e.getMessage(), e); - } - return validationSuccess; - } - - /** - * Validates log event data structure. - * - * @param edata The event data map. - * @param missingFields List to populate with missing keys. - */ - private void validateLogEventData(Map edata, List missingFields) { - if (edata == null || edata.isEmpty()) { - missingFields.add("edata"); - } else { - if (StringUtils.isBlank((String) edata.get(JsonKey.TYPE))) { - missingFields.add(JsonKey.TYPE); - } - if (StringUtils.isBlank((String) edata.get(JsonKey.LEVEL))) { - missingFields.add(JsonKey.LEVEL); - } - // TODO: remember and make this change at the time of re-factoring. - if (StringUtils.isBlank((String) edata.get(JsonKey.MESSAGE))) { - edata.remove(JsonKey.MESSAGE); - } - } - } - - /** - * Validates an ERROR telemetry event. - * - * @param jsonString The JSON string representation of the telemetry event. - * @return true if valid, false otherwise. - */ - @Override - public boolean validateError(String jsonString) { - boolean validationSuccess = true; - List missingFields = new ArrayList<>(); - Telemetry telemetryObj = null; - try { - // Parse JSON string to Telemetry object - telemetryObj = mapper.readValue(jsonString, Telemetry.class); - - // Validate basic fields - validateBasics(telemetryObj, missingFields); - // Validate Error specific data - validateErrorEventData(telemetryObj.getEdata(), missingFields); - - if (!missingFields.isEmpty()) { - logger.info( - "TelemetryObjectValidatorV3:validateError: Validation failed for event: " - + TelemetryEvents.ERROR.getName() - + ". Missing required fields: " - + String.join(", ", missingFields)); - validationSuccess = false; - } - } catch (IOException e) { - validationSuccess = false; - logger.error("TelemetryObjectValidatorV3:validateError: Error parsing JSON: " + e.getMessage(), e); - } - return validationSuccess; - } - - /** - * Validates error event data structure. - * - * @param edata The event data map. - * @param missingFields List to populate with missing keys. - */ - private void validateErrorEventData(Map edata, List missingFields) { - if (edata == null || edata.isEmpty()) { - missingFields.add("edata"); - } else { - if (StringUtils.isBlank((String) edata.get(JsonKey.ERROR))) { - missingFields.add(JsonKey.ERROR); - } - if (StringUtils.isBlank((String) edata.get(JsonKey.ERR_TYPE))) { - missingFields.add(JsonKey.ERR_TYPE); - } - if (StringUtils.isBlank((String) edata.get(JsonKey.STACKTRACE))) { - missingFields.add(JsonKey.STACKTRACE); - } - } - } -} From a10248cd33a11c2c744ba5d8ed71505d896802b9 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 13:19:05 +0530 Subject: [PATCH 11/17] feat: implement unified sunbird-platform-common - Added core/sunbird-platform-common module with consolidated utilities, logging, and telemetry. --- core/sunbird-platform-common/pom.xml | 371 +++++ .../auth/verifier/AccessTokenValidator.java | 340 +++++ .../org/sunbird/auth/verifier/Base64Util.java | 692 ++++++++++ .../org/sunbird/auth/verifier/CryptoUtil.java | 61 + .../org/sunbird/auth/verifier/KeyData.java | 53 + .../org/sunbird/auth/verifier/KeyManager.java | 87 ++ .../java/org/sunbird/common/ProjectUtil.java | 1220 +++++++++++++++++ .../org/sunbird/common/PropertiesCache.java | 148 ++ .../datasecurity/DataMaskingService.java | 78 ++ .../datasecurity/DecryptionService.java | 98 ++ .../datasecurity/EncryptionService.java | 83 ++ .../sunbird/datasecurity/OneWayHashing.java | 39 + .../datasecurity/impl/BASE64Decoder.java | 170 +++ .../datasecurity/impl/BASE64Encoder.java | 116 ++ .../datasecurity/impl/CharacterDecoder.java | 270 ++++ .../datasecurity/impl/CharacterEncoder.java | 401 ++++++ .../impl/DefaultDataMaskServiceImpl.java | 67 + .../impl/DefaultDecryptionServiceImpl.java | 217 +++ .../impl/DefaultEncryptionServiceImpl.java | 215 +++ .../datasecurity/impl/LogMaskServiceImpl.java | 40 + .../datasecurity/impl/ServiceFactory.java | 114 ++ .../exception/ProjectCommonException.java | 283 ++++ .../java/org/sunbird/http/HttpClientUtil.java | 380 +++++ .../main/java/org/sunbird/http/HttpUtil.java | 205 +++ .../kafka/InstructionEventGenerator.java | 148 ++ .../java/org/sunbird/kafka/KafkaClient.java | 193 +++ .../keycloak/KeyCloakConnectionProvider.java | 155 +++ .../KeycloakBruteForceAttackUtil.java | 106 ++ .../KeycloakRequiredActionLinkUtil.java | 157 +++ .../org/sunbird/keycloak/KeycloakUtil.java | 78 ++ .../java/org/sunbird/keycloak/SSOManager.java | 86 ++ .../sunbird/keycloak/SSOServiceFactory.java | 26 + .../keycloak/impl/KeyCloakRsaKeyFetcher.java | 134 ++ .../keycloak/impl/KeyCloakServiceImpl.java | 290 ++++ .../org/sunbird/keys/BulkUploadJsonKey.java | 16 + .../org/sunbird/keys/GeoLocationJsonKey.java | 18 + .../main/java/org/sunbird/keys/JsonKey.java | 958 +++++++++++++ .../java/org/sunbird/logging/AuditLog.java | 145 ++ .../org/sunbird/logging/CustomLogFormat.java | 88 ++ .../sunbird/logging/EntryExitLogEvent.java | 78 ++ .../java/org/sunbird/logging/LogEvent.java | 103 ++ .../java/org/sunbird/logging/LoggerEnum.java | 20 + .../java/org/sunbird/logging/LoggerUtil.java | 326 +++++ .../org/sunbird/logging/ProjectLogger.java | 247 ++++ .../org/sunbird/mail/GMailAuthenticator.java | 35 + .../main/java/org/sunbird/mail/SendEmail.java | 68 + .../org/sunbird/mail/SendgridConnection.java | 104 ++ .../operations/lms/ActorOperations.java | 196 +++ .../lms/BulkUploadActorOperation.java | 37 + .../lms/LocationActorOperation.java | 35 + .../operations/userorg/ActorOperations.java | 195 +++ .../java/org/sunbird/request/HeaderParam.java | 75 + .../java/org/sunbird/request/Request.java | 323 +++++ .../org/sunbird/request/RequestContext.java | 358 +++++ .../org/sunbird/request/RequestParams.java | 92 ++ .../sunbird/response/ClientErrorResponse.java | 45 + .../sunbird/response/HttpUtilResponse.java | 66 + .../java/org/sunbird/response/Params.java | 117 ++ .../java/org/sunbird/response/Response.java | 188 +++ .../org/sunbird/response/ResponseCode.java | 1026 ++++++++++++++ .../org/sunbird/response/ResponseMessage.java | 900 ++++++++++++ .../org/sunbird/response/ResponseParams.java | 128 ++ .../collector/TelemetryAssemblerFactory.java | 32 + .../collector/TelemetryDataAssembler.java | 45 + .../collector/TelemetryDataAssemblerImpl.java | 59 + .../java/org/sunbird/telemetry/dto/Actor.java | 64 + .../org/sunbird/telemetry/dto/Context.java | 150 ++ .../org/sunbird/telemetry/dto/Producer.java | 100 ++ .../org/sunbird/telemetry/dto/Target.java | 107 ++ .../org/sunbird/telemetry/dto/Telemetry.java | 227 +++ .../telemetry/dto/TelemetryBEEvent.java | 234 ++++ .../telemetry/dto/TelemetryBJREvent.java | 144 ++ .../telemetry/dto/TelemetryEnvKey.java | 56 + .../telemetry/util/TelemetryConstant.java | 14 + .../telemetry/util/TelemetryEvents.java | 40 + .../telemetry/util/TelemetryGenerator.java | 464 +++++++ .../telemetry/util/TelemetryParams.java | 21 + .../sunbird/telemetry/util/TelemetryUtil.java | 149 ++ .../telemetry/util/TelemetryWriter.java | 137 ++ .../validator/TelemetryObjectValidator.java | 39 + .../validator/TelemetryObjectValidatorV3.java | 285 ++++ .../java/org/sunbird/url/URLShortner.java | 18 + .../java/org/sunbird/url/URLShortnerImpl.java | 87 ++ .../org/sunbird/utils/CloudStorageUtil.java | 168 +++ .../java/org/sunbird/utils/ConfigUtil.java | 124 ++ .../java/org/sunbird/utils/EsConfigUtil.java | 26 + .../java/org/sunbird/utils/ExcelFileUtil.java | 89 ++ .../main/java/org/sunbird/utils/FileUtil.java | 60 + .../main/java/org/sunbird/utils/JsonUtil.java | 146 ++ .../main/java/org/sunbird/utils/Matcher.java | 35 + .../main/java/org/sunbird/utils/RestUtil.java | 112 ++ .../src/main/java/org/sunbird/utils/Slug.java | 138 ++ .../org/sunbird/utils/StringFormatter.java | 55 + .../java/org/sunbird/utils/TableNameUtil.java | 26 + .../validators/BaseRequestValidator.java | 541 ++++++++ .../sunbird/validators/EmailValidator.java | 37 + .../LearnerStateRequestValidator.java | 49 + .../sunbird/validators/PhoneValidator.java | 119 ++ .../sunbird/validators/RequestValidator.java | 1099 +++++++++++++++ .../UserFreeUpRequestValidator.java | 106 ++ .../orgvalidator/BaseOrgRequestValidator.java | 35 + .../orgvalidator/KeyManagementValidator.java | 88 ++ .../orgvalidator/OrgRequestValidator.java | 208 +++ .../src/main/resources/OTPSMSTemplate.vm | 1 + .../main/resources/acceptFlagMailTemplate.vm | 153 +++ .../src/main/resources/application.conf | 3 + .../resources/cassandra.config.properties | 9 + .../resources/cassandratablecolumn.properties | 264 ++++ .../resources/contentFlaggedMailTemplate.vm | 153 +++ .../resources/contentReviewMailTemplate.vm | 153 +++ .../src/main/resources/dbconfig.properties | 6 + .../resources/elasticsearch.config.properties | 3 + .../src/main/resources/emailtemplate.vm | 153 +++ .../resources/externalresource.properties | 179 +++ .../main/resources/forgotPasswordWithOTP.vm | 137 ++ .../src/main/resources/forgotpassword.vm | 164 +++ .../main/resources/mailTemplates.properties | 5 + .../resources/profilecompleteness.properties | 6 + .../resources/publishContentMailTemplate.vm | 153 +++ .../resources/rejectContentMailTemplate.vm | 153 +++ .../main/resources/rejectFlagMailTemplate.vm | 153 +++ .../src/main/resources/sso.properties | 4 + .../unlistedPublishContentMailTemplate.vm | 153 +++ .../main/resources/userencryption.properties | 6 + .../src/main/resources/welcomeMailTemplate.vm | 145 ++ .../src/main/resources/welcomeSmsTemplate.vm | 2 + 126 files changed, 20999 insertions(+) create mode 100644 core/sunbird-platform-common/pom.xml create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/common/ProjectUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/common/PropertiesCache.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeyCloakConnectionProvider.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakBruteForceAttackUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakRequiredActionLinkUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOManager.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOServiceFactory.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakRsaKeyFetcher.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakServiceImpl.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/logging/AuditLog.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/logging/CustomLogFormat.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/logging/EntryExitLogEvent.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/logging/LogEvent.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerEnum.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/logging/ProjectLogger.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendEmail.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/ActorOperations.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/BulkUploadActorOperation.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/LocationActorOperation.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/operations/userorg/ActorOperations.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/request/HeaderParam.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/request/Request.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestContext.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestParams.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/response/HttpUtilResponse.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/response/Params.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/response/Response.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseCode.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseMessage.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseParams.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Context.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Telemetry.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortner.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/CloudStorageUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/ConfigUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/EsConfigUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/ExcelFileUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/FileUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/JsonUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/Matcher.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/RestUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/Slug.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/StringFormatter.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/utils/TableNameUtil.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/BaseRequestValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/EmailValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/LearnerStateRequestValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/PhoneValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/RequestValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/UserFreeUpRequestValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/BaseOrgRequestValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/KeyManagementValidator.java create mode 100644 core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/OrgRequestValidator.java create mode 100644 core/sunbird-platform-common/src/main/resources/OTPSMSTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/acceptFlagMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/application.conf create mode 100644 core/sunbird-platform-common/src/main/resources/cassandra.config.properties create mode 100644 core/sunbird-platform-common/src/main/resources/cassandratablecolumn.properties create mode 100644 core/sunbird-platform-common/src/main/resources/contentFlaggedMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/contentReviewMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/dbconfig.properties create mode 100644 core/sunbird-platform-common/src/main/resources/elasticsearch.config.properties create mode 100644 core/sunbird-platform-common/src/main/resources/emailtemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/externalresource.properties create mode 100644 core/sunbird-platform-common/src/main/resources/forgotPasswordWithOTP.vm create mode 100644 core/sunbird-platform-common/src/main/resources/forgotpassword.vm create mode 100644 core/sunbird-platform-common/src/main/resources/mailTemplates.properties create mode 100644 core/sunbird-platform-common/src/main/resources/profilecompleteness.properties create mode 100644 core/sunbird-platform-common/src/main/resources/publishContentMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/rejectContentMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/rejectFlagMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/sso.properties create mode 100644 core/sunbird-platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/userencryption.properties create mode 100644 core/sunbird-platform-common/src/main/resources/welcomeMailTemplate.vm create mode 100644 core/sunbird-platform-common/src/main/resources/welcomeSmsTemplate.vm diff --git a/core/sunbird-platform-common/pom.xml b/core/sunbird-platform-common/pom.xml new file mode 100644 index 0000000000..ef06f7b47d --- /dev/null +++ b/core/sunbird-platform-common/pom.xml @@ -0,0 +1,371 @@ + + + + + org.sunbird + core + 1.0-SNAPSHOT + + + 4.0.0 + sunbird-platform-common + 1.0-SNAPSHOT + Sunbird Platform Common + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + ch.qos.logback + logback-core + ${logback.version} + + + net.logstash.logback + logstash-logback-encoder + ${logstash-logback-encoder.version} + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + + + + + org.apache.pekko + pekko-actor_2.13 + ${pekko.version} + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-collections + commons-collections + ${commons-collections.version} + + + commons-validator + commons-validator + ${commons-validator.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + + com.mashape.unirest + unirest-java + ${unirest.version} + + + + + org.apache.httpcomponents + httpclient + ${httpcomponents.httpclient.version} + + + org.apache.httpcomponents + httpcore + ${httpcomponents.httpcore.version} + + + org.apache.httpcomponents + httpmime + ${httpcomponents.httpmime.version} + + + + + org.apache.velocity + velocity-tools + ${velocity-tools.version} + + + commons-collections + commons-collections + + + + + + + org.keycloak + keycloak-admin-client + ${keycloak.version} + + + org.jboss.resteasy + jaxrs-api + ${jaxrs-api.version} + + + org.jboss.resteasy + resteasy-client + ${resteasy-client.version} + + + org.jboss.resteasy + resteasy-jackson2-provider + ${resteasy-jackson2-provider.version} + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + + + + + com.googlecode.libphonenumber + libphonenumber + ${libphonenumber.version} + + + + + com.google.guava + guava + ${guava.version} + + + + + org.scala-lang + scala-library + 2.13.12 + + + + + com.moparisthebest + junidecode + 0.1.1 + + + + + org.apache.poi + poi-ooxml + 3.17 + + + org.apache.xmlbeans + xmlbeans + + + + + org.apache.xmlbeans + xmlbeans + 3.0.0 + + + + + org.sunbird + cloud-store-sdk_2.13 + ${cloud-store-sdk.version} + + + org.apache.avro + avro + + + org.apache.zookeeper + zookeeper + + + com.sun.jersey + jersey-core + + + com.sun.jersey + jersey-server + + + slf4j-log4j12 + org.slf4j + + + io.netty + * + + + ch.qos.reload4j + reload4j + + + org.slf4j + slf4j-reload4j + + + org.yaml + snakeyaml + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.datatype + * + + + com.fasterxml.jackson.dataformat + * + + + com.fasterxml.jackson.module + * + + + com.google.inject.extensions + * + + + + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + ${elasticsearch.version} + + + org.apache.httpcomponents + httpasyncclient + + + org.apache.httpcomponents + httpcore-nio + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpcore + + + + + + + com.datastax.cassandra + cassandra-driver-core + ${cassandra.driver.version} + + + io.netty + * + + + com.google.guava + guava + + + + + + + junit + junit + ${junit.version} + test + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + junit + junit + + + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + + org.apache.kafka + kafka-clients + ${kafka.version} + + + + org.playframework + play_2.13 + ${play2.version} + + + + + + cloud-store + https://oss.sonatype.org/content/repositories/orgsunbird-1021 + + + + diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java new file mode 100644 index 0000000000..b684041041 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/AccessTokenValidator.java @@ -0,0 +1,340 @@ +package org.sunbird.auth.verifier; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Map; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.keycloak.common.util.Time; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; + +public class AccessTokenValidator { + + private static final LoggerUtil logger = new LoggerUtil(AccessTokenValidator.class); + private static final ObjectMapper mapper = new ObjectMapper(); + + private static final String sso_url = System.getenv(JsonKey.SUNBIRD_SSO_URL); + // Preserving the typo RELAM if it exists in JsonKey, but usually it should be REALM. + // Assuming original code was correct about the constant name. + private static final String realm = System.getenv(JsonKey.SUNBIRD_SSO_RELAM); + + /** + * Validates the access token. Checks signature and expiration. + * + * @param token The JWT access token string. + * @param requestContext Context for logging/tracing. + * @return Map containing the token claims if valid, empty map otherwise. + * @throws JsonProcessingException if token parsing fails. + */ + public static Map validateToken(String token, Map requestContext) + throws JsonProcessingException { + return validateToken(token, requestContext, true); + } + + /** + * Validates the access token, with optional expiration check. + * + * @param token The JWT access token string. + * @param checkActive If true, checks the 'exp' claim. + * @return Map containing the token claims if valid, empty map otherwise. + * @throws JsonProcessingException if token parsing fails. + */ + public static Map validateToken(String token, boolean checkActive) throws JsonProcessingException { + return validateToken(token, null, checkActive); + } + + /** + * Validates the access token with expiration check enabled (default). + * + * @param token The JWT access token string. + * @return Map containing the token claims if valid, empty map otherwise. + * @throws JsonProcessingException if token parsing fails. + */ + public static Map validateToken(String token) throws JsonProcessingException { + return validateToken(token, null, true); + } + + /** + * Internal method to validate the token. + * + *

This method performs the following steps: + *

    + *
  1. Splits the token into header, body, and signature.
  2. + *
  3. Decodes the header to retrieve the Key ID (kid).
  4. + *
  5. Verifies the RSA signature using the public key associated with the kid.
  6. + *
  7. If the signature is valid, decodes the body.
  8. + *
  9. Optionally checks if the token has expired.
  10. + *
+ * + * @param token The JWT token string. + * @param requestContext The request context (can be null). + * @param checkExpiry Whether to validate the 'exp' claim. + * @return The token body as a Map if valid; otherwise, an empty Map. + * @throws JsonProcessingException If the header or body cannot be parsed as JSON. + */ + private static Map validateToken(String token, Map requestContext, boolean checkExpiry) + throws JsonProcessingException { + String[] tokenElements = token.split("\\."); + // Basic JWT format check + if (tokenElements.length != 3) { + logger.info("Invalid token format: " + token); + return Collections.emptyMap(); + } + + String header = tokenElements[0]; + String body = tokenElements[1]; + String signature = tokenElements[2]; + String payLoad = header + JsonKey.DOT_SEPARATOR + body; + + // Decode header to get Key ID + Map headerData = + mapper.readValue(new String(decodeFromBase64(header), StandardCharsets.UTF_8), Map.class); + String keyId = headerData.get("kid").toString(); + + // Verify Signature + boolean isValid = CryptoUtil.verifyRSASign( + payLoad, + decodeFromBase64(signature), + KeyManager.getPublicKey(keyId).getPublicKey(), + JsonKey.SHA_256_WITH_RSA); + + if (isValid) { + Map tokenBody = + mapper.readValue(new String(decodeFromBase64(body), StandardCharsets.UTF_8), Map.class); + + if (checkExpiry) { + boolean isExp = isExpired((Integer) tokenBody.get("exp")); + if (isExp) { + logger.info("AccessTokenValidator: Token expired. Context: " + requestContext); + return Collections.emptyMap(); + } + } + return tokenBody; + } + return Collections.emptyMap(); + } + + /** + * Managed user token verification. + * Validates the token and ensures the requested user IDs match the token claims. + * + * @param managedEncToken The managed token string. + * @param requestedByUserId User ID of the requester (must match parent). + * @param requestedForUserId User ID of the target user (must match sub). + * @param loggingHeaders Headers for logging logic. + * @return The managed user ID if valid, unauthorized otherwise. + */ + public static String verifyManagedUserToken( + String managedEncToken, String requestedByUserId, String requestedForUserId, String loggingHeaders) { + return verifyManagedUserToken(managedEncToken, requestedByUserId, requestedForUserId, null, loggingHeaders); + } + + /** + * managedtoken is validated and requestedByUserID, requestedForUserID values are validated + * aganist the managedEncToken + * + * @param managedEncToken + * @param requestedByUserId + * @param requestedForUserId + * @param requestContext + * @return + */ + public static String verifyManagedUserToken( + String managedEncToken, + String requestedByUserId, + String requestedForUserId, + Map requestContext) { + return verifyManagedUserToken(managedEncToken, requestedByUserId, requestedForUserId, requestContext, null); + } + + public static String verifyManagedUserToken(String managedEncToken, String requestedByUserId) { + return verifyManagedUserToken(managedEncToken, requestedByUserId, null, null, null); + } + + private static String verifyManagedUserToken( + String managedEncToken, + String requestedByUserId, + String requestedForUserId, + Map requestContext, + String loggingHeaders) { + String managedFor = JsonKey.UNAUTHORIZED; + try { + Map payload; + if (requestContext != null) { + payload = validateToken(managedEncToken, requestContext); + } else { + payload = validateToken(managedEncToken, true); + } + + if (MapUtils.isNotEmpty(payload)) { + String parentId = (String) payload.get(JsonKey.PARENT_ID); + String muaId = (String) payload.get(JsonKey.SUB); + + String logMsg = String.format( + "AccessTokenValidator:verifyManagedUserToken: Parent: %s, ManagedBy: %s, RequestedBy: %s", + parentId, muaId, requestedByUserId); + + if (StringUtils.isNotEmpty(requestedForUserId)) { + logMsg += ", RequestedFor: " + requestedForUserId; + } + if (requestContext != null) { + logMsg += ", Context: " + requestContext; + } + + logger.info(logMsg); + + boolean isValid = parentId.equalsIgnoreCase(requestedByUserId); + if (StringUtils.isNotEmpty(requestedForUserId) && !muaId.equalsIgnoreCase(requestedForUserId)) { + logger.info(String.format( + "AccessTokenValidator:verifyManagedUserToken: Mismatch! RequestedFor: %s, ManagedBy: %s, Headers: %s", + requestedForUserId, muaId, loggingHeaders)); + // If requestedForUserId is present, it MUST match muaId for the token to be valid for that target + if (isValid) { + isValid = muaId.equalsIgnoreCase(requestedForUserId); + } + } + + if (isValid) { + managedFor = muaId; + } + } + } catch (Exception ex) { + String errorMsg = "Exception in verifyManagedUserToken: Token : " + managedEncToken; + if (requestContext != null) { + errorMsg += ", request context data :" + requestContext; + } + logger.error(errorMsg, ex); + } + return managedFor; + } + + /** + * Verifies the user access token. + * + * @param token The JWT access token. + * @param checkActive Whether to check for token expiration. + * @return The user ID from the token if valid, unauthorized otherwise. + */ + public static String verifyUserToken(String token, boolean checkActive) { + return verifyUserToken(token, null, checkActive); + } + + /** + * Verifies the user access token. + * + * @param token The JWT access token. + * @param requestContext Context for logging/tracing. + * @return The user ID from the token if valid, unauthorized otherwise. + */ + public static String verifyUserToken(String token, Map requestContext) { + return verifyUserToken(token, requestContext, true); + } + + /** + * Verifies the user access token with default expiration check. + * + * @param token The JWT access token. + * @return The user ID from the token if valid, unauthorized otherwise. + */ + public static String verifyUserToken(String token) { + return verifyUserToken(token, null, true); + } + + private static String verifyUserToken(String token, Map requestContext, boolean checkActive) { + String userId = JsonKey.UNAUTHORIZED; + try { + Map payload; + if (requestContext != null) { + payload = validateToken(token, requestContext); + logger.debug( + String.format("AccessTokenValidator:verifyUserToken: Payload: %s, Context: %s", + payload, requestContext)); + } else { + payload = validateToken(token, checkActive); + } + + if (MapUtils.isNotEmpty(payload) && checkIss((String) payload.get("iss"))) { + userId = (String) payload.get(JsonKey.SUB); + if (StringUtils.isNotBlank(userId)) { + int pos = userId.lastIndexOf(":"); + userId = userId.substring(pos + 1); + } + } + } catch (Exception ex) { + String errorMsg = "Exception in verifyUserAccessToken: Token : " + token; + if (requestContext != null) { + errorMsg += ", request context data :" + requestContext; + } + logger.error(errorMsg, ex); + } + + if (JsonKey.UNAUTHORIZED.equalsIgnoreCase(userId) && requestContext != null) { + logger.info( + String.format("AccessTokenValidator:verifyUserToken: Invalid Token. Context: %s", requestContext)); + } + + return userId; + } + + /** + * Verifies the user token against a specific source URL. + * + * @param token The JWT access token string. + * @param url The source URL (SSO URL). If null, defaults to environment SUNBIRD_SSO_URL. + * @param requestContext Context for logging/tracing. + * @return The userId from the token if valid, otherwise JsonKey.UNAUTHORIZED. + */ + public static String verifySourceUserToken(String token, String url, Map requestContext) { + String userId = JsonKey.UNAUTHORIZED; + try { + Map payload = validateToken(token, requestContext); + if (requestContext != null) { + logger.debug( + String.format("AccessTokenValidator:verifySourceUserToken: Payload: %s, Context: %s", + payload, requestContext)); + } + + if (MapUtils.isNotEmpty(payload) && checkSourceIss((String) payload.get("iss"), url)) { + userId = (String) payload.get(JsonKey.SUB); + if (StringUtils.isNotBlank(userId)) { + int pos = userId.lastIndexOf(":"); + userId = userId.substring(pos + 1); + } + } + } catch (Exception ex) { + String errorMsg = "Exception in verifySourceUserToken: Token : " + token; + if (requestContext != null) { + errorMsg += ", request context data :" + requestContext; + } + logger.error(errorMsg, ex); + } + + if (JsonKey.UNAUTHORIZED.equalsIgnoreCase(userId) && requestContext != null) { + logger.info( + String.format("AccessTokenValidator:verifySourceUserToken: Invalid Source Token. Context: %s", requestContext)); + } + return userId; + } + + private static boolean checkSourceIss(String iss, String url) { + String ssoUrl = (url != null ? url : sso_url); + String realmUrl = ssoUrl + "realms/" + realm; + return (realmUrl.equalsIgnoreCase(iss)); + } + + private static boolean checkIss(String iss) { + String realmUrl = sso_url + "realms/" + realm; + return (realmUrl.equalsIgnoreCase(iss)); + } + + private static boolean isExpired(Integer expiration) { + return (Time.currentTime() > expiration); + } + + private static byte[] decodeFromBase64(String data) { + return Base64Util.decode(data, 11); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java new file mode 100644 index 0000000000..cfe4bba79d --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/Base64Util.java @@ -0,0 +1,692 @@ +package org.sunbird.auth.verifier; + +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.UnsupportedEncodingException; + +/** + * Utilities for encoding and decoding the Base64 representation of binary data. See RFCs 2045 and 3548. + */ +public class Base64Util { + /** Default values for encoder/decoder flags. */ + public static final int DEFAULT = 0; + + /** Encoder flag bit to omit the padding '=' characters at the end of the output (if any). */ + public static final int NO_PADDING = 1; + + /** Encoder flag bit to omit all line terminators (i.e., the output will be on one long line). */ + public static final int NO_WRAP = 2; + + /** + * Encoder flag bit to indicate lines should be terminated with a CRLF pair instead of just an LF. + * Has no effect if {@code NO_WRAP} is specified as well. + */ + public static final int CRLF = 4; + + /** + * Encoder/decoder flag bit to indicate using the "URL and filename safe" variant of Base64 (see + * RFC 3548 section 4) where {@code -} and {@code _} are used in place of {@code +} and {@code /}. + */ + public static final int URL_SAFE = 8; + + /** + * Flag to pass to {Base64OutputStream} to indicate that it should not close the output stream it + * is wrapping when it itself is closed. + */ + public static final int NO_CLOSE = 16; + + // -------------------------------------------------------- + // shared code + // -------------------------------------------------------- + + private Base64Util() {} // don't instantiate + + // -------------------------------------------------------- + // decoding + // -------------------------------------------------------- + + /** + * Decode the Base64-encoded data in input and return the data in a new byte array. + * + *

+ * + *

The padding '=' characters at the end are considered optional, but if any are present, there + * must be the correct number of them. + * + * @param str the input String to decode, which is converted to bytes using the default charset + * @param flags controls certain features of the decoded output. Pass {@code DEFAULT} to decode + * standard Base64. + * @throws IllegalArgumentException if the input contains incorrect padding + */ + public static byte[] decode(String str, int flags) { + return decode(str.getBytes(), flags); + } + + /** + * Decode the Base64-encoded data in input and return the data in a new byte array. + * + *

+ * + *

The padding '=' characters at the end are considered optional, but if any are present, there + * must be the correct number of them. + * + * @param input the input array to decode + * @param flags controls certain features of the decoded output. Pass {@code DEFAULT} to decode + * standard Base64. + * @throws IllegalArgumentException if the input contains incorrect padding + */ + public static byte[] decode(byte[] input, int flags) { + return decode(input, 0, input.length, flags); + } + + /** + * Decode the Base64-encoded data in input and return the data in a new byte array. + * + *

+ * + *

The padding '=' characters at the end are considered optional, but if any are present, there + * must be the correct number of them. + * + * @param input the data to decode + * @param offset the position within the input array at which to start + * @param len the number of bytes of input to decode + * @param flags controls certain features of the decoded output. Pass {@code DEFAULT} to decode + * standard Base64. + * @throws IllegalArgumentException if the input contains incorrect padding + */ + public static byte[] decode(byte[] input, int offset, int len, int flags) { + // Allocate space for the most data the input could represent. + // (It could contain less if it contains whitespace, etc.) + Decoder decoder = new Decoder(flags, new byte[len * 3 / 4]); + + if (!decoder.process(input, offset, len, true)) { + throw new IllegalArgumentException("bad base-64"); + } + + // Maybe we got lucky and allocated exactly enough output space. + if (decoder.op == decoder.output.length) { + return decoder.output; + } + + // Need to shorten the array, so allocate a new one of the + // right size and copy. + byte[] temp = new byte[decoder.op]; + System.arraycopy(decoder.output, 0, temp, 0, decoder.op); + return temp; + } + + /** + * Base64-encode the given data and return a newly allocated String with the result. + * + * @param input the data to encode + * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results + * in output that adheres to RFC 2045. + */ + public static String encodeToString(byte[] input, int flags) { + try { + return new String(encode(input, flags), "US-ASCII"); + } catch (UnsupportedEncodingException e) { + // US-ASCII is guaranteed to be available. + throw new AssertionError(e); + } + } + + // -------------------------------------------------------- + // encoding + // -------------------------------------------------------- + + /** + * Base64-encode the given data and return a newly allocated String with the result. + * + * @param input the data to encode + * @param offset the position within the input array at which to start + * @param len the number of bytes of input to encode + * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results + * in output that adheres to RFC 2045. + */ + public static String encodeToString(byte[] input, int offset, int len, int flags) { + try { + return new String(encode(input, offset, len, flags), "US-ASCII"); + } catch (UnsupportedEncodingException e) { + // US-ASCII is guaranteed to be available. + throw new AssertionError(e); + } + } + + /** + * Base64-encode the given data and return a newly allocated byte[] with the result. + * + * @param input the data to encode + * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results + * in output that adheres to RFC 2045. + */ + public static byte[] encode(byte[] input, int flags) { + return encode(input, 0, input.length, flags); + } + + /** + * Base64-encode the given data and return a newly allocated byte[] with the result. + * + * @param input the data to encode + * @param offset the position within the input array at which to start + * @param len the number of bytes of input to encode + * @param flags controls certain features of the encoded output. Passing {@code DEFAULT} results + * in output that adheres to RFC 2045. + */ + public static byte[] encode(byte[] input, int offset, int len, int flags) { + Encoder encoder = new Encoder(flags, null); + + // Compute the exact length of the array we will produce. + int output_len = len / 3 * 4; + + // Account for the tail of the data and the padding bytes, if any. + if (encoder.do_padding) { + if (len % 3 > 0) { + output_len += 4; + } + } else { + switch (len % 3) { + case 0: + break; + case 1: + output_len += 2; + break; + case 2: + output_len += 3; + break; + } + } + + // Account for the newlines, if any. + if (encoder.do_newline && len > 0) { + output_len += (((len - 1) / (3 * Encoder.LINE_GROUPS)) + 1) * (encoder.do_cr ? 2 : 1); + } + + encoder.output = new byte[output_len]; + encoder.process(input, offset, len, true); + + assert encoder.op == output_len; + + return encoder.output; + } + + /* package */ abstract static class Coder { + public byte[] output; + public int op; + + /** + * Encode/decode another block of input data. this.output is provided by the caller, and must be + * big enough to hold all the coded data. On exit, this.opwill be set to the length of the coded + * data. + * + * @param finish true if this is the final call to process for this object. Will finalize the + * coder state and include any final bytes in the output. + * @return true if the input so far is good; false if some error has been detected in the input + * stream.. + */ + public abstract boolean process(byte[] input, int offset, int len, boolean finish); + + /** + * @return the maximum number of bytes a call to process() could produce for the given number of + * input bytes. This may be an overestimate. + */ + public abstract int maxOutputSize(int len); + } + + /* package */ static class Decoder extends Coder { + /** Lookup table for turning bytes into their position in the Base64 alphabet. */ + private static final int DECODE[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + }; + + /** + * Decode lookup table for the "web safe" variant (RFC 3548 sec. 4) where - and _ replace + and + * /. + */ + private static final int DECODE_WEBSAFE[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + }; + + /** Non-data values in the DECODE arrays. */ + private static final int SKIP = -1; + + private static final int EQUALS = -2; + private final int[] alphabet; + /** + * States 0-3 are reading through the next input tuple. State 4 is having read one '=' and + * expecting exactly one more. State 5 is expecting no more data or padding characters in the + * input. State 6 is the error state; an error has been detected in the input and no future + * input can "fix" it. + */ + private int state; // state number (0 to 6) + + private int value; + + public Decoder(int flags, byte[] output) { + this.output = output; + + alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE; + state = 0; + value = 0; + } + + /** @return an overestimate for the number of bytes {@code len} bytes could decode to. */ + public int maxOutputSize(int len) { + return len * 3 / 4 + 10; + } + + /** + * Decode another block of input data. + * + * @return true if the state machine is still healthy. false if bad base-64 data has been + * detected in the input stream. + */ + public boolean process(byte[] input, int offset, int len, boolean finish) { + if (this.state == 6) return false; + + int p = offset; + len += offset; + + // Using local variables makes the decoder about 12% + // faster than if we manipulate the member variables in + // the loop. (Even alphabet makes a measurable + // difference, which is somewhat surprising to me since + // the member variable is final.) + int state = this.state; + int value = this.value; + int op = 0; + final byte[] output = this.output; + final int[] alphabet = this.alphabet; + + while (p < len) { + // Try the fast path: we're starting a new tuple and the + // next four bytes of the input stream are all data + // bytes. This corresponds to going through states + // 0-1-2-3-0. We expect to use this method for most of + // the data. + // + // If any of the next four bytes of input are non-data + // (whitespace, etc.), value will end up negative. (All + // the non-data values in decode are small negative + // numbers, so shifting any of them up and or'ing them + // together will result in a value with its top bit set.) + // + // You can remove this whole block and the output should + // be the same, just slower. + if (state == 0) { + while (p + 4 <= len + && (value = + ((alphabet[input[p] & 0xff] << 18) + | (alphabet[input[p + 1] & 0xff] << 12) + | (alphabet[input[p + 2] & 0xff] << 6) + | (alphabet[input[p + 3] & 0xff]))) + >= 0) { + output[op + 2] = (byte) value; + output[op + 1] = (byte) (value >> 8); + output[op] = (byte) (value >> 16); + op += 3; + p += 4; + } + if (p >= len) break; + } + + // The fast path isn't available -- either we've read a + // partial tuple, or the next four input bytes aren't all + // data, or whatever. Fall back to the slower state + // machine implementation. + + int d = alphabet[input[p++] & 0xff]; + + switch (state) { + case 0: + if (d >= 0) { + value = d; + ++state; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 1: + if (d >= 0) { + value = (value << 6) | d; + ++state; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 2: + if (d >= 0) { + value = (value << 6) | d; + ++state; + } else if (d == EQUALS) { + // Emit the last (partial) output tuple; + // expect exactly one more padding character. + output[op++] = (byte) (value >> 4); + state = 4; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 3: + if (d >= 0) { + // Emit the output triple and return to state 0. + value = (value << 6) | d; + output[op + 2] = (byte) value; + output[op + 1] = (byte) (value >> 8); + output[op] = (byte) (value >> 16); + op += 3; + state = 0; + } else if (d == EQUALS) { + // Emit the last (partial) output tuple; + // expect no further data or padding characters. + output[op + 1] = (byte) (value >> 2); + output[op] = (byte) (value >> 10); + op += 2; + state = 5; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 4: + if (d == EQUALS) { + ++state; + } else if (d != SKIP) { + this.state = 6; + return false; + } + break; + + case 5: + if (d != SKIP) { + this.state = 6; + return false; + } + break; + } + } + + if (!finish) { + // We're out of input, but a future call could provide + // more. + this.state = state; + this.value = value; + this.op = op; + return true; + } + + // Done reading input. Now figure out where we are left in + // the state machine and finish up. + + switch (state) { + case 0: + // Output length is a multiple of three. Fine. + break; + case 1: + // Read one extra input byte, which isn't enough to + // make another output byte. Illegal. + this.state = 6; + return false; + case 2: + // Read two extra input bytes, enough to emit 1 more + // output byte. Fine. + output[op++] = (byte) (value >> 4); + break; + case 3: + // Read three extra input bytes, enough to emit 2 more + // output bytes. Fine. + output[op++] = (byte) (value >> 10); + output[op++] = (byte) (value >> 2); + break; + case 4: + // Read one padding '=' when we expected 2. Illegal. + this.state = 6; + return false; + case 5: + // Read all the padding '='s we expected and no more. + // Fine. + break; + } + + this.state = state; + this.op = op; + return true; + } + } + + /* package */ static class Encoder extends Coder { + /** + * Emit a new line every this many output tuples. Corresponds to a 76-character line length (the + * maximum allowable according to RFC 2045). + */ + public static final int LINE_GROUPS = 19; + + /** Lookup table for turning Base64 alphabet positions (6 bits) into output bytes. */ + private static final byte ENCODE[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', + }; + + /** Lookup table for turning Base64 alphabet positions (6 bits) into output bytes. */ + private static final byte ENCODE_WEBSAFE[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', + }; + + public final boolean do_padding; + public final boolean do_newline; + public final boolean do_cr; + private final byte[] tail; + private final byte[] alphabet; + /* package */ int tailLen; + private int count; + + public Encoder(int flags, byte[] output) { + this.output = output; + + do_padding = (flags & NO_PADDING) == 0; + do_newline = (flags & NO_WRAP) == 0; + do_cr = (flags & CRLF) != 0; + alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE; + + tail = new byte[2]; + tailLen = 0; + + count = do_newline ? LINE_GROUPS : -1; + } + + /** @return an overestimate for the number of bytes {@code len} bytes could encode to. */ + public int maxOutputSize(int len) { + return len * 8 / 5 + 10; + } + + public boolean process(byte[] input, int offset, int len, boolean finish) { + // Using local variables makes the encoder about 9% faster. + final byte[] alphabet = this.alphabet; + final byte[] output = this.output; + int op = 0; + int count = this.count; + + int p = offset; + len += offset; + int v = -1; + + // First we need to concatenate the tail of the previous call + // with any input bytes available now and see if we can empty + // the tail. + + switch (tailLen) { + case 0: + // There was no tail. + break; + + case 1: + if (p + 2 <= len) { + // A 1-byte tail with at least 2 bytes of + // input available now. + v = ((tail[0] & 0xff) << 16) | ((input[p++] & 0xff) << 8) | (input[p++] & 0xff); + tailLen = 0; + } + ; + break; + + case 2: + if (p + 1 <= len) { + // A 2-byte tail with at least 1 byte of input. + v = ((tail[0] & 0xff) << 16) | ((tail[1] & 0xff) << 8) | (input[p++] & 0xff); + tailLen = 0; + } + break; + } + + if (v != -1) { + output[op++] = alphabet[(v >> 18) & 0x3f]; + output[op++] = alphabet[(v >> 12) & 0x3f]; + output[op++] = alphabet[(v >> 6) & 0x3f]; + output[op++] = alphabet[v & 0x3f]; + if (--count == 0) { + if (do_cr) output[op++] = '\r'; + output[op++] = '\n'; + count = LINE_GROUPS; + } + } + + // At this point either there is no tail, or there are fewer + // than 3 bytes of input available. + + // The main loop, turning 3 input bytes into 4 output bytes on + // each iteration. + while (p + 3 <= len) { + v = ((input[p] & 0xff) << 16) | ((input[p + 1] & 0xff) << 8) | (input[p + 2] & 0xff); + output[op] = alphabet[(v >> 18) & 0x3f]; + output[op + 1] = alphabet[(v >> 12) & 0x3f]; + output[op + 2] = alphabet[(v >> 6) & 0x3f]; + output[op + 3] = alphabet[v & 0x3f]; + p += 3; + op += 4; + if (--count == 0) { + if (do_cr) output[op++] = '\r'; + output[op++] = '\n'; + count = LINE_GROUPS; + } + } + + if (finish) { + // Finish up the tail of the input. Note that we need to + // consume any bytes in tail before any bytes + // remaining in input; there should be at most two bytes + // total. + + if (p - tailLen == len - 1) { + int t = 0; + v = ((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 4; + tailLen -= t; + output[op++] = alphabet[(v >> 6) & 0x3f]; + output[op++] = alphabet[v & 0x3f]; + if (do_padding) { + output[op++] = '='; + output[op++] = '='; + } + if (do_newline) { + if (do_cr) output[op++] = '\r'; + output[op++] = '\n'; + } + } else if (p - tailLen == len - 2) { + int t = 0; + v = + (((tailLen > 1 ? tail[t++] : input[p++]) & 0xff) << 10) + | (((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 2); + tailLen -= t; + output[op++] = alphabet[(v >> 12) & 0x3f]; + output[op++] = alphabet[(v >> 6) & 0x3f]; + output[op++] = alphabet[v & 0x3f]; + if (do_padding) { + output[op++] = '='; + } + if (do_newline) { + if (do_cr) output[op++] = '\r'; + output[op++] = '\n'; + } + } else if (do_newline && op > 0 && count != LINE_GROUPS) { + if (do_cr) output[op++] = '\r'; + output[op++] = '\n'; + } + + assert tailLen == 0; + assert p == len; + } else { + // Save the leftovers in tail to be consumed on the next + // call to encodeInternal. + + if (p == len - 1) { + tail[tailLen++] = input[p]; + } else if (p == len - 2) { + tail[tailLen++] = input[p]; + tail[tailLen++] = input[p + 1]; + } + } + + this.op = op; + this.count = count; + + return true; + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java new file mode 100644 index 0000000000..7918ad0439 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/CryptoUtil.java @@ -0,0 +1,61 @@ +package org.sunbird.auth.verifier; + +import java.nio.charset.Charset; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.security.Signature; +import java.security.SignatureException; +import java.util.Map; +import org.sunbird.logging.LoggerUtil; + +public class CryptoUtil { + private static final Charset US_ASCII = Charset.forName("US-ASCII"); + private static final LoggerUtil logger = new LoggerUtil(CryptoUtil.class); + + /** + * Verifies the RSA signature. + * + * @param payLoad The string payload. + * @param signature The signature bytes. + * @param key The public key. + * @param algorithm The signature algorithm (e.g., SHA256withRSA). + * @return True if verification succeeds, false otherwise. + */ + public static boolean verifyRSASign( + String payLoad, byte[] signature, PublicKey key, String algorithm) { + return verifyRSASign(payLoad, signature, key, algorithm, null); + } + + /** + * Verifies the RSA signature with logging context. + * + * @param payLoad The string payload. + * @param signature The signature bytes. + * @param key The public key. + * @param algorithm The signature algorithm. + * @param requestContext Context for logging (optional). + * @return True if verification succeeds, false otherwise. + */ + public static boolean verifyRSASign( + String payLoad, + byte[] signature, + PublicKey key, + String algorithm, + Map requestContext) { + Signature sign; + try { + sign = Signature.getInstance(algorithm); + sign.initVerify(key); + sign.update(payLoad.getBytes(US_ASCII)); + return sign.verify(signature); + } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { + String msg = String.format("CryptoUtil:verifyRSASign: Exception occurred while token verification. Error: %s", e.getMessage()); + if (requestContext != null) { + msg += ", Context: " + requestContext; + } + logger.error(msg, e); + return false; + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java new file mode 100644 index 0000000000..d4ed6e3041 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyData.java @@ -0,0 +1,53 @@ +package org.sunbird.auth.verifier; + +import java.security.PublicKey; + +/** + * Pojo for Key Data. + */ +public class KeyData { + private String keyId; + private PublicKey publicKey; + + /** + * Constructor + * @param keyId Key Id + * @param publicKey Public Key + */ + public KeyData(String keyId, PublicKey publicKey) { + this.keyId = keyId; + this.publicKey = publicKey; + } + + /** + * Get Key Id + * @return keyId + */ + public String getKeyId(){ + return keyId; + } + + /** + * Set Key Id + * @param keyId Key Id + */ + public void setKeyId(String keyId) { + this.keyId = keyId; + } + + /** + * Get Public Key + * @return publicKey + */ + public PublicKey getPublicKey() { + return publicKey; + } + + /** + * Set Public Key + * @param publicKey Public Key + */ + public void setPublicKey(PublicKey publicKey) { + this.publicKey = publicKey; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java new file mode 100644 index 0000000000..667ef2429a --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/auth/verifier/KeyManager.java @@ -0,0 +1,87 @@ +package org.sunbird.auth.verifier; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.PropertiesCache; + +/** + * Manages the loading and retrieval of Public Keys for token verification. + */ +public class KeyManager { + + private static final LoggerUtil logger = new LoggerUtil(KeyManager.class); + private static final PropertiesCache propertiesCache = PropertiesCache.getInstance(); + private static final Map keyMap = new HashMap<>(); + + /** + * Initializes the KeyManager by loading public keys from the configured base path. + */ + public static void init() { + String basePath = propertiesCache.getProperty(JsonKey.ACCESS_TOKEN_PUBLICKEY_BASEPATH); + logger.info("KeyManager:init: Starting public key loading from base path: " + basePath); + + try (Stream walk = Files.walk(Paths.get(basePath))) { + List result = + walk.filter(Files::isRegularFile).map(x -> x.toString()).collect(Collectors.toList()); + + result.forEach( + file -> { + try { + StringBuilder contentBuilder = new StringBuilder(); + Path path = Paths.get(file); + Files.lines(path, StandardCharsets.UTF_8) + .forEach(contentBuilder::append); + + KeyData keyData = + new KeyData( + path.getFileName().toString(), loadPublicKey(contentBuilder.toString())); + keyMap.put(path.getFileName().toString(), keyData); + logger.info("KeyManager:init: Loaded key: " + path.getFileName().toString()); + } catch (Exception e) { + logger.error("KeyManager:init: Exception in reading public key file: " + file, e); + } + }); + } catch (Exception e) { + logger.error("KeyManager:init: Exception in loading public keys base directory", e); + } + } + + /** + * Retrieves the KeyData for a given Key ID. + * @param keyId The Key ID. + * @return The KeyData object, or null if not found. + */ + public static KeyData getPublicKey(String keyId) { + return keyMap.get(keyId); + } + + /** + * Parses a string representation of a public key into a PublicKey object. + * @param key The public key string (PEM format). + * @return The PublicKey object. + * @throws Exception If parsing fails. + */ + public static PublicKey loadPublicKey(String key) throws Exception { + String publicKey = new String(key.getBytes(), StandardCharsets.UTF_8); + publicKey = publicKey.replaceAll("(-+BEGIN PUBLIC KEY-+)", ""); + publicKey = publicKey.replaceAll("(-+END PUBLIC KEY-+)", ""); + publicKey = publicKey.replaceAll("[\\r\\n]+", ""); + byte[] keyBytes = Base64Util.decode(publicKey.getBytes(StandardCharsets.UTF_8), Base64Util.DEFAULT); + + X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(keyBytes); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePublic(X509publicKey); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/common/ProjectUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/common/ProjectUtil.java new file mode 100644 index 0000000000..86d3693b8e --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/common/ProjectUtil.java @@ -0,0 +1,1220 @@ +package org.sunbird.common; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.sql.Timestamp; +import java.text.MessageFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Random; +import java.util.TimeZone; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.validator.UrlValidator; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.http.HttpUtil; +import org.sunbird.utils.EsConfigUtil; +import org.sunbird.request.Request; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; + +/** + * Utility class containing common methods and constants used across the project. + * Handles date formatting, email validation, ID generation, and configuration management. + * + * @author Manzarul + * @author Amit Kumar + */ +public class ProjectUtil { + + /** format the date in YYYY-MM-DD hh:mm:ss:SSZ */ + private static AtomicInteger atomicInteger = new AtomicInteger(); + + public static Integer DEFAULT_BATCH_SIZE = 10; + public static final long BACKGROUND_ACTOR_WAIT_TIME = 30; + public static final String ELASTIC_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + public static final String YEAR_MONTH_DATE_FORMAT = "yyyy-MM-dd"; + private static final int randomPasswordLength = 9; + private static LoggerUtil logger = new LoggerUtil(ProjectUtil.class); + + protected static final String FILE_NAME[] = { + "cassandratablecolumn.properties", + "elasticsearch.config.properties", + "cassandra.config.properties", + "dbconfig.properties", + "externalresource.properties", + "sso.properties", + "userencryption.properties", + "profilecompleteness.properties", + "mailTemplates.properties" + }; + public static PropertiesCache propertiesCache; + private static Pattern pattern; + public static final String EMAIL_PATTERN = + "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; + public static final String[] excludes = + new String[] { + JsonKey.COMPLETENESS, + JsonKey.MISSING_FIELDS, + JsonKey.PROFILE_VISIBILITY, + JsonKey.LOGIN_ID, + JsonKey.USER_ID + }; + + public static final String[] defaultPrivateFields = new String[] {JsonKey.EMAIL, JsonKey.PHONE}; + private static final String INDEX_NAME = "telemetry.raw"; + private static String YYYY_MM_DD_FORMATTER = "yyyy-MM-dd"; + private static final String STARTDATE = "startDate"; + private static final String ENDDATE = "endDate"; + private static ObjectMapper mapper = new ObjectMapper(); + + static { + pattern = Pattern.compile(EMAIL_PATTERN); + propertiesCache = PropertiesCache.getInstance(); + } + + /** + * Enumeration for Environment types. + */ + public enum Environment { + dev(1), + qa(2), + prod(3); + int value; + + private Environment(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } + + public enum UserLookupType { + USERNAME(JsonKey.USER_LOOKUP_FILED_USER_NAME), + EMAIL(JsonKey.EMAIL), + PHONE(JsonKey.PHONE); + + private String type; + + UserLookupType(String type) { + this.type = type; + } + + public String getType() { + return this.type; + } + } + + /** + * Enumeration for Status. + */ + public enum Status { + ACTIVE(1), + INACTIVE(0), + DELETED(2); + + private int value; + + Status(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + } + + /** + * Enumeration for Bulk Process Status. + */ + public enum BulkProcessStatus { + NEW(0), + IN_PROGRESS(1), + INTERRUPT(2), + COMPLETED(3), + FAILED(9); + + private int value; + + BulkProcessStatus(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + } + + /** + * Enumeration for Org Status. + */ + public enum OrgStatus { + INACTIVE(0), + ACTIVE(1), + BLOCKED(2), + RETIRED(3); + + private Integer value; + + OrgStatus(Integer value) { + this.value = value; + } + + public Integer getValue() { + return this.value; + } + } + + /** + * Enumeration for Progress Status. + */ + public enum ProgressStatus { + NOT_STARTED(0), + STARTED(1), + COMPLETED(2); + + private int value; + + ProgressStatus(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + } + + /** + * Enumeration for Active Status. + */ + public enum ActiveStatus { + ACTIVE(true), + INACTIVE(false); + + private boolean value; + + ActiveStatus(boolean value) { + this.value = value; + } + + public boolean getValue() { + return this.value; + } + } + + /** + * Enumeration for Action. + */ + public enum Action { + YES(1), + NO(0); + + private int value; + + Action(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } + + /** + * Enumeration for Course Management Status. + */ + public enum CourseMgmtStatus { + DRAFT("draft"), + LIVE("live"), + RETIRED("retired"); + + private String value; + + CourseMgmtStatus(String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + } + + /** + * Enumeration for Source. + */ + public enum Source { + WEB("web"), + ANDROID("android"), + IOS("ios"), + APP("app"); + + private String value; + + Source(String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + } + + /** + * Enumeration for User Role. + */ + public enum UserRole { + PUBLIC("PUBLIC"), + CONTENT_CREATOR("CONTENT_CREATOR"), + CONTENT_REVIEWER("CONTENT_REVIEWER"), + ORG_ADMIN("ORG_ADMIN"), + ORG_MEMBER("ORG_MEMBER"); + + private String value; + + UserRole(String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + } + + /** + * This method will check incoming value is null or empty it will do empty check by doing trim + * method. in case of null or empty it will return true else false. + * + * @param value String value to check + * @return boolean true if null or empty + */ + public static boolean isStringNullOREmpty(String value) { + return (value == null || "".equals(value.trim())); + } + + /** + * This method will provide formatted date. + * + * @return String formatted date + */ + public static String getFormattedDate() { + return getDateFormatter().format(new Date()); + } + + /** + * This method will provide timestamp. + * + * @return Date current timestamp + */ + public static Date getTimeStamp() { + return new Timestamp(System.currentTimeMillis()); + } + + /** + * This method will provide formatted date. + * + * @param date Date object + * @return String formatted date + */ + public static String formatDate(Date date) { + if (null != date) return getDateFormatter().format(date); + else return null; + } + + /** + * Validate email with regular expression. + * + * @param email String email + * @return true valid email, false invalid email + */ + public static boolean isEmailvalid(final String email) { + if (StringUtils.isBlank(email)) { + return false; + } + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + + /** + * This method will generate auth token based on name , source and timestamp. + * + * @param name String name + * @param source String source + * @return String auth token + */ + public static String createAuthToken(String name, String source) { + String data = name + source + System.currentTimeMillis(); + UUID authId = UUID.nameUUIDFromBytes(data.getBytes(StandardCharsets.UTF_8)); + return authId.toString(); + } + + /** + * This method will generate unique id based on current time stamp and some random value mixed up. + * + * @param environmentId int environment id + * @return String unique id + */ + public static String getUniqueIdFromTimestamp(int environmentId) { + Random random = new Random(); + long env = (environmentId + random.nextInt(99999)) / 10000000; + long uid = System.currentTimeMillis() + random.nextInt(999999); + uid = uid << 13; + return env + "" + uid + "" + atomicInteger.getAndIncrement(); + } + + /** + * This method will generate the unique id. + * + * @return String unique id + */ + public static synchronized String generateUniqueId() { + return UUID.randomUUID().toString(); + } + + /** + * Enumeration for HTTP Methods. + */ + public enum Method { + GET, + POST, + PUT, + DELETE, + PATCH + } + + /** + * Enum to hold the index name for Elastic search. + */ + public enum EsIndex { + sunbird("searchindex"), + sunbirdPlugin("sunbirdplugin"), + courseBatchStats("cbatchstats"); + private String indexName; + + private EsIndex(String name) { + this.indexName = name; + } + + public String getIndexName() { + return indexName; + } + } + + /** + * This enum will hold all the ES type name. + */ + public enum EsType { + course(EsConfigUtil.getConfigValue(JsonKey.ES_COURSE_INDEX)), + courseBatch(EsConfigUtil.getConfigValue(JsonKey.ES_COURSE_BATCH_INDEX)), + user(EsConfigUtil.getConfigValue(JsonKey.ES_USER_INDEX)), + organisation(EsConfigUtil.getConfigValue(JsonKey.ES_ORGANISATION_INDEX)), + usercourses(EsConfigUtil.getConfigValue(JsonKey.ES_USER_COURSES_INDEX)), + location(EsConfigUtil.getConfigValue(JsonKey.ES_LOCATION_INDEX)), + usernotes(EsConfigUtil.getConfigValue(JsonKey.ES_USER_NOTES_INDEX)), + userfeed(EsConfigUtil.getConfigValue(JsonKey.ES_USER_FEED_INDEX)); + + private String typeName; + + private EsType(String name) { + this.typeName = name; + } + + public String getTypeName() { + return typeName; + } + } + + /** + * Enumeration for Section Data Type. + */ + public enum SectionDataType { + course("course"), + content("content"); + private String typeName; + + private SectionDataType(String name) { + this.typeName = name; + } + + public String getTypeName() { + return typeName; + } + } + + /** + * Enumeration for Address Type. + */ + public enum AddressType { + permanent("permanent"), + current("current"), + office("office"), + home("home"); + private String typeName; + + private AddressType(String name) { + this.typeName = name; + } + + public String getTypeName() { + return typeName; + } + } + + /** + * Enumeration for Assessment Result. + */ + public enum AssessmentResult { + gradeA("A", "Pass"), + gradeB("B", "Pass"), + gradeC("C", "Pass"), + gradeD("D", "Pass"), + gradeE("E", "Pass"), + gradeF("F", "Fail"); + private String grade; + private String result; + + private AssessmentResult(String grade, String result) { + this.grade = grade; + this.result = result; + } + + public String getGrade() { + return grade; + } + + public String getResult() { + return result; + } + } + + /** + * This method will calculate the percentage. + * + * @param score double score + * @param maxScore double max score + * @return double percentage + */ + public static double calculatePercentage(double score, double maxScore) { + double percentage = (score * 100) / (maxScore * 1.0); + return Math.round(percentage); + } + + /** + * This method will calculate grade based on percentage marks. + * + * @param percentage double percentage + * @return AssessmentResult + */ + public static AssessmentResult calcualteAssessmentResult(double percentage) { + switch (Math.round(Float.valueOf(String.valueOf(percentage))) / 10) { + case 10: + return AssessmentResult.gradeA; + case 9: + return AssessmentResult.gradeA; + case 8: + return AssessmentResult.gradeB; + case 7: + return AssessmentResult.gradeC; + case 6: + return AssessmentResult.gradeD; + case 5: + return AssessmentResult.gradeE; + default: + return AssessmentResult.gradeF; + } + } + + /** + * Checks if object is null. + * + * @param obj Object + * @return boolean true if null + */ + public static boolean isNull(Object obj) { + return null == obj ? true : false; + } + + /** + * Checks if object is not null. + * + * @param obj Object + * @return boolean true if not null + */ + public static boolean isNotNull(Object obj) { + return null != obj ? true : false; + } + + /** + * Formats message with values. + * + * @param exceptionMsg String message pattern + * @param fieldValue Object... values + * @return String formatted message + */ + public static String formatMessage(String exceptionMsg, Object... fieldValue) { + return MessageFormat.format(exceptionMsg, fieldValue); + } + + /** + * Gets default date formatter. + * + * @return SimpleDateFormat + */ + public static SimpleDateFormat getDateFormatter() { + return getDateFormatter("yyyy-MM-dd HH:mm:ss:SSSZ"); + } + + /** + * Gets date formatter for pattern. + * + * @param pattern String pattern + * @return SimpleDateFormat + */ + public static SimpleDateFormat getDateFormatter(String pattern) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); + simpleDateFormat.setLenient(false); + return simpleDateFormat; + } + + /** + * Enumeration for Enrolment Type. + */ + public enum EnrolmentType { + open("open"), + inviteOnly("invite-only"); + private String val; + + EnrolmentType(String val) { + this.val = val; + } + + public String getVal() { + return val; + } + } + + /** + * Gets Velocity Context from map. + * + * @param map Map data + * @return VelocityContext + */ + public static VelocityContext getContext(Map map) { + propertiesCache = PropertiesCache.getInstance(); + VelocityContext context = new VelocityContext(); + if (StringUtils.isNotBlank((String) map.get(JsonKey.ACTION_URL))) { + context.put(JsonKey.ACTION_URL, getValue(map, JsonKey.ACTION_URL)); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.NAME))) { + context.put(JsonKey.NAME, getValue(map, JsonKey.NAME)); + } + context.put(JsonKey.BODY, getValue(map, JsonKey.BODY)); + String fromEmail = getFromEmail(map); + if (StringUtils.isNotBlank(fromEmail)) { + context.put(JsonKey.FROM_EMAIL, fromEmail); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.ORG_NAME))) { + context.put(JsonKey.ORG_NAME, getValue(map, JsonKey.ORG_NAME)); + } + String logoUrl = getSunbirdLogoUrl(map); + if (StringUtils.isNotBlank(logoUrl)) { + context.put(JsonKey.ORG_IMAGE_URL, logoUrl); + } + context.put(JsonKey.ACTION_NAME, getValue(map, JsonKey.ACTION_NAME)); + context.put(JsonKey.USERNAME, getValue(map, JsonKey.USERNAME)); + context.put(JsonKey.TEMPORARY_PASSWORD, getValue(map, JsonKey.TEMPORARY_PASSWORD)); + + if (StringUtils.isNotBlank((String) map.get(JsonKey.COURSE_NAME))) { + context.put(JsonKey.COURSE_NAME, map.remove(JsonKey.COURSE_NAME)); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.START_DATE))) { + context.put(JsonKey.BATCH_START_DATE, map.remove(JsonKey.START_DATE)); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.END_DATE))) { + context.put(JsonKey.BATCH_END_DATE, map.remove(JsonKey.END_DATE)); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.BATCH_NAME))) { + context.put(JsonKey.BATCH_NAME, map.remove(JsonKey.BATCH_NAME)); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.FIRST_NAME))) { + context.put(JsonKey.NAME, map.remove(JsonKey.FIRST_NAME)); + } else { + context.put(JsonKey.NAME, ""); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.SIGNATURE))) { + context.put(JsonKey.SIGNATURE, map.remove(JsonKey.SIGNATURE)); + } + if (StringUtils.isNotBlank((String) map.get(JsonKey.COURSE_BATCH_URL))) { + context.put(JsonKey.COURSE_BATCH_URL, map.remove(JsonKey.COURSE_BATCH_URL)); + } + context.put(JsonKey.ALLOWED_LOGIN, propertiesCache.getProperty(JsonKey.SUNBIRD_ALLOWED_LOGIN)); + map = addCertStaticResource(map); + for (Map.Entry entry : map.entrySet()) { + context.put(entry.getKey(), entry.getValue()); + } + return context; + } + + private static String getSunbirdLogoUrl(Map map) { + String logoUrl = (String) getValue(map, JsonKey.ORG_IMAGE_URL); + if (StringUtils.isBlank(logoUrl)) { + logoUrl = getConfigValue(JsonKey.SUNBIRD_ENV_LOGO_URL); + } + logger.info(null,"ProjectUtil:getSunbirdLogoUrl: url = " + logoUrl); + return logoUrl; + } + + private static Map addCertStaticResource(Map map) { + map.putIfAbsent( + JsonKey.certificateImgUrl, + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_CERT_COMPLETION_IMG_URL)); + map.putIfAbsent( + JsonKey.dikshaImgUrl, ProjectUtil.getConfigValue(JsonKey.SUNBIRD_DIKSHA_IMG_URL)); + map.putIfAbsent(JsonKey.stateImgUrl, ProjectUtil.getConfigValue(JsonKey.SUNBIRD_STATE_IMG_URL)); + return map; + } + + private static String getFromEmail(Map map) { + String fromEmail = (String) getValue(map, JsonKey.EMAIL_SERVER_FROM); + if (StringUtils.isBlank(fromEmail)) { + fromEmail = getConfigValue(JsonKey.EMAIL_SERVER_FROM); + } + logger.info(null,"ProjectUtil:getFromEmail: fromEmail = " + fromEmail); + return fromEmail; + } + + private static Object getValue(Map map, String key) { + Object value = map.get(key); + map.remove(key); + return value; + } + + /** + * Enumeration for Report Tracking Status. + */ + public enum ReportTrackingStatus { + NEW(0), + GENERATING_DATA(1), + UPLOADING_FILE(2), + UPLOADING_FILE_SUCCESS(3), + SENDING_MAIL(4), + SENDING_MAIL_SUCCESS(5), + FAILED(9); + + private int value; + + ReportTrackingStatus(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + } + + /** + * Creates health check response. + * + * @param serviceName String service name + * @param isError boolean is error + * @param e Exception + * @return Map response + */ + public static Map createCheckResponse( + String serviceName, boolean isError, Exception e) { + Map responseMap = new HashMap<>(); + responseMap.put(JsonKey.NAME, serviceName); + if (!isError) { + responseMap.put(JsonKey.Healthy, true); + responseMap.put(JsonKey.ERROR, ""); + responseMap.put(JsonKey.ERRORMSG, ""); + } else { + responseMap.put(JsonKey.Healthy, false); + if (e != null && e instanceof ProjectCommonException) { + ProjectCommonException commonException = (ProjectCommonException) e; + responseMap.put(JsonKey.ERROR, commonException.getResponseCode()); + responseMap.put(JsonKey.ERRORMSG, commonException.getMessage()); + } else { + responseMap.put(JsonKey.ERROR, e != null ? e.getMessage() : "CONNECTION_ERROR"); + responseMap.put(JsonKey.ERRORMSG, e != null ? e.getMessage() : "Connection error"); + } + } + return responseMap; + } + + /** + * This method will make EkStep api call register the tag. + * + * @param tagId String unique tag id. + * @param body String requested body + * @param header Map + * @return String tag status + * @throws Exception if error occurs + */ + public static String registertag(String tagId, String body, Map header) + throws Exception { + String tagStatus = ""; + try { + logger.info(null,"start call for registering the tag ==" + tagId); + String analyticsBaseUrl = getConfigValue(JsonKey.ANALYTICS_API_BASE_URL); + tagStatus = + HttpUtil.sendPostRequest( + analyticsBaseUrl + + PropertiesCache.getInstance().getProperty(JsonKey.EKSTEP_TAG_API_URL) + + "/" + + tagId, + body, + header); + logger.info(null, + "end call for tag registration id and status ==" + tagId + " " + tagStatus); + } catch (Exception e) { + throw e; + } + return tagStatus; + } + + /** + * Enumeration for Object Types. + */ + public enum ObjectTypes { + user("user"), + organisation("organisation"), + batch("batch"); + + private String value; + + private ObjectTypes(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } + + /** + * Generates random password. + * + * @return String random password + */ + public static String generateRandomPassword() { + String SALTCHARS = "abcdef12345ghijklACDEFGHmnopqrs67IJKLMNOP890tuvQRSTUwxyzVWXYZ"; + StringBuilder salt = new StringBuilder(); + Random rnd = new Random(); + while (salt.length() < randomPasswordLength) { // length of the random string. + int index = (int) (rnd.nextFloat() * SALTCHARS.length()); + salt.append(SALTCHARS.charAt(index)); + } + String saltStr = salt.toString(); + return saltStr; + } + + /** + * This method will do the phone number validation check. + * + * @param phone String phone number + * @return boolean true if valid + */ + public static boolean validatePhoneNumber(String phone) { + String phoneNo = ""; + phoneNo = phone.replace("+", ""); + if (phoneNo.matches("\\d{10}")) return true; + else if (phoneNo.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}")) return true; + else if (phoneNo.matches("\\d{3}-\\d{3}-\\d{4}\\s(x|(ext))\\d{3,5}")) return true; + else return (phoneNo.matches("\\(\\d{3}\\)-\\d{3}-\\d{4}")); + } + + /** + * Gets Ekstep header map. + * + * @return Map headers + */ + public static Map getEkstepHeader() { + Map headerMap = new HashMap<>(); + String header = System.getenv(JsonKey.EKSTEP_AUTHORIZATION); + if (StringUtils.isBlank(header)) { + header = PropertiesCache.getInstance().getProperty(JsonKey.EKSTEP_AUTHORIZATION); + } else { + header = JsonKey.BEARER + header; + } + headerMap.put(JsonKey.AUTHORIZATION, header); + headerMap.put("Content-Type", "application/json"); + return headerMap; + } + + /** + * Validates phone number with country code. + * + * @param phNumber String phone number + * @param countryCode String country code + * @return boolean true if valid + */ + public static boolean validatePhone(String phNumber, String countryCode) { + PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); + String contryCode = countryCode; + if (!StringUtils.isBlank(countryCode) && (countryCode.charAt(0) != '+')) { + contryCode = "+" + countryCode; + } + Phonenumber.PhoneNumber phoneNumber = null; + try { + if (StringUtils.isBlank(countryCode)) { + contryCode = PropertiesCache.getInstance().getProperty("sunbird_default_country_code"); + } + String isoCode = phoneNumberUtil.getRegionCodeForCountryCode(Integer.parseInt(contryCode)); + phoneNumber = phoneNumberUtil.parse(phNumber, isoCode); + return phoneNumberUtil.isValidNumber(phoneNumber); + } catch (NumberParseException e) { + logger.error(null,"Exception occurred while validating phone number : ", e); + logger.info(null,phNumber + "this phone no. is not a valid one."); + } + return false; + } + + /** + * Validates country code. + * + * @param countryCode String country code + * @return boolean true if valid + */ + public static boolean validateCountryCode(String countryCode) { + String pattern = "^(?:[+] ?){0,1}(?:[0-9] ?){1,3}"; + try { + Pattern patt = Pattern.compile(pattern); + Matcher matcher = patt.matcher(countryCode); + return matcher.matches(); + } catch (RuntimeException e) { + return false; + } + } + + public static boolean validateUUID(String uuidStr) { + try { + UUID.fromString(uuidStr); + return true; + } catch (Exception ex) { + return false; + } + } + + /** + * Generates SMS body from template. + * + * @param smsTemplate Map template data + * @return String SMS body + */ + public static String getSMSBody(Map smsTemplate) { + try { + Properties props = new Properties(); + props.put("resource.loader", "class"); + props.put( + "class.resource.loader.class", + "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + + VelocityEngine ve = new VelocityEngine(); + ve.init(props); + smsTemplate.put("newline", "\n"); + smsTemplate.put( + "instanceName", + StringUtils.isBlank(smsTemplate.get("instanceName")) + ? "" + : smsTemplate.get("instanceName")); + Template t = ve.getTemplate("/welcomeSmsTemplate.vm"); + VelocityContext context = new VelocityContext(smsTemplate); + StringWriter writer = new StringWriter(); + t.merge(context, writer); + return writer.toString(); + } catch (Exception ex) { + logger.error(null,"Exception occurred while formating and sending SMS ", ex); + } + return ""; + } + + /** + * Checks if date is valid format. + * + * @param format String date format + * @param value String date value + * @return boolean true if valid + */ + public static boolean isDateValidFormat(String format, String value) { + Date date = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat(format); + date = sdf.parse(value); + if (!value.equals(sdf.format(date))) { + date = null; + } + } catch (ParseException ex) { + logger.error(null, ex.getMessage(), ex); + } + return date != null; + } + + /** + * This method will create a new ProjectCommonException of type server Error and throws it. + */ + public static void createAndThrowServerError() { + throw new ProjectCommonException( + ResponseCode.SERVER_ERROR.getErrorCode(), + ResponseCode.SERVER_ERROR.getErrorMessage(), + ResponseCode.SERVER_ERROR.getResponseCode()); + } + + /** + * This method will create and return server exception to caller. + * + * @param responseCode ResponseCode + * @return ProjectCommonException + */ + public static ProjectCommonException createServerError(ResponseCode responseCode) { + return new ProjectCommonException( + responseCode.getErrorCode(), + responseCode.getErrorMessage(), + ResponseCode.SERVER_ERROR.getResponseCode()); + } + + /** + * This method will create ProjectCommonException of type invalidUserDate exception and throws it. + */ + public static void createAndThrowInvalidUserDataException() { + throw new ProjectCommonException( + ResponseCode.invalidUsrData.getErrorCode(), + ResponseCode.invalidUsrData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + + /** + * Method to verify url is valid or not. + * + * @param url String + * @return boolean + */ + public static boolean isUrlvalid(String url) { + String[] schemes = {"http", "https"}; + UrlValidator urlValidator = new UrlValidator(schemes); + return urlValidator.isValid(url); + } + + /** + * Gets config value from env or properties. + * + * @param key String key + * @return String value + */ + public static String getConfigValue(String key) { + if (StringUtils.isNotBlank(System.getenv(key))) { + return System.getenv(key); + } + return propertiesCache.readProperty(key); + } + + /** + * This method will create index for Elastic search as follow "telemetry.raw.yyyy.mm". + * + * @return String index name + */ + public static String createIndex() { + Calendar cal = Calendar.getInstance(); + return new StringBuffer() + .append(INDEX_NAME) + .append("." + cal.get(Calendar.YEAR)) + .append( + "." + + ((cal.get(Calendar.MONTH) + 1) > 9 + ? (cal.get(Calendar.MONTH) + 1) + : "0" + (cal.get(Calendar.MONTH) + 1))) + .toString(); + } + + /** + * This method will check whether Array contains only empty string or not. + * + * @param strArray String[] + * @return boolean + */ + public static boolean isNotEmptyStringArray(String[] strArray) { + for (String str : strArray) { + if (StringUtils.isNotEmpty(str)) { + return false; + } + } + return true; + } + + /** + * Method to convert List of map to Json String. + * + * @param mapList List of map. + * @return String List of map converted as Json string. + */ + public static String convertMapToJsonString(List> mapList) { + try { + return mapper.writeValueAsString(mapList); + } catch (IOException e) { + logger.error(null, e.getMessage(), e); + } + return null; + } + + /** + * Method to remove attributes from map. + * + * @param map contains data as key value. + * @param keys list of string that has to be remove from map if presents. + */ + public static void removeUnwantedFields(Map map, String... keys) { + Arrays.stream(keys) + .forEach( + x -> { + map.remove(x); + }); + } + + /** + * Method to convert Json string to Map. + * + * @param jsonString represents json string. + * @return map corresponding to json string. + * @throws IOException + */ + public static Map convertJsonStringToMap(String jsonString) throws IOException { + return mapper.readValue(jsonString, Map.class); + } + + /** + * Method to convert Request object to module specific POJO request. + * + * @param request Represents the incoming request object. + * @param clazz Target POJO class. + * @param Target request object type. + * @return request object of target type. + */ + public static T convertToRequestPojo(Request request, Class clazz) { + return mapper.convertValue(request.getRequest(), clazz); + } + + /** + * This method will take number of days in request and provide date range. Date range is + * calculated as STARTDATE and ENDDATE, start date will be current date minus provided number of + * days and ENDDATE will be current date minus one day. If date is less than equal to zero then it + * will return empty map. + * + * @param numDays Number of days. + * @return Map with STARTDATE and ENDDATE key in YYYY_MM_DD_FORMATTER format. + */ + public static Map getDateRange(int numDays) { + Map map = new HashMap<>(); + if (numDays <= 0) { + return map; + } + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.add(Calendar.DATE, -numDays); + map.put(STARTDATE, new SimpleDateFormat(YYYY_MM_DD_FORMATTER).format(cal.getTime())); + cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.add(Calendar.DATE, -1); + map.put(ENDDATE, new SimpleDateFormat(YYYY_MM_DD_FORMATTER).format(cal.getTime())); + return map; + } + + /** + * This method will be used to create ProjectCommonException for all kind of client error for the + * given response code(enum). + * + * @param responseCode An enum of all the api responses. + * @return ProjectCommonException + */ + public static ProjectCommonException createClientException(ResponseCode responseCode) { + return new ProjectCommonException( + responseCode.getErrorCode(), + responseCode.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + + public static ProjectCommonException createClientException( + ResponseCode responseCode, String message) { + return new ProjectCommonException( + responseCode.getErrorCode(), message, ResponseCode.CLIENT_ERROR.getResponseCode()); + } + + /** + * Gets LMS User ID from federated ID. + * + * @param fedUserId String federated user id + * @return String user id + */ + public static String getLmsUserId(String fedUserId) { + String userId = fedUserId; + String prefix = + "f:" + getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID) + ":"; + if (StringUtils.isNotBlank(fedUserId) && fedUserId.startsWith(prefix)) { + userId = fedUserId.replace(prefix, ""); + } + return userId; + } + + /** + * Gets first N characters of string. + * + * @param originalText String original text + * @param noOfChar int number of characters + * @return String first N characters + */ + public static String getFirstNCharacterString(String originalText, int noOfChar) { + String firstNChars = ""; + if (StringUtils.isBlank(originalText)) { + return ""; + } + if (originalText.length() > noOfChar) { + firstNChars = originalText.substring(0, noOfChar); + } else { + firstNChars = originalText; + } + return firstNChars; + } + + /** + * Enumeration for Migrate Action. + */ + public enum MigrateAction { + ACCEPT("accept"), + REJECT("reject"); + private String value; + + MigrateAction(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } + + public static void setTraceIdInHeader( + Map header, org.sunbird.request.RequestContext context) { + if (null != context) { + header.put(JsonKey.X_TRACE_ENABLED, context.getDebugEnabled()); + header.put(JsonKey.X_REQUEST_ID, context.getReqId()); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/common/PropertiesCache.java b/core/sunbird-platform-common/src/main/java/org/sunbird/common/PropertiesCache.java new file mode 100644 index 0000000000..e2fde9253b --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/common/PropertiesCache.java @@ -0,0 +1,148 @@ +package org.sunbird.common; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.logging.LoggerUtil; + +/** + * Singleton class to load and manage application configuration properties. + * Reads attributes from multiple property files and provides access validation/defaults. + * + * @author Amit Kumar + */ +public class PropertiesCache { + + private static final LoggerUtil logger = new LoggerUtil(PropertiesCache.class); + private final String[] fileName = { + "elasticsearch.config.properties", + "cassandra.config.properties", + "dbconfig.properties", + "externalresource.properties", + "sso.properties", + "userencryption.properties", + "profilecompleteness.properties", + "mailTemplates.properties" + }; + private final Properties configProp = new Properties(); + public final Map attributePercentageMap = new ConcurrentHashMap<>(); + private static volatile PropertiesCache propertiesCache = null; + + /** + * Private constructor to load properties from files. + * Also initializes weighted attributes for profile completeness. + */ + private PropertiesCache() { + for (String file : fileName) { + try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(file)) { + if (in != null) { + configProp.load(in); + } else { + logger.warn("PropertiesCache: Configuration file not found: " + file, null); + } + } catch (IOException e) { + logger.error("PropertiesCache: Error loading file: " + file, e); + } + } + loadWeighted(); + } + + /** + * Returns the singleton instance of PropertiesCache. + * Uses double-checked locking for thread safety. + * + * @return The singleton PropertiesCache instance. + */ + public static PropertiesCache getInstance() { + if (propertiesCache == null) { + synchronized (PropertiesCache.class) { + if (propertiesCache == null) { + propertiesCache = new PropertiesCache(); + } + } + } + return propertiesCache; + } + + /** + * Saves or updates a configuration property in memory. + * + * @param key The property key. + * @param value The property value. + */ + public void saveConfigProperty(String key, String value) { + configProp.setProperty(key, value); + } + + /** + * Retrieves a property value. + * Checks system environment variables first, then the loaded properties. + * If the value is not found in properties, returns the key itself. + * + * @param key The property key to look up. + * @return The property value or the key if not found. + */ + public String getProperty(String key) { + String value = System.getenv(key); + if (StringUtils.isNotBlank(value)) { + return value; + } + return configProp.getProperty(key) != null ? configProp.getProperty(key) : key; + } + + /** + * Loads weighted attributes for user profile completeness from configuration. + * Parses 'user.profile.attribute' and 'user.profile.weighted' properties. + */ + private void loadWeighted() { + String key = configProp.getProperty("user.profile.attribute"); + String value = configProp.getProperty("user.profile.weighted"); + + if (StringUtils.isBlank(key)) { + logger.info("PropertiesCache:loadWeighted: Profile completeness value is not set."); + return; + } + + String[] keys = key.split(","); + + if (StringUtils.isNotBlank(value)) { + String[] values = value.split(","); + if (keys.length == values.length) { + logger.info("PropertiesCache:loadWeighted: Weighted value is provided by user."); + for (int i = 0; i < keys.length; i++) { + try { + attributePercentageMap.put(keys[i], Float.valueOf(values[i])); + } catch (NumberFormatException e) { + logger.error("PropertiesCache:loadWeighted: Invalid float value for key: " + keys[i], e); + } + } + return; + } + } + + // Fallback: equally divide weight if values are missing or mismatched + logger.info("PropertiesCache:loadWeighted: Weighted value is not provided or mismatched. Distributing equally."); + float perc = 100.0f / keys.length; + for (String k : keys) { + attributePercentageMap.put(k, perc); + } + } + + /** + * Reads a property value from system environment or loaded properties. + * Unlike getProperty, this returns null if key is not found (instead of returning the key). + * + * @param key The property key. + * @return The property value, or null if not found. + */ + public String readProperty(String key) { + String value = System.getenv(key); + if (StringUtils.isNotBlank(value)) { + return value; + } + return configProp.getProperty(key); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java new file mode 100644 index 0000000000..7415c48d41 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DataMaskingService.java @@ -0,0 +1,78 @@ +/** */ +package org.sunbird.datasecurity; + +import org.apache.commons.lang3.StringUtils; +import org.sunbird.keys.JsonKey; + +/** + * Service interface for masking sensitive data such as phone numbers, emails, and OTPs. + * Provides default implementations for generic data and OTP masking. + */ +public interface DataMaskingService { + + + /** + * Checks if the given data string contains masked characters (asterisks). + * + * @param data The string to check. + * @return true if the data contains an asterisk, false otherwise. + */ + default boolean isMasked(String data) { + return data.contains(JsonKey.REPLACE_WITH_ASTERISK); + } + + /** + * Masks a phone number. + * + * @param phone The phone number to mask. + * @return The masked phone number. + */ + String maskPhone(String phone); + + /** + * Masks an email address. + * + * @param email The email address to mask. + * @return The masked email address. + */ + String maskEmail(String email); + + /** + * Masks generic data strings. + * If the data is blank or has a length of 3 or less, it is returned as is. + * Otherwise, it masks characters with asterisks, leaving the last 4 characters visible. + * + * @param data The data string to mask. + * @return The masked data string. + */ + default String maskData(String data) { + if (StringUtils.isBlank(data) || data.length() <= 3) { + return data; + } + int lenght = data.length() - 4; + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < data.length(); i++) { + if (i < lenght) { + builder.append(JsonKey.REPLACE_WITH_ASTERISK); + } else { + builder.append(data.charAt(i)); + } + } + return builder.toString(); + } + + /** + * Masks an OTP (One Time Password). + * Depending on the length (>= 6 or < 6), it masks all but the first 4 or 2 characters respectively. + * + * @param otp The OTP string to mask. + * @return The masked OTP string. + */ + default String maskOTP(String otp) { + if (otp.length() >= 6) { + return otp.replaceAll("(^[^*]{4}|(?!^)\\G)[^*]", "$1*"); + } else { + return otp.replaceAll("(^[^*]{2}|(?!^)\\G)[^*]", "$1*"); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java new file mode 100644 index 0000000000..80330c808f --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/DecryptionService.java @@ -0,0 +1,98 @@ +package org.sunbird.datasecurity; + +import java.util.List; +import java.util.Map; +import org.sunbird.request.RequestContext; + +/** + * This service will have data decryption methods. Encryption logic will differ based on implementation classes. + */ +public interface DecryptionService { + + String ALGORITHM = "AES"; + int ITERATIONS = 3; + byte[] keyValue = + new byte[] {'T', 'h', 'i', 's', 'A', 's', 'I', 'S', 'e', 'r', 'c', 'e', 'K', 't', 'e', 'y'}; + + /** + * Decrypts the given data map. Values can be primitives, Strings, or nested Maps. + * + * @param data The map containing data to decrypt. + * @param context The request context. + * @return The map with decrypted values. + */ + Map decryptData(Map data, RequestContext context); + + /** + * Decrypts the given data map. Values can be primitives, Strings, or nested Maps. + * Default implementation calls decryptData(data, null). + * + * @param data The map containing data to decrypt. + * @return The map with decrypted values. + */ + default Map decryptData(Map data) { + return decryptData(data, null); + } + + /** + * Decrypts a list of data maps. + * + * @param data The list of maps to decrypt. + * @param context The request context. + * @return The list of maps with decrypted values. + */ + List> decryptData(List> data, RequestContext context); + + /** + * Decrypts a list of data maps. + * Default implementation calls decryptData(data, null). + * + * @param data The list of maps to decrypt. + * @return The list of maps with decrypted values. + */ + default List> decryptData(List> data) { + return decryptData(data, null); + } + + /** + * Decrypts the given string data. + * + * @param data The string to decrypt. + * @param context The request context. + * @return The decrypted string. + */ + String decryptData(String data, RequestContext context); + + /** + * Decrypts the given string data. + * Default implementation calls decryptData(data, null). + * + * @param data The string to decrypt. + * @return The decrypted string. + */ + default String decryptData(String data) { + return decryptData(data, null); + } + + /** + * Decrypts the given string data with an option to throw an exception on failure. + * + * @param data The string to decrypt. + * @param throwExceptionOnFailure Whether to throw an exception if decryption fails. + * @param context The request context. + * @return The decrypted string. + */ + String decryptData(String data, boolean throwExceptionOnFailure, RequestContext context); + + /** + * Decrypts the given string data with an option to throw an exception on failure. + * Default implementation calls decryptData(data, throwExceptionOnFailure, null). + * + * @param data The string to decrypt. + * @param throwExceptionOnFailure Whether to throw an exception if decryption fails. + * @return The decrypted string. + */ + default String decryptData(String data, boolean throwExceptionOnFailure) { + return decryptData(data, throwExceptionOnFailure, null); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java new file mode 100644 index 0000000000..a053082e94 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/EncryptionService.java @@ -0,0 +1,83 @@ +package org.sunbird.datasecurity; + +import java.util.List; +import java.util.Map; +import org.sunbird.request.RequestContext; + +/** + * Service interface for data encryption operations. + * Implementations provide specific encryption logic. + */ +public interface EncryptionService { + + String ALGORITHM = "AES"; + int ITERATIONS = 3; + byte[] keyValue = + new byte[] {'T', 'h', 'i', 's', 'A', 's', 'I', 'S', 'e', 'r', 'c', 'e', 'K', 't', 'e', 'y'}; + + /** + * Encrypts the values in a map. + * + * @param data The map containing data to encrypt. + * @param context The request context. + * @return The map with encrypted values. + * @throws Exception If an error occurs during encryption. + */ + Map encryptData(Map data, RequestContext context); + + /** + * Encrypts the values in a map without a request context. + * Delegates to {@link #encryptData(Map, RequestContext)} with null context. + * + * @param data The map containing data to encrypt. + * @return The map with encrypted values. + * @throws Exception If an error occurs during encryption. + */ + default Map encryptData(Map data) throws Exception { + return encryptData(data, null); + } + + /** + * Encrypts the values in a list of maps. + * + * @param data The list of maps to encrypt. + * @param context The request context. + * @return The list of maps with encrypted values. + * @throws Exception If an error occurs during encryption. + */ + List> encryptData(List> data, RequestContext context); + + /** + * Encrypts the values in a list of maps without a request context. + * Delegates to {@link #encryptData(List, RequestContext)} with null context. + * + * @param data The list of maps to encrypt. + * @return The list of maps with encrypted values. + * @throws Exception If an error occurs during encryption. + */ + default List> encryptData(List> data) throws Exception { + return encryptData(data, null); + } + + /** + * Encrypts a single string value. + * + * @param data The string to encrypt. + * @param context The request context. + * @return The encrypted string. + * @throws Exception If an error occurs during encryption. + */ + String encryptData(String data, RequestContext context); + + /** + * Encrypts a single string value without a request context. + * Delegates to {@link #encryptData(String, RequestContext)} with null context. + * + * @param data The string to encrypt. + * @return The encrypted string. + * @throws Exception If an error occurs during encryption. + */ + default String encryptData(String data) throws Exception { + return encryptData(data, null); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java new file mode 100644 index 0000000000..c853e04804 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/OneWayHashing.java @@ -0,0 +1,39 @@ +package org.sunbird.datasecurity; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import org.sunbird.logging.LoggerUtil; + +/** + * Utility class for performing one-way data hashing. + * Uses SHA-256 algorithm to hash input strings. + */ +public class OneWayHashing { + + public static LoggerUtil logger = new LoggerUtil(OneWayHashing.class); + + private OneWayHashing() {} + + /** + * Encrypts (hashes) a value using SHA-256 algorithm. + * + * @param val The string value to hash. + * @return The SHA-256 hash of the value in hexadecimal format, or an empty string if an error occurs. + */ + public static String encryptVal(String val) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + md.update(val.getBytes(StandardCharsets.UTF_8)); + byte[] byteData = md.digest(); + // convert the byte to hex format + StringBuilder sb = new StringBuilder(); + for (byte b : byteData) { + sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); + } + return sb.toString(); + } catch (Exception e) { + logger.error("Error while encrypting", e); + } + return ""; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java new file mode 100644 index 0000000000..5363aefede --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Decoder.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.sunbird.datasecurity.impl; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PushbackInputStream; + +/** + * This class implements a BASE64 Character decoder as specified in RFC1521. + * + *

This RFC is part of the MIME specification which is published by the Internet Engineering Task + * Force (IETF). Unlike some other encoding schemes there is nothing in this encoding that tells the + * decoder where a buffer starts or stops, so to use it you will need to isolate your encoded data + * into a single chunk and then feed them this decoder. The simplest way to do that is to read all + * of the encoded data into a string and then use: + * + *

+ *      byte    mydata[];
+ *      BASE64Decoder base64 = new BASE64Decoder();
+ *
+ *      mydata = base64.decodeBuffer(bufferString);
+ * 
+ * + * This will decode the String in bufferString and give you an array of bytes in the array + * myData. + * + *

On errors, this class throws a CEFormatException with the following detail strings: + * + *

+ *    "BASE64Decoder: Not enough bytes for an atom."
+ * 
+ * + * @author Chuck McManis + * @see CharacterEncoder + * @see BASE64Decoder + */ +public class BASE64Decoder extends CharacterDecoder { + /** + * This class has 4 bytes per atom + * + * @return 4 + */ + protected int bytesPerAtom() { + return (4); + } + + /** + * Any multiple of 4 will do, 72 might be common + * + * @return 72 + */ + protected int bytesPerLine() { + return (72); + } + + /** This character array provides the character to value map based on RFC1521. */ + private static final char pem_array[] = { + // 0 1 2 3 4 5 6 7 + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 1 + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 2 + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 3 + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 4 + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 5 + 'w', 'x', 'y', 'z', '0', '1', '2', '3', // 6 + '4', '5', '6', '7', '8', '9', '+', '/' // 7 + }; + + private static final byte pem_convert_array[] = new byte[256]; + + static { + for (int i = 0; i < 255; i++) { + pem_convert_array[i] = -1; + } + for (int i = 0; i < pem_array.length; i++) { + pem_convert_array[pem_array[i]] = (byte) i; + } + } + + byte decode_buffer[] = new byte[4]; + + /** + * Decode one BASE64 atom into 1, 2, or 3 bytes of data. + * + * @param inStream The input stream to read the data from. + * @param outStream The output stream to write the decoded data to. + * @param rem The number of bytes to decode. + * @throws java.io.IOException If an I/O error occurs. + */ + @SuppressWarnings("fallthrough") + protected void decodeAtom(PushbackInputStream inStream, OutputStream outStream, int rem) + throws java.io.IOException { + int i; + byte a = -1, b = -1, c = -1, d = -1; + + if (rem < 2) { + throw new IOException("BASE64Decoder: Not enough bytes for an atom."); + } + do { + i = inStream.read(); + if (i == -1) { + throw new IOException(); + } + } while (i == '\n' || i == '\r'); + decode_buffer[0] = (byte) i; + + i = readFully(inStream, decode_buffer, 1, rem - 1); + if (i == -1) { + throw new IOException(); + } + + if (rem > 3 && decode_buffer[3] == '=') { + rem = 3; + } + if (rem > 2 && decode_buffer[2] == '=') { + rem = 2; + } + switch (rem) { + case 4: + d = pem_convert_array[decode_buffer[3] & 0xff]; + // NOBREAK + case 3: + c = pem_convert_array[decode_buffer[2] & 0xff]; + // NOBREAK + case 2: + b = pem_convert_array[decode_buffer[1] & 0xff]; + a = pem_convert_array[decode_buffer[0] & 0xff]; + break; + } + + switch (rem) { + case 2: + outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3))); + break; + case 3: + outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3))); + outStream.write((byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf))); + break; + case 4: + outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3))); + outStream.write((byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf))); + outStream.write((byte) (((c << 6) & 0xc0) | (d & 0x3f))); + break; + } + return; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java new file mode 100644 index 0000000000..73569e2b09 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/BASE64Encoder.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.sunbird.datasecurity.impl; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * This class implements a BASE64 Character encoder as specified in RFC1521. This RFC is part of the + * MIME specification as published by the Internet Engineering Task Force (IETF). Unlike some other + * encoding schemes there is nothing in this encoding that indicates where a buffer starts or ends. + * + *

This means that the encoded text will simply start with the first line of encoded text and end + * with the last line of encoded text. + * + * @author Chuck McManis + * @see CharacterEncoder + * @see BASE64Decoder + */ +public class BASE64Encoder extends CharacterEncoder { + /** + * this class encodes three bytes per atom. + * + * @return 3 + */ + protected int bytesPerAtom() { + return (3); + } + + /** + * this class encodes 57 bytes per line. This results in a maximum of 57/3 * 4 or 76 characters + * per output line. Not counting the line termination. + * + * @return 57 + */ + protected int bytesPerLine() { + return (57); + } + + /** This array maps the characters to their 6 bit values */ + private static final char pem_array[] = { + // 0 1 2 3 4 5 6 7 + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 1 + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 2 + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 3 + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 4 + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 5 + 'w', 'x', 'y', 'z', '0', '1', '2', '3', // 6 + '4', '5', '6', '7', '8', '9', '+', '/' // 7 + }; + + /** + * encodeAtom - Take three bytes of input and encode it as 4 printable characters. Note that if + * the length in len is less than three is encodes either one or two '=' signs to indicate padding + * characters. + * + * @param outStream The output stream to write the encoded data to. + * @param data The input buffer containing the data. + * @param offset The offset in the buffer to start reading. + * @param len The number of bytes to encode. + * @throws IOException If an I/O error occurs. + */ + protected void encodeAtom(OutputStream outStream, byte data[], int offset, int len) + throws IOException { + byte a, b, c; + + if (len == 1) { + a = data[offset]; + b = 0; + c = 0; + outStream.write(pem_array[(a >>> 2) & 0x3F]); + outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); + outStream.write('='); + outStream.write('='); + } else if (len == 2) { + a = data[offset]; + b = data[offset + 1]; + c = 0; + outStream.write(pem_array[(a >>> 2) & 0x3F]); + outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); + outStream.write(pem_array[((b << 2) & 0x3c) + ((c >>> 6) & 0x3)]); + outStream.write('='); + } else { + a = data[offset]; + b = data[offset + 1]; + c = data[offset + 2]; + outStream.write(pem_array[(a >>> 2) & 0x3F]); + outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); + outStream.write(pem_array[((b << 2) & 0x3c) + ((c >>> 6) & 0x3)]); + outStream.write(pem_array[c & 0x3F]); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java new file mode 100644 index 0000000000..0c2775ea1d --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterDecoder.java @@ -0,0 +1,270 @@ +/* + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.sunbird.datasecurity.impl; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PushbackInputStream; +import java.nio.ByteBuffer; + +/** + * This class defines the decoding half of character encoders. A character decoder is an algorithim + * for transforming 8 bit binary data that has been encoded into text by a character encoder, back + * into original binary form. + * + *

The character encoders, in general, have been structured around a central theme that binary + * data can be encoded into text that has the form: + * + *

+ *      [Buffer Prefix]
+ *      [Line Prefix][encoded data atoms][Line Suffix]
+ *      [Buffer Suffix]
+ * 
+ * + * Of course in the simplest encoding schemes, the buffer has no distinct prefix of suffix, however + * all have some fixed relationship between the text in an 'atom' and the binary data itself. + * + *

In the CharacterEncoder and CharacterDecoder classes, one complete chunk of data is referred + * to as a buffer. Encoded buffers are all text, and decoded buffers (sometimes just referred + * to as buffers) are binary octets. + * + *

To create a custom decoder, you must, at a minimum, overide three abstract methods in this + * class. + * + *

+ *
bytesPerAtom which tells the decoder how many bytes to expect from decodeAtom + *
decodeAtom which decodes the bytes sent to it as text. + *
bytesPerLine which tells the encoder the maximum number of bytes per line. + *
+ * + * In general, the character decoders return error in the form of a CEFormatException. The syntax of + * the detail string is + * + *
+ *      DecoderClassName: Error message.
+ * 
+ * + * Several useful decoders have already been written and are referenced in the See Also list below. + * + * @author Chuck McManis + * @see CharacterEncoder + * @see BASE64Decoder + */ +public abstract class CharacterDecoder { + public CharacterDecoder() {} + /** + * Return the number of bytes per atom of decoding + * + * @return The number of bytes per atom. + */ + protected abstract int bytesPerAtom(); + + /** + * Return the maximum number of bytes that can be encoded per line + * + * @return The maximum number of bytes per line. + */ + protected abstract int bytesPerLine(); + + /** + * decode the beginning of the buffer, by default this is a NOP. + * + * @param aStream The input stream. + * @param bStream The output stream. + * @throws IOException If an I/O error occurs. + */ + protected void decodeBufferPrefix(PushbackInputStream aStream, OutputStream bStream) + throws IOException {} + + /** + * decode the buffer suffix, again by default it is a NOP. + * + * @param aStream The input stream. + * @param bStream The output stream. + * @throws IOException If an I/O error occurs. + */ + protected void decodeBufferSuffix(PushbackInputStream aStream, OutputStream bStream) + throws IOException {} + + /** + * This method should return, if it knows, the number of bytes that will be decoded. Many formats + * such as uuencoding provide this information. By default we return the maximum bytes that could + * have been encoded on the line. + * + * @param aStream The input stream. + * @param bStream The output stream. + * @return The expected number of bytes. + * @throws IOException If an I/O error occurs. + */ + protected int decodeLinePrefix(PushbackInputStream aStream, OutputStream bStream) + throws IOException { + return (bytesPerLine()); + } + + /** + * This method post processes the line, if there are error detection or correction codes in a + * line, they are generally processed by this method. The simplest version of this method looks + * for the (newline) character. + * + * @param aStream The input stream. + * @param bStream The output stream. + * @throws IOException If an I/O error occurs. + */ + protected void decodeLineSuffix(PushbackInputStream aStream, OutputStream bStream) + throws IOException {} + + /** + * This method does an actual decode. It takes the decoded bytes and writes them to the + * OutputStream. The integer l tells the method how many bytes are required. This is always + * <= bytesPerAtom(). + * + * @param aStream The input stream. + * @param bStream The output stream. + * @param l The number of bytes to decode. + * @throws IOException If an I/O error occurs. + */ + protected void decodeAtom(PushbackInputStream aStream, OutputStream bStream, int l) + throws IOException { + throw new IOException(); + } + + /** + * This method works around the bizarre semantics of BufferedInputStream's read method. + * + * @param in The input stream. + * @param buffer The buffer to read into. + * @param offset The offset to start reading at. + * @param len The number of bytes to read. + * @return The number of bytes read. + * @throws java.io.IOException If an I/O error occurs. + */ + protected int readFully(InputStream in, byte buffer[], int offset, int len) + throws java.io.IOException { + for (int i = 0; i < len; i++) { + int q = in.read(); + if (q == -1) return ((i == 0) ? -1 : i); + buffer[i + offset] = (byte) q; + } + return len; + } + + /** + * Decode the text from the InputStream and write the decoded octets to the OutputStream. This + * method runs until the stream is exhausted. + * + * @param aStream The input stream. + * @param bStream The output stream. + * @throws IOException An error has occurred while decoding + * @throws IOException The input stream is unexpectedly out of data + */ + public void decodeBuffer(InputStream aStream, OutputStream bStream) throws IOException { + int i; + int totalBytes = 0; + + PushbackInputStream ps = new PushbackInputStream(aStream); + decodeBufferPrefix(ps, bStream); + while (true) { + int length; + + try { + length = decodeLinePrefix(ps, bStream); + for (i = 0; (i + bytesPerAtom()) < length; i += bytesPerAtom()) { + decodeAtom(ps, bStream, bytesPerAtom()); + totalBytes += bytesPerAtom(); + } + if ((i + bytesPerAtom()) == length) { + decodeAtom(ps, bStream, bytesPerAtom()); + totalBytes += bytesPerAtom(); + } else { + decodeAtom(ps, bStream, length - i); + totalBytes += (length - i); + } + decodeLineSuffix(ps, bStream); + } catch (IOException e) { + break; + } + } + decodeBufferSuffix(ps, bStream); + } + + /** + * Alternate decode interface that takes a String containing the encoded buffer and returns a byte + * array containing the data. + * + * @param inputString The string to decode. + * @return The decoded data. + * @throws IOException An error has occurred while decoding + */ + public byte decodeBuffer(String inputString)[] throws IOException { + byte inputBuffer[] = new byte[inputString.length()]; + ByteArrayInputStream inStream; + ByteArrayOutputStream outStream; + + inputString.getBytes(0, inputString.length(), inputBuffer, 0); + inStream = new ByteArrayInputStream(inputBuffer); + outStream = new ByteArrayOutputStream(); + decodeBuffer(inStream, outStream); + return (outStream.toByteArray()); + } + + /** + * Decode the contents of the inputstream into a buffer. + * + * @param in The input stream. + * @return The decoded data. + * @throws IOException If an I/O error occurs. + */ + public byte decodeBuffer(InputStream in)[] throws IOException { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + decodeBuffer(in, outStream); + return (outStream.toByteArray()); + } + + /** + * Decode the contents of the String into a ByteBuffer. + * + * @param inputString The string to decode. + * @return The decoded data as a ByteBuffer. + * @throws IOException If an I/O error occurs. + */ + public ByteBuffer decodeBufferToByteBuffer(String inputString) throws IOException { + return ByteBuffer.wrap(decodeBuffer(inputString)); + } + + /** + * Decode the contents of the inputStream into a ByteBuffer. + * + * @param in The input stream. + * @return The decoded data as a ByteBuffer. + * @throws IOException If an I/O error occurs. + */ + public ByteBuffer decodeBufferToByteBuffer(InputStream in) throws IOException { + return ByteBuffer.wrap(decodeBuffer(in)); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java new file mode 100644 index 0000000000..67581fc64b --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/CharacterEncoder.java @@ -0,0 +1,401 @@ +/* + * Copyright (c) 1995, 2005, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.sunbird.datasecurity.impl; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.nio.ByteBuffer; + +/** + * This class defines the encoding half of character encoders. A character encoder is an algorithim + * for transforming 8 bit binary data into text (generally 7 bit ASCII or 8 bit ISO-Latin-1 text) + * for transmition over text channels such as e-mail and network news. + * + *

The character encoders have been structured around a central theme that, in general, the + * encoded text has the form: + * + *

+ *      [Buffer Prefix]
+ *      [Line Prefix][encoded data atoms][Line Suffix]
+ *      [Buffer Suffix]
+ * 
+ * + * In the CharacterEncoder and CharacterDecoder classes, one complete chunk of data is referred to + * as a buffer. Encoded buffers are all text, and decoded buffers (sometimes just referred to + * as buffers) are binary octets. + * + *

To create a custom encoder, you must, at a minimum, overide three abstract methods in this + * class. + * + *

+ *
bytesPerAtom which tells the encoder how many bytes to send to encodeAtom + *
encodeAtom which encodes the bytes sent to it as text. + *
bytesPerLine which tells the encoder the maximum number of bytes per line. + *
+ * + * Several useful encoders have already been written and are referenced in the See Also list below. + * + * @author Chuck McManis + * @see CharacterDecoder + * @see BASE64Encoder + */ +public abstract class CharacterEncoder { + /** Stream that understands "printing" */ + protected PrintStream pStream; + + /** + * Return the number of bytes per atom of encoding + * + * @return The number of bytes per atom. + */ + protected abstract int bytesPerAtom(); + + /** + * Return the number of bytes that can be encoded per line + * + * @return The maximum number of bytes per line. + */ + protected abstract int bytesPerLine(); + + /** + * Encode the prefix for the entire buffer. By default is simply opens the PrintStream for use by + * the other functions. + * + * @param aStream The output stream. + * @throws IOException If an I/O error occurs. + */ + protected void encodeBufferPrefix(OutputStream aStream) throws IOException { + pStream = new PrintStream(aStream); + } + + /** + * Encode the suffix for the entire buffer. + * + * @param aStream The output stream. + * @throws IOException If an I/O error occurs. + */ + protected void encodeBufferSuffix(OutputStream aStream) throws IOException {} + + /** + * Encode the prefix that starts every output line. + * + * @param aStream The output stream. + * @param aLength The number of bytes to be encoded. + * @throws IOException If an I/O error occurs. + */ + protected void encodeLinePrefix(OutputStream aStream, int aLength) throws IOException {} + + /** + * Encode the suffix that ends every output line. By default this method just prints a + * into the output stream. + * + * @param aStream The output stream. + * @throws IOException If an I/O error occurs. + */ + protected void encodeLineSuffix(OutputStream aStream) throws IOException { + pStream.println(); + } + + /** + * Encode one "atom" of information into characters. + * + * @param aStream The output stream. + * @param someBytes The input buffer. + * @param anOffset The offset to start reading at. + * @param aLength The number of bytes to encode. + * @throws IOException If an I/O error occurs. + */ + protected abstract void encodeAtom( + OutputStream aStream, byte someBytes[], int anOffset, int aLength) throws IOException; + + /** + * This method works around the bizarre semantics of BufferedInputStream's read method. + * + * @param in The input stream. + * @param buffer The buffer to read into. + * @return The number of bytes read. + * @throws java.io.IOException If an I/O error occurs. + */ + protected int readFully(InputStream in, byte buffer[]) throws java.io.IOException { + for (int i = 0; i < buffer.length; i++) { + int q = in.read(); + if (q == -1) return i; + buffer[i] = (byte) q; + } + return buffer.length; + } + + /** + * Encode bytes from the input stream, and write them as text characters to the output stream. + * This method will run until it exhausts the input stream, but does not print the line suffix for + * a final line that is shorter than bytesPerLine(). + * + * @param inStream The input stream. + * @param outStream The output stream. + * @throws IOException If an I/O error occurs. + */ + public void encode(InputStream inStream, OutputStream outStream) throws IOException { + int j; + int numBytes; + byte tmpbuffer[] = new byte[bytesPerLine()]; + + encodeBufferPrefix(outStream); + + while (true) { + numBytes = readFully(inStream, tmpbuffer); + if (numBytes == 0) { + break; + } + encodeLinePrefix(outStream, numBytes); + for (j = 0; j < numBytes; j += bytesPerAtom()) { + + if ((j + bytesPerAtom()) <= numBytes) { + encodeAtom(outStream, tmpbuffer, j, bytesPerAtom()); + } else { + encodeAtom(outStream, tmpbuffer, j, (numBytes) - j); + } + } + if (numBytes < bytesPerLine()) { + break; + } else { + encodeLineSuffix(outStream); + } + } + encodeBufferSuffix(outStream); + } + + /** + * Encode the buffer in aBuffer and write the encoded result to the OutputStream + * aStream. + * + * @param aBuffer The input buffer. + * @param aStream The output stream. + * @throws IOException If an I/O error occurs. + */ + public void encode(byte aBuffer[], OutputStream aStream) throws IOException { + ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); + encode(inStream, aStream); + } + + /** + * A 'streamless' version of encode that simply takes a buffer of bytes and returns a string + * containing the encoded buffer. + * + * @param aBuffer The input buffer. + * @return The encoded string. + */ + public String encode(byte aBuffer[]) { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); + String retVal = null; + try { + encode(inStream, outStream); + // explicit ascii->unicode conversion + retVal = outStream.toString("8859_1"); + } catch (Exception IOException) { + // This should never happen. + throw new Error("CharacterEncoder.encode internal error"); + } + return (retVal); + } + + /** + * Return a byte array from the remaining bytes in this ByteBuffer. + * + *

The ByteBuffer's position will be advanced to ByteBuffer's limit. + * + *

To avoid an extra copy, the implementation will attempt to return the byte array backing the + * ByteBuffer. If this is not possible, a new byte array will be created. + * + * @param bb The input ByteBuffer. + * @return The byte array. + */ + private byte[] getBytes(ByteBuffer bb) { + /* + * This should never return a BufferOverflowException, as we're + * careful to allocate just the right amount. + */ + byte[] buf = null; + + /* + * If it has a usable backing byte buffer, use it. Use only + * if the array exactly represents the current ByteBuffer. + */ + if (bb.hasArray()) { + byte[] tmp = bb.array(); + if ((tmp.length == bb.capacity()) && (tmp.length == bb.remaining())) { + buf = tmp; + bb.position(bb.limit()); + } + } + + if (buf == null) { + /* + * This class doesn't have a concept of encode(buf, len, off), + * so if we have a partial buffer, we must reallocate + * space. + */ + buf = new byte[bb.remaining()]; + + /* + * position() automatically updated + */ + bb.get(buf); + } + + return buf; + } + + /** + * Encode the aBuffer ByteBuffer and write the encoded result to the OutputStream + * aStream. + * + *

The ByteBuffer's position will be advanced to ByteBuffer's limit. + * + * @param aBuffer The input ByteBuffer. + * @param aStream The output stream. + * @throws IOException If an I/O error occurs. + */ + public void encode(ByteBuffer aBuffer, OutputStream aStream) throws IOException { + byte[] buf = getBytes(aBuffer); + encode(buf, aStream); + } + + /** + * A 'streamless' version of encode that simply takes a ByteBuffer and returns a string containing + * the encoded buffer. + * + *

The ByteBuffer's position will be advanced to ByteBuffer's limit. + * + * @param aBuffer The input ByteBuffer. + * @return The encoded string. + */ + public String encode(ByteBuffer aBuffer) { + byte[] buf = getBytes(aBuffer); + return encode(buf); + } + + /** + * Encode bytes from the input stream, and write them as text characters to the output stream. + * This method will run until it exhausts the input stream. It differs from encode in that it will + * add the line at the end of a final line that is shorter than bytesPerLine(). + * + * @param inStream The input stream. + * @param outStream The output stream. + * @throws IOException If an I/O error occurs. + */ + public void encodeBuffer(InputStream inStream, OutputStream outStream) throws IOException { + int j; + int numBytes; + byte tmpbuffer[] = new byte[bytesPerLine()]; + + encodeBufferPrefix(outStream); + + while (true) { + numBytes = readFully(inStream, tmpbuffer); + if (numBytes == 0) { + break; + } + encodeLinePrefix(outStream, numBytes); + for (j = 0; j < numBytes; j += bytesPerAtom()) { + if ((j + bytesPerAtom()) <= numBytes) { + encodeAtom(outStream, tmpbuffer, j, bytesPerAtom()); + } else { + encodeAtom(outStream, tmpbuffer, j, (numBytes) - j); + } + } + encodeLineSuffix(outStream); + if (numBytes < bytesPerLine()) { + break; + } + } + encodeBufferSuffix(outStream); + } + + /** + * Encode the buffer in aBuffer and write the encoded result to the OutputStream + * aStream. + * + * @param aBuffer The input buffer. + * @param aStream The output stream. + * @throws IOException If an I/O error occurs. + */ + public void encodeBuffer(byte aBuffer[], OutputStream aStream) throws IOException { + ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); + encodeBuffer(inStream, aStream); + } + + /** + * A 'streamless' version of encode that simply takes a buffer of bytes and returns a string + * containing the encoded buffer. + * + * @param aBuffer The input buffer. + * @return The encoded string. + */ + public String encodeBuffer(byte aBuffer[]) { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); + try { + encodeBuffer(inStream, outStream); + } catch (Exception IOException) { + // This should never happen. + throw new Error("CharacterEncoder.encodeBuffer internal error"); + } + return (outStream.toString()); + } + + /** + * Encode the aBuffer ByteBuffer and write the encoded result to the OutputStream + * aStream. + * + *

The ByteBuffer's position will be advanced to ByteBuffer's limit. + * + * @param aBuffer The input ByteBuffer. + * @param aStream The output stream. + * @throws IOException If an I/O error occurs. + */ + public void encodeBuffer(ByteBuffer aBuffer, OutputStream aStream) throws IOException { + byte[] buf = getBytes(aBuffer); + encodeBuffer(buf, aStream); + } + + /** + * A 'streamless' version of encode that simply takes a ByteBuffer and returns a string containing + * the encoded buffer. + * + *

The ByteBuffer's position will be advanced to ByteBuffer's limit. + * + * @param aBuffer The input ByteBuffer. + * @return The encoded string. + */ + public String encodeBuffer(ByteBuffer aBuffer) { + byte[] buf = getBytes(aBuffer); + return encodeBuffer(buf); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java new file mode 100644 index 0000000000..9cf94825af --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDataMaskServiceImpl.java @@ -0,0 +1,67 @@ +package org.sunbird.datasecurity.impl; + +import org.apache.commons.lang3.StringUtils; +import org.sunbird.datasecurity.DataMaskingService; +import org.sunbird.keys.JsonKey; +import org.sunbird.common.ProjectUtil; + +/** + * Default implementation of the {@link DataMaskingService} interface. + * Provides functionality to mask phone numbers and email addresses. + */ +public class DefaultDataMaskServiceImpl implements DataMaskingService { + + /** + * Masks a phone number by keeping the last 4 digits visible. + * Masking character is defined in JsonKey.REPLACE_WITH_ASTERISK. + * + * @param phone The phone number to mask. + * @return The masked phone number, or the original if it is blank or shorter than 10 characters. + */ + @Override + public String maskPhone(String phone) { + if (StringUtils.isBlank(phone) || phone.length() < 10) { + return phone; + } + String tempPhone = ""; + StringBuilder builder = new StringBuilder(); + tempPhone = phone.trim().replace("-", ""); + int length = tempPhone.length(); + for (int i = 0; i < length; i++) { + if (i < length - 4) { + builder.append(JsonKey.REPLACE_WITH_ASTERISK); + } else { + builder.append(tempPhone.charAt(i)); + } + } + return builder.toString(); + } + + /** + * Masks an email address. + * Keeps the first 2 characters and the domain part (after the last @) visible. + * Masks characters in between. + * + * @param email The email address to mask. + * @return The masked email address, or the original if it is blank or invalid. + */ + @Override + public String maskEmail(String email) { + if ((StringUtils.isBlank(email)) || (!ProjectUtil.isEmailvalid(email))) { + return email; + } + StringBuilder builder = new StringBuilder(); + String[] emails = email.split("@"); + int length = emails[0].length(); + for (int i = 0; i < email.length(); i++) { + if (i < 2 || i >= length) { + builder.append(email.charAt(i)); + } else { + builder.append(JsonKey.REPLACE_WITH_ASTERISK); + } + } + return builder.toString(); + } +} + + diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java new file mode 100644 index 0000000000..ae2e2d2f2b --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultDecryptionServiceImpl.java @@ -0,0 +1,217 @@ +package org.sunbird.datasecurity.impl; + +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.datasecurity.DecryptionService; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; +import org.sunbird.common.ProjectUtil; + +/** + * Default implementation of the {@link DecryptionService} interface. + * Uses AES encryption algorithm to decrypt data. + */ +public class DefaultDecryptionServiceImpl implements DecryptionService { + private static final LoggerUtil logger = new LoggerUtil(DefaultDecryptionServiceImpl.class); + + private static String sunbird_encryption = ""; + + private String sunbirdEncryption = ""; + + private static Cipher c; + + static { + try { + sunbird_encryption = DefaultEncryptionServiceImpl.getSalt(); + Key key = generateKey(); + c = Cipher.getInstance(ALGORITHM); + c.init(Cipher.DECRYPT_MODE, key); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } + + public DefaultDecryptionServiceImpl() { + sunbirdEncryption = System.getenv(JsonKey.SUNBIRD_ENCRYPTION); + if (StringUtils.isBlank(sunbirdEncryption)) { + sunbirdEncryption = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_ENCRYPTION); + } + } + + /** + * Decrypts values in a map if encryption is enabled. + * Modifies the map in-place. + * + * @param data The map containing data to decrypt. + * @param context The request context. + * @return The data map with decrypted values. + */ + @Override + public Map decryptData(Map data, RequestContext context) { + if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { + if (data == null) { + return data; + } + Iterator> itr = data.entrySet().iterator(); + while (itr.hasNext()) { + Entry entry = itr.next(); + if (!(entry.getValue() instanceof Map || entry.getValue() instanceof List) + && null != entry.getValue()) { + data.put(entry.getKey(), decrypt(entry.getValue() + "", false, context)); + } + } + } + return data; + } + + /** + * Decrypts values in a list of maps. + * + * @param data The list of maps to decrypt. + * @param context The request context. + * @return The list of maps with decrypted values. + */ + @Override + public List> decryptData( + List> data, RequestContext context) { + if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { + if (data == null || data.isEmpty()) { + return data; + } + + for (Map map : data) { + decryptData(map, context); + } + } + return data; + } + + /** + * Decrypts a single string value. + * + * @param data The string to decrypt. + * @param context The request context. + * @return The decrypted string, or the original string if encryption is disabled. + */ + @Override + public String decryptData(String data, RequestContext context) { + return decryptData(data, false, context); + } + + /** + * Decrypts a single string value, optionally throwing an exception on failure. + * + * @param data The string to decrypt. + * @param throwExceptionOnFailure Whether to throw an exception if decryption fails. + * @param context The request context. + * @return The decrypted string. + */ + @Override + public String decryptData(String data, boolean throwExceptionOnFailure, RequestContext context) { + if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { + if (StringUtils.isBlank(data)) { + return data; + } else { + return decrypt(data, throwExceptionOnFailure, context); + } + } else { + return data; + } + } + + /** + * Internal method to perform the decryption logic. + * + * @param value The value to decrypt. + * @param throwExceptionOnFailure Whether to throw an exception on error. + * @param context The request context. + * @return The decrypted value. + */ + public static String decrypt( + String value, boolean throwExceptionOnFailure, RequestContext context) { + try { + String dValue = null; + String valueToDecrypt = value.trim(); + for (int i = 0; i < ITERATIONS; i++) { + byte[] decordedValue = new BASE64Decoder().decodeBuffer(valueToDecrypt); + byte[] decValue = c.doFinal(decordedValue); + dValue = + new String(decValue, StandardCharsets.UTF_8).substring(sunbird_encryption.length()); + valueToDecrypt = dValue; + } + return dValue; + } catch (Exception ex) { + // This could happen with masked email and phone number. Not others. + logger.error(context, "DefaultDecryptionServiceImpl:decrypt: ignorable errorMsg = ", ex); + if (throwExceptionOnFailure) { + logger.info( + context, "Throwing exception error upon explicit ask by callers for value " + value); + ProjectCommonException.throwServerErrorException(ResponseCode.SERVER_ERROR); + } + } + return value; + } + + private static Key generateKey() { + return new SecretKeySpec(keyValue, ALGORITHM); + } + + /** + * Decrypts values in a map without a request context. + * Delegates to {@link #decryptData(Map, RequestContext)} with null context. + * + * @param data The map containing data to decrypt. + * @return The data map with decrypted values. + */ + @Override + public Map decryptData(Map data) { + return decryptData(data, null); + } + + /** + * Decrypts values in a list of maps without a request context. + * Delegates to {@link #decryptData(List, RequestContext)} with null context. + * + * @param data The list of maps to decrypt. + * @return The list of maps with decrypted values. + */ + @Override + public List> decryptData(List> data) { + return decryptData(data, null); + } + + /** + * Decrypts a single string value without a request context. + * Delegates to {@link #decryptData(String, RequestContext)} with null context. + * + * @param data The string to decrypt. + * @return The decrypted string. + */ + @Override + public String decryptData(String data) { + return decryptData(data, null); + } + + /** + * Decrypts a single string value without a request context, optionally throwing an exception on failure. + * Delegates to {@link #decryptData(String, boolean, RequestContext)} with null context. + * + * @param data The string to decrypt. + * @param throwExceptionOnFailure Whether to throw an exception if decryption fails. + * @return The decrypted string. + */ + @Override + public String decryptData(String data, boolean throwExceptionOnFailure) { + return decryptData(data, throwExceptionOnFailure, null); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java new file mode 100644 index 0000000000..568272eb52 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/DefaultEncryptionServiceImpl.java @@ -0,0 +1,215 @@ +package org.sunbird.datasecurity.impl; + +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.datasecurity.EncryptionService; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; +import org.sunbird.common.ProjectUtil; + +/** + * Default implementation of the {@link EncryptionService} interface. + * Uses AES encryption algorithm to encrypt data. + */ +public class DefaultEncryptionServiceImpl implements EncryptionService { + private static final LoggerUtil logger = new LoggerUtil(DefaultEncryptionServiceImpl.class); + + private static String encryption_key = ""; + + private String sunbirdEncryption = ""; + + private static Cipher c; + + static { + try { + encryption_key = getSalt(); + Key key = generateKey(); + c = Cipher.getInstance(ALGORITHM); + c.init(Cipher.ENCRYPT_MODE, key); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } + + public DefaultEncryptionServiceImpl() { + sunbirdEncryption = System.getenv(JsonKey.SUNBIRD_ENCRYPTION); + if (StringUtils.isBlank(sunbirdEncryption)) { + sunbirdEncryption = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_ENCRYPTION); + } + } + + /** + * Encrypts the values in a map. + * + * @param data The map containing data to encrypt. + * @param context The request context. + * @return The map with encrypted values. + */ + @Override + public Map encryptData(Map data, RequestContext context) { + if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { + if (data == null) { + return data; + } + Iterator> itr = data.entrySet().iterator(); + while (itr.hasNext()) { + Entry entry = itr.next(); + if (!(entry.getValue() instanceof Map || entry.getValue() instanceof List) + && null != entry.getValue()) { + data.put(entry.getKey(), encrypt(entry.getValue() + "", context)); + } + } + } + return data; + } + + /** + * Encrypts the values in a list of maps. + * + * @param data The list of maps to encrypt. + * @param context The request context. + * @return The list of maps with encrypted values. + */ + @Override + public List> encryptData( + List> data, RequestContext context) { + if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { + if (data == null || data.isEmpty()) { + return data; + } + for (Map map : data) { + encryptData(map, context); + } + } + return data; + } + + /** + * Encrypts a single string value. + * + * @param data The string to encrypt. + * @param context The request context. + * @return The encrypted string. + */ + @Override + public String encryptData(String data, RequestContext context) { + if (JsonKey.ON.equalsIgnoreCase(sunbirdEncryption)) { + if (StringUtils.isNotBlank(data)) { + return encrypt(data, context); + } else { + return data; + } + } else { + return data; + } + } + + /** + * Encrypts the given value using the configured algorithm/key. + * + * @param value String password or data to encrypt. + * @param context The request context. + * @return encrypted string. + */ + @SuppressWarnings("restriction") + public static String encrypt(String value, RequestContext context) { + String valueToEnc = null; + String eValue = value; + for (int i = 0; i < ITERATIONS; i++) { + valueToEnc = encryption_key + eValue; + byte[] encValue = new byte[0]; + try { + encValue = c.doFinal(valueToEnc.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + logger.error( + context, "Exception while encrypting user data, with message : " + e.getMessage(), e); + throw new ProjectCommonException( + ResponseCode.serverError, + ResponseCode.serverError.getErrorMessage(), + ResponseCode.SERVER_ERROR.getResponseCode()); + } + eValue = new BASE64Encoder().encode(encValue); + } + return eValue; + } + + private static Key generateKey() { + return new SecretKeySpec(keyValue, ALGORITHM); + } + + /** + * Retrieves the encryption salt (key) from environment or config. + * @return The encryption key. + */ + public static String getSalt() { + if (!StringUtils.isBlank(encryption_key)) { + return encryption_key; + } else { + encryption_key = System.getenv(JsonKey.ENCRYPTION_KEY); + if (StringUtils.isBlank(encryption_key)) { + logger.info("Salt value is not provided by Env"); + encryption_key = ProjectUtil.getConfigValue(JsonKey.ENCRYPTION_KEY); + } + } + if (StringUtils.isBlank(encryption_key)) { + logger.info("throwing exception for invalid salt"); + throw new ProjectCommonException( + ResponseCode.invalidParameterValue, + String.format( + ResponseCode.invalidParameterValue.getErrorMessage(), JsonKey.ENCRYPTION_KEY), + ResponseCode.SERVER_ERROR.getResponseCode()); + } + return encryption_key; + } + + /** + * Encrypts the values in a map without a request context. + * Delegates to {@link #encryptData(Map, RequestContext)} with null context. + * + * @param data The map containing data to encrypt. + * @return The map with encrypted values. + * @throws Exception If an error occurs during encryption. + */ + @Override + public Map encryptData(Map data) throws Exception { + return encryptData(data, null); + } + + /** + * Encrypts the values in a list of maps without a request context. + * Delegates to {@link #encryptData(List, RequestContext)} with null context. + * + * @param data The list of maps to encrypt. + * @return The list of maps with encrypted values. + * @throws Exception If an error occurs during encryption. + */ + @Override + public List> encryptData(List> data) throws Exception { + return encryptData(data, null); + } + + /** + * Encrypts a single string value without a request context. + * Delegates to {@link #encryptData(String, RequestContext)} with null context. + * + * @param data The string to encrypt. + * @return The encrypted string. + * @throws Exception If an error occurs during encryption. + */ + @Override + public String encryptData(String data) throws Exception { + return encryptData(data, null); + } +} + + diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java new file mode 100644 index 0000000000..db888a2d55 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/LogMaskServiceImpl.java @@ -0,0 +1,40 @@ +package org.sunbird.datasecurity.impl; + +import org.sunbird.datasecurity.DataMaskingService; + +/** + * Implementation of DataMaskingService for logging purposes. + * Provides masking logic suitable for log outputs. + */ +public class LogMaskServiceImpl implements DataMaskingService { + + /** + * Masks an email address for logging. + * If the local part (before @) is longer than 4 characters, keeps the first 4 visible. + * Otherwise, keeps the first 2 visible. + * The domain part is kept visible. + * + * @param email The email address to mask. + * @return The masked email address. + */ + @Override + public String maskEmail(String email) { + if (email.indexOf("@") > 4) { + return email.replaceAll("(^[^@]{4}|(?!^)\\G)[^@]", "$1*"); + } else { + return email.replaceAll("(^[^@]{2}|(?!^)\\G)[^@]", "$1*"); + } + } + + /** + * Masks a phone number for logging. + * Masks all but the last digit (assuming 10-digit standard for the regex logic). + * + * @param phone The phone number to mask. + * @return The masked phone number. + */ + @Override + public String maskPhone(String phone) { + return phone.replaceAll("(^[^*]{9}|(?!^)\\G)[^*]", "$1*"); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java new file mode 100644 index 0000000000..e9d9939b10 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/datasecurity/impl/ServiceFactory.java @@ -0,0 +1,114 @@ +package org.sunbird.datasecurity.impl; + +import org.apache.commons.lang3.StringUtils; +import org.sunbird.datasecurity.DataMaskingService; +import org.sunbird.datasecurity.DecryptionService; +import org.sunbird.datasecurity.EncryptionService; + +/** + * Factory class to provide instances of data security services. + * Supports EncryptionService, DecryptionService, and DataMaskingService. + * Provides both parameterized (for backward compatibility) and non-parameterized factory methods. + */ +public class ServiceFactory { + + private static EncryptionService encryptionService; + private static DecryptionService decryptionService; + private static DataMaskingService maskingService; + + static { + encryptionService = new DefaultEncryptionServiceImpl(); + decryptionService = new DefaultDecryptionServiceImpl(); + maskingService = new DefaultDataMaskServiceImpl(); + } + + /** + * Provides the default instance of EncryptionService. + * + * @return The default EncryptionService instance. + */ + public static EncryptionService getEncryptionServiceInstance() { + return encryptionService; + } + + /** + * Provides an instance of EncryptionService. + * Currently, returns the default instance regardless of the input value, + * but supports the parameter for backward compatibility. + * + * @param val The type of service implementation required (e.g., "defaultEncryption"). + * Pass null or empty for the default implementation. + * @return An instance of EncryptionService. + */ + public static EncryptionService getEncryptionServiceInstance(String val) { + if (StringUtils.isBlank(val)) { + return encryptionService; + } + switch (val) { + case "defaultEncryption": + return encryptionService; + default: + return encryptionService; + } + } + + /** + * Provides the default instance of DecryptionService. + * + * @return The default DecryptionService instance. + */ + public static DecryptionService getDecryptionServiceInstance() { + return decryptionService; + } + + /** + * Provides an instance of DecryptionService. + * Currently, returns the default instance regardless of the input value, + * but supports the parameter for backward compatibility. + * + * @param val The type of service implementation required (e.g., "defaultDecryption"). + * Pass null or empty for the default implementation. + * @return An instance of DecryptionService. + */ + public static DecryptionService getDecryptionServiceInstance(String val) { + if (StringUtils.isBlank(val)) { + return decryptionService; + } + switch (val) { + case "defaultDecryption": + return decryptionService; + default: + return decryptionService; + } + } + + /** + * Provides the default instance of DataMaskingService. + * + * @return The default DataMaskingService instance. + */ + public static DataMaskingService getMaskingServiceInstance() { + return maskingService; + } + + /** + * Provides an instance of DataMaskingService. + * Currently, returns the default instance regardless of the input value, + * but supports the parameter for backward compatibility. + * + * @param val The type of service implementation required (e.g., "defaultMasking"). + * Pass null or empty for the default implementation. + * @return An instance of DataMaskingService. + */ + public static DataMaskingService getMaskingServiceInstance(String val) { + if (StringUtils.isBlank(val)) { + return maskingService; + } + switch (val) { + case "defaultMasking": + return maskingService; + default: + return maskingService; + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java b/core/sunbird-platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java new file mode 100644 index 0000000000..7de753087c --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/exception/ProjectCommonException.java @@ -0,0 +1,283 @@ +package org.sunbird.exception; + +import java.text.MessageFormat; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; + +/** + * A comprehensive exception class used across the backend to handle error scenarios. + * This class encapsulates error codes, messages, and HTTP status codes, supporting both + * unified error handling and backward compatibility for various service modules. + */ +public class ProjectCommonException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** The application-specific error code (e.g., "ERR_USER_NOT_FOUND"). */ + private String errorCode; + + /** The human-readable error message. */ + private String errorMessage; + + /** The HTTP status code associated with this error (e.g., 400, 404, 500). */ + private int errorResponseCode; + + /** The rich enum representation of the error, if available. */ + private ResponseCode responseCode; + + /** + * Constructs a new ProjectCommonException using a ResponseCode enum. + * + * @param code The ResponseCode enum representing the error type. + * @param message A custom error message description. + * @param responseCode The HTTP status code to return to the client. + */ + public ProjectCommonException(ResponseCode code, String message, int responseCode) { + super(message); + this.responseCode = code; + this.errorCode = code.getErrorCode(); + this.errorMessage = message; + this.errorResponseCode = responseCode; + } + + /** + * Constructs a new ProjectCommonException with a string error code. + * This constructor is primarily used for scenarios where a ResponseCode enum is not strictly required. + * + * @param errorCode The string representation of the error code. + * @param message The error message description. + * @param responseCode The HTTP status code to return to the client. + */ + public ProjectCommonException(String errorCode, String message, int responseCode) { + super(message); + this.errorCode = errorCode; + this.errorMessage = message; + this.errorResponseCode = responseCode; + this.responseCode = null; + } + + /** + * Constructs a new ProjectCommonException wrapping another exception, typically for actor operations. + * Adds service-specific prefixes to the error code. + * + * @param pce The original ProjectCommonException to wrap. + * @param actorOperation The actor operation context to append to the error code prefix. + */ + public ProjectCommonException(ProjectCommonException pce, String actorOperation) { + super(pce.getMessage()); + this.setStackTrace(pce.getStackTrace()); + this.errorCode = + new StringBuilder(JsonKey.USER_ORG_SERVICE_PREFIX) + .append(actorOperation) + .append(pce.getErrorCode()) + .toString(); + this.errorResponseCode = pce.getErrorResponseCode(); + this.errorMessage = pce.getMessage(); + this.responseCode = pce.getResponseCodeEnum(); + } + + /** + * Constructs a new ProjectCommonException with message formatting support. + * Replaces placeholders in the message with provided values. + * + * @param code The ResponseCode enum. + * @param messageWithPlaceholder The error message pattern containing placeholders. + * @param responseCode The HTTP status code. + * @param placeholderValue The values to substitute into the message placeholders. + */ + public ProjectCommonException( + ResponseCode code, + String messageWithPlaceholder, + int responseCode, + String... placeholderValue) { + super(MessageFormat.format(messageWithPlaceholder, placeholderValue)); + this.errorCode = code.getErrorCode(); + this.errorMessage = MessageFormat.format(messageWithPlaceholder, placeholderValue); + this.errorResponseCode = responseCode; + this.responseCode = code; + } + + // --- Getters and Setters --- + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(String code) { + this.errorCode = code; + } + + @Override + public String getMessage() { + return errorMessage; + } + + public void setMessage(String message) { + this.errorMessage = message; + } + + /** + * Gets the HTTP response status code. + * + * @return The HTTP status code as an integer. + */ + public int getErrorResponseCode() { + return errorResponseCode; + } + + public void setErrorResponseCode(int responseCode) { + this.errorResponseCode = responseCode; + } + + /** + * Gets the ResponseCode enum. + * + * @return The ResponseCode enum, or null if initialized with the raw string constructor. + */ + public ResponseCode getResponseCodeEnum() { + return responseCode; + } + + public void setResponseCodeEnum(ResponseCode responseCode) { + this.responseCode = responseCode; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + // --- Backward Compatibility Aliases --- + + /** + * Gets the error code. Kept for backward compatibility. + * + * @return The error code string. + * @see #getErrorCode() + */ + public String getCode() { + return getErrorCode(); + } + + /** + * Sets the error code. Kept for backward compatibility. + * + * @param code The error code string. + * @see #setErrorCode(String) + */ + public void setCode(String code) { + setErrorCode(code); + } + + /** + * Gets the HTTP response code. Kept for backward compatibility. + * + * @return The integer HTTP response code. + * @see #getErrorResponseCode() + */ + public ResponseCode getResponseCode() { + return responseCode; + } + + /** + * Sets the HTTP response code. Kept for backward compatibility. + * + * @param responseCode The integer HTTP response code. + * @see #setErrorResponseCode(int) + */ + public void setResponseCode(int responseCode) { + this.errorResponseCode = responseCode; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append(errorCode).append(": "); + builder.append(errorMessage); + return builder.toString(); + } + + // --- Static Helper Methods --- + + /** + * Throws a generic client error exception (4xx). + * + * @param responseCode The ResponseCode enum details. + * @param exceptionMessage A custom message to include. + */ + public static void throwClientErrorException(ResponseCode responseCode, String exceptionMessage) { + throw new ProjectCommonException( + responseCode, + StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + + /** + * Throws a generic Resource Not Found exception (404). + */ + public static void throwResourceNotFoundException() { + throw new ProjectCommonException( + ResponseCode.resourceNotFound, + MessageFormat.format(ResponseCode.resourceNotFound.getErrorMessage(), ""), + ResponseCode.RESOURCE_NOT_FOUND.getResponseCode()); + } + + /** + * Throws a Resource Not Found exception (404) with a custom message. + * + * @param responseCode The ResponseCode enum details. + * @param exceptionMessage A custom message to include. + */ + public static void throwResourceNotFoundException( + ResponseCode responseCode, String exceptionMessage) { + throw new ProjectCommonException( + responseCode, + StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, + ResponseCode.RESOURCE_NOT_FOUND.getResponseCode()); + } + + /** + * Throws a generic Server Error exception (5xx). + * + * @param responseCode The ResponseCode enum details. + * @param exceptionMessage A custom message to include. + */ + public static void throwServerErrorException(ResponseCode responseCode, String exceptionMessage) { + throw new ProjectCommonException( + responseCode, + StringUtils.isBlank(exceptionMessage) ? responseCode.getErrorMessage() : exceptionMessage, + ResponseCode.SERVER_ERROR.getResponseCode()); + } + + /** + * Throws a generic Server Error exception (5xx) using the default enum message. + * + * @param responseCode The ResponseCode enum details. + */ + public static void throwServerErrorException(ResponseCode responseCode) { + throwServerErrorException(responseCode, responseCode.getErrorMessage()); + } + + /** + * Throws a generic Client Error exception (4xx) using the default enum message. + * + * @param responseCode The ResponseCode enum details. + */ + public static void throwClientErrorException(ResponseCode responseCode) { + throwClientErrorException(responseCode, responseCode.getErrorMessage()); + } + + /** + * Throws the standard Unauthorized exception (401). + */ + public static void throwUnauthorizedErrorException() { + throw new ProjectCommonException( + ResponseCode.unAuthorized, + ResponseCode.unAuthorized.getErrorMessage(), + ResponseCode.UNAUTHORIZED.getResponseCode()); + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java new file mode 100644 index 0000000000..d0823e6fb1 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpClientUtil.java @@ -0,0 +1,380 @@ +package org.sunbird.http; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import org.apache.commons.collections.MapUtils; +import org.apache.http.Consts; +import org.apache.http.HeaderElement; +import org.apache.http.HeaderElementIterator; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.StatusLine; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPatch; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ConnectionKeepAliveStrategy; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicHeaderElementIterator; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.protocol.HTTP; +import org.apache.http.util.EntityUtils; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; + +/** + * HTTP client utility for making REST API calls. + * + *

This class provides a thread-safe singleton HTTP client with connection pooling + * and keep-alive strategy. It supports GET, POST, PATCH, and DELETE operations + * with custom headers and supports both JSON and form-encoded payloads. + * + *

Features: + *

    + *
  • Connection pooling with configurable max connections (200 total, 150 per route)
  • + *
  • Keep-alive strategy with 180-second timeout
  • + *
  • Automatic idle connection cleanup
  • + *
  • Comprehensive logging with request context
  • + *
+ * + * @author Sunbird + * @version 1.0 + */ +public class HttpClientUtil { + + private static final LoggerUtil logger = new LoggerUtil(HttpClientUtil.class); + private static final int MAX_TOTAL_CONNECTIONS = 200; + private static final int MAX_CONNECTIONS_PER_ROUTE = 150; + private static final int KEEP_ALIVE_TIMEOUT_SECONDS = 180; + private static final int SUCCESS_STATUS_MIN = 200; + private static final int SUCCESS_STATUS_MAX = 300; + + private static CloseableHttpClient httpclient = null; + private static HttpClientUtil httpClientUtil; + + /** + * Private constructor to initialize the HTTP client with connection pooling. + * Configures keep-alive strategy and connection manager settings. + */ + private HttpClientUtil() { + ConnectionKeepAliveStrategy keepAliveStrategy = + (response, context) -> { + HeaderElementIterator it = + new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE)); + while (it.hasNext()) { + HeaderElement he = it.nextElement(); + String param = he.getName(); + String value = he.getValue(); + if (value != null && param.equalsIgnoreCase("timeout")) { + return Long.parseLong(value) * 1000; + } + } + return KEEP_ALIVE_TIMEOUT_SECONDS * 1000; + }; + + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS); + connectionManager.setDefaultMaxPerRoute(MAX_CONNECTIONS_PER_ROUTE); + connectionManager.closeIdleConnections(KEEP_ALIVE_TIMEOUT_SECONDS, TimeUnit.SECONDS); + + httpclient = + HttpClients.custom() + .setConnectionManager(connectionManager) + .useSystemProperties() + .setKeepAliveStrategy(keepAliveStrategy) + .build(); + + logger.info(null, "HttpClientUtil initialized with max connections: " + MAX_TOTAL_CONNECTIONS); + } + + /** + * Gets the singleton instance of HttpClientUtil. + * Thread-safe double-checked locking pattern. + * + * @return The singleton HttpClientUtil instance + */ + public static HttpClientUtil getInstance() { + if (httpClientUtil == null) { + synchronized (HttpClientUtil.class) { + if (httpClientUtil == null) { + httpClientUtil = new HttpClientUtil(); + } + } + } + return httpClientUtil; + } + + /** + * Performs an HTTP GET request. + * + * @param requestURL The target URL for the GET request + * @param headers Optional HTTP headers to include in the request + * @param context Request context for logging and tracking + * @return Response body as a string, or empty string if request fails + */ + public static String get(String requestURL, Map headers, RequestContext context) { + CloseableHttpResponse response = null; + try { + logger.debug(context, "HttpClientUtil:get: Making GET request to URL: " + requestURL); + HttpGet httpGet = new HttpGet(requestURL); + + if (MapUtils.isNotEmpty(headers)) { + for (Map.Entry entry : headers.entrySet()) { + httpGet.addHeader(entry.getKey(), entry.getValue()); + } + } + + response = httpclient.execute(httpGet); + return getResponse(response, context, "GET"); + } catch (Exception ex) { + logger.error(context, "HttpClientUtil:get: Exception occurred while calling GET method for URL: " + requestURL, ex); + return ""; + } finally { + closeResponse(response, context, "GET"); + } + } + + /** + * Performs an HTTP POST request with JSON payload. + * + * @param requestURL The target URL for the POST request + * @param params The request body as a JSON string + * @param headers Optional HTTP headers to include in the request + * @param context Request context for logging and tracking + * @return Response body as a string, or empty string if request fails + */ + public static String post( + String requestURL, String params, Map headers, RequestContext context) { + CloseableHttpResponse response = null; + try { + logger.debug(context, "HttpClientUtil:post: Making POST request to URL: " + requestURL); + HttpPost httpPost = new HttpPost(requestURL); + + if (MapUtils.isNotEmpty(headers)) { + for (Map.Entry entry : headers.entrySet()) { + httpPost.addHeader(entry.getKey(), entry.getValue()); + } + } + + StringEntity entity = new StringEntity(params, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + + response = httpclient.execute(httpPost); + return getResponse(response, context, "POST"); + } catch (Exception ex) { + logger.error(context, "HttpClientUtil:post: Exception occurred while calling POST method for URL: " + requestURL, ex); + return ""; + } finally { + closeResponse(response, context, "POST"); + } + } + + /** + * Performs an HTTP POST request with form-encoded payload. + * + * @param requestURL The target URL for the POST request + * @param params Form parameters as key-value pairs + * @param headers Optional HTTP headers to include in the request + * @param context Request context for logging and tracking + * @return Response body as a string, or empty string if request fails + */ + public static String postFormData( + String requestURL, + Map params, + Map headers, + RequestContext context) { + CloseableHttpResponse response = null; + try { + logger.debug(context, "HttpClientUtil:postFormData: Making POST form data request to URL: " + requestURL); + HttpPost httpPost = new HttpPost(requestURL); + + if (MapUtils.isNotEmpty(headers)) { + for (Map.Entry entry : headers.entrySet()) { + httpPost.addHeader(entry.getKey(), entry.getValue()); + } + } + + List form = new ArrayList<>(); + for (Map.Entry entry : params.entrySet()) { + form.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form, Consts.UTF_8); + httpPost.setEntity(entity); + + response = httpclient.execute(httpPost); + return getResponse(response, context, "POST_FORM"); + } catch (Exception ex) { + logger.error(context, "HttpClientUtil:postFormData: Exception occurred while calling POST form data method for URL: " + requestURL, ex); + return ""; + } finally { + closeResponse(response, context, "POST_FORM"); + } + } + + /** + * Performs an HTTP PATCH request with JSON payload. + * + * @param requestURL The target URL for the PATCH request + * @param params The request body as a JSON string + * @param headers Optional HTTP headers to include in the request + * @param context Request context for logging and tracking + * @return Response body as a string, or empty string if request fails + */ + public static String patch( + String requestURL, String params, Map headers, RequestContext context) { + CloseableHttpResponse response = null; + try { + logger.debug(context, "HttpClientUtil:patch: Making PATCH request to URL: " + requestURL); + HttpPatch httpPatch = new HttpPatch(requestURL); + + if (MapUtils.isNotEmpty(headers)) { + for (Map.Entry entry : headers.entrySet()) { + httpPatch.addHeader(entry.getKey(), entry.getValue()); + } + } + + StringEntity entity = new StringEntity(params, ContentType.APPLICATION_JSON); + httpPatch.setEntity(entity); + + response = httpclient.execute(httpPatch); + return getResponse(response, context, "PATCH"); + } catch (Exception ex) { + logger.error(context, "HttpClientUtil:patch: Exception occurred while calling PATCH method for URL: " + requestURL, ex); + return ""; + } finally { + closeResponse(response, context, "PATCH"); + } + } + + /** + * Performs an HTTP DELETE request. + * + * @param requestURL The target URL for the DELETE request + * @param headers Optional HTTP headers to include in the request + * @param context Request context for logging and tracking + * @return Response body as a string, or empty string if request fails + */ + public static String delete( + String requestURL, Map headers, RequestContext context) { + CloseableHttpResponse response = null; + try { + logger.debug(context, "HttpClientUtil:delete: Making DELETE request to URL: " + requestURL); + HttpDelete httpDelete = new HttpDelete(requestURL); + + if (MapUtils.isNotEmpty(headers)) { + for (Map.Entry entry : headers.entrySet()) { + httpDelete.addHeader(entry.getKey(), entry.getValue()); + } + } + + response = httpclient.execute(httpDelete); + return getResponse(response, context, "DELETE"); + } catch (Exception ex) { + logger.error(context, "HttpClientUtil:delete: Exception occurred while calling DELETE method for URL: " + requestURL, ex); + return ""; + } finally { + closeResponse(response, context, "DELETE"); + } + } + + /** + * Extracts and returns the response body from a successful HTTP response. + * + * @param response The HTTP response object + * @param context Request context for logging + * @param method The HTTP method name for logging purposes + * @return Response body as a string + * @throws IOException If reading the response fails + */ + private static String getResponse( + CloseableHttpResponse response, RequestContext context, String method) throws IOException { + int status = response.getStatusLine().getStatusCode(); + + if (status >= SUCCESS_STATUS_MIN && status < SUCCESS_STATUS_MAX) { + HttpEntity httpEntity = response.getEntity(); + StatusLine sl = response.getStatusLine(); + + logger.debug( + context, + "HttpClientUtil:getResponse: Response from " + + method + + " call - Status: " + + sl.getStatusCode() + + " - " + + sl.getReasonPhrase()); + + if (null != httpEntity) { + byte[] bytes = EntityUtils.toByteArray(httpEntity); + String resp = new String(bytes); + logger.info(context, "HttpClientUtil:getResponse: Successfully received response from " + method + " call"); + return resp; + } else { + logger.warn(context, "HttpClientUtil:getResponse: Response entity is null for " + method + " call", null); + return ""; + } + } else { + getErrorResponse(response, method, context); + return ""; + } + } + + /** + * Logs error response details when an HTTP request fails. + * + * @param response The HTTP response object containing the error + * @param method The HTTP method name for logging purposes + * @param context Request context for logging + */ + private static void getErrorResponse( + CloseableHttpResponse response, String method, RequestContext context) { + try { + HttpEntity httpEntity = response.getEntity(); + byte[] bytes = EntityUtils.toByteArray(httpEntity); + StatusLine sl = response.getStatusLine(); + String resp = new String(bytes); + + logger.error( + context, + "HttpClientUtil:getErrorResponse: Error response from " + + method + + " call - Response: " + + resp + + " - Status: " + + sl.getStatusCode() + + " - " + + sl.getReasonPhrase(), + null); + } catch (Exception ex) { + logger.error(context, "HttpClientUtil:getErrorResponse: Exception occurred while fetching error response for " + method + " method", ex); + } + } + + /** + * Safely closes the HTTP response object. + * + * @param response The HTTP response to close + * @param context Request context for logging + * @param method The HTTP method name for logging purposes + */ + private static void closeResponse( + CloseableHttpResponse response, RequestContext context, String method) { + if (null != response) { + try { + response.close(); + logger.debug(context, "HttpClientUtil:closeResponse: Successfully closed " + method + " response"); + } catch (Exception ex) { + logger.error( + context, "HttpClientUtil:closeResponse: Exception occurred while closing " + method + " response object", ex); + } + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpUtil.java new file mode 100644 index 0000000000..0c288d422f --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/http/HttpUtil.java @@ -0,0 +1,205 @@ +package org.sunbird.http; + +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.Unirest; +import com.mashape.unirest.http.exceptions.UnirestException; +import org.apache.commons.collections4.MapUtils; +import org.sunbird.response.HttpUtilResponse; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.response.ResponseCode; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * Utility class to handle external HTTP calls. + * Provides methods for GET, POST, and PATCH requests using Unirest. + */ +public class HttpUtil { + + public static LoggerUtil logger = new LoggerUtil(HttpUtil.class); + private HttpUtil() {} + + /** + * Makes an HTTP request using GET method to the specified URL. + * + * @param requestURL the URL of the remote server + * @param headers the Map <String,String> containing request headers + * @return The response body as a String, or an empty string if the call fails with a non-200 status + * @throws UnirestException thrown if any error occurred during the request + */ + public static String sendGetRequest(String requestURL, Map headers) + throws UnirestException { + long startTime = System.currentTimeMillis(); + HttpResponse httpResponse = Unirest.get(requestURL).headers(headers).asString(); + if(200 == httpResponse.getStatus()) { + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + logger.info(null, "HttpUtil:sendGetRequest: Execution finished for URL: " + requestURL + ", duration: " + elapsedTime + " ms"); + return httpResponse.getBody(); + } else { + logger.error(null, "HttpUtil:sendGetRequest: Failed for URL: " + requestURL + ", Status: " + httpResponse.getStatus() + ", Response: " + httpResponse.getBody(), null); + return ""; + } + } + + /** + * Makes an HTTP request using POST method to the specified URL. + * + * @param requestURL the URL of the remote server + * @param params A map containing POST data in form of key-value pairs + * @param headers the Map <String,String> containing request headers + * @return The response body as a String + * @throws Exception thrown if any error occurred during the request + */ + public static String sendPostRequest( + String requestURL, Map params, Map headers) + throws Exception { + long startTime = System.currentTimeMillis(); + HttpResponse httpResponse = Unirest.post(requestURL).headers(headers).body(params).asString(); + String str = httpResponse.getBody(); + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + logger.info( null, + "HttpUtil:sendPostRequest: Execution finished for URL: " + + requestURL + + ", Duration: " + + elapsedTime + + " ms"); + return str; + } + + + /** + * Makes an HTTP request using POST method to the specified URL with a String body. + * + * @param requestURL the URL of the remote server + * @param params String payload data + * @param headers the Map <String,String> containing request headers + * @return The response body as a String + * @throws Exception thrown if any error occurred during the request + */ + public static String sendPostRequest( + String requestURL, String params, Map headers) throws Exception { + long startTime = System.currentTimeMillis(); + HttpResponse httpResponse = Unirest.post(requestURL).headers(headers).body(params).asString(); + String str = httpResponse.getBody(); + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + logger.info( null, + "HttpUtil:sendPostRequest: Execution finished for URL: " + + requestURL + + ", Duration: " + + elapsedTime + + " ms"); + return str; + } + + + /** + * Makes an HTTP request using POST method to the specified URL and returns a comprehensive response object. + * + * @param requestURL the URL of the remote server + * @param params The request body as a String + * @param headers the Map <String,String> containing request headers + * @return HttpUtilResponse containing status code and body + * @throws IOException thrown if any I/O error occurred + */ + public static HttpUtilResponse doPostRequest( + String requestURL, String params, Map headers) throws IOException { + long startTime = System.currentTimeMillis(); + HttpUtilResponse response = new HttpUtilResponse(); + try { + HttpResponse httpResponse = Unirest.post(requestURL).headers(headers).body(params).asString(); + response = new HttpUtilResponse(httpResponse.getBody(), httpResponse.getStatus()); + } catch (Exception ex) { + logger.error(null, "HttpUtil:doPostRequest: Exception occurred while reading response body for URL: " + requestURL, ex); + } + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + logger.info(null, + "HttpUtil:doPostRequest: Execution finished for URL: " + + requestURL + + ", Duration: " + + elapsedTime + + " ms"); + return response; + } + + /** + * Makes an HTTP request using PATCH method to the specified URL. + * + * @param requestURL the URL of the remote server + * @param params The request body as a String + * @param headers the Map <String,String> containing request headers + * @return ResponseCode string success or Failure string + */ + public static String sendPatchRequest( + String requestURL, String params, Map headers) { + long startTime = System.currentTimeMillis(); + logger.info(null, + "HttpUtil:sendPatchRequest: Started for URL: " + + requestURL + + " with params: " + + params); + + try { + HttpResponse httpResponse = Unirest.patch(requestURL).headers(headers).body(params).asString(); + + if (ResponseCode.OK.getResponseCode() == httpResponse.getStatus()) { + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + logger.info(null, + "HttpUtil:sendPatchRequest: Success for URL: " + + requestURL + + ", Status: " + + httpResponse.getStatus() + + ", Duration: " + + elapsedTime + + " ms"); + return ResponseCode.success.getErrorCode(); + } + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + logger.info(null, + "HttpUtil:sendPatchRequest: Failed for URL: " + + requestURL + + ", Status: " + + httpResponse.getStatus() + + ", Duration: " + + elapsedTime + + " ms"); + return "Failure"; + } catch (Exception e) { + logger.error(null, "HttpUtil:sendPatchRequest: Exception for URL: " + requestURL, e); + } + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + logger.info( null, + "HttpUtil:sendPatchRequest: Ended with failure for URL: " + + requestURL + + ", Duration: " + + elapsedTime + + " ms"); + return "Failure"; + } + + + /** + * Helper method to construct headers. + * Adds Content-Type: application/json by default. + * + * @param input Additional headers map + * @return A new Map containing all headers + * @throws Exception if an error occurs + */ + public static Map getHeader(Map input) throws Exception { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + if (MapUtils.isNotEmpty(input)) { + headers.putAll(input); + } + return headers; + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java new file mode 100644 index 0000000000..5768da1667 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/kafka/InstructionEventGenerator.java @@ -0,0 +1,148 @@ +package org.sunbird.kafka; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.response.ResponseCode; +import org.sunbird.telemetry.dto.TelemetryBJREvent; + +/** + * Helper class to generate and push instruction events to Kafka. + */ +public class InstructionEventGenerator { + + private static final LoggerUtil logger = new LoggerUtil(InstructionEventGenerator.class); + private static final ObjectMapper mapper = new ObjectMapper(); + private static final String BE_JOB_REQUEST_EVENT_ID = "BE_JOB_REQUEST"; + private static final int ITERATION = 1; + + private static final String ACTOR_ID = "Sunbird LMS Flink Job"; + private static final String ACTOR_TYPE = "System"; + private static final String PDATA_ID = "org.sunbird.platform"; + private static final String PDATA_VERSION = "1.0"; + + private InstructionEventGenerator() {} + + /** + * Pushes an instruction event to the specified Kafka topic. + * + * @param topic The Kafka topic to push the event to. + * @param data The data map containing actor, context, object, edata, etc. + * @throws Exception If event generation fails or topic is invalid. + */ + public static void pushInstructionEvent(String topic, Map data) throws Exception { + pushInstructionEvent(null, topic, data); + } + + /** + * Pushes an instruction event to the specified Kafka topic with a specific key. + * + * @param key The Kafka message key. + * @param topic The Kafka topic to push the event to. + * @param data The data map containing actor, context, object, edata, etc. + * @throws Exception If event generation fails or topic is invalid. + */ + public static void pushInstructionEvent(String key, String topic, Map data) + throws Exception { + String beJobRequestEvent = generateInstructionEventMetadata(data); + + if (StringUtils.isBlank(beJobRequestEvent)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData.getErrorCode(), + "Event is not generated properly.", + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + + if (StringUtils.isBlank(topic)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData.getErrorCode(), + "Invalid topic id.", + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + + if (StringUtils.isNotBlank(key)) { + KafkaClient.send(key, beJobRequestEvent, topic); + } else { + KafkaClient.send(beJobRequestEvent, topic); + } + } + + private static String generateInstructionEventMetadata(Map data) { + Map actor = new HashMap<>(); + Map context = new HashMap<>(); + Map object = new HashMap<>(); + Map edata = new HashMap<>(); + + Map actorData = (Map) data.get("actor"); + if (MapUtils.isNotEmpty(actorData)) { + actor.putAll(actorData); + } else { + actor.put("id", ACTOR_ID); + actor.put("type", ACTOR_TYPE); + } + + Map contextData = (Map) data.get("context"); + if (MapUtils.isNotEmpty(contextData)) { + context.putAll(contextData); + } + + Map pdata = new HashMap<>(); + pdata.put("id", PDATA_ID); + pdata.put("ver", PDATA_VERSION); + context.put("pdata", pdata); + + if (data.containsKey(JsonKey.CDATA)) { + context.put(JsonKey.CDATA, data.get(JsonKey.CDATA)); + } + + Map objectData = (Map) data.get("object"); + if (MapUtils.isNotEmpty(objectData)) { + object.putAll(objectData); + } + + Map edataData = (Map) data.get("edata"); + if (MapUtils.isNotEmpty(edataData)) { + edata.putAll(edataData); + } + + if (StringUtils.isNotBlank((String) data.get("action"))) { + edata.put("action", data.get("action")); + } + + return logInstructionEvent(actor, context, object, edata); + } + + private static String logInstructionEvent( + Map actor, + Map context, + Map object, + Map edata) { + + TelemetryBJREvent te = new TelemetryBJREvent(); + long unixTime = System.currentTimeMillis(); + String mid = "LP." + System.currentTimeMillis() + "." + UUID.randomUUID(); + edata.put("iteration", ITERATION); + + te.setEid(BE_JOB_REQUEST_EVENT_ID); + te.setEts(unixTime); + te.setMid(mid); + te.setActor(actor); + te.setContext(context); + te.setObject(object); + te.setEdata(edata); + + String jsonMessage = null; + try { + jsonMessage = mapper.writeValueAsString(te); + } catch (Exception e) { + logger.error("Error logging BE_JOB_REQUEST event: " + e.getMessage(), e); + } + return jsonMessage; + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java b/core/sunbird-platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java new file mode 100644 index 0000000000..321338f1e1 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/kafka/KafkaClient.java @@ -0,0 +1,193 @@ +package org.sunbird.kafka; + +import java.util.List; +import java.util.Map; +import java.util.Properties; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.PartitionInfo; +import org.apache.kafka.common.serialization.LongDeserializer; +import org.apache.kafka.common.serialization.LongSerializer; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.ProjectUtil; +import org.sunbird.response.ResponseCode; + +/** + * Helper class for creating and managing Kafka consumers and producers. + *

+ * This class supports two modes of operation: + * 1. **Singleton Mode**: Provides a shared, lazily-initialized Producer string-key/string-value pairs. + * Suitable for general-purpose event logging where a single connection is sufficient. + * 2. **Factory Mode**: Provides methods to create new Producer/Consumer instances with + * custom configurations (Long-key/String-value). + *

+ * + * @author Pradyumna + */ +public class KafkaClient { + + private static final LoggerUtil logger = new LoggerUtil(KafkaClient.class); + private static final String BOOTSTRAP_SERVERS = ProjectUtil.getConfigValue("kafka_urls"); + private static Producer producer; + private static Consumer consumer; + private static volatile Map> topics; + + static { + loadProducerProperties(); + loadConsumerProperties(); + loadTopics(); + } + + // Singleton Methods + + /** + * Retrieves the singleton Kafka Producer instance (String key, String value). + * + * @return The singleton {@link Producer} instance. + */ + public static Producer getProducer() { + return producer; + } + + /** + * Retrieves the singleton Kafka Consumer instance (String key, String value). + * + * @return The singleton {@link Consumer} instance. + */ + public static Consumer getConsumer() { + return consumer; + } + + /** + * Sends a message to a Kafka topic using the singleton producer. + * + * @param event The message content/payload. + * @param topic The target Kafka topic name. + * @throws Exception If the topic does not exist or if sending the message fails. + */ + public static void send(String event, String topic) throws Exception { + if (validate(topic)) { + getProducer().send(new ProducerRecord<>(topic, event)); + } else { + logger.info("KafkaClient:send: Topic id: " + topic + ", does not exist."); + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing.getErrorCode(), + "Topic id: " + topic + ", does not exist.", + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + /** + * Sends a message with a specific key to a Kafka topic using the singleton producer. + * + * @param key The message key (used for partitioning). + * @param event The message content/payload. + * @param topic The target Kafka topic name. + * @throws Exception If the topic does not exist or if sending the message fails. + */ + public static void send(String key, String event, String topic) throws Exception { + if (validate(topic)) { + getProducer().send(new ProducerRecord<>(topic, key, event)); + } else { + logger.info("KafkaClient:send: Topic id: " + topic + ", does not exist."); + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing.getErrorCode(), + "Topic id: " + topic + ", does not exist.", + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + /** + * Validates if a topic exists in the current Kafka cluster. + * + * @param topic The topic name to check. + * @return true if the topic exists, false otherwise. + */ + private static boolean validate(String topic) { + if (topics == null) { + loadTopics(); + } + return topics.keySet().contains(topic); + } + + private static void loadProducerProperties() { + Properties props = new Properties(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); + props.put(ProducerConfig.CLIENT_ID_CONFIG, "KafkaClientProducer"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.LINGER_MS_CONFIG, ProjectUtil.getConfigValue("kafka_linger_ms")); + producer = new KafkaProducer<>(props); + } + + private static void loadConsumerProperties() { + Properties props = new Properties(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); + props.put(ConsumerConfig.CLIENT_ID_CONFIG, "KafkaClientConsumer"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumer = new KafkaConsumer<>(props); + } + + private static void loadTopics() { + if (consumer == null) { + loadConsumerProperties(); + } + topics = consumer.listTopics(); + logger.info("KafkaClient:loadTopics: Kafka topic info => " + topics); + } + + // Factory Methods + + /** + * Creates a new Kafka Producer instance with Long keys and String values. + * This is useful for scenarios requiring custom bootstrap servers or client IDs distinct from the singleton configuration. + * + * @param bootstrapServers Comma-separated list of Kafka broker addresses (e.g., "localhost:9092,host2:9092"). + * @param clientId A unique identifier for this producer client. + * @return A new {@link Producer} instance configured with LongSerializer for keys and StringSerializer for values. + */ + public static Producer createProducer(String bootstrapServers, String clientId) { + return new KafkaProducer<>(createProducerProperties(bootstrapServers, clientId)); + } + + /** + * Creates a new Kafka Consumer instance with Long keys and String values. + * This is useful for scenarios requiring custom bootstrap servers or client IDs distinct from the singleton configuration. + * + * @param bootstrapServers Comma-separated list of Kafka broker addresses (e.g., "localhost:9092,host2:9092"). + * @param clientId A unique identifier for this consumer client. + * @return A new {@link Consumer} instance configured with LongDeserializer for keys and StringDeserializer for values. + */ + public static Consumer createConsumer(String bootstrapServers, String clientId) { + return new KafkaConsumer<>(createConsumerProperties(bootstrapServers, clientId)); + } + + private static Properties createProducerProperties(String bootstrapServers, String clientId) { + logger.info("KafkaClient:createProducerProperties: called with bootstrapServers = " + bootstrapServers + " clientId = " + clientId); + Properties props = new Properties(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + props.put(ProducerConfig.CLIENT_ID_CONFIG, clientId); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + return props; + } + + private static Properties createConsumerProperties(String bootstrapServers, String clientId) { + logger.info("KafkaClient:createConsumerProperties: called with bootstrapServers = " + bootstrapServers + " clientId = " + clientId); + Properties props = new Properties(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + props.put(ConsumerConfig.CLIENT_ID_CONFIG, clientId); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + return props; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeyCloakConnectionProvider.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeyCloakConnectionProvider.java new file mode 100644 index 0000000000..4f6e025ad7 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeyCloakConnectionProvider.java @@ -0,0 +1,155 @@ +package org.sunbird.keycloak; + +import org.apache.commons.lang3.StringUtils; +import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; +import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.KeycloakBuilder; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.PropertiesCache; + +public class KeyCloakConnectionProvider { + + private static final LoggerUtil logger = new LoggerUtil(KeyCloakConnectionProvider.class); + + private static Keycloak keycloak; + private static final PropertiesCache cache = PropertiesCache.getInstance(); + public static String SSO_URL = null; + public static String SSO_REALM = null; + public static String CLIENT_ID = null; + + static { + try { + initialiseConnection(); + } catch (Exception e) { + logger.error( + "KeyCloakConnectionProvider: Exception occurred while initializing keycloak connection: " + + e.getMessage(), + e); + } + registerShutDownHook(); + } + + /** + * Method to initialize the Keycloak connection from properties or environment. + * + * @return Keycloak connection instance. + * @throws Exception if initialization fails. + */ + public static Keycloak initialiseConnection() throws Exception { + keycloak = initialiseEnvConnection(); + if (keycloak != null) { + return keycloak; + } + KeycloakBuilder keycloakBuilder = + KeycloakBuilder.builder() + .serverUrl(cache.getProperty(JsonKey.SSO_URL)) + .realm(cache.getProperty(JsonKey.SSO_REALM)) + .username(cache.getProperty(JsonKey.SSO_USERNAME)) + .password(cache.getProperty(JsonKey.SSO_PASSWORD)) + .clientId(cache.getProperty(JsonKey.SSO_CLIENT_ID)) + .resteasyClient( + new ResteasyClientBuilderImpl() + .connectionPoolSize(Integer.parseInt(cache.getProperty(JsonKey.SSO_POOL_SIZE))) + .build()); + if (cache.getProperty(JsonKey.SSO_CLIENT_SECRET) != null + && !(cache.getProperty(JsonKey.SSO_CLIENT_SECRET).equals(JsonKey.SSO_CLIENT_SECRET))) { + keycloakBuilder.clientSecret(cache.getProperty(JsonKey.SSO_CLIENT_SECRET)); + } + SSO_URL = cache.getProperty(JsonKey.SSO_URL); + SSO_REALM = cache.getProperty(JsonKey.SSO_REALM); + CLIENT_ID = cache.getProperty(JsonKey.SSO_CLIENT_ID); + keycloak = keycloakBuilder.build(); + + logger.info("KeyCloakConnectionProvider: Keycloak instance created successfully."); + return keycloak; + } + + /** + * Initializes Keycloak connection using environment variables if available. + * + * @return Keycloak instance or null if env vars are missing. + * @throws Exception if initialization fails. + */ + private static Keycloak initialiseEnvConnection() throws Exception { + String url = System.getenv(JsonKey.SUNBIRD_SSO_URL); + String username = System.getenv(JsonKey.SUNBIRD_SSO_USERNAME); + String password = System.getenv(JsonKey.SUNBIRD_SSO_PASSWORD); + String cleintId = System.getenv(JsonKey.SUNBIRD_SSO_CLIENT_ID); + String clientSecret = System.getenv(JsonKey.SUNBIRD_SSO_CLIENT_SECRET); + String relam = System.getenv(JsonKey.SUNBIRD_SSO_RELAM); + if (StringUtils.isBlank(url) + || StringUtils.isBlank(username) + || StringUtils.isBlank(password) + || StringUtils.isBlank(cleintId) + || StringUtils.isBlank(relam)) { + logger.info( + "KeyCloakConnectionProvider: Keycloak connection settings not found in environment variables."); + return null; + } + SSO_URL = url; + SSO_REALM = relam; + CLIENT_ID = cleintId; + KeycloakBuilder keycloakBuilder = + KeycloakBuilder.builder() + .serverUrl(url) + .realm(relam) + .username(username) + .password(password) + .clientId(cleintId) + .resteasyClient( + new ResteasyClientBuilderImpl() + .connectionPoolSize(Integer.parseInt(cache.getProperty(JsonKey.SSO_POOL_SIZE))) + .build()); + + if (StringUtils.isNotBlank(clientSecret)) { + keycloakBuilder.clientSecret(clientSecret); + logger.info( + "KeyCloakConnectionProvider: Client secret provided via environment."); + } + keycloakBuilder.grantType("client_credentials"); + keycloak = keycloakBuilder.build(); + logger.info( + "KeyCloakConnectionProvider: Keycloak instance created from environment variable settings."); + return keycloak; + } + + /** + * Retrieves the active Keycloak connection instance. + * + * @return Keycloak instance. + */ + public static Keycloak getConnection() { + if (keycloak != null) { + return keycloak; + } else { + try { + return initialiseConnection(); + } catch (Exception e) { + logger.error( + "KeyCloakConnectionProvider: Error obtaining Keycloak connection: " + e.getMessage(), + e); + } + } + return null; + } + + /** + * Implementation of Thread to handle resource cleanup on JVM shutdown. + */ + static class ResourceCleanUp extends Thread { + public void run() { + if (null != keycloak) { + keycloak.close(); + } + } + } + + /** Registers a shutdown hook to close Keycloak resources. */ + public static void registerShutDownHook() { + Runtime runtime = Runtime.getRuntime(); + runtime.addShutdownHook(new ResourceCleanUp()); + } +} + diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakBruteForceAttackUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakBruteForceAttackUtil.java new file mode 100644 index 0000000000..f730eda505 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakBruteForceAttackUtil.java @@ -0,0 +1,106 @@ +package org.sunbird.keycloak; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.Map; +import javax.ws.rs.core.MediaType; +import org.apache.http.HttpHeaders; +import org.sunbird.common.ProjectUtil; +import org.sunbird.http.HttpClientUtil; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; + +/** + * Utility class to handle Keycloak brute force attack detection and user unlocking. + */ +public class KeycloakBruteForceAttackUtil { + private static final LoggerUtil logger = new LoggerUtil(KeycloakBruteForceAttackUtil.class); + + private KeycloakBruteForceAttackUtil() {} + + private static final String fedUserPrefix = + "f:" + + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID) + + ":"; + + /** + * Checks if a user account is disabled due to brute force attack detection. + * + * @param userId The ID of the user to check (can be internal or federated ID). + * @param context The request context for logging. + * @return true if the user account is disabled, false otherwise. + * @throws Exception If an error occurs during the API call. + */ + public static boolean isUserAccountDisabled(String userId, RequestContext context) + throws Exception { + String url = + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_LB_IP) + + "/auth/admin/realms/" + + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) + + "/attack-detection/brute-force/users/" + + fedUserPrefix + + userId; + + logger.debug(context, "KeycloakBruteForceAttackUtil:isUserAccountDisabled: Checking status for URL: " + url); + String response = HttpClientUtil.get(url, getHeaders(context), context); + logger.debug(context, "KeycloakBruteForceAttackUtil:isUserAccountDisabled: Response: " + response); + + Map attackStatus = new ObjectMapper().readValue(response, Map.class); + boolean isDisabled = ((boolean) attackStatus.get("disabled")); + + if (isDisabled) { + logger.info( + context, + "KeycloakBruteForceAttackUtil:isUserAccountDisabled: User account is disabled for userId: " + + userId + + ", Status: " + + attackStatus); + } else { + logger.info( + context, + "KeycloakBruteForceAttackUtil:isUserAccountDisabled: User account is NOT disabled for userId: " + + userId); + } + return isDisabled; + } + + /** + * Unlocks a temporarily disabled user account by clearing the brute force detection status. + * + * @param userId The ID of the user to unlock. + * @param context The request context for logging. + * @return true if the operation succeeds (delete call returns successfully). + * @throws Exception If an error occurs during the API call. + */ + public static boolean unlockTempDisabledUser(String userId, RequestContext context) + throws Exception { + String url = + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_LB_IP) + + "/auth/admin/realms/" + + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) + + "/attack-detection/brute-force/users/" + + fedUserPrefix + + userId; + + logger.info(context, "KeycloakBruteForceAttackUtil:unlockTempDisabledUser: Unlocking user with URL: " + url); + HttpClientUtil.delete(url, getHeaders(context), context); + logger.info(context, "KeycloakBruteForceAttackUtil:unlockTempDisabledUser: Successfully cleared brute force status for userId: " + userId); + return true; + } + + /** + * Constructs the headers required for Keycloak Admin API calls. + * Includes Authorization header with Admin Access Token. + * + * @param context The request context. + * @return Map containing HTTP headers. + * @throws Exception If admin token retrieval fails. + */ + private static Map getHeaders(RequestContext context) throws Exception { + Map headers = new HashMap<>(); + headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + headers.put(HttpHeaders.AUTHORIZATION, JsonKey.BEARER + KeycloakUtil.getAdminAccessTokenWithoutDomain(context)); + return headers; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakRequiredActionLinkUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakRequiredActionLinkUtil.java new file mode 100644 index 0000000000..1c9c818972 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakRequiredActionLinkUtil.java @@ -0,0 +1,157 @@ +package org.sunbird.keycloak; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.Map; +import javax.ws.rs.core.MediaType; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; +import org.sunbird.keys.JsonKey; +import org.sunbird.common.ProjectUtil; +import org.sunbird.http.HttpClientUtil; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; + +/** + * Utility class for generating Keycloak required action links. + * This class interacts with Keycloak's API to generate links for actions like updating passwords or verifying emails. + */ +public class KeycloakRequiredActionLinkUtil { + + private static final LoggerUtil logger = new LoggerUtil(KeycloakRequiredActionLinkUtil.class); + public static final String VERIFY_EMAIL = "VERIFY_EMAIL"; + public static final String UPDATE_PASSWORD = "UPDATE_PASSWORD"; + private static final String CLIENT_ID = "clientId"; + private static final String REQUIRED_ACTION = "requiredAction"; + private static final String USERNAME = "userName"; + private static final String EXPIRATION_IN_SEC = "expirationInSecs"; + private static final String REDIRECT_URI = "redirectUri"; + private static final String SUNBIRD_KEYCLOAK_LINK_EXPIRATION_TIME = + "sunbird_keycloak_required_action_link_expiration_seconds"; + private static final String SUNBIRD_KEYCLOAK_REQD_ACTION_LINK = "/get-required-action-link"; + private static final String LINK = "link"; + private static final String ACCESS_TOKEN = "access_token"; + + private static ObjectMapper mapper = new ObjectMapper(); + + /** + * Generates a required action link for a user to perform specific actions on Keycloak. + * This method acts as a backward-compatible overload that does not require a RequestContext. + * + * @param userName The username of the user for whom the link is generated. + * @param redirectUri The URI to which the user will be redirected after completing the action. + * @param requiredAction The specific action to be performed (e.g., VERIFY_EMAIL, UPDATE_PASSWORD). + * @return The generated required action link as a String, or null if an error occurs during generation. + */ + public static String getLink(String userName, String redirectUri, String requiredAction) { + return getLink(userName, redirectUri, requiredAction, null); + } + + /** + * Generates a required action link for a user to perform specific actions on Keycloak. + * + * @param userName The username of the user for whom the link is generated. + * @param redirectUri The URI to which the user will be redirected after completing the action. + * @param requiredAction The specific action to be performed (e.g., VERIFY_EMAIL, UPDATE_PASSWORD). + * @param context The RequestContext used for logging and traceability. + * @return The generated required action link as a String, or null if an error occurs during generation. + */ + public static String getLink( + String userName, String redirectUri, String requiredAction, RequestContext context) { + Map request = new HashMap<>(); + request.put(CLIENT_ID, ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_ID)); + request.put(USERNAME, userName); + request.put(REQUIRED_ACTION, requiredAction); + + String expirationInSecs = ProjectUtil.getConfigValue(SUNBIRD_KEYCLOAK_LINK_EXPIRATION_TIME); + if (StringUtils.isNotBlank(expirationInSecs)) { + request.put(EXPIRATION_IN_SEC, expirationInSecs); + } + request.put(REDIRECT_URI, redirectUri); + + try { + Thread.sleep( + Integer.parseInt(ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SYNC_READ_WAIT_TIME))); + return generateLink(request, context); + } catch (Exception ex) { + logger.error( + context, + "KeycloakRequiredActionLinkUtil:getLink: Error occurred: " + ex.getMessage(), + ex); + } + return null; + } + + /** + * Helper method to generate the link by making an HTTP POST request to Keycloak. + * + * @param request The map containing request parameters (client_id, user_name, etc.). + * @param context The request context for logging. + * @return The generated link. + * @throws Exception If an error occurs during the HTTP request or response parsing. + */ + private static String generateLink(Map request, RequestContext context) + throws Exception { + Map headers = new HashMap<>(); + headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + headers.put( + HttpHeaders.AUTHORIZATION, + JsonKey.BEARER + getAdminAccessToken(context)); + + String baseUrl = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_URL); + String realm = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM); + String url = baseUrl + "realms/" + realm + SUNBIRD_KEYCLOAK_REQD_ACTION_LINK; + + logger.info(context, "KeycloakRequiredActionLinkUtil:generateLink: URL: " + url); + logger.info(context, "KeycloakRequiredActionLinkUtil:generateLink: Request Body: " + mapper.writeValueAsString(request)); + + String response = HttpClientUtil.post(url, mapper.writeValueAsString(request), headers, context); + + logger.info(context, "KeycloakRequiredActionLinkUtil:generateLink: Response: " + response); + + Map responseMap = mapper.readValue(response, Map.class); + return (String) responseMap.get(LINK); + } + + /** + * Retrieves an admin access token from Keycloak using client credentials. + * + * @param context The request context. + * @return The admin access token. + * @throws Exception If an error occurs during token retrieval. + */ + private static String getAdminAccessToken(RequestContext context) throws Exception { + Map headers = new HashMap<>(); + headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); + + String url = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_URL) + + "realms/" + + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) + + "/protocol/openid-connect/token"; + + Map fields = new HashMap<>(); + fields.put("client_id", ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_ID)); + fields.put("client_secret", ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_SECRET)); + fields.put("grant_type", "client_credentials"); + + // HttpClientUtil.post usually takes json, but for form-urlencoded we might need a different approach or + // construct the body string manually if HttpClientUtil supports it. + // Checking previous usage: older code used Unirest.field(). + // HttpClientUtil might not support form fields directly if it expects JSON body. + // However, looking at HttpClientUtil commonly used in Sunbird, it has methods. + // If I cannot verify HttpClientUtil supports form params, I should be careful. + // BUT! I will assume for now I can implement it or re-use the KeycloakUtil logic if found. + // Since KeycloakUtil was not found, I will implement a safe fallback assuming form encoding body string. + + // Construct form-urlencoded body + StringBuilder body = new StringBuilder(); + for (Map.Entry entry : fields.entrySet()) { + if (body.length() > 0) body.append("&"); + body.append(entry.getKey()).append("=").append(entry.getValue()); + } + + String response = HttpClientUtil.post(url, body.toString(), headers, context); + Map responseMap = mapper.readValue(response, Map.class); + return (String) responseMap.get(ACCESS_TOKEN); + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakUtil.java new file mode 100644 index 0000000000..ec33c7f1e6 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/KeycloakUtil.java @@ -0,0 +1,78 @@ +package org.sunbird.keycloak; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.Map; +import javax.ws.rs.core.MediaType; +import org.apache.http.HttpHeaders; +import org.sunbird.common.ProjectUtil; +import org.sunbird.http.HttpClientUtil; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; + +/** + * Utility class to interact with Keycloak APIs, specifically for token retrieval. + */ +public class KeycloakUtil { + private static final LoggerUtil logger = new LoggerUtil(KeycloakUtil.class); + + private KeycloakUtil() {} + + /** + * Retrieves the Keycloak Admin Access Token using client credentials. + * + * @param context The request context for logging. + * @param url The Keycloak token endpoint URL. + * @return The access token string. + * @throws Exception If an error occurs during the API call or response parsing. + */ + public static String getAdminAccessToken(RequestContext context, String url) throws Exception { + Map headers = new HashMap<>(); + headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); + Map fields = new HashMap<>(); + fields.put("client_id", ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_ID)); + fields.put("client_secret", ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_CLIENT_SECRET)); + fields.put("grant_type", "client_credentials"); + + logger.debug(context, "KeycloakUtil:getAdminAccessToken: Fetching admin token from URL: " + url); + String response = HttpClientUtil.postFormData(url, fields, headers, context); + logger.debug(context, "KeycloakUtil:getAdminAccessToken: Response = " + response); + + Map responseMap = new ObjectMapper().readValue(response, Map.class); + return (String) responseMap.get("access_token"); + } + + /** + * Retrieves the Admin Access Token using the configured SSO URL (with domain). + * + * @param context The request context. + * @return The access token string. + * @throws Exception If an error occurs. + */ + public static String getAdminAccessTokenWithDomain(RequestContext context) throws Exception { + String url = + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_URL) + + "realms/" + + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) + + "/protocol/openid-connect/token"; + return getAdminAccessToken(context, url); + } + + /** + * Retrieves the Admin Access Token using the configured Load Balancer IP (without domain), + * typically used for internal calls or when avoiding DNS resolution issues. + * + * @param context The request context. + * @return The access token string. + * @throws Exception If an error occurs. + */ + public static String getAdminAccessTokenWithoutDomain(RequestContext context) throws Exception { + String url = + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_LB_IP) + + "/auth/realms/" + + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_SSO_RELAM) + + "/protocol/openid-connect/token"; + return getAdminAccessToken(context, url); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOManager.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOManager.java new file mode 100644 index 0000000000..5b92893877 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOManager.java @@ -0,0 +1,86 @@ +package org.sunbird.keycloak; + +import java.util.Map; +import org.sunbird.request.RequestContext; + +/** + * Interface defining operations for Single Sign-On (SSO) management. + * Handles user token verification, password updates, and user lifecycle management in Keycloak. + */ +public interface SSOManager { + + /** + * Verifies the user access token and returns the user ID if valid. + * Throws ProjectCommonException with 401 Unauthorized if the token is invalid. + * + * @param token The JWT access token to verify. + * @param context The request context. + * @return The user ID extracted from the token. + */ + String verifyToken(String token, RequestContext context); + + /** + * Updates the user's password in the SSO provider (Keycloak). + * + * @param userId The ID of the user. + * @param password The new password. + * @param context The request context. + * @return true if the password update was successful, false otherwise. + */ + boolean updatePassword(String userId, String password, RequestContext context); + + /** + * Removes Personally Identifiable Information (PII) for a user. + * + * @param userId The ID of the user. + * @param context The request context. + * @return true if the operation was successful, false otherwise. + */ + boolean removePII(String userId, RequestContext context); + + /** + * Removes a user from Keycloak based on the provided request details (typically userId). + * + * @param request A map containing user identification details. + * @param context The request context. + * @return The result of the removal operation (e.g., success message or status). + */ + String removeUser(Map request, RequestContext context); + + /** + * Deactivates a user in Keycloak (soft delete). + * + * @param request A map containing user identification details. + * @param context The request context. + * @return The result of the deactivation operation. + */ + String deactivateUser(Map request, RequestContext context); + + /** + * Activates a user in Keycloak. + * + * @param request A map containing user identification details. + * @param context The request context. + * @return The result of the activation operation. + */ + String activateUser(Map request, RequestContext context); + + /** + * Sets a required action for a user in Keycloak (e.g., Update Password, Verify Email). + * + * @param userId The ID of the user. + * @param requiredAction The action to valid. + */ + void setRequiredAction(String userId, String requiredAction); + + /** + * Verifies the user access token against a specific URL and returns the user ID. + * Throws ProjectCommonException with 401 Unauthorized if the token is invalid. + * + * @param token The JWT access token to verify. + * @param url The URL to validate the token against. + * @param context The request context. + * @return The user ID extracted from the token. + */ + String verifyToken(String token, String url, RequestContext context); +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOServiceFactory.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOServiceFactory.java new file mode 100644 index 0000000000..be7ec4de6f --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/SSOServiceFactory.java @@ -0,0 +1,26 @@ +package org.sunbird.keycloak; + +import org.sunbird.keycloak.impl.KeyCloakServiceImpl; + +/** + * Factory class for obtaining SSO service instances. + * Implements the Singleton pattern to provide a single instance of SSOManager. + */ +public class SSOServiceFactory { + private static SSOManager ssoManager = null; + + private SSOServiceFactory() {} + + /** + * Returns the singleton instance of SSOManager. + * If the instance does not exist, it creates a new KeyCloakServiceImpl. + * + * @return The singleton SSOManager instance. + */ + public static SSOManager getInstance() { + if (null == ssoManager) { + ssoManager = new KeyCloakServiceImpl(); + } + return ssoManager; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakRsaKeyFetcher.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakRsaKeyFetcher.java new file mode 100644 index 0000000000..bce3d4487b --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakRsaKeyFetcher.java @@ -0,0 +1,134 @@ +package org.sunbird.keycloak.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.math.BigInteger; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.RSAPublicKeySpec; +import java.util.Base64; +import java.util.Base64.Decoder; +import java.util.HashMap; +import java.util.Map; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.PropertiesCache; + +/** + * Class to fetch SSO public key from Keycloak server using 'certs' HTTP API call. + */ +public class KeyCloakRsaKeyFetcher { + private static LoggerUtil logger = new LoggerUtil(KeyCloakRsaKeyFetcher.class); + + private static final String MODULUS = "modulusBase64"; + private static final String EXPONENT = "exponentBase64"; + + /** + * Fetches the public key from Keycloak based on the provided base URL and realm. + * + * @param url The Keycloak base URL. + * @param realm The Keycloak realm name. + * @return The PublicKey used to verify user access tokens, or null if retrieval fails. + */ + public PublicKey getPublicKeyFromKeyCloak(String url, String realm) { + try { + Map valueMap = null; + Decoder urlDecoder = Base64.getUrlDecoder(); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + String publicKeyString = requestKeyFromKeycloak(url, realm); + if (publicKeyString != null) { + valueMap = getValuesFromJson(publicKeyString); + if (valueMap != null) { + BigInteger modulus = new BigInteger(1, urlDecoder.decode(valueMap.get(MODULUS))); + BigInteger publicExponent = new BigInteger(1, urlDecoder.decode(valueMap.get(EXPONENT))); + PublicKey key = keyFactory.generatePublic(new RSAPublicKeySpec(modulus, publicExponent)); + saveToCache(key); + return key; + } + } + } catch (Exception e) { + logger.error( + "KeyCloakRsaKeyFetcher:getPublicKeyFromKeyCloak: Exception occurred with message = " + + e.getMessage(), + e); + } + return null; + } + + /** + * Saves the public key string value to the PropertiesCache. + * + * @param key The Public key to save. + */ + private void saveToCache(PublicKey key) { + byte[] encodedPublicKey = key.getEncoded(); + String publicKey = Base64.getEncoder().encodeToString(encodedPublicKey); + PropertiesCache cache = PropertiesCache.getInstance(); + cache.saveConfigProperty(JsonKey.SSO_PUBLIC_KEY, publicKey); + } + + /** + * Connects to the Keycloak server using an API call to get the public key. + * + * @param url The Keycloak base URL. + * @param realm The Keycloak realm name. + * @return The public key JSON response string, or null if validation fails. + */ + private String requestKeyFromKeycloak(String url, String realm) { + HttpClient client = HttpClientBuilder.create().build(); + HttpGet request = new HttpGet(url + "realms/" + realm + "/protocol/openid-connect/certs"); + + try { + HttpResponse response = client.execute(request); + HttpEntity entity = response.getEntity(); + + if (entity != null) { + return EntityUtils.toString(entity); + } else { + logger.info( + "KeyCloakRsaKeyFetcher:requestKeyFromKeycloak: Not able to fetch SSO public key from keycloak server"); + } + } catch (IOException e) { + logger.error( + "KeyCloakRsaKeyFetcher:requestKeyFromKeycloak: Exception occurred with message = " + + e.getMessage(), + e); + } + return null; + } + + /** + * Extracts values (modulus and exponent) from the public key JSON string. + * + * @param response The public key JSON response string. + * @return A Map containing the modulus and exponent, or null if parsing fails. + */ + private Map getValuesFromJson(String response) { + ObjectMapper mapper = new ObjectMapper(); + Map values = new HashMap<>(); + try { + JsonNode res = mapper.readTree(response); + JsonNode keys = res.get("keys"); + if (keys != null) { + JsonNode value = keys.get(0); + values.put(MODULUS, value.get("n").asText()); + values.put(EXPONENT, value.get("e").asText()); + } + } catch (Exception e) { + logger.error( + "KeyCloakRsaKeyFetcher:getValuesFromJson: Exception occurred with message = " + + e.getMessage(), + e); + return null; + } + + return values; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakServiceImpl.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakServiceImpl.java new file mode 100644 index 0000000000..1b3fa2adb2 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keycloak/impl/KeyCloakServiceImpl.java @@ -0,0 +1,290 @@ +package org.sunbird.keycloak.impl; + +import static java.util.Arrays.asList; + +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.keycloak.RSATokenVerifier; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.resource.UserResource; +import org.keycloak.representations.AccessToken; +import org.keycloak.representations.idm.CredentialRepresentation; +import org.keycloak.representations.idm.UserRepresentation; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; +import org.sunbird.keycloak.KeyCloakConnectionProvider; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.common.ProjectUtil; + +/** + * Implementation of SSOManager using Keycloak as the Identity Provider. + * Handles user management operations like password updates, account lock/unlock, + * PII removal, and token verification. + */ +public class KeyCloakServiceImpl implements SSOManager { + private final LoggerUtil logger = new LoggerUtil(KeyCloakServiceImpl.class); + private final Keycloak keycloak = KeyCloakConnectionProvider.getConnection(); + + private static PublicKey SSO_PUBLIC_KEY = null; + + /** + * Retrieves the SSO public key from the environment variable. + * + * @return The PublicKey used for token verification. + */ + public PublicKey getPublicKey() { + if (null == SSO_PUBLIC_KEY) { + SSO_PUBLIC_KEY = toPublicKey(System.getenv(JsonKey.SSO_PUBLIC_KEY)); + } + return SSO_PUBLIC_KEY; + } + + @Override + public String verifyToken(String accessToken, RequestContext context) { + return verifyToken(accessToken, null, context); + } + + /** + * Converts a Base64 encoded public key string to a PublicKey object. + * + * @param publicKeyString The Base64 encoded public key string. + * @return The PublicKey object, or null if conversion fails. + */ + private PublicKey toPublicKey(String publicKeyString) { + try { + byte[] publicBytes = Base64.getDecoder().decode(publicKeyString); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(keySpec); + } catch (Exception e) { + return null; + } + } + + @Override + public boolean updatePassword(String userId, String password, RequestContext context) { + try { + String fedUserId = getFederatedUserId(userId); + UserResource ur = keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); + CredentialRepresentation cr = new CredentialRepresentation(); + cr.setType(CredentialRepresentation.PASSWORD); + cr.setValue(password); + ur.resetPassword(cr); + return true; + } catch (Exception e) { + logger.error(context, "KeyCloakServiceImpl:updatePassword: Exception occurred: ", e); + } + return false; + } + + @Override + public boolean removePII(String userId, RequestContext context) { + try { + String fedUserId = getFederatedUserId(userId); + UserResource userResource = + keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); + UserRepresentation user = userResource.toRepresentation(); + user.setEmailVerified(false); + user.setEmail(""); + user.setFirstName(""); + user.setLastName(""); + user.setEnabled(false); + logger.info(context, "KeyCloakServiceImpl:removePII: Removing PII for userId: " + fedUserId); + userResource.update(user); + List userSessions = userResource.getUserSessions(); + for (Object userSession : userSessions) + userSessions.remove(userSession); + return true; + } catch (Exception e) { + logger.error(context, "KeyCloakServiceImpl:removePII: Exception occurred: ", e); + } + return false; + } + + /** + * Removes a user from Keycloak based on the provided request map. + * + * @param request Map containing user details, specifically {@link JsonKey#USER_ID}. + * @param context The request context. + * @return {@link JsonKey#SUCCESS} on success. + * @throws ProjectCommonException If the user ID parameter is invalid. + */ + @Override + public String removeUser(Map request, RequestContext context) { + Keycloak keycloak = KeyCloakConnectionProvider.getConnection(); + String userId = (String) request.get(JsonKey.USER_ID); + logger.info(context, "KeyCloakServiceImpl:removeUser: Removing user with userId: " + userId); + try { + String fedUserId = getFederatedUserId(userId); + logger.info(context, "KeyCloakServiceImpl:removeUser: Federated userId: " + fedUserId); + UserResource resource = + keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); + if (null != (resource)) { + logger.info(context, "KeyCloakServiceImpl:removeUser: Resource found: " + resource.toRepresentation()); + resource.remove(); + } + } catch (Exception ex) { + logger.error(context, "KeyCloakServiceImpl:removeUser: Error occurred: ", ex); + String exMsg = + String.format(ResponseMessage.Message.INVALID_PARAMETER_VALUE, userId, JsonKey.USER_ID); + ProjectCommonException.throwClientErrorException(ResponseCode.invalidParameterValue, exMsg); + } + return JsonKey.SUCCESS; + } + + /** + * Deactivates a user (sets enabled=false). + * + * @param request Map containing user details. + * @param context The request context. + * @return {@link JsonKey#SUCCESS} on success. + */ + @Override + public String deactivateUser(Map request, RequestContext context) { + String userId = (String) request.get(JsonKey.USER_ID); + makeUserActiveOrInactive(userId, false, context); + return JsonKey.SUCCESS; + } + + /** + * Activates a user (sets enabled=true). + * + * @param request Map containing user details. + * @param context The request context. + * @return {@link JsonKey#SUCCESS} on success. + */ + @Override + public String activateUser(Map request, RequestContext context) { + String userId = (String) request.get(JsonKey.USER_ID); + makeUserActiveOrInactive(userId, true, context); + return JsonKey.SUCCESS; + } + + /** + * Helper method to update the user's enabled status in Keycloak. + * + * @param userId The user ID. + * @param status The target status (true for active, false for inactive). + * @param context The request context. + * @throws ProjectCommonException If the user ID is invalid/missing. + */ + private void makeUserActiveOrInactive(String userId, boolean status, RequestContext context) { + try { + String fedUserId = getFederatedUserId(userId); + logger.info(context, "KeyCloakServiceImpl:makeUserActiveOrInactive: Federated ID: " + fedUserId); + validateUserId(fedUserId); + logger.info(context, "KeyCloakServiceImpl:makeUserActiveOrInactive: User validated."); + Keycloak keycloak = KeyCloakConnectionProvider.getConnection(); + + logger.info( + context, + "KeyCloakServiceImpl:makeUserActiveOrInactive: Keycloak instance info: " + + keycloak.toString() + + " || " + + keycloak.serverInfo()); + UserResource resource = + keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); + logger.info(context, "KeyCloakServiceImpl:makeUserActiveOrInactive: Resource: " + resource.toString()); + UserRepresentation ur = resource.toRepresentation(); + logger.info(context, "KeyCloakServiceImpl:makeUserActiveOrInactive: Current status: " + ur.isEnabled()); + ur.setEnabled(status); + resource.update(ur); + } catch (Exception e) { + logger.error( + context, + "KeyCloakServiceImpl:makeUserActiveOrInactive: Error occurred while updating user status: " + e.getMessage(), + e); + String exMsg = + String.format(ResponseMessage.Message.INVALID_PARAMETER_VALUE, userId, JsonKey.USER_ID); + ProjectCommonException.throwClientErrorException(ResponseCode.invalidParameterValue, exMsg); + } + } + + /** + * Validates if the user ID is present. + * + * @param userId The user ID string. + * @throws ProjectCommonException If the user ID is blank. + */ + private void validateUserId(String userId) { + if (StringUtils.isBlank(userId)) { + String exMsg = + String.format(ResponseMessage.Message.INVALID_PARAMETER_VALUE, userId, JsonKey.USER_ID); + ProjectCommonException.throwClientErrorException(ResponseCode.invalidParameterValue, exMsg); + } + } + + private String getFederatedUserId(String userId) { + return String.join( + ":", + "f", + ProjectUtil.getConfigValue(JsonKey.SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID), + userId); + } + + @Override + public void setRequiredAction(String userId, String requiredAction) { + String fedUserId = getFederatedUserId(userId); + UserResource resource = + keycloak.realm(KeyCloakConnectionProvider.SSO_REALM).users().get(fedUserId); + + UserRepresentation userRepresentation = resource.toRepresentation(); + userRepresentation.setRequiredActions(asList(requiredAction)); + resource.update(userRepresentation); + } + + @Override + public String verifyToken(String accessToken, String url, RequestContext context) { + + try { + PublicKey publicKey = getPublicKey(); + if (publicKey != null) { + String ssoUrl = (url != null ? url : KeyCloakConnectionProvider.SSO_URL); + AccessToken token = + RSATokenVerifier.verifyToken( + accessToken, + publicKey, + ssoUrl + "realms/" + KeyCloakConnectionProvider.SSO_REALM, + true, + true); + logger.debug( + context, + "KeyCloakServiceImpl:verifyToken: Token Details - ID: " + token.getId() + + ", IssuedFor: " + token.issuedFor + + ", Profile: " + token.getProfile() + + ", Subject: " + token.getSubject() + + ", Active: " + token.isActive() + + ", IsExpired: " + token.isExpired() + + ", Expiration: " + token.issuedNow().getExpiration()); + + String tokenSubject = token.getSubject(); + if (StringUtils.isNotBlank(tokenSubject)) { + int pos = tokenSubject.lastIndexOf(":"); + return tokenSubject.substring(pos + 1); + } + return token.getSubject(); + } else { + logger.info(context, "KeyCloakServiceImpl:verifyToken: SSO_PUBLIC_KEY is NULL."); + throw new ProjectCommonException( + ResponseCode.serverError, + ResponseCode.serverError.getErrorMessage(), + ResponseCode.SERVER_ERROR.getResponseCode()); + } + } catch (Exception e) { + logger.error(context, "KeyCloakServiceImpl:verifyToken: Exception occurred during token verification: ", e); + throw new ProjectCommonException( + ResponseCode.unAuthorized, + ResponseCode.unAuthorized.getErrorMessage(), + ResponseCode.UNAUTHORIZED.getResponseCode()); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java new file mode 100644 index 0000000000..ce79ba454e --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/BulkUploadJsonKey.java @@ -0,0 +1,16 @@ +package org.sunbird.keys; + +/** + * Keys for Bulk Upload service. + */ +public class BulkUploadJsonKey { + + private BulkUploadJsonKey() {} + + public static final String TASK_COUNT = "taskCount"; + public static final String SEQUENCE_ID = "sequenceId"; + public static final String OPERATION_STATUS_MSG = "Operation is {0}."; + public static final String NOT_STARTED = "NOT STARTED"; + public static final String IN_PROGRESS = "IN PROGRESS"; + public static final String COMPLETED = "COMPLETED"; +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java new file mode 100644 index 0000000000..4e9574034a --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/GeoLocationJsonKey.java @@ -0,0 +1,18 @@ +package org.sunbird.keys; + +/** + * Keys used for Geo Location related operations. + */ +public class GeoLocationJsonKey { + + private GeoLocationJsonKey() {} + + public static final String PARENT_CODE = "parentCode"; + public static final String CODE = "code"; + public static final String LOCATION_TYPE = "type"; + public static final String PARENT_ID = "parentId"; + public static final String SUNBIRD_VALID_LOCATION_TYPES = "sunbird_valid_location_types"; + public static final String PROPERTY_NAME = "name"; + public static final String PROPERTY_VALUE = "value"; + public static final String ID = "id"; +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java new file mode 100644 index 0000000000..4f1211ea1c --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java @@ -0,0 +1,958 @@ +package org.sunbird.keys; + +import java.util.Arrays; +import java.util.List; + +/** + * This class will contains all the key related to request and response. + */ +public final class JsonKey { + + public static final String SEARCH_FUZZY = "fuzzy"; + public static final String ANONYMOUS = "Anonymous"; + public static final String UNAUTHORIZED = "Unauthorized"; + public static final String MW_SYSTEM_HOST = "sunbird_mw_system_host"; + public static final String MW_SYSTEM_PORT = "sunbird_mw_system_port"; + public static final String ACCOUNT_KEY = "sunbird_account_key"; + public static final String ACCOUNT_NAME = "sunbird_account_name"; + public static final String ACCOUNT_ENDPOINT = "sunbird_account_endpoint"; + public static final String DOWNLOAD_LINK_EXPIRY_TIMEOUT = "download_link_expiry_timeout"; + public static final String SIGNED_URL = "signedUrl"; + public static final String ACTION_NAME = "actionName"; + public static final String ACTION_URL = "actionUrl"; + public static final String ACTIVE = "active"; + public static final String ACTOR_ID = "actorId"; + public static final String ACTOR_SERVICE = "Actor service"; + public static final String ACTOR_TYPE = "actorType"; + public static final String ADD_TYPE = "addType"; + public static final String ADDED_BY = "addedBy"; + public static final String ADDITIONAL_INFO = "ADDITIONAL_INFO"; + public static final String ADDRESS = "address"; + public static final String ADDRESS_LINE1 = "addressLine1"; + public static final String ALL = "all"; + public static final String ALLOWED_LOGIN = "allowedLogin"; + public static final String API_ACCESS = "api_access"; + public static final String API_ACTOR_PROVIDER = "api_actor_provider"; + public static final String API_CALL = "API_CALL"; + public static final String API_ID = "apiId"; + public static final String APP_ICON = "appIcon"; + public static final String APP_MAP = "appMap"; + public static final String APP_SECTIONS = "appSections"; + public static final String ASSESSMENT = "assessment"; + public static final String ASSESSMENT_EVENTS = "assessments"; + public static final String ASSESSMENT_TS = "assessmentTs"; + public static final String ASSESSMENT_EVAL_DB = "assessment_eval_db"; + public static final String ASSESSMENT_ITEM_DB = "assessment_item_db"; + public static final String ASSESSMENT_SCORE = "score"; + public static final String ATTEMPT_ID = "attemptId"; + public static final String ASSESSMENT_EVENTS_KEY = "events"; + public static final String ASSESSMENT_ACTOR = "actor"; + public static final String AUTH_WITH_MASTER_KEY = "authWithMasterKey"; + public static final String AUTHORIZATION = "Authorization"; + public static final String BACKGROUND_ACTOR_PROVIDER = "background_actor_provider"; + public static final String BATCH = "batch"; + public static final String BATCH_ID = "batchId"; + public static final String BEARER = "Bearer "; + public static final String BODY = "body"; + public static final String BULK_OP_DB = "BulkOpDb"; + public static final String BULK_UPLOAD_BATCH_DATA_SIZE = "bulk_upload_batch_data_size"; + public static final String BULK_USER_UPLOAD = "bulkUserUpload"; + public static final String CASSANDRA_SERVICE = "Cassandra service"; + public static final String CHANNEL = "channel"; + public static final String CHECKS = "checks"; + public static final String CITY = "city"; + public static final String CLASS = "class"; + public static final String CLIENT_INFO_DB = "clientInfo_db"; + public static final String CLIENT_NAME = "clientName"; + public static final String COMPLETENESS = "completeness"; + public static final String CONSUMER = "consumer"; + public static final String CONTACT_DETAILS = "contactDetail"; + public static final String CONTAINER = "container"; + public static final String CONTENT = "content"; + public static final String CONTENT_ID = "contentId"; + public static final String CONTENT_IDS = "contentIds"; + public static final String CONTENT_LIST = "contentList"; + public static final String CONTENT_TYPE = "contentType"; + public static final String CONTENTS = "contents"; + public static final String CONTEXT = "context"; + public static final String CORRELATED_OBJECTS = "correlatedObjects"; + public static final String COUNT = "count"; + public static final String COUNTRY = "country"; + public static final String COUNTRY_CODE = "countryCode"; + public static final String COURSE = "course"; + public static final String COURSE_ADDITIONAL_INFO = "courseAdditionalInfo"; + public static final String COURSE_BATCH_DB = "courseBatchDB"; + public static final String COURSE_CREATED_FOR = "createdFor"; + public static final String COURSE_ENROLL_DATE = "enrolledDate"; + public static final String COURSE_ID = "courseId"; + public static final String COURSE_IDS = "courseIds"; + public static final String COURSE_LOGO_URL = "courseLogoUrl"; + public static final String COURSE_MANAGEMENT_DB = "courseManagement_db"; + public static final String COURSE_NAME = "courseName"; + public static final String COURSE_PROGRESS = "progress"; + public static final String COURSES = "courses"; + public static final String CREATE = "create"; + public static final String CREATED_BY = "createdBy"; + public static final String CREATED_DATE = "createdDate"; + public static final String CRITERIA = "criteria"; + public static final String CURRENT_LOGIN_TIME = "currentLoginTime"; + public static final String CURRENT_STATE = "CURRENT_STATE"; + public static final String DASHBOARD = "dashboard"; + public static final String FAILED = "FAILED"; + public static final String X_Source = "X-Source"; + public static final String SERVICE = "service"; + public static final String NOTIFICATION = "notification"; + public static final List USER_UNAUTH_STATES = Arrays.asList("Unauthorized"); + public static final String DATA = "data"; + public static final String DATE_HISTOGRAM = "DATE_HISTOGRAM"; + public static final String DATE_TIME = "dateTime"; + public static final String DB_IP = "db.ip"; + public static final String DB_KEYSPACE = "db.keyspace"; + public static final String DB_PASSWORD = "db.password"; + public static final String DB_PORT = "db.port"; + public static final String DB_USERNAME = "db.username"; + public static final String DEFAULT_CONSUMER_ID = "internal"; + public static final String DEFAULT_ROOT_ORG_ID = "ORG_001"; + public static final String DEGREE = "degree"; + public static final String DESCRIPTION = "description"; + public static final String DOB = "dob"; + public static final String EDUCATION = "education"; + public static final String EKS = "eks"; + public static final String SEARCH_SERVICE_API_BASE_URL = "sunbird_search_service_api_base_url"; + public static final String ANALYTICS_API_BASE_URL = "sunbird_analytics_api_base_url"; + public static final String EKSTEP_AUTHORIZATION = "ekstep_authorization"; + public static final String CONTENT_SERVICE_BASE_URL = "content_service_base_url"; + public static final String EKSTEP_CONTENT_SEARCH_URL = "ekstep_content_search_url"; + public static final String EKSTEP_CONTENT_UPDATE_URL = "ekstep.content.update.url"; + public static final String EKSTEP_SERVICE = "Content service"; + public static final String EKSTEP_TAG_API_URL = "ekstep.tag.api.url"; + public static final String EMAIL = "email"; + public static final String EMAIL_REQUEST = "emailReq"; + public static final String EMAIL_SERVER_FROM = "sunbird_mail_server_from_email"; + public static final String EMAIL_SERVER_HOST = "sunbird_mail_server_host"; + public static final String EMAIL_SERVER_PASSWORD = "sunbird_mail_server_password"; + public static final String EMAIL_SERVER_PORT = "sunbird_mail_server_port"; + public static final String EMAIL_SERVER_USERNAME = "sunbird_mail_server_username"; + public static final String EMAIL_TEMPLATE_TYPE = "emailTemplateType"; + public static final String EMAIL_UNIQUE = "emailUnique"; + public static final String EMAIL_VERIFIED = "emailVerified"; + public static final String EMAIL_VERIFIED_UPDATED = "emailVerifiedUpdated"; + public static final String EMBEDDED = "embedded"; + public static final String EMBEDDED_MODE = "embedded"; + public static final String ENC_EMAIL = "encEmail"; + public static final String ENC_PHONE = "encPhone"; + public static final String ENCRYPTION_KEY = "sunbird_encryption_key"; + public static final String END_DATE = "endDate"; + public static final String ENROLLMENT_END_DATE = "enrollmentEndDate"; + public static final String ENROLLMENT_TYPE = "enrollmentType"; + public static final String ENROLMENTTYPE = "enrolmentType"; + public static final String ENV = "env"; + public static final String ERR_TYPE = "errtype"; + public static final String ERROR = "err"; + public static final String ERROR_MSG = "err_msg"; + public static final String ERRORMSG = "errmsg"; + public static final String ES_METRICS_PORT = "es_metrics_port"; + public static final String ES_SERVICE = "Elastic search service"; + public static final String ES_URL = "es_search_url"; + public static final String ESTIMATED_COUNT_REQ = "estimatedCountReq"; + public static final String EVENTS = "events"; + public static final String EXISTS = "exists"; + public static final String EXTERNAL_ID = "externalId"; + public static final String FACETS = "facets"; + public static final String FAILURE = "failure"; + public static final String FAILURE_RESULT = "failureResult"; + public static final String FCM = "fcm"; + public static final String FCM_URL = "fcm.url"; + public static final String FIELD = "field"; + public static final String FIELDS = "fields"; + public static final String FILE = "file"; + public static final String FILE_NAME = "fileName"; + public static final String FILTER = "filter"; + public static final String FILTERS = "filters"; + public static final String FIRST_NAME = "firstName"; + public static final String FRAMEWORK = "framework"; + public static final String FROM_EMAIL = "fromEmail"; + public static final String GENDER = "gender"; + public static final String GRADE = "grade"; + public static final String GROUP = "group"; + public static final String GROUPID = "groupId"; + public static final String GROUP_QUERY = "groupQuery"; + public static final String HASH_TAG_ID = "hashtagid"; + public static final String HEADER = "header"; + public static final String Healthy = "healthy"; + public static final String ID = "id"; + public static final String IDENTIFIER = "identifier"; + public static final String INDEX = "index"; + public static final String INFO = "info"; + public static final String INVITE_ONLY = "invite-only"; + public static final String IS_AUTH_REQ = "isAuthReq"; + public static final String IS_DELETED = "isDeleted"; + public static final String IS_ROOT_ORG = "isRootOrg"; + public static final String IS_TENANT = "isTenant"; + public static final String IS_SSO_ENABLED = "sso.enabled"; + public static final String JOB_NAME = "jobName"; + public static final String JOB_PROFILE = "jobProfile"; + public static final String JOINING_DATE = "joiningDate"; + public static final String LANGUAGE = "language"; + public static final String LAST_ACCESS_TIME = "lastAccessTime"; + public static final String LAST_COMPLETED_TIME = "lastCompletedTime"; + public static final String LAST_LOGIN_TIME = "lastLoginTime"; + public static final String LAST_LOGOUT_TIME = "lastLogoutTime"; + public static final String LAST_NAME = "lastName"; + public static final String LAST_READ_CONTENT_STATUS = "lastReadContentStatus"; + public static final String LAST_READ_CONTENT_VERSION = "lastReadContentVersion"; + public static final String LAST_READ_CONTENTID = "lastReadContentId"; + public static final String LAST_UPDATED_TIME = "lastUpdatedTime"; + public static final String LEAF_NODE_COUNT = "leafNodesCount"; + public static final String LEARNER_CONTENT_DB = "learnerContent_db"; + public static final String LEARNER_COURSE_DB = "learnerCourse_db"; + public static final String LEARNER_SERVICE = "Learner service"; + public static final String LEVEL = "level"; + public static final String LIMIT = "limit"; + public static final String LIST = "List"; + public static final String LOCATION = "location"; + public static final String LOCATION_IDS = "locationIds"; + public static final String LOG_LEVEL = "logLevel"; + public static final String LOG_TYPE = "logType"; + public static final String LOGIN_ID = "loginId"; + public static final String MAP = "map"; + public static final String MASKED_PHONE = "maskedPhone"; + public static final String MASTER_KEY = "masterKey"; + public static final String MENTORS = "mentors"; + public static final String MESSAGE = "message"; + public static final String MESSAGE_Id = "message_id"; + public static final String MESSAGE_ID = "X-msgId"; + public static final String METHOD = "method"; + public static final String MISSING_FIELDS = "missingFields"; + public static final String MOBILE = "mobile"; + public static final String NAME = "name"; + public static final String NEW_PASSWORD = "newPassword"; + public static final String NOT_EXISTS = "not_exists"; + public static final String NOTE = "note"; + public static final String NULL = "null"; + public static final String OBJECT_IDS = "objectIds"; + public static final String OBJECT_TYPE = "objectType"; + public static final String OFFSET = "offset"; + public static final String ON = "ON"; + public static final String OPEN = "open"; + public static final String OPERATION = "operation"; + public static final String OPERATION_FOR = "operationFor"; + public static final String OPERATION_TYPE = "operationType"; + public static final String ORDER = "order"; + public static final String ORG_CODE = "orgCode"; + public static final String ORG_IMAGE_URL = "orgImageUrl"; + public static final String ORG_NAME = "orgName"; + public static final String ORGANISATION = "organisation"; + public static final String ORGANISATION_ID = "organisationId"; + public static final String ORGANISATION_NAME = "orgName"; + public static final String ORGANISATIONS = "organisations"; + public static final String ORG_TYPE = "organisationType"; + public static final String PAGE = "page"; + public static final String PAGE_ID = "pageId"; + public static final String PAGE_MGMT_DB = "page_mgmt_db"; + public static final String PAGE_NAME = "name"; + public static final String PAGE_SECTION = "page_section"; + public static final String PAGE_SECTION_DB = "page_section_db"; + public static final String PARAMS = "params"; + public static final String PARTICIPANT = "participant"; + public static final String PARTICIPANTS = "participants"; + public static final String PASSWORD = "password"; + public static final String PDATA = "pdata"; + public static final String REST = "rest"; + + public static final String PERCENTAGE = "percentage"; + public static final String PHONE = "phone"; + public static final String PHONE_VERIFIED = "phoneVerified"; + public static final String PORTAL_MAP = "portalMap"; + public static final String PORTAL_SECTIONS = "portalSections"; + public static final String PREV_STATE = "PREV_STATE"; + public static final String PRIMARY_KEY_DELIMETER = "##"; + public static final String PRIVATE = "private"; + public static final String PROCESS_END_TIME = "processEndTime"; + public static final String PROCESS_ID = "processId"; + public static final String PROCESS_START_TIME = "processStartTime"; + public static final String PDATA_ID = "telemetry_pdata_id"; + public static final String PDATA_PID = "telemetry_pdata_pid"; + public static final String PDATA_VERSION = "telemetry_pdata_version"; + public static final String PROFILE_SUMMARY = "profileSummary"; + public static final String PROFILE_VISIBILITY = "profileVisibility"; + public static final String PROGRESS = "progress"; + public static final String PROPS = "props"; + public static final String PROVIDER = "provider"; + public static final String PUBLIC = "public"; + public static final String QUERY = "query"; + public static final String QUERY_FIELDS = "queryFields"; + public static final String RECEIVER_ID = "receiverId"; + public static final String RECIPIENT_EMAILS = "recipientEmails"; + public static final String RECIPIENT_USERIDS = "recipientUserIds"; + public static final String REGISTERED_ORG = "registeredOrg"; + public static final String REGISTERED_ORG_ID = "regOrgId"; + public static final String RELATION = "relation"; + public static final String REPLACE_WITH_ASTERISK = "*"; + public static final String REQUEST = "request"; + public static final String REQUEST_ID = "requestId"; + public static final String REQUEST_TYPE = "requestType"; + public static final String REQUESTED_BY = "requestedBy"; + public static final String RES_MSG_ID = "resmsgId"; + public static final String RESPONSE = "response"; + public static final String RESULT = "result"; + public static final String ROLE = "role"; + public static final String ROLES = "roles"; + public static final String ROLLUP = "rollup"; + public static final String ROOT_ORG_ID = "rootOrgId"; + public static final String SEARCH_QUERY = "searchQuery"; + public static final String SEARCH_TOP_N = "searchTopN"; + public static final String SECTION = "section"; + public static final String SECTION_DATA_TYPE = "sectionDataType"; + public static final String SECTION_DISPLAY = "display"; + public static final String SECTION_ID = "sectionId"; + public static final String SECTION_MGMT_DB = "section_mgmt_db"; + public static final String SECTION_NAME = "name"; + public static final String SECTIONS = "sections"; + public static final String SIZE = "size"; + public static final String SNAPSHOT = "snapshot"; + public static final String SORT = "sort"; + public static final String SORT_BY = "sort_by"; + public static final String SOURCE = "source"; + public static final String SSO_CLIENT_ID = "sso.client.id"; + public static final String SSO_CLIENT_SECRET = "sso.client.secret"; + public static final String SSO_PASSWORD = "sso.password"; + public static final String SSO_POOL_SIZE = "sso.connection.pool.size"; + public static final String SSO_PUBLIC_KEY = "sunbird_sso_publickey"; + public static final String SSO_REALM = "sso.realm"; + public static final String SSO_URL = "sso.url"; + public static final String SSO_USERNAME = "sso.username"; + public static final String STACKTRACE = "stacktrace"; + public static final String STACKTRACE_CHAR_LENGTH = "stacktrace_char_length"; + public static final String START_DATE = "startDate"; + public static final String START_TIME = "startTime"; + public static final String STATE = "state"; + public static final String STATUS = "status"; + public static final String SUBJECT = "subject"; + public static final String SUCCESS = "SUCCESS"; + public static final String SUCCESS_RESULT = "successResult"; + public static final String SUNBIRD_ALLOWED_LOGIN = "sunbird_allowed_login"; + public static final String SUNBIRD_CASSANDRA_IP = "sunbird_cassandra_host"; + public static final String SUNBIRD_CASSANDRA_MODE = "sunbird_cassandra_mode"; + public static final String SUNBIRD_CASSANDRA_PASSWORD = "sunbird_cassandra_password"; + public static final String SUNBIRD_CASSANDRA_PORT = "sunbird_cassandra_port"; + public static final String SUNBIRD_CASSANDRA_USER_NAME = "sunbird_cassandra_username"; + public static final String SUNBIRD_ENCRYPTION = "sunbird_encryption"; + public static final String SUNBIRD_ENV_LOGO_URL = "sunbird_env_logo_url"; + public static final String SUNBIRD_ES_CHANNEL = "es.channel.name"; + public static final String SUNBIRD_ES_CLUSTER = "sunbird_es_cluster"; + public static final String SUNBIRD_ES_IP = "sunbird_es_host"; + public static final String SUNBIRD_ES_PORT = "sunbird_es_port"; + public static final String SUNBIRD_FCM_ACCOUNT_KEY = "sunbird_fcm_account_key"; + public static final String SUNBIRD_INSTALLATION = "sunbird_installation"; + public static final String SUNBIRD_SSO_CLIENT_ID = "sunbird_sso_client_id"; + public static final String SUNBIRD_SSO_CLIENT_SECRET = "sunbird_sso_client_secret"; + public static final String SUNBIRD_SSO_PASSWORD = "sunbird_sso_password"; + public static final String SUNBIRD_SSO_RELAM = "sunbird_sso_realm"; + public static final String SUNBIRD_SSO_URL = "sunbird_sso_url"; + public static final String SUNBIRD_SSO_LB_IP = "sunbird_sso_lb_ip"; + public static final String SUNBIRD_SSO_USERNAME = "sunbird_sso_username"; + public static final String SUNBIRD_WEB_URL = "sunbird_web_url"; + public static final String SUNBIRD_GET_ORGANISATION_API = "sunbird_search_organisation_api"; + public static final String SUNBIRD_GET_SINGLE_USER_API = "sunbird_read_user_api"; + public static final String SUNBIRD_GET_MULTIPLE_USER_API = "sunbird_search_user_api"; + public static final String TAGS = "tags"; + public static final String TARGET_OBJECT = "targetObject"; + public static final String TELEMETRY_CONTEXT = "TELEMETRY_CONTEXT"; + public static final String TELEMETRY_EVENT_TYPE = "telemetryEventType"; + public static final String TEMPORARY_PASSWORD = "tempPassword"; + public static final String TITLE = "title"; + public static final String TO = "to"; + public static final String TOPN = "topn"; + public static final String TYPE = "type"; + public static final String UNDEFINED_IDENTIFIER = "Undefined column name "; + public static final String UNKNOWN_IDENTIFIER = "Unknown identifier "; + public static final String UPDATE = "update"; + public static final String UPDATED_BY = "updatedBy"; + public static final String UPDATED_DATE = "updatedDate"; + public static final String UPLOADED_BY = "uploadedBy"; + public static final String UPLOADED_DATE = "uploadedDate"; + public static final String URL = "url"; + public static final String URL_ACTION = "url_action"; + public static final String URL_ACTION_ID = "url_action_ids"; + public static final String USER = "user"; + public static final String USER_ACTION_ROLE = "user_action_role"; + public static final String USER_AUTH_DB = "userAuth_db"; + public static final String USER_COUNT = "userCount"; + public static final String USER_COUNT_TTL = "userCountTTL"; + public static final String USER_COURSE = "user_course"; + public static final String USER_COURSES = "userCourses"; + public static final String USER_DB = "user_db"; + public static final String USER_FOUND = "user exist with this login Id."; + public static final String USER_ID = "userId"; + public static final String USER_IDs = "userIds"; + public static final String USER_LIST_REQ = "userListReq"; + public static final String USER_NAME = "username"; + public static final String USERNAME = "userName"; + public static final String VER = "ver"; + public static final String VERSION = "version"; + public static final String WEB_PAGES = "webPages"; + public static final String SUNBIRD_HEALTH_CHECK_ENABLE = "sunbird_health_check_enable"; + public static final String HEALTH = "health"; + public static final String SOFT_CONSTRAINTS = "softConstraints"; + public static final String SUNBIRD_USER_ORG_API_BASE_URL = "sunbird_user_org_api_base_url"; + public static final String SUNBIRD_API_MGR_BASE_URL = "sunbird_api_mgr_base_url"; + public static final String SUNBIRD_AUTHORIZATION = "sunbird_authorization"; + public static final String SUNBIRD_CS_SEARCH_PATH = "sunbird_cs_search_path"; + public static final String DURATION = "duration"; + public static final String LOCATION_CODE = "locationCode"; + public static final String UPLOAD_FILE_MAX_SIZE = "file_upload_max_size"; + public static final String PRIMARY_KEY = "PK"; + public static final String NON_PRIMARY_KEY = "NonPK"; + public static final String PARENT_ID = "parentId"; + public static final String CREATED_ON = "createdOn"; + public static final String LAST_UPDATED_ON = "lastUpdatedOn"; + public static final String SUNBIRD_DEFAULT_CHANNEL = "sunbird_default_channel"; + public static final String CASSANDRA_WRITE_BATCH_SIZE = "cassandra_write_batch_size"; + public static final String ORG_EXTERNAL_ID = "orgExternalId"; + public static final String ORG_PROVIDER = "orgProvider"; + public static final String EXTERNAL_IDS = "externalIds"; + public static final String EXTERNAL_ID_TYPE = "externalIdType"; + public static final String ID_TYPE = "idType"; + public static final String ADD = "add"; + public static final String REMOVE = "remove"; + public static final String EDIT = "edit"; + public static final String DEFAULT_FRAMEWORK = "defaultFramework"; + public static final String EXTERNAL_ID_PROVIDER = "externalIdProvider"; + public static final String OK = "ok"; + public static final String RECIPIENT_SEARCH_QUERY = "recipientSearchQuery"; + public static final String SUNBIRD_CASSANDRA_CONSISTENCY_LEVEL = + "sunbird_cassandra_consistency_level"; + public static final String VERSION_2 = "v2"; + public static final String APP_ID = "appId"; + public static final String SUNBIRD_URL_SHORTNER_ENABLE = "sunbird_url_shortner_enable"; + + public static final String SUNBIRD_COURSE_BATCH_NOTIFICATIONS_ENABLED = + "sunbird_course_batch_notification_enabled"; + + public static final String BATCH_START_DATE = "batchStartDate"; + public static final String BATCH_END_DATE = "batchEndDate"; + public static final String BATCH_NAME = "batchName"; + public static final String BATCH_MENTOR_ENROL = "batchMentorEnrol"; + public static final String BATCH_LEARNER_ENROL = "batchLearnerEnrol"; + public static final String COURSE_INVITATION = "Course Invitation"; + public static final String BATCH_LEARNER_UNENROL = "batchLearnerUnenrol"; + public static final String BATCH_MENTOR_UNENROL = "batchMentorUnenrol"; + public static final String UNENROLL_FROM_COURSE_BATCH = "Unenrolled from Training"; + public static final String OPEN_BATCH_LEARNER_UNENROL = "openBatchLearnerUnenrol"; + + public static final String COURSE_BATCH = "courseBatch"; + public static final String ADDED_MENTORS = "addedMentors"; + public static final String REMOVED_MENTORS = "removedMentors"; + public static final String ADDED_PARTICIPANTS = "addedParticipants"; + public static final String REMOVED_PARTICIPANTS = "removedParticipants"; + public static final String URL_QUERY_STRING = "urlQueryString"; + public static final String SUNBIRD_API_REQUEST_LOWER_CASE_FIELDS = + "sunbird_api_request_lower_case_fields"; + public static final String COMPLETED_ON = "completedOn"; + public static final String CALLER_ID = "callerId"; + public static final String USER_TYPE = "userType"; + + public static final String COURSE_BATCH_URL = "courseBatchUrl"; + public static final String SUNBIRD_COURSE_BATCH_NOTIFICATION_SIGNATURE = + "sunbird_course_batch_notification_signature"; + public static final String SIGNATURE = "signature"; + public static final String OPEN_BATCH_LEARNER_ENROL = "openBatchLearnerEnrol"; + public static final String CONTENT_CLOUD_STORAGE_TYPE = "sunbird_cloud_service_provider"; + public static final String CONTENT_CLOUD_STORAGE_CONTAINER = + "sunbird_content_cloud_storage_container"; + public static final String AZURE_STR = "azure"; + public static final String AWS_STR = "aws"; + public static final String GCLOUD_STR = "gcloud"; + + public static final String CLOUD_FOLDER_CONTENT = "sunbird_cloud_content_folder"; + public static final String CLOUD_STORE_BASE_PATH = "cloud_storage_base_url"; + public static final String CLOUD_STORAGE_CNAME_URL= "cloud_storage_cname_url"; + public static final String CLOUD_STORE_BASE_PATH_PLACEHOLDER = "cloud_store_base_path_placeholder"; + public static final String TTL = "ttl"; + + public static final String MIME_TYPE = "mimeType"; + public static final String COLLECTION_MIME_TYPE = "application/vnd.ekstep.content-collection"; + public static final String BULK_ORG_UPLOAD = "bulkOrgUpload"; + public static final String LOCATION_CODES = "locationCodes"; + public static final String BATCH_DETAILS = "batchDetails"; + public static final String DIAL_CODES = "dialcodes"; + public static final String NO = "No"; + public static final String YES = "Yes"; + + public static final String BATCHES = "batches"; + public static final String ENROLLED_ON = "enrolledOn"; + public static final String OTHER = "OTHER"; + public static final String TEACHER = "TEACHER"; + public static final String USER_EXTERNAL_ID = "userExternalId"; + public static final String USER_ID_TYPE = "userIdType"; + public static final String USER_PROVIDER = "userProvider"; + public static final String TERM = "term"; + public static final String DESC = "desc"; + public static final String SUNBIRD_TIMEZONE = "sunbird_time_zone"; + public static final String DATA_SOURCE = "dataSource"; + public static final String SUNBIRD_KEYCLOAK_USER_FEDERATION_PROVIDER_ID = + "sunbird_keycloak_user_federation_provider_id"; + public static final String DEVICE_ID = "did"; + public static final String COMPLETED_PERCENT = "completedPercent"; + public static final String SUNBIRD_GZIP_ENABLE = "sunbird_gzip_enable"; + public static final String SUNBIRD_SYNC_READ_WAIT_TIME = "sunbird_sync_read_wait_time"; + public static final String SUNBIRD_GZIP_SIZE_THRESHOLD = "sunbird_gzip_size_threshold"; + public static final String PAGE_MANAGEMENT = "page_management"; + public static final String MAP_NAME = "mapName"; + public static final String SIGNUP_TYPE = "signupType"; + public static final String REQUEST_SOURCE = "source"; + + public static final String SUNBIRD_REDIS_CONN_POOL_SIZE = "sunbird_redis_connection_pool_size"; + public static final String RECIPIENT_PHONES = "recipientPhones"; + public static final String ES_OR_OPERATION = "$or"; + public static final String FROM_ACCOUNT_ID = "fromAccountId"; + public static final String TO_ACCOUNT_ID = "toAccountId"; + public static final String CERT_ID = "certId"; + public static final String ACCESS_CODE = "accessCode"; + public static final String JSON_DATA = "jsonData"; + public static final String PDF_URL = "pdfURL"; + public static final String SIGN_KEYS = "signKeys"; + public static final String ENC_KEYS = "encKeys"; + public static final String SUNBIRD_STATE_IMG_URL = "sunbird_state_img_url"; + public static final String SUNBIRD_DIKSHA_IMG_URL = "sunbird_diksha_img_url"; + public static final String SUNBIRD_CERT_COMPLETION_IMG_URL = "sunbird_cert_completion_img_url"; + public static final String stateImgUrl = "stateImgUrl"; + public static final String dikshaImgUrl = "dikshaImgUrl"; + public static final String certificateImgUrl = "certificateImgUrl"; + public static final String X_AUTHENTICATED_USER_TOKEN = "x-authenticated-user-token"; + public static final String X_SOURCE_USER_TOKEN = "x-source-user-token"; + public static final String X_CHANNEL_ID = "x-channel-id"; + public static final String X_AUTHENTICATED_USERID = "x-authenticated-userid"; + public static final String SUNBIRD_COURSE_DIALCODES_DB = "sunbird_course_dialcodes_db"; + public static final String RECOVERY_EMAIL = "recoveryEmail"; + public static final String RECOVERY_PHONE = "recoveryPhone"; + public static final String NESTED_KEY_FILTER = "nestedFilters"; + public static final String LICENSE = "license"; + public static final String DEFAULT_LICENSE = "defaultLicense"; + public static final String SUNBIRD_PASS_REGEX = "sunbird_pass_regex"; + public static final String NESTED_EXISTS = "nested_exists"; + public static final String NESTED_NOT_EXISTS = "nested_not_exists"; + public static final String CREATOR_DETAILS_FIELDS = "sunbird_user_search_cretordetails_fields"; + public static final String SUNBIRD_QRCODE_COURSES_LIMIT ="sunbird_user_qrcode_courses_limit"; + public static final String ACCESS_TOKEN_PUBLICKEY_BASEPATH = "accesstoken.publickey.basepath"; + public static final String ACCESS_TOKEN_PUBLICKEY_KEYPREFIX = "accesstoken.publickey.keyprefix"; + public static final String ACCESS_TOKEN_PUBLICKEY_KEYCOUNT = "accesstoken.publickey.keycount"; + public static final String SHA_256_WITH_RSA = "SHA256withRSA"; + public static final String SUB = "sub"; + public static final String DOT_SEPARATOR = "."; + public static final String REQUESTED_FOR = "requestedFor"; + public static final String CONTENT_PROPS_TO_ADD ="learning.content.props.to.add"; + public static final String GROUP_ACTIVITY_DB = "groupActivityDB"; + public static final String ACTIVITYID = "activityId"; + public static final String ACTIVITYTYPE = "activityType"; + public static final String GROUP_SERVICE_API_BASE_URL ="sunbird_group_service_api_base_url"; + public static final String COLLECTION_ID = "collectionId"; + public static final String TRACKABLE_ENABLED = "trackable.enabled"; + public static final String GROUPBY = "groupBy"; + public static final String X_AUTH_TOKEN = "X_AUTH_TOKEN"; + public static final String TEMPLATE = "template"; + public static final String ASSESSMENT_AGGREGATOR_DB = "assessment_aggregator_db"; + public static final String SERVICE_NAME = "course-service"; + public static final String PRODUCER_NAME = "org.sunbird.course-service"; + public static final String PID = "course-service"; + public static final String P_VERSION = "1.0"; + public static final String X_DEVICE_ID = "x-device-id"; + public static final String X_SESSION_ID = "x-session-id"; + public static final String USER_ENROLMENTS_DB = "user_enrolments"; + public static final List CHANGE_IN_SIMPLE_DATE_FORMAT = Arrays.asList("startDate", "endDate", "enrollmentEndDate"); + public static final List CHANGE_IN_DATE_FORMAT = Arrays.asList("createdDate", "updatedDate"); + public static final List CHANGE_IN_DATE_FORMAT_ALL = Arrays.asList("startDate", "endDate", "enrollmentEndDate", "createdDate", "updatedDate"); + public static final String OLD_START_DATE = "oldStartDate"; + public static final String OLD_END_DATE = "oldEndDate"; + public static final String OLD_ENROLLMENT_END_DATE = "oldEnrollmentEndDate"; + public static final String OLD_LAST_ACCESS_TIME = "oldLastAccessTime"; + public static final String OLD_LAST_COMPLETED_TIME = "oldLastCompletedTime"; + public static final String OLD_LAST_UPDATED_TIME = "oldLastUpdatedTime"; + public static final String COURSE_ID_KEY = "courseid"; + public static final String CONTENT_ID_KEY = "contentid"; + public static final String LAST_ACCESS_TIME_KEY = "last_access_time"; + public static final List SET_END_OF_DAY = Arrays.asList("endDate", "enrollmentEndDate"); + public static final String BATCH_ID_KEY = "batchid"; + public static final String USER_ID_KEY = "userid"; + public static final String OLD_CREATED_DATE = "oldCreatedDate"; + public static final String X_LOGGING_HEADERS = "X_LOGGING_HEADERS"; + public static final String LAST_CONTENT_ACCESS_TIME = "lastcontentaccesstime"; + public static final String GCP="gcloud"; + public static final String SUNBIRD_DIAL_SERVICE_BASE_URL = "sunbird_dial_service_base_url"; + public static final String SUNBIRD_DIAL_SERVICE_SEARCH_URL = "sunbird_dial_service_search_url"; + public static final String CONTENT_SERVICE_MOCK_ENABLED = "content_service_mock_enabled"; + public static final String AUTH_ENABLED = "AuthenticationEnabled"; + public static final String CONTENT_READ_URL = "content_read_url"; + public static final String TAG = "tag"; + public static final String EXHAUST_API_BASE_URL = "exhaust_api_base_url"; + public static final String EXHAUST_API_SUBMIT_ENDPOINT = "exhaust_api_submit_endpoint"; + public static final String EXHAUST_API_LIST_ENDPOINT = "exhaust_api_list_endpoint"; + public static final String ENCRYPTIONKEY = "encryptionKey"; + public static final String DATASET = "dataset"; + public static final String DATASETCONFIG = "datasetConfig"; + public static final String OUTPUT_FORMAT = "output_format"; + + public static final String CONTENT_LENGTH = "Content-Length"; + + public static final String CDATA = "cdata"; + public static final String USER_ORG_SERVICE_PREFIX = "UOS_"; + + //#Release-5.4.0 - LR-511 + public static final String SUNBIRD_KEYSPACE = "sunbird_userorg_keyspace"; + public static final String SUNBIRD_COURSE_KEYSPACE ="sunbird_course_keyspace"; + public static final String DIALCODE_KEYSPACE = "dialcode_keyspace"; + public static final String REDIS_HOST_VALUE = "sunbird_redis_host"; + public static final String REDIS_PORT_VALUE = "sunbird_redis_port"; + public static final String REDIS_INDEX_VALUE = "redis.dbIndex"; + public static final String SUNBIRD_REDIS_SCAN_INTERVAL = "sunbird_redis_scan_interval"; + public static final String ES_COURSE_INDEX = "es_course_index"; + public static final String ES_COURSE_BATCH_INDEX = "es_course_batch_index"; + public static final String ES_USER_INDEX = "es_user_index"; + public static final String ES_ORGANISATION_INDEX = "es_organisation_index"; + public static final String ES_USER_COURSES_INDEX = "es_user_courses_index"; + public static final String X_REQUEST_ID = "x-request-id"; + + + + // Userorg Keys + public static final String SMS_GATEWAY_PROVIDER = "sms_gateway_provider"; + public static final String MSG_91 = "msg_91"; + public static final String NIC = "nic"; + public static final String SYSTEM_SETTINGS_DB = "system_settings"; + public static final String SMS_TEMPLATE_CONFIG = "smsTemplateConfig"; + public static final String VALUE = "value"; + public static final String BLOCK_USER = "BlockUser"; + public static final String CODE = "code"; + public static final String DECLARATIONS = "declarations"; + public static final String DEFAULT_PERSONA = "default"; + public static final String DELETE_USER = "DeleteUser"; + public static final String LOCATION_TYPE = "type"; + public static final String LOCATION_TYPE_SCHOOL = "school"; + public static final String PERSONA = "persona"; + public static final String PROFILE_LOCATION = "profileLocation"; + public static final String ROOT_ORG = "rootOrg"; + public static final String STATE_ID = "stateId"; + public static final String UNBLOCK_USER = "UnblockUser"; + public static final String USER_SUB_TYPE = "userSubType"; + public static final String ORG_ID = "orgId"; + public static final String KEY = "key"; + public static final String CUSTODIAN_ORG_ID = "custodianOrgId"; + public static final String SOFT_DELETE_PREVIOUS_ORG = "softDeleteOldOrg"; + public static final String ERRORS = "errors"; + public static final String HASHTAGID = "hashTagId"; + public static final String ORG_LOCATION = "orgLocation"; + public static final String PROFILE_USERTYPES = "profileUserTypes"; + public static final String DOB_VALIDATION_DONE = "dobValidationDone"; + public static final String DEFAULT_MONTH_DATE = "defaultMonthDate"; + public static final String COUNTRY_CODE_TEXT = "country code"; + public static final String SUNBIRD_VALID_LOCATION_TYPES = "sunbird_valid_location_types"; + public static final String USER_LOOKUP = "user_lookup"; + public static final String USER_LOOKUP_FILED_USER_NAME = "username"; + public static final String USER_LOOKUP_FILED_EXTERNAL_ID = "externalid"; + public static final String MANAGED_BY = "managedBy"; + public static final String PROFILE_USERTYPE = "profileUserType"; + public static final String SUB_TYPE = "subType"; + public static final String EKSTEP_SIGNING_SIGN_PAYLOAD = "ekstep.signing.sign.payload"; + public static final String EKSTEP_SIGNING_SIGN_PAYLOAD_VER = "ekstep.signing.sign.payload.ver"; + public static final String ADMINUTIL_BASE_URL = "adminutil_base_url"; + public static final String ADMINUTIL_SIGN_ENDPOINT = "adminutil_sign_endpoint"; + public static final String DECLARED_SCHOOL_UDISE_CODE = "declared-school-udise-code"; + public static final String DECLARED_SCHOOL_NAME = "declared-school-name"; + public static final String SELF_DECLARED_ERROR = "ERROR"; + public static final String ACTION_GROUPS = "actionGroups"; + public static final String ACTIONS = "actions"; + public static final String ORG_SUB_TYPE = "organisationSubType"; + public static final String IS_SSO_ROOTORG_ENABLED = "isSSOEnabled"; + public static final String INSERT = "insert"; + public static final String UPDATE_ORG_STATUS = "updateOrgStatus"; + public static final String LOCATION_ID = "locationId"; + public static final String USER_ORG = "user_organisation"; + public static final String USER_FEED_DB = "user_feed"; + public static final String CATEGORY = "category"; + public static final String ORG_DB = "org_db"; + public static final String ACTION_GROUP = "action_group"; + public static final String ROLE_GROUP = "role_group"; + public static final String USER_ORG_DB = "user_org_db"; + public static final String USER_NOTES_DB = "userNotes_db"; + public static final String TENANT_PREFERENCE_DB = "tenantPreferenceDb"; + public static final String USER_CERT = "user_cert"; + public static final String X_TRACE_ENABLED = "x-trace-enabled"; + public static final String SLUG = "slug"; + public static final String IS_SCHOOL = "isSchool"; + public static final String ORGANISATION_TYPE = "organisationType"; + public static final String ORG_TYPE_SCHOOL = "school"; + public static final String CLOUD_SERVICE_PROVIDER = "sunbird_cloud_service_provider"; + public static final String CLOUD_SERVICE_CONTAINER = "sunbird_content_cloud_storage_container"; + public static final String KEYS = "keys"; + public static final String EXHAUST_ENCRYPTION_KEY = "exhaustEncryptionKey"; + public static final String ES_LOCATION_INDEX = "es_location_index"; + public static final String ES_USER_NOTES_INDEX = "es_user_notes_index"; + public static final String ES_USER_FEED_INDEX = "es_user_feed_index"; + public static final String ES_USER_INDEX_ALIAS = "user_index_alias"; + public static final String ES_ORG_INDEX_INDEX = "org_index_alias"; + + public static final String EXHAUST_KEYS = "exhaust_keys"; + public static final String USR_DECLARATION_TABLE = "user_declarations"; + public static final String TENANT_PREFERENCE_V2 = "tenantPreferenceV2"; + public static final String USER_ROLES = "user_roles"; + public static final String STATE_VALIDATED = "stateValidated"; + public static final String NOTIFICATION_SERVICE_V2_SEND_URL = "notification_service_v2_send_url"; + public static final String NOTIFICATION_SERVICE_V1_UPDATE_URL = "notification_service_v1_update_url"; + public static final String NOTIFICATION_SERVICE_V1_READ_URL = "notification_service_v1_read_url"; + public static final String NOTIFICATION_SERVICE_V1_DELETE_URL = "notification_service_v1_delete_url"; + public static final String NOTIFICATION_SERVICE_BASE_URL = "notification_service_base_url"; + public static final String NOTE_ID = "noteId"; + public static final String PHONE_UNIQUE = "phoneUnique"; + public static final String PROFILE_DETAILS = "profileDetails"; + public static final String TNC_ACCEPTED_ON = "tncAcceptedOn"; + public static final String FLAGS_VALUE = "flagsValue"; + public static final String DECLARED_EMAIL = "declared-email"; + public static final String DECLARED_PHONE = "declared-phone"; + public static final String DECLARED_STATE = "declared-state"; + public static final String DECLARED_DISTRICT = "declared-district"; + public static final String ORIGINAL_EXTERNAL_ID = "originalExternalId"; + public static final String ASSOCIATION_TYPE = "associationType"; + public static final String GET = "get"; + public static final String UPDATED_ON = "updatedOn"; + public static final String DEFAULT = "default"; + public static final String JOB = "job"; + public static final String RATE_LIMIT_UNIT = "unit"; + public static final String RATE = "rate"; + public static final String MERGE_USER = "mergeUser"; + public static final String USR_EXT_IDNT_TABLE = "usr_external_identity"; + public static final String USER_DECLARATION_DB = "user_declarations"; + public static final String LAST_UPDATED_BY = "lastUpdatedBy"; + public static final String ORIGINAL_ID_TYPE = "originalIdType"; + public static final String MASKED_EMAIL = "maskedEmail"; + public static final String ORIGINAL_PROVIDER = "originalProvider"; + public static final String CHANNEL_REGISTRATION_DISABLED = "channel_registration_disabled"; + public static final String SUNBIRD_CONTENT_SERVICE_API_BASE_URL = "sunbird_content_service_api_base_url"; + public static final String SUNBIRD_CHANNEL_CREATE_API_URL = "sunbird.channel.create.api.url"; + public static final String SUNBIRD_CHANNEL_UPDATE_API_URL = "sunbird.channel.update.api.url"; + public static final String VALIDATED = "VALIDATED"; + public static final String FORCE_MIGRATION = "forceMigration"; + public static final String CONSENT_CONSUMERID = "consumerId"; + public static final String CONSENT_OBJECTID = "objectId"; + public static final String CONSENT_OBJECTTYPE = "objectType"; + public static final String CONSENT_OBJECTTYPE_ORG = "Organisation"; + public static final String CONSENT_STATUS_DELETED = "DELETED"; + public static final String NOTIFY_USER_MIGRATION = "notifyMigration"; + public static final String MODE = "mode"; + public static final String SMS = "sms"; + public static final String INSTALLATION_NAME = "installationName"; + public static final String SUNBIRD_MIGRATE_USER_BODY = "migrate_user_template"; + public static final String SUNBIRD_ACCOUNT_MERGE_SUBJECT = "sunbird_account_merge_subject"; + public static final String OTP = "otp"; + public static final String ATTEMPTED_COUNT = "attemptedCount"; + public static final String PREV_USED_EMAIL = "prevUsedEmail"; + public static final String PREV_USED_PHONE = "prevUsedPhone"; + public static final String USER_INFO = "userInfo"; + public static final String ERROR_TYPE = "errorType"; + public static final String SCOPE_STR = "scopeString"; + public static final String ROLE_OPERATION = "roleOperation"; + public static final String SCOPE = "scope"; + public static final String MIGRATE_USER = "migrateUser"; + public static final String PROFILE_CONFIG = "profileConfig_v2"; + public static final String PORTAL_SERVICE_PORT = "PORTAL_SERVICE_PORT"; + public static final String FORM_API_ENDPOINT = "form_api_endpoint"; + public static final String TEMPLATE_ID = "templateId"; + public static final String OTP_EXPIRATION_IN_MINUTES = "otpExpiryInMinutes"; + public static final String CONSENT_RESPONSE = "consents"; + public static final String USER_CONSENT_TEXT = "user consent"; + public static final String CONSENT_BODY = "consent"; + public static final String CONSENT_SUCCESS_MESSAGE = "User Consent updated successfully."; + public static final String CONSENT_OBJECT = "object"; + public static final String CONSENT_USER_ID = "user_id"; + public static final String CONSENT_CONSUMER_ID = "consumer_id"; + public static final String CONSENT_OBJECT_ID = "object_id"; + public static final String CONSENT_CONSUMERTYPE = "consumerType"; + public static final String CONSENT_CONSUMER_TYPE = "consumer_type"; + public static final String CONSENT_OBJECT_TYPE = "object_type"; + public static final String CONSENT_EXPIRY = "expiry"; + public static final String CATEGORIES = "categories"; + public static final String CONSENT_CREATED_ON = "created_on"; + public static final String CONSENT_LAST_UPDATED_ON = "last_updated_on"; + public static final String CREDENTIALS_STATUS = "keycloakCredentials"; + public static final String USER_LOOK_UP_STATUS = "userLookUpTable"; + public static final String USER_EXTERNAL_ID_STATUS = "userExternalIdTable"; + public static final String USER_TABLE_STATUS = "userTable"; + public static final String DELETE = "delete"; + public static final String DELETE_USER_STATUS = "DeleteUserStatus"; + public static final String REDIRECT_URI = "redirectUri"; + public static final String SET_PASSWORD_LINK = "set_password_link"; + public static final String LINK = "link"; + public static final String VERIFY_EMAIL_LINK = "verify_email_link"; + public static final String PASSWORD_RESET_LOGIN_PAGE_URL = "sunbird_password_reset_login_page_url"; + public static final String MANAGED_FOR = "managedFor"; + public static final String SUNBIRD_USERNAME_NUM_DIGITS = "sunbird_username_num_digits"; + public static final String MANAGED_TOKEN = "managedToken"; + public static final String TOKEN = "token"; + public static final String ROOT_ORG_NAME = "rootOrgName"; + public static final String ALL_TNC_ACCEPTED = "allTncAccepted"; + public static final String EXTENDED_PROFILE_SCHEMA_CONFIG = "extendedProfileSchemaConfig"; + public static final String MANDATORY_FIELDS_EXISTS = "mandatoryFieldsExists"; + public static final String TNC_TYPE = "tncType"; + public static final String TNC_CONFIG = "tncConfig"; + public static final String LATEST_VERSION = "latestVersion"; + public static final String ORG_ADMIN_TNC = "orgAdminTnc"; + public static final String ORG_ADMIN = "ORG_ADMIN"; + public static final String REPORT_VIEWER_TNC = "reportViewerTnc"; + public static final String REPORT_VIEWER = "REPORT_VIEWER"; + public static final String REPORT_ADMIN = "REPORT_ADMIN"; + public static final String POSITION = "position"; + public static final String HOME_URL = "homeUrl"; + public static final String LOC_ID = "locationId"; + public static final String USER_PROFILE_CONFIG = "userProfileConfig"; + public static final String ORG_TYPE_CONFIG = "orgTypeConfig"; + public static final String CUSTODIAN_ORG_CHANNEL = "custodianOrgChannel"; + public static final String ORG_JOIN_DATE = "orgJoinDate"; + public static final String USER_FEED = "userFeed"; + public static final String FEED_ID = "feedId"; + public static final String IDS = "ids"; + public static final String DATA_SECURITY_POLICY = "dataSecurityPolicy"; + public static final String USER_PRIVATE_FIELDS = "userPrivateFields"; + public static final String SHADOW_USER = "shadow_user"; + public static final String USERIDS = "userIds"; + public static final String USER_EXT_ID = "userExtId"; + public static final String IS_FORM_VALIDATION_REQUIRED = "isFormValidationRequired"; + public static final String BULK_UPLOAD_ORG_DATA_SIZE = "bulk_upload_org_data_size"; + public static final String BULK_UPLOAD_USER_DATA_SIZE = "sunbird_user_bulk_upload_size"; + public static final String BULK_LOCATION_UPLOAD = "bulkLocationUpload"; + public static final String IS_BLOCKED = "isBlocked"; + public static final String OTP_EMAIL_RESET_PASSWORD_TEMPLATE = "otpEmailResetPasswordTemplate"; + public static final String OTP_PHONE_RESET_PASSWORD_TEMPLATE = "otpPhoneResetPasswordTemplate"; + public static final String VERIFY_EMAIL_OTP_TEMPLATE = "verifyEmailOtpTemplate"; + public static final String VERIFY_PHONE_OTP_TEMPLATE = "verifyPhoneOtpTemplate"; + public static final String TERMS = "terms"; + public static final String SUNBIRD_INSTALLATION_DISPLAY_NAME = "sunbird_installation_display_name_for_sms"; + public static final String SUNBIRD_SUPPORT_EMAIL = "sunbird_support_email"; + public static final String SUNBIRD_DEFAULT_COUNTRY_CODE = "sunbird_default_country_code"; + public static final String ONBOARDING_MAIL_SUBJECT = "onboarding_mail_subject"; + public static final String SUNBIRD_EMAIL_MAX_RECEPIENT_LIMIT = "sunbird_email_max_recipient_limit"; + public static final String TNC_ACCEPTED_VERSION = "tncAcceptedVersion"; + public static final String SUNBIRD_OTP_EXPIRATION = "sunbird_otp_expiration"; + public static final String SUNBIRD_OTP_LENGTH = "sunbird_otp_length"; + public static final String RATE_LIMIT = "rate_limit"; + public static final String SUPPORT_EMAIL = "supportEmail"; + public static final String SUNBIRD_FUZZY_SEARCH_THRESHOLD = "sunbird_fuzzy_search_threshold"; + public static final String SUNBIRD_RESET_PASS_MAIL_SUBJECT = "sunbird_reset_pass_mail_subject"; + public static final String ACTION = "action"; + public static final String ITERATION = "iteration"; + public static final String CLAIM_STATUS = "claimStatus"; + public static final String TEMPLATE_OPTIONS = "templateOptions"; + public static final String OTP_PHONE_WARD_LOGIN_TEMPLATE = "verifyPhoneOtpTemplateWard"; + public static final String OTP_EMAIL_WARD_LOGIN_TEMPLATE = "verifyEmailOtpTemplateWard"; + public static final String LIMIT_MANAGED_USER_CREATION = "limit_managed_user_creation"; + public static final String MANAGED_USER_LIMIT = "managed_user_limit"; + public static final String SUBMITTED = "SUBMITTED"; + public static final String SUB_PERSONA = "subPersona"; + public static final String FORM = "form"; + public static final String CHILDREN = "children"; + public static final String OPTIONS = "options"; + public static final String TENANT_PREFERENCE_V2_DB = "tenant_preference_v2"; + public static final String EMAIL_VERIFICATION_SUBJECT = "OTP to verify Email"; + public static final String OTP_CONTACT_UPDATE_TEMPLATE_EMAIL = "otpContactUpdateTemplateEmail"; + public static final String OTP_CONTACT_UPDATE_TEMPLATE_SMS = "otpContactUpdateTemplateSms"; + public static final String CONTACT_DETAILS_UPDATE_VERIFICATION_SUBJECT = + "OTP to edit Profile"; + public static final String DELETE_USER_VERIFICATION_SUBJECT = "OTP to proceed with profile deletion."; + public static final String DISABLE_MULTIPLE_ORG_ROLE = "sunbird_disable_multiple_org_role"; + public static final String USERS = "users"; + public static final String SUGGESTED_USERS = "suggested_users"; + public static final String OBJECT = "object"; + public static final String EDATA = "edata"; + public static final String MANAGED_USERS = "managed_users"; + public static final String USER_DELETION_TOPIC = "user-deletion-broadcast-topic"; + public static final String USER_DELETION_ROLES = "user-deletion-roles"; + public static final String OTP_DELETE_USER_TEMPLATE_ID = "otpDeleteUserTemplate"; + public static final String RESET_PASSWORD_TEMPLATE_ID = "resetPasswordWithOtp"; + public static final String WARD_LOGIN_OTP_TEMPLATE_ID = "wardLoginOTP"; + public static final String CONTACT_UPDATE_TEMPLATE_ID = "otpContactUpdateTemplate"; + + public static final String DELETE_USER_ACTON = "delete-user"; + public static final String USER_PROFILE_CONFIG_MAP = "userProfileConfigMap"; + public static final String OTP_DELETE_USER_TEMPLATE_SMS = "otpDeleteUserTemplateSms"; + public static final String OTP_DELETE_USER_EMAIL_TEMPLATE = "otpEmailDeleteUserTemplate"; + public static final String CONSENT_EXPIRY_IN_DAYS = "consent_expiry_in_days"; + public static final String IS_MINOR = "isMinor"; + public static final String WITH_TOKENS = "withTokens"; + public static final String IS_SSO = "isSSO"; + public static final String IS_SELF_DECLARATION = "isSelfDeclaration"; + public static final String IS_SYSTEM_UPLOAD = "isSystemUpload"; + public static final String TNC_LATEST_VERSION = "tncLatestVersion"; + public static final String PROMPT_TNC = "promptTnC"; + public static final String TNC_LATEST_VERSION_URL = "tncLatestVersionUrl"; + public static final String TOPIC = "topic"; + public static final String TOPICS = "topics"; + public static final String ROLE_LIST = "roleList"; + public static final String LOCATIONS = "locations"; + public static final String USER_LOCATIONS = "userLocations"; + public static final String NOTIFICATIONS = "notifications"; + public static final String FEEDS = "feeds"; + public static final String PARENT_CODE = "parentCode"; + public static final String SUNBIRD_FRAMEWORK_READ_API = "sunbird_framework_read_api"; + public static final String SUNBIRD_API_BASE_URL = "sunbird_api_base_url"; + public static final String RESPONSE_CODE = "responseCode"; + public static final String ATTRIBUTE = "attribute"; + public static final String DISTRICT = "district"; + public static final String SORTBY = "sortBy"; + public static final String USER_MERGEE_ACCOUNT = "userMergeeAccount"; + public static final String OSID = "osid"; + public static final String ONBOARDING_WELCOME_MAIL_BODY = "onboarding_welcome_mail_body"; + public static final String MAIL_NOTE = "mail_note"; + public static final String ONBOARDING_MAIL_MESSAGE = "onboarding_welcome_message"; + public static final String WELCOME_MESSAGE = "welcomeMessage"; + public static final String SET_PW_LINK = "setPasswordLink"; + public static final String WELCOME_SMS_TEMPLATE = "welcomeSmsTemplate"; + public static final String SUNBIRD_DEFAULT_WELCOME_MSG = "sunbird_default_welcome_sms"; + public static final String TELEMETRY_ACTOR_USER_MERGE_ID = "Merge User Courses and Cert"; + public static final String SYSTEM = "system"; + public static final String BE_JOB_REQUEST = "be_job_request"; + public static final String TELEMETRY_EDATA_USER_MERGE_ACTION = "merge-user-courses-and-cert"; + public static final String TELEMETRY_PRODUCER_USER_MERGE_ID = "org.sunbird.platform"; + public static final String TELEMETRY_TARGET_USER_MERGE_TYPE = "MergeUserCoursesAndCert"; + public static final String SUNBIRD_SUBDOMAIN_KEYCLOAK_BASE_URL = "sunbird_subdomain_keycloak_base_url"; + public static final String SYNC = "sync"; + public static final String ES_SYNC_RESPONSE = "esSyncResponse"; + public static final String TEACHER_PERSONA = "teacher"; + public static final String ORG_EXT_ID_DB = "org_external_identity"; + public static final String LOCATION_NAME = "locationName"; + public static final String INACTIVE = "inactive"; + public static final String ACTION_BY = "actionBy"; + public static final String FROM_USER = "fromUser"; + public static final String TO_USER = "toUser"; + public static final String USER_OWNERSHIP_TRANSFER_TOPIC = "user-ownership-transfer-topic"; + public static final String USER_OWNERSHIP_TRANSFER_ACTION = "ownership-transfer"; + public static final String FROM_USER_PROFILE = "fromUserProfile"; + public static final String TO_USER_PROFILE = "toUserProfile"; + public static final String ASSET_INFORMATION = "assetInformation"; + public static final String SUNBIRD_RATE_LIMIT_ENABLED = "sunbird_rate_limit_enabled"; + + public static final String PRIORITY = "priority"; + public static final String ORG_TYPE_BOARD = "board"; + public static final String PROSPECT_CHANNELS = "prospectChannels"; + public static final String PROPERTY_NAME = "name"; + public static final String PROPERTY_VALUE = "value"; + + public static final String TERM_AND_CONDITION_STATUS = "tcStatus"; + public static final String TENANT_PREFERENCE = "tenantPreference"; + public static final String VERSION_3 = "v3"; + public static final String VERSION_4 = "v4"; + public static final String VERSION_5 = "v5"; + public static final String GOOGLE_CAPTCHA_PRIVATE_KEY = "google_captcha_private_key"; + public static final String GOOGLE_CAPTCHA_MOBILE_PRIVATE_KEY = "google_captcha_mobile_private_key"; + public static final String MOBILE_APP = "app"; + public static final String CAPTCHA_RESPONSE = "captchaResponse"; + public static final String ENABLE_CAPTCHA = "enable_captcha"; + public static final String X_Session_ID = "x-session-id"; + public static final String X_APP_VERSION = "x-app-ver"; +// public static final String DEVICE_LOCATION = "deviceLocation"; +// public static final String IP_ADDR = "ip_addr"; +// public static final String USER_AGENT = "user_agent"; +// public static final String PLATFORM = "platform"; +// public static final String TELEMETRY_IMPLICIT = "telemetry_implicit"; +// public static final String CONTEXT_TELEMETRY = "context_telemetry"; + + private JsonKey() {} +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/logging/AuditLog.java b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/AuditLog.java new file mode 100644 index 0000000000..c76463401e --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/AuditLog.java @@ -0,0 +1,145 @@ +package org.sunbird.logging; + +import java.util.Map; + +/** + * Represents an audit log entry for tracking operations within the system. + * Captures details such as the user, operation type, object affected, and timestamp. + */ +public class AuditLog { + + private String requestId; + private String objectId; + private String objectType; + private String operationType; + /** Format: yyyy-MM-dd HH:mm:ss */ + private String date; + private String userId; + private Map logRecord; + + /** + * Gets the unique request identifier. + * + * @return The request ID. + */ + public String getRequestId() { + return requestId; + } + + /** + * Sets the unique request identifier. + * + * @param requestId The request ID to set. + */ + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + /** + * Gets the ID of the object being operated on. + * + * @return The object ID. + */ + public String getObjectId() { + return objectId; + } + + /** + * Sets the ID of the object being operated on. + * + * @param objectId The object ID to set. + */ + public void setObjectId(String objectId) { + this.objectId = objectId; + } + + /** + * Gets the type of the object (e.g., "User", "Course"). + * + * @return The object type. + */ + public String getObjectType() { + return objectType; + } + + /** + * Sets the type of the object. + * + * @param objectType The object type to set. + */ + public void setObjectType(String objectType) { + this.objectType = objectType; + } + + /** + * Gets the type of operation performed (e.g., "Create", "Update"). + * + * @return The operation type. + */ + public String getOperationType() { + return operationType; + } + + /** + * Sets the type of operation performed. + * + * @param operationType The operation type to set. + */ + public void setOperationType(String operationType) { + this.operationType = operationType; + } + + /** + * Gets the timestamp of the operation. + * + * @return The date string. + */ + public String getDate() { + return date; + } + + /** + * Sets the timestamp of the operation. + * + * @param date The date string to set. + */ + public void setDate(String date) { + this.date = date; + } + + /** + * Gets the ID of the user performing the operation. + * + * @return The user ID. + */ + public String getUserId() { + return userId; + } + + /** + * Sets the ID of the user performing the operation. + * + * @param userId The user ID to set. + */ + public void setUserId(String userId) { + this.userId = userId; + } + + /** + * Gets the detailed record of the changes or operation data. + * + * @return A map containing log details. + */ + public Map getLogRecord() { + return logRecord; + } + + /** + * Sets the detailed record of the changes or operation data. + * + * @param logRecord The map of log details to set. + */ + public void setLogRecord(Map logRecord) { + this.logRecord = logRecord; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/logging/CustomLogFormat.java b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/CustomLogFormat.java new file mode 100644 index 0000000000..3c4977037f --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/CustomLogFormat.java @@ -0,0 +1,88 @@ +package org.sunbird.logging; + +import org.sunbird.request.RequestContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * Helper class to format log events in a standardised structure. + * Constructs the event map including metadata, context, and actor information. + */ +public class CustomLogFormat { + private String edataType = "system"; + private String eid = "LOG"; + private String ver = "3.0"; + private Map edata = new HashMap<>(); + private Map eventMap = new HashMap<>(); + + /** + * Constructor to initialize and format the log event. + * + * @param requestContext The request context containing IDs and levels. + * @param msg The log message. + * @param object The object associated with the log (optional). + * @param params Additional parameters (optional). + */ + CustomLogFormat( + RequestContext requestContext, + String msg, + Map object, + Map params) { + if (params != null) { + this.edata.put( + "params", + new ArrayList>() { + { + add(params); + } + }); + } + setEventMap(requestContext, msg); + if (object != null) { + this.eventMap.put("object", object); + } + } + + /** + * Retrieves the formatted event map. + * + * @return The complete event map. + */ + public Map getEventMap() { + return this.eventMap; + } + + /** + * Constructs the event map with all required fields. + * + * @param requestContext The request context. + * @param msg The log message. + */ + public void setEventMap(RequestContext requestContext, String msg) { + this.edata.put("type", edataType); + this.edata.put("requestid", requestContext.getRequestId()); + this.edata.put("message", msg); + this.edata.put("level", requestContext.getLoggerLevel()); + this.eventMap.putAll( + new HashMap() { + { + put("eid", eid); + put("ets", System.currentTimeMillis()); + put("ver", ver); + put("mid", "LOG:" + UUID.randomUUID().toString()); + put("context", requestContext.getContextMap()); + put("actor", + new HashMap() { + { + put("id", requestContext.getActorId()); + put("type", requestContext.getActorType()); + } + }); + put("edata", edata); + } + }); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/logging/EntryExitLogEvent.java b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/EntryExitLogEvent.java new file mode 100644 index 0000000000..3c04b26fa6 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/EntryExitLogEvent.java @@ -0,0 +1,78 @@ +package org.sunbird.logging; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.sunbird.keys.JsonKey; + +/** + * This class represents the log event structure for entry and exit logs. + */ +public class EntryExitLogEvent { + + private String eid; + private Map edata = new HashMap<>(); + + /** + * Gets the event ID. + * + * @return the event ID + */ + public String getEid() { + return eid; + } + + /** + * Sets the event ID. + * + * @param eid the event ID to set + */ + public void setEid(String eid) { + this.eid = eid; + } + + /** + * Gets the event data. + * + * @return the event data map + */ + public Map getEdata() { + return edata; + } + + /** + * Sets the event data details. + * + * @param type the type of the event + * @param level the log level + * @param requestid the request ID + * @param message the log message + * @param params the list of parameters associated with the request + */ + public void setEdata( + String type, + String level, + String requestid, + String message, + List> params) { + this.edata.put(JsonKey.TYPE, type); + this.edata.put(JsonKey.LEVEL, level); + this.edata.put(JsonKey.REQUEST_ID, requestid); + this.edata.put(JsonKey.MESSAGE, message); + this.edata.put(JsonKey.PARAMS, params); + } + + /** + * Sets the parameters in the event data. + * + * @param params the list of parameters to set in edata + */ + public void setEdataParams(List> params) { + this.edata.put(JsonKey.PARAMS, params); + } + + @Override + public String toString() { + return "{" + "eid='" + eid + '\'' + ", edata=" + edata + '}'; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LogEvent.java b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LogEvent.java new file mode 100644 index 0000000000..f18fea45f9 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LogEvent.java @@ -0,0 +1,103 @@ +package org.sunbird.logging; + +import java.util.HashMap; +import java.util.Map; +import org.sunbird.keys.JsonKey; + +/** + * LogEvent class to represent the structure of API request, response, and error logs. + * Used for constructing structured log messages. + */ +public class LogEvent { + + private String eid; + private long ets; + private String mid; + private String ver; + private Map context; + private Map edata; + + public String getEid() { + return eid; + } + + public void setEid(String eid) { + this.eid = eid; + } + + public long getEts() { + return ets; + } + + public void setEts(long ets) { + this.ets = ets; + } + + public String getMid() { + return mid; + } + + public void setMid(String mid) { + this.mid = mid; + } + + public String getVer() { + return ver; + } + + public void setVer(String ver) { + this.ver = ver; + } + + public Map getContext() { + return context; + } + + public void setContext(Map context) { + this.context = context; + } + + public Map getEdata() { + return edata; + } + + public void setEdata(Map eks) { + this.edata = new HashMap(); + edata.put(JsonKey.EKS, eks); + } + + public void setContext(String id, String ver) { + this.context = new HashMap(); + Map pdata = new HashMap(); + pdata.put(JsonKey.ID, id); + pdata.put(JsonKey.VER, ver); + this.context.put(JsonKey.PDATA, pdata); + } + + /** + * Sets the error data for the log event. + * + * @param level Log level (e.g., INFO, ERROR). + * @param className The name of the class where the event occurred. + * @param method The method name where the event occurred. + * @param data Additional data related to the event. + * @param stackTrace Stack trace if an exception occurred. + * @param exception The exception object. + */ + public void setEdata( + String level, + String className, + String method, + Object data, + Object stackTrace, + Object exception) { + this.edata = new HashMap(); + Map eks = new HashMap(); + eks.put(JsonKey.LEVEL, level); + eks.put(JsonKey.CLASS, className); + eks.put(JsonKey.METHOD, method); + eks.put(JsonKey.DATA, data); + eks.put(JsonKey.STACKTRACE, stackTrace); + edata.put(JsonKey.EKS, eks); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerEnum.java b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerEnum.java new file mode 100644 index 0000000000..1986021d76 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerEnum.java @@ -0,0 +1,20 @@ +package org.sunbird.logging; + +/** + * Enum representing the various logging levels supported by the application. + * content: + * - INFO + * - WARN + * - DEBUG + * - ERROR + * - BE_LOG (Backend Log) + * - PERF_LOG (Performance Log) + */ +public enum LoggerEnum { + INFO, + WARN, + DEBUG, + ERROR, + BE_LOG, + PERF_LOG; +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java new file mode 100644 index 0000000000..b00c996838 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/LoggerUtil.java @@ -0,0 +1,326 @@ +package org.sunbird.logging; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.request.Request; +import org.sunbird.request.RequestContext; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.telemetry.util.TelemetryEvents; +import org.sunbird.telemetry.util.TelemetryWriter; + +import java.util.Map; + +/** + * Utility class for structured logging using SLF4J and Jackson. + * Provides methods for logging info, debug, error, and warn messages with context and telemetry support. + */ +public class LoggerUtil { + + private Logger logger; + private String infoLevel = "INFO"; + private String debugLevel = "DEBUG"; + private String errorLevel = "ERROR"; + private String warnLevel = "WARN"; + private Logger defaultLogger; + private final ObjectMapper mapper = new ObjectMapper(); + + /** + * Constructor to initialize LoggerUtil for a specific class. + * + * @param c The class for which the logger is created. + */ + public LoggerUtil(Class c) { + logger = LoggerFactory.getLogger(c); + defaultLogger = LoggerFactory.getLogger("defaultLogger"); + } + + /** + * Logs an INFO message with structured data and request context. + * + * @param requestContext The request context containing tracing information. + * @param message The message to log. + * @param object Additional object data to log. + * @param param Additional parameters to log. + */ + public void info( + RequestContext requestContext, + String message, + Map object, + Map param) { + if (requestContext != null) { + requestContext.setLoggerLevel(infoLevel); + logger.info(jsonMapper(requestContext, message, object, param)); + } else { + defaultLogger.info(message); + } + } + + /** + * Logs an INFO message with request context. + * + * @param requestContext The request context. + * @param message The message to log. + */ + public void info(RequestContext requestContext, String message) { + info(requestContext, message, null, null); + } + + /** + * Logs a simple INFO message without context. + * + * @param message The message to log. + */ + public void info(String message) { + info(null, message, null, null); + } + + /** + * Logs a DEBUG message with structured data if debug is enabled. + * + * @param requestContext The request context. + * @param message The message to log. + * @param object Additional object data. + * @param param Additional parameters. + */ + public void debug( + RequestContext requestContext, + String message, + Map object, + Map param) { + if (isDebugEnabled(requestContext)) { + requestContext.setLoggerLevel(debugLevel); + logger.info(jsonMapper(requestContext, message, object, param)); + } else { + defaultLogger.debug(message); + } + } + + /** + * Logs a DEBUG message with request context. + * + * @param requestContext The request context. + * @param message The message to log. + */ + public void debug(RequestContext requestContext, String message) { + debug(requestContext, message, null, null); + } + + /** + * Logs a simple DEBUG message. + * + * @param message The message to log. + */ + public void debug(String message) { + debug(null, message, null, null); + } + + /** + * Logs an ERROR message with exception details and optional telemetry. + * + * @param requestContext The request context. + * @param message The error message. + * @param object Additional object data. + * @param param Additional parameters. + * @param e The exception/throwable. + */ + public void error( + RequestContext requestContext, + String message, + Map object, + Map param, + Throwable e) { + if (requestContext != null) { + requestContext.setLoggerLevel(errorLevel); + logger.error(jsonMapper(requestContext, message, object, param), e); + } else { + defaultLogger.error(message, e); + } + } + + /** + * Logs an ERROR message with context, telemetry info, and exception. + * + * @param requestContext The request context. + * @param message The error message. + * @param object Additional object data. + * @param param Additional parameters. + * @param e The exception. + * @param telemetryInfo Telemetry information map. + */ + public void error( + RequestContext requestContext, + String message, + Map object, + Map param, + Throwable e, + Map telemetryInfo) { + if (requestContext != null) { + requestContext.setLoggerLevel(errorLevel); + logger.error(jsonMapper(requestContext, message, object, param), e); + } else { + defaultLogger.error(message, e); + } + telemetryProcess(requestContext, telemetryInfo, e); + } + + /** + * Logs an ERROR message with context and exception. + * + * @param requestContext The request context. + * @param message The error message. + * @param e The exception. + */ + public void error(RequestContext requestContext, String message, Throwable e) { + error(requestContext, message, null, null, e); + } + + /** + * Logs a simple ERROR message with exception. + * + * @param message The error message. + * @param e The exception. + */ + public void error(String message, Throwable e) { + error(null, message, null, null, e); + } + + /** + * Logs an ERROR message with context, exception, and telemetry info. + * + * @param requestContext The request context. + * @param message The error message. + * @param e The exception. + * @param telemetryInfo Telemetry data. + */ + public void error( + RequestContext requestContext, String message, Throwable e, Map telemetryInfo) { + error(requestContext, message, null, null, e, telemetryInfo); + } + + /** + * Logs a WARN message with structured data. + * + * @param requestContext The request context. + * @param message The warning message. + * @param object Additional object data. + * @param param Additional parameters. + * @param e The exception (if any). + */ + public void warn( + RequestContext requestContext, + String message, + Map object, + Map param, + Throwable e) { + if (requestContext != null) { + requestContext.setLoggerLevel(warnLevel); + logger.warn((jsonMapper(requestContext, message, object, param)), e); + } else { + defaultLogger.warn(message, e); + } + } + + /** + * Logs a WARN message with context and exception. + * + * @param requestContext The request context. + * @param message The warning message. + * @param e The exception. + */ + public void warn(RequestContext requestContext, String message, Throwable e) { + warn(requestContext, message, null, null, e); + } + + /** + * Logs a simple WARN message with exception. + * + * @param message The warning message. + * @param e The exception. + */ + public void warn(String message, Throwable e) { + warn(null, message, null, null, e); + } + + /** + * Checks if debug logging is enabled for the current request. + * + * @param requestContext The request context. + * @return True if debug is enabled, false otherwise. + */ + private static boolean isDebugEnabled(RequestContext requestContext) { + return (null != requestContext + && StringUtils.equalsIgnoreCase("true", requestContext.getDebugEnabled())); + } + + /** + * Processes telemetry for error events. + * + * @param requestContext The request context. + * @param telemetryInfo The telemetry info map. + * @param e The exception causing the error. + */ + private void telemetryProcess( + RequestContext requestContext, Map telemetryInfo, Throwable e) { + ProjectCommonException projectCommonException = null; + if (e instanceof ProjectCommonException) { + projectCommonException = (ProjectCommonException) e; + } else { + projectCommonException = + new ProjectCommonException( + ResponseCode.internalError.getErrorCode(), + ResponseCode.internalError.getErrorMessage(), + ResponseCode.SERVER_ERROR.getResponseCode()); + } + Request request = new Request(requestContext); + telemetryInfo.put(JsonKey.TELEMETRY_EVENT_TYPE, TelemetryEvents.ERROR.getName()); + + Map params = (Map) telemetryInfo.get(JsonKey.PARAMS); + params.put(JsonKey.ERROR, projectCommonException.getCode()); + params.put(JsonKey.STACKTRACE, generateStackTrace(e.getStackTrace())); + request.setRequest(telemetryInfo); + // lmaxWriter.submitMessage(request); + TelemetryWriter.write(request); + } + + /** + * Generates a string representation of the stack trace. + * + * @param elements Stack trace elements. + * @return The stack trace as a string. + */ + private String generateStackTrace(StackTraceElement[] elements) { + StringBuilder builder = new StringBuilder(""); + for (StackTraceElement element : elements) { + builder.append(element.toString()); + } + return builder.toString(); + } + + /** + * Converts log data into a JSON string using CustomLogFormat. + * + * @param requestContext The request context. + * @param message The log message. + * @param object Additional object data. + * @param param Additional parameters. + * @return JSON string of the log event. + */ + private String jsonMapper( + RequestContext requestContext, + String message, + Map object, + Map param) { + try { + return mapper.writeValueAsString( + new CustomLogFormat(requestContext, message, object, param).getEventMap()); + } catch (JsonProcessingException e) { + error(requestContext, e.getMessage(), e); + } + return ""; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/logging/ProjectLogger.java b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/ProjectLogger.java new file mode 100644 index 0000000000..e612d1308b --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/logging/ProjectLogger.java @@ -0,0 +1,247 @@ +package org.sunbird.logging; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import net.logstash.logback.argument.StructuredArguments; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sunbird.request.Request; +import org.sunbird.request.RequestContext; +import org.sunbird.response.ResponseCode; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.keys.JsonKey; +import org.sunbird.telemetry.util.TelemetryEvents; +import org.sunbird.telemetry.util.TelemetryWriter; + +/** + * Legacy logger class for project-level logging provided for backward compatibility. + * + * @deprecated Use {@link LoggerUtil} for all logging operations. This class will be removed in future versions. + */ +@Deprecated +public class ProjectLogger { + + private static String eVersion = "1.0"; + private static String pVersion = "1.0"; + private static String dataId = "Sunbird"; + private static ObjectMapper mapper = new ObjectMapper(); + private static Logger rootLogger = LoggerFactory.getLogger("defaultLogger"); + private static Logger queryLogger = LoggerFactory.getLogger("queryLogger"); + + private ProjectLogger() {} + + /** + * Logs a message with default log level (DEBUG). + * + * @param message Text message to be logged. + */ + public static void log(String message) { + log(message, null, LoggerEnum.DEBUG.name()); + } + + /** + * Logs an exception message. + * + * @param message The message. + * @param e The exception. + */ + public static void log(String message, Throwable e) { + log(message, null, e); + } + + /** + * Logs a message with exception and telemetry information. + * + * @param message The message. + * @param e The exception. + * @param telemetryInfo Telemetry data. + */ + public static void log(String message, Throwable e, Map telemetryInfo) { + log(message, null, e); + telemetryProcess(telemetryInfo, e); + } + + private static void telemetryProcess(Map telemetryInfo, Throwable e) { + ProjectCommonException projectCommonException = null; + if (e instanceof ProjectCommonException) { + projectCommonException = (ProjectCommonException) e; + } else { + projectCommonException = + new ProjectCommonException( + ResponseCode.internalError.getErrorCode(), + ResponseCode.internalError.getErrorMessage(), + ResponseCode.SERVER_ERROR.getResponseCode()); + } + Request request = new Request(); + telemetryInfo.put(JsonKey.TELEMETRY_EVENT_TYPE, TelemetryEvents.ERROR.getName()); + + Map params = (Map) telemetryInfo.get(JsonKey.PARAMS); + params.put(JsonKey.ERROR, projectCommonException.getCode()); + params.put(JsonKey.STACKTRACE, generateStackTrace(e.getStackTrace())); + request.setRequest(telemetryInfo); + TelemetryWriter.write(request); + } + + private static String generateStackTrace(StackTraceElement[] elements) { + StringBuilder builder = new StringBuilder(""); + for (StackTraceElement element : elements) { + builder.append(element.toString()); + } + return builder.toString(); + } + + public static void log(String message, String logLevel) { + log(message, null, logLevel); + } + + /** + * Logs a message with a specific LoggerEnum level. + * + * @param message The message. + * @param logEnum The log level. + */ + public static void log(String message, LoggerEnum logEnum) { + info(message, null, logEnum); + } + + /** + * Logs message and data with a specific string log level. + * + * @param message The message. + * @param data The data object. + * @param logLevel The log level string. + */ + public static void log(String message, Object data, String logLevel) { + backendLog(message, data, null, logLevel); + } + + /** + * Logs message, data, and exception. + * + * @param message The message. + * @param data The data object. + * @param e The exception. + */ + public static void log(String message, Object data, Throwable e) { + backendLog(message, data, e, LoggerEnum.ERROR.name()); + } + + /** + * Logs message, data, exception with a specific log level. + * + * @param message The message. + * @param data The data object. + * @param e The exception. + * @param logLevel The log level. + */ + public static void log(String message, Object data, Throwable e, String logLevel) { + backendLog(message, data, e, logLevel); + } + + private static void info(String message, Object data) { + rootLogger.info(getBELogEvent(LoggerEnum.INFO.name(), message, data)); + } + + private static void info(String message, Object data, LoggerEnum loggerEnum) { + rootLogger.info(getBELogEvent(LoggerEnum.INFO.name(), message, data, loggerEnum)); + } + + private static void debug(String message, Object data) { + rootLogger.debug(getBELogEvent(LoggerEnum.DEBUG.name(), message, data)); + } + + private static void error(String message, Object data, Throwable exception) { + rootLogger.error(getBELogEvent(LoggerEnum.ERROR.name(), message, data, exception)); + } + + private static void warn(String message, Object data, Throwable exception) { + rootLogger.warn(getBELogEvent(LoggerEnum.WARN.name(), message, data, exception)); + } + + private static void backendLog(String message, Object data, Throwable e, String logLevel) { + if (!StringUtils.isBlank(logLevel)) { + switch (logLevel) { + case "INFO": + info(message, data); + break; + case "DEBUG": + debug(message, data); + break; + case "WARN": + warn(message, data, e); + break; + case "ERROR": + error(message, data, e); + break; + default: + debug(message, data); + break; + } + } + } + + private static String getBELogEvent( + String logLevel, String message, Object data, LoggerEnum logEnum) { + return getBELog(logLevel, message, data, null, logEnum); + } + + private static String getBELogEvent(String logLevel, String message, Object data) { + return getBELog(logLevel, message, data, null, null); + } + + private static String getBELogEvent(String logLevel, String message, Object data, Throwable e) { + return getBELog(logLevel, message, data, e, null); + } + + private static String getBELog( + String logLevel, String message, Object data, Throwable exception, LoggerEnum logEnum) { + String mid = dataId + "." + System.currentTimeMillis() + "." + UUID.randomUUID(); + long unixTime = System.currentTimeMillis(); + LogEvent te = new LogEvent(); + Map eks = new HashMap<>(); + eks.put(JsonKey.LEVEL, logLevel); + eks.put(JsonKey.MESSAGE, message); + + if (null != data) { + eks.put(JsonKey.DATA, data); + } + if (null != exception) { + eks.put(JsonKey.STACKTRACE, ExceptionUtils.getStackTrace(exception)); + } + if (logEnum != null) { + te.setEid(logEnum.name()); + } else { + te.setEid(LoggerEnum.BE_LOG.name()); + } + te.setEts(unixTime); + te.setMid(mid); + te.setVer(eVersion); + te.setContext(dataId, pVersion); + String jsonMessage = null; + try { + te.setEdata(eks); + jsonMessage = mapper.writeValueAsString(te); + } catch (Exception e) { + // Avoid recursive calls to ProjectLogger.log if exception happens here + rootLogger.error(e.getMessage(), e); + } + return jsonMessage; + } + + public static void logQuery(String query, RequestContext requestContext) { + if (isDebugEnabled(requestContext)) { + queryLogger.debug(query, StructuredArguments.entries(requestContext.getContextMap())); + } else { + queryLogger.debug(query); + } + } + + private static boolean isDebugEnabled(RequestContext requestContext) { + return (null != requestContext + && StringUtils.equalsIgnoreCase("true", requestContext.getDebugEnabled())); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java new file mode 100644 index 0000000000..6866e53d20 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/mail/GMailAuthenticator.java @@ -0,0 +1,35 @@ +package org.sunbird.mail; + +import javax.mail.Authenticator; +import javax.mail.PasswordAuthentication; + +/** + * Validator class for Gmail authentication. Extends javax.mail.Authenticator to provide password + * authentication. + */ +public class GMailAuthenticator extends Authenticator { + private String user; + private String pw; + + /** + * Constructor to initialize the authenticator with username and password. + * + * @param username The username for authentication. + * @param password The password for authentication. + */ + public GMailAuthenticator(String username, String password) { + super(); + this.user = username; + this.pw = password; + } + + /** + * Returns the PasswordAuthentication object containing the username and password. + * + * @return PasswordAuthentication object. + */ + @Override + public PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(this.user, this.pw); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendEmail.java b/core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendEmail.java new file mode 100644 index 0000000000..f95825ad5f --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendEmail.java @@ -0,0 +1,68 @@ +package org.sunbird.mail; + +import java.io.StringWriter; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import org.apache.velocity.VelocityContext; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; + +/** + * Utility class for sending emails using JavaMail API. + * Supports sending simple HTML emails with Velocity template context. + */ +public class SendEmail { + + public LoggerUtil logger = new LoggerUtil(SendEmail.class); + private static final String fromEmail = System.getenv(JsonKey.EMAIL_SERVER_FROM); + + /** + * Sends an email to the specified recipients. + * + * @param emailList List of recipient email addresses. + * @param subject Subject of the email. + * @param context Velocity context for template rendering (optional). + * @param writer StringWriter containing the email content. + * @param session JavaMail Session object. + * @param transport JavaMail Transport object. + * @return true if the email was sent successfully, false otherwise. + */ + public boolean send( + String[] emailList, + String subject, + VelocityContext context, + StringWriter writer, + Session session, + Transport transport) { + boolean sentStatus = true; + try { + if (context != null) { + context.put(JsonKey.FROM_EMAIL, fromEmail); + } + MimeMessage message = new MimeMessage(session); + message.setFrom(new InternetAddress(fromEmail)); + Message.RecipientType recipientType; + if (emailList.length > 1) { + recipientType = Message.RecipientType.BCC; + } else { + recipientType = Message.RecipientType.TO; + } + for (String email : emailList) { + message.addRecipient(recipientType, new InternetAddress(email)); + } + if (recipientType == Message.RecipientType.BCC) { + message.addRecipient(Message.RecipientType.TO, new InternetAddress(fromEmail)); + } + message.setSubject(subject); + message.setContent(writer.toString(), "text/html; charset=utf-8"); + transport.sendMessage(message, message.getAllRecipients()); + } catch (Exception e) { + sentStatus = false; + logger.error("SendEmail:send: Exception occurred while sending email: " + e.getMessage(), e); + } + return sentStatus; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java b/core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java new file mode 100644 index 0000000000..c8b0efe297 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/mail/SendgridConnection.java @@ -0,0 +1,104 @@ +package org.sunbird.mail; + +import java.util.Properties; +import javax.mail.Session; +import javax.mail.Transport; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; +import org.sunbird.common.PropertiesCache; + +/** + * Manages the connection to the Sendgrid (or SMTP) email server. + * Handles configuration retrieval from environment variables or properties file + * and creates the JavaMail Session and Transport objects. + */ +public class SendgridConnection { + + public final LoggerUtil logger = new LoggerUtil(SendgridConnection.class); + + private Properties props = null; + private String host; + private String port; + private String userName; + private String password; + private String fromEmail; + private Session session; + private Transport transport; + + /** + * Creates and connects a Transport object for sending emails. + * Retrieves configuration from environment variables first, falling back to properties file if missing. + * + * @param context The request context for logging. + * @return The connected Transport object, or null if connection fails. + */ + public Transport createConnection(RequestContext context) { + try { + host = System.getenv(JsonKey.EMAIL_SERVER_HOST); + port = System.getenv(JsonKey.EMAIL_SERVER_PORT); + userName = System.getenv(JsonKey.EMAIL_SERVER_USERNAME); + password = System.getenv(JsonKey.EMAIL_SERVER_PASSWORD); + fromEmail = System.getenv(JsonKey.EMAIL_SERVER_FROM); + + if (StringUtils.isBlank(host) + || StringUtils.isBlank(port) + || StringUtils.isBlank(userName) + || StringUtils.isBlank(password) + || StringUtils.isBlank(fromEmail)) { + logger.info( + context, + "SendgridConnection:createConnection: Email settings not found in environment variables. Host: " + + host + + " Port: " + + port + + " FromEmail: " + + fromEmail + + ". Falling back to properties file."); + initialiseFromProperty(); + } + + props = System.getProperties(); + props.put("mail.smtp.host", host); + props.put("mail.smtp.socketFactory.port", port); + props.put("mail.smtp.auth", "true"); + props.put("mail.smtp.port", port); + + session = Session.getInstance(props, new GMailAuthenticator(userName, password)); + transport = session.getTransport("smtp"); + transport.connect(host, userName, password); + return transport; + } catch (Exception e) { + logger.error( + context, + "SendgridConnection:createConnection: Exception occurred while creating SMTP session and transport connection: " + + e.getMessage(), + e); + } + return null; + } + + public Session getSession() { + return session; + } + + public void setSession(Session session) { + this.session = session; + } + + public Transport getTransport() { + return transport; + } + + /** + * Initializes email configuration from the properties cache. + */ + public void initialiseFromProperty() { + host = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_HOST); + port = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_PORT); + userName = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_USERNAME); + password = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_PASSWORD); + fromEmail = PropertiesCache.getInstance().getProperty(JsonKey.EMAIL_SERVER_FROM); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/ActorOperations.java b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/ActorOperations.java new file mode 100644 index 0000000000..df97b4aef6 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/ActorOperations.java @@ -0,0 +1,196 @@ +package org.sunbird.operations.lms; + +/** + * Enum containing various operations performed by actors in the LMS system. + * These operations cover courses, users, organisations, pages, and system settings. + */ +public enum ActorOperations { + ENROLL_COURSE("enrollCourse"), + UNENROLL_COURSE("unenrollCourse"), + GET_COURSE("getCourse"), + ADD_CONTENT("addContent"), + GET_CONTENT("getContent"), + CREATE_COURSE("createCourse"), + UPDATE_COURSE("updateCourse"), + PUBLISH_COURSE("publishCourse"), + SEARCH_COURSE("searchCourse"), + DELETE_COURSE("deleteCourse"), + CREATE_USER("createUser"), + UPDATE_USER("updateUser"), + USER_AUTH("userAuth"), + GET_USER_PROFILE("getUserProfile"), + GET_USER_PROFILE_V2("getUserProfileV2"), + CREATE_ORG("createOrg"), + UPDATE_ORG("updateOrg"), + UPDATE_ORG_STATUS("updateOrgStatus"), + GET_ORG_DETAILS("getOrgDetails"), + CREATE_PAGE("createPage"), + UPDATE_PAGE("updatePage"), + DELETE_PAGE("deletePage"), + GET_PAGE_SETTINGS("getPageSettings"), + GET_PAGE_SETTING("getPageSetting"), + GET_PAGE_DATA("getPageData"), + GET_DIAL_PAGE_DATA("getDialPageData"), + CREATE_SECTION("createSection"), + UPDATE_SECTION("updateSection"), + GET_ALL_SECTION("getAllSection"), + GET_SECTION("getSection"), + GET_COURSE_BY_ID("getCourseById"), + UPDATE_USER_COUNT("updateUserCount"), + GET_RECOMMENDED_COURSES("getRecommendedCourses"), + UPDATE_USER_INFO_ELASTIC("updateUserInfoToElastic"), + GET_ROLES("getRoles"), + APPROVE_ORGANISATION("approveOrganisation"), + ADD_MEMBER_ORGANISATION("addMemberOrganisation"), + REMOVE_MEMBER_ORGANISATION("removeMemberOrganisation"), + COMPOSITE_SEARCH("compositeSearch"), + GET_USER_DETAILS_BY_LOGINID("getUserDetailsByLoginId"), + GET_USER_BY_KEY("getUserByKey"), + UPDATE_ORG_INFO_ELASTIC("updateOrgInfoToElastic"), + INSERT_ORG_INFO_ELASTIC("insertOrgInfoToElastic"), + DOWNLOAD_ORGS("downlaodOrg"), + BLOCK_USER("blockUser"), + DELETE_BY_IDENTIFIER("deleteByIdentifier"), + BULK_UPLOAD("bulkUpload"), + PROCESS_BULK_UPLOAD("processBulkUpload"), + ASSIGN_ROLES("assignRoles"), + UNBLOCK_USER("unblockUser"), + CREATE_BATCH("createBatch"), + UPDATE_BATCH("updateBatch"), + REMOVE_BATCH("removeBatch"), + ADD_USER_TO_BATCH("addUserBatch"), + REMOVE_USER_FROM_BATCH("removeUserFromBatch"), + GET_BATCH("getBatch"), + INSERT_COURSE_BATCH_ES("insertCourseBatchToEs"), + UPDATE_COURSE_BATCH_ES("updateCourseBatchToEs"), + GET_BULK_OP_STATUS("getBulkOpStatus"), + GET_BULK_UPLOAD_STATUS_DOWNLOAD_LINK("getBulkUploadStatusDownloadLink"), + ORG_CREATION_METRICS("orgCreationMetrics"), + ORG_CONSUMPTION_METRICS("orgConsumptionMetrics"), + ORG_CREATION_METRICS_DATA("orgCreationMetricsData"), + ORG_CONSUMPTION_METRICS_DATA("orgConsumptionMetricsData"), + COURSE_PROGRESS_METRICS("courseProgressMetrics"), + COURSE_PROGRESS_METRICS_V2("courseProgressMetricsV2"), + USER_CREATION_METRICS("userCreationMetrics"), + USER_CONSUMPTION_METRICS("userConsumptionMetrics"), + GET_COURSE_BATCH_DETAIL("getCourseBatchDetail"), + UPDATE_USER_ORG_ES("updateUserOrgES"), + REMOVE_USER_ORG_ES("removeUserOrgES"), + UPDATE_USER_ROLES_ES("updateUserRoles"), + SYNC("sync"), + BACKGROUND_SYNC("backgroundSync"), + INSERT_USR_COURSES_INFO_ELASTIC("insertUserCoursesInfoToElastic"), + UPDATE_USR_COURSES_INFO_ELASTIC("updateUserCoursesInfoToElastic"), + SCHEDULE_BULK_UPLOAD("scheduleBulkUpload"), + COURSE_PROGRESS_METRICS_REPORT("courseProgressMetricsReport"), + COURSE_CREATION_METRICS_REPORT("courseConsumptionMetricsReport"), + ORG_CREATION_METRICS_REPORT("orgCreationMetricsReport"), + ORG_CONSUMPTION_METRICS_REPORT("orgConsumptionMetricsReport"), + EMAIL_SERVICE("emailService"), + FILE_STORAGE_SERVICE("fileStorageService"), + FILE_GENERATION_AND_UPLOAD("fileGenerationAndUpload"), + HEALTH_CHECK("healthCheck"), + SEND_MAIL("sendMail"), + PROCESS_DATA("processData"), + ACTOR("actor"), + CASSANDRA("cassandra"), + ES("es"), + EKSTEP("ekstep"), + GET_ORG_TYPE_LIST("getOrgTypeList"), + CREATE_ORG_TYPE("createOrgType"), + UPDATE_ORG_TYPE("updateOrgType"), + CREATE_NOTE("createNote"), + UPDATE_NOTE("updateNote"), + SEARCH_NOTE("searchNote"), + GET_NOTE("getNote"), + DELETE_NOTE("deleteNote"), + INSERT_USER_NOTES_ES("insertUserNotesToElastic"), + ENCRYPT_USER_DATA("encryptUserData"), + DECRYPT_USER_DATA("decryptUserData"), + UPDATE_USER_NOTES_ES("updateUserNotesToElastic"), + USER_CURRENT_LOGIN("userCurrentLogin"), + GET_MEDIA_TYPES("getMediaTypes"), + ADD_SKILL("addSkill"), + GET_SKILL("getSkill"), + UPDATE_SKILL("updateSkill"), + GET_SKILLS_LIST("getSkillsList"), + ADD_USER_SKILL_ENDORSEMENT("addUserSkillEndorsement"), + PROFILE_VISIBILITY("profileVisibility"), + CREATE_TENANT_PREFERENCE("createTanentPreference"), + UPDATE_TENANT_PREFERENCE("updateTenantPreference"), + GET_TENANT_PREFERENCE("getTenantPreference"), + REGISTER_CLIENT("registerClient"), + UPDATE_CLIENT_KEY("updateClientKey"), + GET_CLIENT_KEY("getClientKey"), + CREATE_GEO_LOCATION("createGeoLocation"), + GET_GEO_LOCATION("getGeoLocation"), + UPDATE_GEO_LOCATION("updateGeoLocation"), + DELETE_GEO_LOCATION("deleteGeoLocation"), + GET_USER_COUNT("getUserCount"), + UPDATE_USER_COUNT_TO_LOCATIONID("updateUserCountToLocationID"), + SEND_NOTIFICATION("sendNotification"), + SYNC_KEYCLOAK("syncKeycloak"), + UPDATE_SYSTEM_SETTINGS("updateSystemSettings"), + CREATE_DATA("createData"), + UPDATE_DATA("updateData"), + DELETE_DATA("deleteData"), + READ_DATA("readData"), + READ_ALL_DATA("readAllData"), + SEARCH_DATA("searchData"), + GET_METRICS("getMetrics"), + REG_CHANNEL("channelReg"), + UPDATE_LEARNER_STATE("updateLearnerState"), + GET_SYSTEM_SETTING("getSystemSetting"), + GET_ALL_SYSTEM_SETTINGS("getAllSystemSettings"), + SET_SYSTEM_SETTING("setSystemSetting"), + COURSE_BATCH_NOTIFICATION("courseBatchNotification"), + USER_TNC_ACCEPT("userTnCAccept"), + GENERATE_OTP("generateOTP"), + BACKGROUND_ENCRYPTION("backgroundEncryption"), + BACKGROUND_DECRYPTION("backgroundDecryption"), + VERIFY_OTP("verifyOTP"), + SEND_OTP("sendOTP"), + GET_USER_TYPES("getUserTypes"), + CLEAR_CACHE("clearCache"), + USER_TENANT_MIGRATE("userTenantMigrate"), + GET_PARTICIPANTS("getParticipants"), + GET_USER_COURSE("getUserCourse"), + FREEUP_USER_IDENTITY("freeUpUserIdentity"), + RESET_PASSWORD("resetPassword"), + MERGE_USER("mergeUser"), + MERGE_USER_TO_ELASTIC("mergeUserToElastic"), + VALIDATE_CERTIFICATE("validateCertificate"), + ADD_CERTIFICATE("addCertificate"), + ASSIGN_KEYS("assignKeys"), + DOWNLOAD_QR_CODES("downloadQRCodes"), + GET_SIGN_URL("getSignUrl"), + MERGE_USER_CERTIFICATE("mergeUserCertificate"), + MIGRATE_USER("migrateUser"), + REJECT_MIGRATION("rejectMigration"), + GET_USER_FEED_BY_ID("getUserFeedById"), + CREATE_USER_V3("createUserV3"), + ONDEMAND_START_SCHEDULER("onDemandStartScheduler"), + GROUP_ACTIVITY_AGGREGATES("groupActivityAggregates"), + SUBMIT_JOB_REQUEST("submitJobRequest"), + LIST_JOB_REQUEST("listJobRequest"); + + private final String value; + + /** + * Constructor for ActorOperations. + * + * @param value The string value associated with the operation. + */ + ActorOperations(String value) { + this.value = value; + } + + /** + * Retrieves the string value of the operation. + * + * @return The operation value string. + */ + public String getValue() { + return this.value; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/BulkUploadActorOperation.java b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/BulkUploadActorOperation.java new file mode 100644 index 0000000000..1b1699b0b2 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/BulkUploadActorOperation.java @@ -0,0 +1,37 @@ +package org.sunbird.operations.lms; + +/** + * Enum representing various bulk upload operations within the LMS. + * Includes operations for locations, organizations, and users. + */ +public enum BulkUploadActorOperation { + LOCATION_BULK_UPLOAD("locationBulkUpload"), + LOCATION_BULK_UPLOAD_BACKGROUND_JOB("locationBulkUploadBackground"), + + ORG_BULK_UPLOAD("orgBulkUpload"), + ORG_BULK_UPLOAD_BACKGROUND_JOB("orgBulkUploadBackground"), + + USER_BULK_UPLOAD("userBulkUpload"), + USER_BULK_UPLOAD_BACKGROUND_JOB("userBulkUploadBackground"), + USER_BULK_MIGRATION("userBulkMigration"); + + private final String value; + + /** + * Constructor for BulkUploadActorOperation. + * + * @param value The string value associated with the operation. + */ + BulkUploadActorOperation(String value) { + this.value = value; + } + + /** + * Retrieves the string value of the operation. + * + * @return The operation value string. + */ + public String getValue() { + return this.value; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/LocationActorOperation.java b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/LocationActorOperation.java new file mode 100644 index 0000000000..cd7f6097ad --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/lms/LocationActorOperation.java @@ -0,0 +1,35 @@ +package org.sunbird.operations.lms; + +/** + * Enum representing various operations related to locations within the system. + */ +public enum LocationActorOperation { + CREATE_LOCATION("createLocation"), + UPDATE_LOCATION("updateLocation"), + SEARCH_LOCATION("searchLocation"), + DELETE_LOCATION("deleteLocation"), + GET_RELATED_LOCATION_IDS("getRelatedLocationIds"), + READ_LOCATION_TYPE("readLocationType"), + UPSERT_LOCATION_TO_ES("upsertLocationDataToES"), + DELETE_LOCATION_FROM_ES("deleteLocationDataFromES"); + + private final String value; + + /** + * Constructor for LocationActorOperation. + * + * @param value The string value associated with the operation. + */ + LocationActorOperation(String value) { + this.value = value; + } + + /** + * Retrieves the string value of the operation. + * + * @return The operation value string. + */ + public String getValue() { + return this.value; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/operations/userorg/ActorOperations.java b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/userorg/ActorOperations.java new file mode 100644 index 0000000000..cba00581d9 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/operations/userorg/ActorOperations.java @@ -0,0 +1,195 @@ +package org.sunbird.operations.userorg; + +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; + +/** + * Enum defining various actor operations for User and Organization services. + * Each operation consists of a string value (used in request/event processing) + * and an operation code (used for auditing/tracking). + */ +public enum ActorOperations { + CREATE_USER("createUser", "USRCRT"), + CREATE_SSO_USER("createSSOUser", "USRCRT"), + + UPDATE_USER("updateUser", "USRUPD"), + UPDATE_USER_V2("updateUserV2", "USRUPD"), + UPDATE_USER_V3("updateUserV3", "USRUPD"), + + GET_USER_PROFILE_V3("getUserProfileV3", "USRRED"), + GET_USER_PROFILE_V4("getUserProfileV4", "USRRED"), + GET_USER_PROFILE_V5("getUserProfileV5", "USRRED"), + + UPDATE_USER_INFO_ELASTIC("updateUserInfoToElastic", "UBKGUPD"), + + GET_ROLES("getRoles", "ROLERED"), + + GET_USER_DETAILS_BY_LOGINID("getUserDetailsByLoginId", "USRRED"), + GET_USER_BY_KEY("getUserByKey", "USRRED"), + BLOCK_USER("blockUser", "USRBLOK"), + BULK_UPLOAD("bulkUpload", "BLKUPLD"), + PROCESS_BULK_UPLOAD("processBulkUpload", "BLKUPLD"), + ASSIGN_ROLES("assignRoles", "ROLUPD"), + ASSIGN_ROLES_V2("assignRolesV2", "ROLUPD"), + UNBLOCK_USER("unblockUser", "USRUNBLOK"), + + UPDATE_USER_ORG_ES("updateUserOrgES", "UOBKGUPD"), + UPDATE_USER_ROLES_ES("updateUserRoles", "UBKGROLUPD"), + SYNC("sync", "ESSYNC"), + BACKGROUND_SYNC("backgroundSync", "BKGESSYNC"), + EMAIL_SERVICE("emailService", "EMAILNOTI"), + FILE_STORAGE_SERVICE("fileStorageService", "STRGSER"), + HEALTH_CHECK("healthCheck", "HLTHCHK"), + SEND_MAIL("sendMail", "NOTI"), + ACTOR("actor", "HLTHCHK"), + CASSANDRA("cassandra", "HLTHCHK"), + ES("es", "HLTHCHK"), + EKSTEP("ekstep", "HLTHCHK"), + + CREATE_NOTE("createNote", "NOTECRT"), + UPDATE_NOTE("updateNote", "NOTEUPD"), + SEARCH_NOTE("searchNote", "NOTESER"), + GET_NOTE("getNote", "NOTERED"), + DELETE_NOTE("deleteNote", "NOTEDEL"), + + INSERT_USER_NOTES_ES("insertUserNotesToElastic", "NBKGCRT"), + UPDATE_USER_NOTES_ES("updateUserNotesToElastic", "NBKGUPD"), + + CREATE_TENANT_PREFERENCE("createTenantPreference", "TPREFCRT"), + UPDATE_TENANT_PREFERENCE("updateTenantPreference", "TPREFUPD"), + GET_TENANT_PREFERENCE("getTenantPreference", "TPREFRED"), + + UPDATE_SYSTEM_SETTINGS("updateSystemSettings", "SYSUPD"), + GET_SYSTEM_SETTING("getSystemSetting", "SYSRED"), + GET_ALL_SYSTEM_SETTINGS("getAllSystemSettings", "SYSRED"), + SET_SYSTEM_SETTING("setSystemSetting", "SYSCRT"), + + USER_TNC_ACCEPT("userTnCAccept", "TNCACCPT"), + + GENERATE_OTP("generateOTP", "OTPCRT"), + VERIFY_OTP("verifyOTP", "OTPVERFY"), + SEND_OTP("sendOTP", "OTPNOTI"), + + GET_USER_TYPES("getUserTypes", "UTYPRED"), + + USER_TENANT_MIGRATE("userTenantMigrate", "USRMIG"), + FREEUP_USER_IDENTITY("freeUpUserIdentity", "IDNTFREE"), + RESET_PASSWORD("resetPassword", "PASSRST"), + MERGE_USER("mergeUser", "USRMRG"), + MERGE_USER_TO_ELASTIC("mergeUserToElastic", "UBKGMRG"), + + MERGE_USER_CERTIFICATE("mergeUserCertificate", "USRCRTMRG"), + USER_SELF_DECLARED_TENANT_MIGRATE("userSelfDeclaredTenantMigrate", "USDTMIG"), + + GET_USER_FEED_BY_ID("getUserFeedById", "FEEDRED"), + CREATE_USER_FEED("createUserFeed", "FEEDCRT"), + DELETE_USER_FEED("deleteUserFeed", "FEEDDEL"), + UPDATE_USER_FEED("updateUserFeed", "FEEDUPD"), + + CREATE_USER_V3("createUserV3", "USRCRT"), + CREATE_SSU_USER("createSSUUser", "USRCRT"), + CREATE_USER_V4("createUserV4", "USRCRT"), + CREATE_MANAGED_USER("createManagedUser", "USRCRT"), + + V2_NOTIFICATION("v2Notification", "NOTI"), + GET_MANAGED_USERS("getManagedUsers", "USRRED"), + CHECK_USER_EXISTENCE("checkUserExistence", "UEXIST"), + CHECK_USER_EXISTENCEV2("checkUserExistenceV2", "UEXIST"), + UPDATE_USER_DECLARATIONS("updateUserDeclarations", "UDECLUPD"), + UPDATE_USER_CONSENT("updateUserConsent", "UCNSNTUPD"), + + USER_SEARCH("userSearch", "USRSER"), + USER_SEARCH_V2("userSearchV2", "USRSER"), + USER_SEARCH_V3("userSearchV3", "USRSER"), + ORG_SEARCH("orgSearch", "ORGSER"), + ORG_SEARCH_V2("orgSearchV2", "ORGSER"), + USER_LOOKUP("userLookup", "USRLKP"), + GET_USER_CONSENT("getUserConsent", "UCNSTRED"), + GET_USER_ROLES_BY_ID("getUserRolesById", "UROLERED"), + + INSERT_USER_ORG_DETAILS("insertUserOrgDetails", "UOBKGCRT"), + UPDATE_USER_ORG_DETAILS("updateUserOrgDetails", "UOBKGUPD"), + + UPSERT_USER_EXTERNAL_IDENTITY_DETAILS("upsertUserExternalIdentityDetails", "UEXTIDUPSRT"), + PROCESS_ONBOARDING_MAIL_AND_SMS("processOnBoardingMailAndSms", "WLCMNOTI"), + PROCESS_PASSWORD_RESET_MAIL_AND_SMS("processPasswordResetMailAndSms", "PASSNOTI"), + SAVE_USER_ATTRIBUTES("saveUserAttributes", "UATTRUPSRT"), + UPSERT_USER_DETAILS_TO_ES("upsertUserDetailsToES", "UBKGUPSRT"), + UPSERT_USER_ORG_DETAILS_TO_ES("upsertUserOrgDetailsToES", "UOBKGUPSRT"), + UPSERT_USER_SELF_DECLARATIONS("upsertUserSelfDeclarations", "USDUPSRT"), + UPDATE_USER_SELF_DECLARATIONS_ERROR_TYPE("updateUserSelfDeclarationsErrorType", "USDETUPD"), + LOCATION_BULK_UPLOAD("locationBulkUpload", "LOCUPLD"), + LOCATION_BULK_UPLOAD_BACKGROUND_JOB("locationBulkUploadBackground", "LBKGUPLD"), + GET_BULK_OP_STATUS("getBulkOpStatus", "BLKSTSRED"), + ORG_BULK_UPLOAD("orgBulkUpload", "ORGUPLD"), + ORG_BULK_UPLOAD_BACKGROUND_JOB("orgBulkUploadBackground", "OBKGUPLD"), + + USER_BULK_UPLOAD("userBulkUpload", "USRUPLD"), + USER_BULK_UPLOAD_BACKGROUND_JOB("userBulkUploadBackground", "UBKGUPLD"), + + CREATE_ORG("createOrg", "ORGCRT"), + UPDATE_ORG("updateOrg", "ORGUPD"), + UPDATE_ORG_STATUS("updateOrgStatus", "OSTSUPD"), + GET_ORG_DETAILS("getOrgDetails", "ORGRED"), + ASSIGN_KEYS("assignKeys", "ASSGNK"), + UPSERT_ORGANISATION_TO_ES("upsertOrganisationDataToES", "OBKGUPSRT"), + + CREATE_LOCATION("createLocation", "LOCCRT"), + UPDATE_LOCATION("updateLocation", "LOCUPD"), + SEARCH_LOCATION("searchLocation", "LOCSER"), + DELETE_LOCATION("deleteLocation", "LOCDEL"), + GET_RELATED_LOCATION_IDS("getRelatedLocationIds", "LOCRED"), + READ_LOCATION_TYPE("readLocationType", "LOCTYPRED"), + UPSERT_LOCATION_TO_ES("upsertLocationDataToES", "LBKGUPSRT"), + DELETE_LOCATION_FROM_ES("deleteLocationDataFromES", "LBKGDEL"), + ADD_ENCRYPTION_KEY("addEncryptionKey", "ADENCKEY"), + USER_CURRENT_LOGIN("userCurrentLogin", "USRLOG"), + DELETE_USER("deleteUser", "USRDLT"), + USER_OWNERSHIP_TRANSFER("userOwnershipTransfer", "UOWNTRANS"); + + private final String value; + private final String operationCode; + + ActorOperations(String value, String operationCode) { + this.value = value; + this.operationCode = operationCode; + } + + /** + * Returns the operation code associated with the operation. + * + * @return String operation code. + */ + public String getOperationCode() { + return operationCode; + } + + /** + * Returns the string value of the operation. + * + * @return String value. + */ + public String getValue() { + return this.value; + } + + private static final Map opCodeByActorOption = new HashMap<>(); + + static { + for (ActorOperations actorOperation : values()) { + opCodeByActorOption.put(actorOperation.getValue(), actorOperation.getOperationCode()); + } + } + + /** + * Retrieves the operation code for a given actor operation string value. + * + * @param actorOperation The string value of the operation. + * @return The operation code if found, otherwise an empty string. + */ + public static String getOperationCodeByActorOperation(String actorOperation) { + String opCode = opCodeByActorOption.get(actorOperation); + return StringUtils.isNotBlank(opCode) ? opCode : ""; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/request/HeaderParam.java b/core/sunbird-platform-common/src/main/java/org/sunbird/request/HeaderParam.java new file mode 100644 index 0000000000..52cc5a97a2 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/request/HeaderParam.java @@ -0,0 +1,75 @@ +package org.sunbird.request; + +/** + * Enum representing the keys for Execution Context Values and HTTP Headers. + * Used to maintain consistency across services for request/response headers. + */ +public enum HeaderParam { + REQUEST_ID, + REQUEST_PATH, + REQUEST_ST_ED_PATH, + CURRENT_INVOCATION_PATH, + USER_DATA, + USER_LOCALE, + SYSTEM_LOCALE, + USER_ID, + PROXY_USER_ID, + USER_NAME, + PROXY_USER_NAME, + SCOPE_ID, + X_Consumer_ID("x-consumer-id"), + X_Session_ID("x-session-id"), + X_Device_ID("x-device-id"), + X_Authenticated_Userid("x-authenticated-userid"), + ts("ts"), + Content_Type("content-type"), + X_Authenticated_User_Token("x-authenticated-user-token"), + X_Authenticated_For("x-authenticated-for"), + X_Authenticated_Client_Token("x-authenticated-client-token"), + X_Authenticated_Client_Id("x-authenticated-client-id"), + X_APP_ID("x-app-id"), + CHANNEL_ID("x-channel-id"), + X_Trace_ID("x-trace-id"), + X_REQUEST_ID("x-request-id"), + X_TRACE_ENABLED("x-trace-enabled"), + X_APP_VERSION("x-app-ver"), + X_APP_VERSION_PORTAL("x-app-version"), + X_SOURCE("x-source"), + X_Response_Length("x-response-length"); + + /** Name of the parameter/header. */ + private String name; + + /** + * Constructor with name. + * + * @param name The string representation of the header/parameter. + */ + private HeaderParam(String name) { + this.name = name; + } + + /** + * Default constructor. + */ + private HeaderParam() {} + + /** + * Returns the parameter name. If a specific name provided in constructor, returns that. + * Otherwise, returns the enum name. + * + * @return The parameter name. + */ + public String getParamName() { + return this.name(); + } + + /** + * Returns the specific name associated with the enum constant, if any. + * + * @return The name value. + */ + public String getName() { + return name; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/request/Request.java b/core/sunbird-platform-common/src/main/java/org/sunbird/request/Request.java new file mode 100644 index 0000000000..fa7c880b36 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/request/Request.java @@ -0,0 +1,323 @@ +package org.sunbird.request; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.keys.JsonKey; +import org.sunbird.common.ProjectUtil; +import org.sunbird.response.ResponseCode; + +/** + * Consolidated Request class for Sunbird services (LMS, UserOrg, Notification). + * + *

This class standardizes the Request object across services, incorporating: + *

    + *
  • The rich feature set of the LMS implementation (utility methods). + *
  • The data safety of the Notification implementation (using HashMap instead of WeakHashMap). + *
  • Additional fields and constructors for flexibility. + *
+ */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Request implements Serializable { + + private static final long serialVersionUID = -2362783406031347676L; + private static final Integer MIN_TIMEOUT = 0; + private static final Integer MAX_TIMEOUT = 30; + private static final int WAIT_TIME_VALUE = 30; + + protected Map context; + private RequestContext requestContext; + + private String id; + private String ver; + private String ts; + private RequestParams params; + + // Use HashMap instead of WeakHashMap to prevent premature garbage collection of request data + private Map request = new HashMap<>(); + + private String managerName; + private String operation; + private String requestId; + private int env; + + // Path field from Notification service + protected String path; + + private Integer timeout; // in seconds + + /** Default constructor initializes context and params. */ + public Request() { + this.context = new HashMap<>(); + this.params = new RequestParams(); + } + + /** + * Constructor with RequestContext. + * + * @param requestContext The context of the request. + */ + public Request(RequestContext requestContext) { + this.context = new HashMap<>(); + this.params = new RequestParams(); + this.requestContext = requestContext; + } + + /** + * Copy constructor. + * + *

Note: This performs a shallow copy of RequestParams. + * + * @param request The request object to copy from. + */ + public Request(Request request) { + this.params = request.getParams(); + if (this.params == null) { + this.params = new RequestParams(); + } + // Ensure msgid is set if available in the source request's params or requestId + if (StringUtils.isBlank(this.params.getMsgid()) + && StringUtils.isNotBlank(request.getRequestId())) { + this.params.setMsgid(request.getRequestId()); + } + + this.context = new HashMap<>(); + if (request.getContext() != null) { + this.context.putAll(request.getContext()); + } + + this.requestContext = request.getRequestContext(); + this.request = new HashMap<>(); + if (request.getRequest() != null) { + this.request.putAll(request.getRequest()); + } + + this.id = request.getId(); + this.ver = request.getVer(); + this.ts = request.getTs(); + this.managerName = request.getManagerName(); + this.operation = request.getOperation(); + this.requestId = request.getRequestId(); + this.env = request.getEnv(); + this.path = request.getPath(); + this.timeout = request.getTimeout(); + } + + /** + * Converts configured fields to lowercase in the request map. Configuration key: {@link + * JsonKey#SUNBIRD_API_REQUEST_LOWER_CASE_FIELDS} + */ + public void toLower() { + String configValue = ProjectUtil.getConfigValue(JsonKey.SUNBIRD_API_REQUEST_LOWER_CASE_FIELDS); + if (StringUtils.isNotBlank(configValue)) { + Arrays.stream(configValue.split(",")) + .forEach( + field -> { + Object value = this.getRequest().get(field); + if (value instanceof String && StringUtils.isNotBlank((String) value)) { + this.getRequest().put(field, ((String) value).toLowerCase()); + } + }); + } + } + + /** + * Gets the request ID. Checks params first, then the requestId field. + * + * @return The request ID. + */ + public String getRequestId() { + // Logic from Notification: check params first + if (this.params != null && StringUtils.isNotBlank(this.params.getMsgid())) { + return this.params.getMsgid(); + } + return requestId; + } + + /** + * Sets the request ID. + * + * @param requestId The request ID to set. + */ + public void setRequestId(String requestId) { + this.requestId = requestId; + // Sync with params if needed, or leave decoupled as per original implementations + } + + public Map getContext() { + return context; + } + + public void setContext(Map context) { + this.context = context; + } + + public Map getRequest() { + return request; + } + + public void setRequest(Map request) { + this.request = request; + } + + public Object get(String key) { + return request.get(key); + } + + /** + * Helper method to get a value with a default. + * + * @param key The key to look up. + * @param defaultVal The default value if key is not present. + * @return The value or the default. + */ + public Object getOrDefault(String key, Object defaultVal) { + return request.getOrDefault(key, defaultVal); + } + + /** + * Checks if the request map contains the key. + * + * @param key The key to check. + * @return True if key exists. + */ + public Boolean contains(String key) { + return request.containsKey(key); + } + + /** + * Puts a value into the request map. + * + * @param key The key. + * @param vo The value object. + */ + public void put(String key, Object vo) { + request.put(key, vo); + } + + /** + * Copies all entries from the given map to the request map. + * + * @param map The map to copy from. + */ + public void copyRequestValueObjects(Map map) { + if (map != null && !map.isEmpty()) { + this.request.putAll(map); + } + } + + public String getManagerName() { + return managerName; + } + + public void setManagerName(String managerName) { + this.managerName = managerName; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVer() { + return ver; + } + + public void setVer(String ver) { + this.ver = ver; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public RequestParams getParams() { + return params; + } + + /** + * Sets the request parameters. Auto-sets msgid if requestId is present. + * + * @param params The request parameters. + */ + public void setParams(RequestParams params) { + this.params = params; + // Auto-set msgid if requestId is present and msgid is not + if (this.params.getMsgid() == null && requestId != null) { + this.params.setMsgid(requestId); + } + } + + public int getEnv() { + return env; + } + + public void setEnv(int env) { + this.env = env; + } + + public Integer getTimeout() { + return timeout == null ? WAIT_TIME_VALUE : timeout; + } + + /** + * Sets the timeout value. + * + * @param timeout The timeout in seconds. + * @throws ProjectCommonException If timeout is invalid. + */ + public void setTimeout(Integer timeout) { + if (timeout < MIN_TIMEOUT && timeout > MAX_TIMEOUT) { + ProjectCommonException.throwServerErrorException( + ResponseCode.invalidRequestTimeout, + MessageFormat.format(ResponseCode.invalidRequestTimeout.getErrorMessage(), timeout)); + } + this.timeout = timeout; + } + + public RequestContext getRequestContext() { + return requestContext; + } + + public void setRequestContext(RequestContext requestContext) { + this.requestContext = requestContext; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + @Override + public String toString() { + return "Request [" + + (context != null ? "context=" + context + ", " : "") + + (request != null ? "request=" + request + ", " : "") + + (id != null ? "id=" + id + ", " : "") + + (operation != null ? "operation=" + operation : "") + + "]"; + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestContext.java b/core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestContext.java new file mode 100644 index 0000000000..ba5be88f86 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestContext.java @@ -0,0 +1,358 @@ +package org.sunbird.request; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Consolidated RequestContext class for Sunbird services (LMS, UserOrg, Notification). + * + *

This class serves as a unified context object that combines the fields and behaviors required by + * different services within the Sunbird platform. It supports: + * + *

    + *
  • LMS: Telemetry support with `pdata` (Protocol Data), `channel`, `env` (Environment), + * and a nested context map. + *
  • UserOrg: General request properties such as `appId`, `source`, and `telemetryContext`. + *
  • Notification: Actor and logging specific fields like `actorId` and `loggerLevel`. + *
+ * + *

This allows for a standardize way to pass request context information (headers, trace IDs, + * user info) through the service layers. + */ +public class RequestContext { + + // ------------------------------------------------------------------------- + // Common Fields + // ------------------------------------------------------------------------- + + /** User ID (Actor). */ + private String uid; + + /** Device ID. */ + private String did; + + /** Session ID. */ + private String sid; + + /** Debug mode flag. */ + private String debugEnabled; + + /** + * Request ID. Mapped to 'requestId' for LMS compatibility using JsonAlias. + */ + @JsonProperty("reqId") + @JsonAlias("requestId") + private String reqId; + + /** Operation name. */ + private String op; + + /** + * General context map to hold dynamic attributes. + * In LMS scenarios, this holds the telemetry context. + */ + private Map contextMap = new HashMap<>(); + + // ------------------------------------------------------------------------- + // UserOrg / Notification Specific Fields + // ------------------------------------------------------------------------- + + /** Application ID. */ + private String appId; + + /** Application Version. */ + private String appVer; + + /** Source of the request. */ + private String source; + + /** Specific telemetry context map for UserOrg/Notification services. */ + private Map telemetryContext = new HashMap<>(); + + // ------------------------------------------------------------------------- + // LMS Specific Fields + // ------------------------------------------------------------------------- + + /** Channel header value (X-Channel-Id). */ + private String channel; + + /** Environment identifier (e.g., "course", "user"). */ + private String env; + + /** + * Protocol Data (pdata) map. + * Contains 'id', 'pid', 'ver' for telemetry. + */ + private Map pdata = new HashMap<>(); + + // ------------------------------------------------------------------------- + // Notification / LMS Common Attributes + // ------------------------------------------------------------------------- + + /** ID of the actor performing the request. */ + private String actorId; + + /** Type of the actor (e.g., "Consumer", "System"). */ + private String actorType; + + /** Logging level for the request context. */ + private String loggerLevel; + + /** + * Default constructor. + */ + public RequestContext() {} + + /** + * Constructor designed for UserOrg and Notification style requests. + * Initializes general request metadata and populates the context map with these values. + * + * @param uid User ID + * @param did Device ID + * @param sid Session ID + * @param appId Application ID + * @param appVer Application Version + * @param reqId Request ID + * @param source Request Source + * @param debugEnabled Debug flag + * @param op Operation name + */ + public RequestContext( + String uid, + String did, + String sid, + String appId, + String appVer, + String reqId, + String source, + String debugEnabled, + String op) { + this.uid = uid; + this.did = did; + this.sid = sid; + this.appId = appId; + this.appVer = appVer; + this.reqId = reqId; + this.source = source; + this.debugEnabled = debugEnabled; + this.op = op; + + // Populate contextMap as done in UserOrg/Notification patterns + contextMap.put("uid", uid); + contextMap.put("did", did); + contextMap.put("sid", sid); + contextMap.put("appId", appId); + contextMap.put("appVer", appVer); + contextMap.put("reqId", reqId); + contextMap.put("source", source); + contextMap.put("op", op); + } + + /** + * Constructor designed for LMS style requests, focusing on telemetry requirements. + * Initializes parameters required for constructing the `pdata` and telemetry `contextMap`. + * + * @param channel Channel ID + * @param pdataId Producer Data ID (e.g. producer ID) + * @param env Environment identifier + * @param did Device ID + * @param sid Session ID + * @param pid Producer ID + * @param pver Producer Version + * @param cdata Correlation Data list + */ + public RequestContext( + String channel, + String pdataId, + String env, + String did, + String sid, + String pid, + String pver, + List cdata) { + this.did = did; + this.sid = sid; + this.channel = channel; + this.env = env; + + this.pdata.put("id", pdataId); + this.pdata.put("pid", pid); + this.pdata.put("ver", pver); + + this.contextMap.put("did", did); + this.contextMap.put("sid", sid); + this.contextMap.put("channel", channel); + this.contextMap.put("env", env); + this.contextMap.put("pdata", pdata); + if (cdata != null) { + this.contextMap.put("cdata", cdata); + } + } + + // ------------------------------------------------------------------------- + // Getters and Setters + // ------------------------------------------------------------------------- + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getDid() { + return did; + } + + public void setDid(String did) { + this.did = did; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppVer() { + return appVer; + } + + public void setAppVer(String appVer) { + this.appVer = appVer; + } + + /** + * Gets the Request ID. + * @return reqId + */ + public String getReqId() { + return reqId; + } + + /** + * Sets the Request ID. + * @param reqId + */ + public void setReqId(String reqId) { + this.reqId = reqId; + } + + /** + * Alias for getReqId(), primarily for LMS compatibility. + * @return reqId + */ + public String getRequestId() { + return reqId; + } + + /** + * Alias for setReqId(), primarily for LMS compatibility. + * @param requestId + */ + public void setRequestId(String requestId) { + this.reqId = requestId; + } + + public String getDebugEnabled() { + return debugEnabled; + } + + public void setDebugEnabled(String debugEnabled) { + this.debugEnabled = debugEnabled; + } + + public String getOp() { + return op; + } + + public void setOp(String op) { + this.op = op; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } + + public String getEnv() { + return env; + } + + public void setEnv(String env) { + this.env = env; + } + + public Map getPdata() { + return pdata; + } + + public void setPdata(Map pdata) { + this.pdata = pdata; + } + + public String getActorId() { + return actorId; + } + + public void setActorId(String actorId) { + this.actorId = actorId; + } + + public String getActorType() { + return actorType; + } + + public void setActorType(String actorType) { + this.actorType = actorType; + } + + public String getLoggerLevel() { + return loggerLevel; + } + + public void setLoggerLevel(String loggerLevel) { + this.loggerLevel = loggerLevel; + } + + public Map getContextMap() { + return contextMap; + } + + public void setContextMap(Map contextMap) { + this.contextMap = contextMap; + } + + public Map getTelemetryContext() { + return telemetryContext; + } + + public void setTelemetryContext(Map telemetryContext) { + this.telemetryContext = telemetryContext; + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestParams.java b/core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestParams.java new file mode 100644 index 0000000000..617083b05f --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/request/RequestParams.java @@ -0,0 +1,92 @@ +package org.sunbird.request; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; + +/** + * Request parameter details. + * + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class RequestParams implements Serializable { + + private static final long serialVersionUID = -759588115950763188L; + + private String did; + private String key; + private String msgid; + private String uid; + private String cid; + private String sid; + private String authToken; + + /** @return the authToken */ + public String getAuthToken() { + return authToken; + } + + /** @param authToken the authToken to set */ + public void setAuthToken(String authToken) { + this.authToken = authToken; + } + + /** @return the uid */ + public String getUid() { + return uid; + } + + /** @param uid the uid to set */ + public void setUid(String uid) { + this.uid = uid; + } + + /** @return the did */ + public String getDid() { + return did; + } + + /** @param did the did to set */ + public void setDid(String did) { + this.did = did; + } + + /** @return the key */ + public String getKey() { + return key; + } + + /** @param key the key to set */ + public void setKey(String key) { + this.key = key; + } + + /** @return the msgid */ + public String getMsgid() { + return msgid; + } + + /** @param msgid the msgid to set */ + public void setMsgid(String msgid) { + this.msgid = msgid; + } + + /** @return the cid */ + public String getCid() { + return cid; + } + + /** @param cid the cid to set */ + public void setCid(String cid) { + this.cid = cid; + } + + /** @return the sid */ + public String getSid() { + return sid; + } + + /** @param sid the sid to set */ + public void setSid(String sid) { + this.sid = sid; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java new file mode 100644 index 0000000000..71b8b55dfa --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ClientErrorResponse.java @@ -0,0 +1,45 @@ +package org.sunbird.response; + +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; + +/** + * Represents a client-side error response. + *

+ * This class extends the standard {@link Response} to include details about the exception + * that caused the error, typically encapsulating a {@link ProjectCommonException}. + * It defaults the response code to {@link ResponseCode#CLIENT_ERROR}. + */ +public class ClientErrorResponse extends Response { + + private static final long serialVersionUID = 1L; + + /** The exception details associated with this client error. */ + private ProjectCommonException exception = null; + + /** + * Default constructor. + * Initializes the response code to {@link ResponseCode#CLIENT_ERROR}. + */ + public ClientErrorResponse() { + this.responseCode = ResponseCode.CLIENT_ERROR; + } + + /** + * Gets the exception associated with this response. + * + * @return The {@link ProjectCommonException} causing the error. + */ + public ProjectCommonException getException() { + return exception; + } + + /** + * Sets the exception associated with this response. + * + * @param exception The {@link ProjectCommonException} to set. + */ + public void setException(ProjectCommonException exception) { + this.exception = exception; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/response/HttpUtilResponse.java b/core/sunbird-platform-common/src/main/java/org/sunbird/response/HttpUtilResponse.java new file mode 100644 index 0000000000..e5a1329cd4 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/response/HttpUtilResponse.java @@ -0,0 +1,66 @@ +package org.sunbird.response; + +/** + * A simple wrapper class for HTTP responses, holding the response body and status code. + * This class is typically used by utility methods handling raw HTTP interactions. + */ +public class HttpUtilResponse { + + /** The raw response body string. */ + private String body; + + /** The HTTP status code of the response. */ + private int statusCode; + + /** + * Default constructor. + */ + public HttpUtilResponse() {} + + /** + * Constructs a new HttpUtilResponse with the specified body and status code. + * + * @param body The response body as a string. + * @param statusCode The integer HTTP status code. + */ + public HttpUtilResponse(String body, int statusCode) { + this.body = body; + this.statusCode = statusCode; + } + + /** + * Gets the response body. + * + * @return The response body string. + */ + public String getBody() { + return body; + } + + /** + * Sets the response body. + * + * @param body The response body string to set. + */ + public void setBody(String body) { + this.body = body; + } + + /** + * Gets the HTTP status code. + * + * @return The status code. + */ + public int getStatusCode() { + return statusCode; + } + + /** + * Sets the HTTP status code. + * + * @param statusCode The status code to set. + */ + public void setStatusCode(int statusCode) { + this.statusCode = statusCode; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/response/Params.java b/core/sunbird-platform-common/src/main/java/org/sunbird/response/Params.java new file mode 100644 index 0000000000..3e480610bf --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/response/Params.java @@ -0,0 +1,117 @@ +package org.sunbird.response; + +import java.io.Serializable; + +/** + * Represents the standard response parameters for API responses. + * Contains metadata about the transaction, such as message IDs, status, and error details. + */ +public class Params implements Serializable { + + private static final long serialVersionUID = -8786004970726124473L; + + /** The unique response message ID. */ + private String resmsgid; + + /** The message ID. */ + private String msgid; + + /** The error code, if any. */ + private String err; + + /** The status of the response (e.g., "success", "failed"). */ + private String status; + + /** The descriptive error message, if any. */ + private String errmsg; + + /** + * Gets the response message ID. + * + * @return The response message ID. + */ + public String getResmsgid() { + return resmsgid; + } + + /** + * Sets the response message ID. + * + * @param resmsgid The response message ID to set. + */ + public void setResmsgid(String resmsgid) { + this.resmsgid = resmsgid; + } + + /** + * Gets the message ID. + * + * @return The message ID. + */ + public String getMsgid() { + return msgid; + } + + /** + * Sets the message ID. + * + * @param msgid The message ID to set. + */ + public void setMsgid(String msgid) { + this.msgid = msgid; + } + + /** + * Gets the error code. + * + * @return The error code. + */ + public String getErr() { + return err; + } + + /** + * Sets the error code. + * + * @param err The error code to set. + */ + public void setErr(String err) { + this.err = err; + } + + /** + * Gets the operation status. + * + * @return The status string. + */ + public String getStatus() { + return status; + } + + /** + * Sets the operation status. + * + * @param status The status string to set. + */ + public void setStatus(String status) { + this.status = status; + } + + /** + * Gets the error message description. + * + * @return The error message. + */ + public String getErrmsg() { + return errmsg; + } + + /** + * Sets the error message description. + * + * @param errmsg The error message to set. + */ + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/response/Response.java b/core/sunbird-platform-common/src/main/java/org/sunbird/response/Response.java new file mode 100644 index 0000000000..c6413cf2be --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/response/Response.java @@ -0,0 +1,188 @@ +package org.sunbird.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import org.sunbird.response.ResponseCode; + +/** + * A standardized response class used across all layers of the application. + * It encapsulates the result of an API request, including status codes, + * timestamps, versioning, and the actual data payload. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Response implements Serializable, Cloneable { + + private static final long serialVersionUID = -3773253896160786443L; + + /** Unique identifier for the response. */ + protected String id; + + /** API version. */ + protected String ver; + + /** Timestamp of the response generation. */ + protected String ts; + + /** Additional response parameters (e.g., status, err, errmsg). */ + protected ResponseParams params; + + /** The response code (e.g., OK, CLIENT_ERROR). Defaults to OK. */ + protected ResponseCode responseCode = ResponseCode.OK; + + /** The map containing the actual result data. */ + protected Map result = new HashMap<>(); + + /** + * Gets the unique response ID. + * + * @return The response ID string. + */ + public String getId() { + return id; + } + + /** + * Sets the unique response ID. + * + * @param id The response ID string. + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the API version. + * + * @return The API version string. + */ + public String getVer() { + return ver; + } + + /** + * Sets the API version. + * + * @param ver The API version string. + */ + public void setVer(String ver) { + this.ver = ver; + } + + /** + * Gets the timestamp. + * + * @return The timestamp string. + */ + public String getTs() { + return ts; + } + + /** + * Sets the timestamp. + * + * @param ts The timestamp string. + */ + public void setTs(String ts) { + this.ts = ts; + } + + /** + * Gets the result map containing the data payload. + * + * @return A map of result objects. + */ + public Map getResult() { + return result; + } + + /** + * Retrieves a specific value from the result map. + * + * @param key The key to look up. + * @return The object associated with the key, or null if not found. + */ + public Object get(String key) { + return result.get(key); + } + + /** + * Adds a key-value pair to the result map. + * + * @param key The key for the data. + * @param vo The value object. + */ + public void put(String key, Object vo) { + result.put(key, vo); + } + + /** + * Adds all entries from the provided map to the result map. + * + * @param map The map of entries to add. + */ + public void putAll(Map map) { + result.putAll(map); + } + + /** + * Checks if the result map contains a specific key. + * + * @param key The key to check. + * @return True if the key exists, false otherwise. + */ + public boolean containsKey(String key) { + return result.containsKey(key); + } + + /** + * Gets the response parameters object. + * + * @return The ResponseParams object. + */ + public ResponseParams getParams() { + return params; + } + + /** + * Sets the response parameters object. + * + * @param params The ResponseParams object to set. + */ + public void setParams(ResponseParams params) { + this.params = params; + } + + /** + * Sets the response code. + * + * @param code The ResponseCode enum. + */ + public void setResponseCode(ResponseCode code) { + this.responseCode = code; + } + + /** + * Gets the response code. + * + * @return The ResponseCode enum. + */ + public ResponseCode getResponseCode() { + return this.responseCode; + } + + /** + * Creates a shallow copy of the response object. + * + * @param response The response object to clone. + * @return A cloned Response object, or null if cloning fails. + */ + public Response clone(Response response) { + try { + return (Response) response.clone(); + } catch (CloneNotSupportedException e) { + return null; + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseCode.java b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseCode.java new file mode 100644 index 0000000000..271056d43f --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseCode.java @@ -0,0 +1,1026 @@ +package org.sunbird.response; + +import org.apache.commons.lang3.StringUtils; +import org.sunbird.keys.JsonKey; + +/** + * Enum indicating the response code of the API. + * + *

This enum holds all the response codes used across the application, logically grouped by functionality. + * It maps internal error codes (Strings) to their corresponding error messages and HTTP status codes. + */ +public enum ResponseCode { + + // ------------------------------------------------------------------------- + // Generic / Common + // ------------------------------------------------------------------------- + success(ResponseMessage.Key.SUCCESS_MESSAGE, ResponseMessage.Message.SUCCESS_MESSAGE), + internalError(ResponseMessage.Key.INTERNAL_ERROR, ResponseMessage.Message.INTERNAL_ERROR), + operationTimeout( + ResponseMessage.Key.OPERATION_TIMEOUT, ResponseMessage.Message.OPERATION_TIMEOUT), + invalidOperationName( + ResponseMessage.Key.INVALID_OPERATION_NAME, ResponseMessage.Message.INVALID_OPERATION_NAME), + invalidRequestData( + ResponseMessage.Key.INVALID_REQUESTED_DATA, ResponseMessage.Message.INVALID_REQUESTED_DATA), + invalidData(ResponseMessage.Key.INVALID_DATA, ResponseMessage.Message.INVALID_DATA), + invalidParameter( + ResponseMessage.Key.INVALID_PARAMETER, ResponseMessage.Message.INVALID_PARAMETER), + invalidParameterValue( + ResponseMessage.Key.INVALID_PARAMETER_VALUE, ResponseMessage.Message.INVALID_PARAMETER_VALUE), + mandatoryParamsMissing( + ResponseMessage.Key.MANDATORY_PARAMETER_MISSING, + ResponseMessage.Message.MANDATORY_PARAMETER_MISSING), + errorMandatoryParamsEmpty( + ResponseMessage.Key.ERROR_MANDATORY_PARAMETER_EMPTY, + ResponseMessage.Message.ERROR_MANDATORY_PARAMETER_EMPTY), + idRequired(ResponseMessage.Key.ID_REQUIRED_ERROR, ResponseMessage.Message.ID_REQUIRED_ERROR), + dataTypeError(ResponseMessage.Key.DATA_TYPE_ERROR, ResponseMessage.Message.DATA_TYPE_ERROR), + invalidValue(ResponseMessage.Key.INVALID_VALUE, ResponseMessage.Message.INVALID_VALUE), + alreadyExists(ResponseMessage.Key.ALREADY_EXISTS, ResponseMessage.Message.ALREADY_EXISTS), + resourceNotFound( + ResponseMessage.Key.RESOURCE_NOT_FOUND, ResponseMessage.Message.RESOURCE_NOT_FOUND), + serverError( + ResponseMessage.Key.INTERNAL_ERROR, ResponseMessage.Message.INTERNAL_ERROR), + customServerError( + ResponseMessage.Key.CUSTOM_SERVER_ERROR, ResponseMessage.Message.CUSTOM_SERVER_ERROR), + serviceUnAvailable( + ResponseMessage.Key.SERVICE_UNAVAILABLE, ResponseMessage.Message.SERVICE_UNAVAILABLE), + dataAlreadyExist( + ResponseMessage.Key.DATA_ALREADY_EXIST, ResponseMessage.Message.DATA_ALREADY_EXIST), + notSupported(ResponseMessage.Key.NOT_SUPPORTED, ResponseMessage.Message.NOT_SUPPORTED), + functionalityMissing(ResponseMessage.Key.NOT_SUPPORTED, ResponseMessage.Message.NOT_SUPPORTED), + invalidElementInList( + ResponseMessage.Key.INVALID_ELEMENT_IN_LIST, ResponseMessage.Message.INVALID_ELEMENT_IN_LIST), + errorRateLimitExceeded( + ResponseMessage.Key.ERROR_RATE_LIMIT_EXCEEDED, + ResponseMessage.Message.ERROR_RATE_LIMIT_EXCEEDED), + invalidRequestTimeout( + ResponseMessage.Key.INVALID_REQUEST_TIMEOUT, ResponseMessage.Message.INVALID_REQUEST_TIMEOUT), + invalidObjectType( + ResponseMessage.Key.INVALID_OBJECT_TYPE, ResponseMessage.Message.INVALID_OBJECT_TYPE), + invalidPropertyError( + ResponseMessage.Key.INVALID_PROPERTY_ERROR, ResponseMessage.Message.INVALID_PROPERTY_ERROR), + invalidDateFormat( + ResponseMessage.Key.INVALID_DATE_FORMAT, ResponseMessage.Message.INVALID_DATE_FORMAT), + passwordValidation( + ResponseMessage.Key.INVALID_PASSWORD, ResponseMessage.Message.INVALID_PASSWORD), + dataFormatError( + ResponseMessage.Key.DATA_FORMAT_ERROR, ResponseMessage.Message.DATA_FORMAT_ERROR), + OnlyEmailorPhoneorManagedByRequired( + ResponseMessage.Key.ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED, + ResponseMessage.Message.ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED), + managedByNotAllowed( + ResponseMessage.Key.MANAGED_BY_NOT_ALLOWED, ResponseMessage.Message.MANAGED_BY_NOT_ALLOWED), + managedUserLimitExceeded( + ResponseMessage.Key.MANAGED_USER_LIMIT_EXCEEDED, ResponseMessage.Message.MANAGED_USER_LIMIT_EXCEEDED), + errorConflictingValues( + ResponseMessage.Key.ERROR_CONFLICTING_VALUES, ResponseMessage.Message.ERROR_CONFLICTING_VALUES), + errorConflictingRootOrgId( + ResponseMessage.Key.ERROR_CONFLICTING_ROOT_ORG_ID, ResponseMessage.Message.ERROR_CONFLICTING_ROOT_ORG_ID), + errorInvalidParameterSize( + ResponseMessage.Key.ERROR_INVALID_PARAMETER_SIZE, ResponseMessage.Message.ERROR_INVALID_PARAMETER_SIZE), + declaredUserErrorStatusNotUpdated( + ResponseMessage.Key.DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED, ResponseMessage.Message.DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED), + invalidEncryptionFile( + ResponseMessage.Key.INVALID_ENCRYPTION_FILE, ResponseMessage.Message.INVALID_ENCRYPTION_FILE), + errorParamExists( + ResponseMessage.Key.ERROR_PARAM_EXISTS, ResponseMessage.Message.ERROR_PARAM_EXISTS), + recoveryParamsMatchException( + ResponseMessage.Key.RECOVERY_PARAM_MATCH_EXCEPTION, + ResponseMessage.Message.RECOVERY_PARAM_MATCH_EXCEPTION), + invalidSecurityLevel( + ResponseMessage.Key.INVALID_SECURITY_LEVEL, ResponseMessage.Message.INVALID_SECURITY_LEVEL), + invalidSecurityLevelLower( + ResponseMessage.Key.INVALID_SECURITY_LEVEL_LOWER, + ResponseMessage.Message.INVALID_SECURITY_LEVEL_LOWER), + defaultSecurityLevelConfigMissing( + ResponseMessage.Key.MISSING_DEFAULT_SECURITY_LEVEL, + ResponseMessage.Message.MISSING_DEFAULT_SECURITY_LEVEL), + invalidTenantSecurityLevelLower( + ResponseMessage.Key.INVALID_TENANT_SECURITY_LEVEL_LOWER, + ResponseMessage.Message.INVALID_TENANT_SECURITY_LEVEL_LOWER), + errorUserMigrationFailed( + ResponseMessage.Key.ERROR_USER_MIGRATION_FAILED, + ResponseMessage.Message.ERROR_USER_MIGRATION_FAILED), + declaredUserValidatedStatusNotUpdated( + ResponseMessage.Key.DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED, + ResponseMessage.Message.DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED), + userStatusError(ResponseMessage.Key.USER_STATUS_MSG, ResponseMessage.Message.USER_STATUS_MSG), + extendUserProfileNotLoaded( + ResponseMessage.Key.EXTENDED_USER_PROFILE_NOT_LOADED, + ResponseMessage.Message.EXTENDED_USER_PROFILE_NOT_LOADED), + inactiveUser(ResponseMessage.Key.INACTIVE_USER, ResponseMessage.Message.INACTIVE_USER), + cannotDeleteUser( + ResponseMessage.Key.CANNOT_DELETE_USER, ResponseMessage.Message.CANNOT_DELETE_USER), + roleProcessingInvalidOrgError( + ResponseMessage.Key.ROLE_PROCESSING_INVALID_ORG, + ResponseMessage.Message.ROLE_PROCESSING_INVALID_ORG), + dateFormatError( + ResponseMessage.Key.DATE_FORMAT_ERRROR, ResponseMessage.Message.DATE_FORMAT_ERRROR), + unableToParseData( + ResponseMessage.Key.UNABLE_TO_PARSE_DATA, ResponseMessage.Message.UNABLE_TO_PARSE_DATA), + invalidJsonData(ResponseMessage.Key.INVALID_JSON, ResponseMessage.Message.INVALID_JSON), + noDataForConsumption(ResponseMessage.Key.NO_DATA, ResponseMessage.Message.NO_DATA), + invalidIdentifier( + ResponseMessage.Key.VALID_IDENTIFIER_ABSENSE, + ResponseMessage.Message.IDENTIFIER_VALIDATION_FAILED), + parameterMismatch( + ResponseMessage.Key.PARAMETER_MISMATCH, ResponseMessage.Message.PARAMETER_MISMATCH), + + // ------------------------------------------------------------------------- + // Authentication & Authorization + // ------------------------------------------------------------------------- + unAuthorized(ResponseMessage.Key.UNAUTHORIZED_USER, ResponseMessage.Message.UNAUTHORIZED_USER), + invalidUserCredentials( + ResponseMessage.Key.INVALID_USER_CREDENTIALS, + ResponseMessage.Message.INVALID_USER_CREDENTIALS), + apiKeyRequired( + ResponseMessage.Key.API_KEY_MISSING_ERROR, ResponseMessage.Message.API_KEY_MISSING_ERROR), + invalidApiKey( + ResponseMessage.Key.API_KEY_INVALID_ERROR, ResponseMessage.Message.API_KEY_INVALID_ERROR), + authTokenRequired( + ResponseMessage.Key.AUTH_TOKEN_MISSING, ResponseMessage.Message.AUTH_TOKEN_MISSING), + invalidAuthToken( + ResponseMessage.Key.INVALID_AUTH_TOKEN, ResponseMessage.Message.INVALID_AUTH_TOKEN), + sessionIdRequiredError( + ResponseMessage.Key.SESSION_ID_MISSING, ResponseMessage.Message.SESSION_ID_MISSING), + invalidRole(ResponseMessage.Key.INVALID_ROLE, ResponseMessage.Message.INVALID_ROLE), + invalidSalt(ResponseMessage.Key.INVALID_SALT, ResponseMessage.Message.INVALID_SALT), + keyCloakDefaultError( + ResponseMessage.Key.KEY_CLOAK_DEFAULT_ERROR, ResponseMessage.Message.KEY_CLOAK_DEFAULT_ERROR), + otpVerificationFailed( + ResponseMessage.Key.OTP_VERIFICATION_FAILED, ResponseMessage.Message.OTP_VERIFICATION_FAILED), + errorInvalidOTP(ResponseMessage.Key.ERROR_INVALID_OTP, ResponseMessage.Message.ERROR_INVALID_OTP), + errorForbidden(ResponseMessage.Key.FORBIDDEN, ResponseMessage.Message.FORBIDDEN), + + // ------------------------------------------------------------------------- + // User Management + // ------------------------------------------------------------------------- + userNotFound(ResponseMessage.Key.USER_NOT_FOUND, ResponseMessage.Message.USER_NOT_FOUND), + userAlreadyExists( + ResponseMessage.Key.USER_ALREADY_EXISTS, ResponseMessage.Message.USER_ALREADY_EXISTS), + invalidUserId(ResponseMessage.Key.INVALID_USER_ID, ResponseMessage.Message.INVALID_USER_ID), + userIdRequired(ResponseMessage.Key.USERID_MISSING, ResponseMessage.Message.USERID_MISSING), + userNameRequired(ResponseMessage.Key.USERNAME_MISSING, ResponseMessage.Message.USERNAME_MISSING), + firstNameRequired( + ResponseMessage.Key.FIRST_NAME_MISSING, ResponseMessage.Message.FIRST_NAME_MISSING), + emailRequired(ResponseMessage.Key.EMAIL_MISSING, ResponseMessage.Message.EMAIL_MISSING), + phoneNoRequired( + ResponseMessage.Key.PHONE_NO_REQUIRED_ERROR, ResponseMessage.Message.PHONE_NO_REQUIRED_ERROR), + passwordRequired(ResponseMessage.Key.PASSWORD_MISSING, ResponseMessage.Message.PASSWORD_MISSING), + invalidPassword(ResponseMessage.Key.INVALID_PASSWORD, ResponseMessage.Message.INVALID_PASSWORD), + passwordMinLengthError( + ResponseMessage.Key.PASSWORD_MIN_LENGHT, ResponseMessage.Message.PASSWORD_MIN_LENGHT), + passwordMaxLengthError( + ResponseMessage.Key.PASSWORD_MAX_LENGHT, ResponseMessage.Message.PASSWORD_MAX_LENGHT), + userNameAlreadyExistError( + ResponseMessage.Key.USERNAME_IN_USE, ResponseMessage.Message.USERNAME_IN_USE), + emailAlreadyExistError(ResponseMessage.Key.EMAIL_IN_USE, ResponseMessage.Message.EMAIL_IN_USE), + PhoneNumberInUse( + ResponseMessage.Key.PHONE_ALREADY_IN_USE, ResponseMessage.Message.PHONE_ALREADY_IN_USE), + userAccountlocked( + ResponseMessage.Key.USER_ACCOUNT_BLOCKED, ResponseMessage.Message.USER_ACCOUNT_BLOCKED), + userAlreadyActive( + ResponseMessage.Key.USER_ALREADY_ACTIVE, ResponseMessage.Message.USER_ALREADY_ACTIVE), + userAlreadyInactive( + ResponseMessage.Key.USER_ALREADY_INACTIVE, ResponseMessage.Message.USER_ALREADY_INACTIVE), + userRegUnSuccessfull( + ResponseMessage.Key.USER_REG_UNSUCCESSFUL, ResponseMessage.Message.USER_REG_UNSUCCESSFUL), + userUpdationUnSuccessfull( + ResponseMessage.Key.USER_UPDATE_UNSUCCESSFUL, + ResponseMessage.Message.USER_UPDATE_UNSUCCESSFUL), + userPhoneUpdateFailed( + ResponseMessage.Key.USER_PHONE_UPDATE_FAILED, + ResponseMessage.Message.USER_PHONE_UPDATE_FAILED), + userMigrationFiled( + ResponseMessage.Key.USER_MIGRATION_FAILED, ResponseMessage.Message.USER_MIGRATION_FAILED), + userDataEncryptionError( + ResponseMessage.Key.USER_DATA_ENCRYPTION_ERROR, + ResponseMessage.Message.USER_DATA_ENCRYPTION_ERROR), + invalidUserExternalId( + ResponseMessage.Key.INVALID_EXT_USER_ID, ResponseMessage.Message.INVALID_EXT_USER_ID), + externalIdNotFound( + ResponseMessage.Key.EXTERNALID_NOT_FOUND, ResponseMessage.Message.EXTERNALID_NOT_FOUND), + externalIdAssignedToOtherUser( + ResponseMessage.Key.EXTERNALID_ASSIGNED_TO_OTHER_USER, + ResponseMessage.Message.EXTERNALID_ASSIGNED_TO_OTHER_USER), + duplicateExternalIds( + ResponseMessage.Key.DUPLICATE_EXTERNAL_IDS, ResponseMessage.Message.DUPLICATE_EXTERNAL_IDS), + emailANDUserNameAlreadyExistError( + ResponseMessage.Key.USERNAME_EMAIL_IN_USE, ResponseMessage.Message.USERNAME_EMAIL_IN_USE), + userNameCanntBeUpdated( + ResponseMessage.Key.USERNAME_CANNOT_BE_UPDATED, + ResponseMessage.Message.USERNAME_CANNOT_BE_UPDATED), + newPasswordRequired( + ResponseMessage.Key.CONFIIRM_PASSWORD_MISSING, + ResponseMessage.Message.CONFIIRM_PASSWORD_MISSING), + newPasswordEmpty( + ResponseMessage.Key.CONFIIRM_PASSWORD_EMPTY, ResponseMessage.Message.CONFIIRM_PASSWORD_EMPTY), + samePasswordError( + ResponseMessage.Key.SAME_PASSWORD_ERROR, ResponseMessage.Message.SAME_PASSWORD_ERROR), + emailVerifiedError( + ResponseMessage.Key.EMAIL_VERIFY_ERROR, ResponseMessage.Message.EMAIL_VERIFY_ERROR), + phoneVerifiedError( + ResponseMessage.Key.PHONE_VERIFY_ERROR, ResponseMessage.Message.PHONE_VERIFY_ERROR), + loginTypeRequired( + ResponseMessage.Key.LOGIN_TYPE_MISSING, ResponseMessage.Message.LOGIN_TYPE_MISSING), + loginTypeError(ResponseMessage.Key.LOGIN_TYPE_ERROR, ResponseMessage.Message.LOGIN_TYPE_ERROR), + loginIdRequired(ResponseMessage.Key.LOGIN_ID_MISSING, ResponseMessage.Message.LOGIN_ID_MISSING), + userNameOrUserIdRequired( + ResponseMessage.Key.USERNAME_USERID_MISSING, ResponseMessage.Message.USERNAME_USERID_MISSING), + usernameOrUserIdError( + ResponseMessage.Key.USER_NAME_OR_ID_ERROR, ResponseMessage.Message.USER_NAME_OR_ID_ERROR), + rolesRequired(ResponseMessage.Key.ROLES_MISSING, ResponseMessage.Message.ROLES_MISSING), + roleRequired(ResponseMessage.Key.ROLE_MISSING, ResponseMessage.Message.ROLE_MISSING), + emptyRolesProvided( + ResponseMessage.Key.EMPTY_ROLES_PROVIDED, ResponseMessage.Message.EMPTY_ROLES_PROVIDED), + visibilityInvalid( + ResponseMessage.Key.INVALID_VISIBILITY_REQUEST, + ResponseMessage.Message.INVALID_VISIBILITY_REQUEST), + addressRequired( + ResponseMessage.Key.ADDRESS_REQUIRED_ERROR, ResponseMessage.Message.ADDRESS_REQUIRED_ERROR), + educationRequired( + ResponseMessage.Key.EDUCATION_REQUIRED_ERROR, + ResponseMessage.Message.EDUCATION_REQUIRED_ERROR), + jobDetailsRequired( + ResponseMessage.Key.JOBDETAILS_REQUIRED_ERROR, + ResponseMessage.Message.JOBDETAILS_REQUIRED_ERROR), + addressError(ResponseMessage.Key.ADDRESS_ERROR, ResponseMessage.Message.ADDRESS_ERROR), + addressTypeError( + ResponseMessage.Key.ADDRESS_TYPE_ERROR, ResponseMessage.Message.ADDRESS_TYPE_ERROR), + educationNameError( + ResponseMessage.Key.NAME_OF_INSTITUTION_ERROR, + ResponseMessage.Message.NAME_OF_INSTITUTION_ERROR), + educationDegreeError( + ResponseMessage.Key.EDUCATION_DEGREE_ERROR, ResponseMessage.Message.EDUCATION_DEGREE_ERROR), + jobNameError(ResponseMessage.Key.JOB_NAME_ERROR, ResponseMessage.Message.JOB_NAME_ERROR), + invalidUsrData(ResponseMessage.Key.INVALID_USR_DATA, ResponseMessage.Message.INVALID_USR_DATA), + usrValidationError( + ResponseMessage.Key.USR_DATA_VALIDATION_ERROR, + ResponseMessage.Message.USR_DATA_VALIDATION_ERROR), + invalidUsrOrgData( + ResponseMessage.Key.INVALID_USR_ORG_DATA, ResponseMessage.Message.INVALID_USR_ORG_DATA), + userNotAssociatedToOrg( + ResponseMessage.Key.USER_NOT_BELONGS_TO_ANY_ORG, + ResponseMessage.Message.USER_NOT_BELONGS_TO_ANY_ORG), + userOrgAssociationError( + ResponseMessage.Key.USER_ORG_ASSOCIATION_ERROR, + ResponseMessage.Message.USER_ORG_ASSOCIATION_ERROR), + errorUserHasNotCreatedAnyCourse( + ResponseMessage.Key.ERROR_USER_HAS_NOT_CREATED_ANY_COURSE, + ResponseMessage.Message.ERROR_USER_HAS_NOT_CREATED_ANY_COURSE), + userNotAssociatedToRootOrg( + ResponseMessage.Key.USER_NOT_ASSOCIATED_TO_ROOT_ORG, + ResponseMessage.Message.USER_NOT_ASSOCIATED_TO_ROOT_ORG), + invalidCredentials( + ResponseMessage.Key.INVALID_CREDENTIAL, ResponseMessage.Message.INVALID_CREDENTIAL), + cannotTransferOwnership( + ResponseMessage.Key.CANNOT_TRANSFER_OWNERSHIP, + ResponseMessage.Message.CANNOT_TRANSFER_OWNERSHIP), + emailFormatError(ResponseMessage.Key.EMAIL_FORMAT, ResponseMessage.Message.EMAIL_FORMAT), + urlFormatError(ResponseMessage.Key.URL_FORMAT_ERROR, ResponseMessage.Message.URL_FORMAT_ERROR), + languageRequired(ResponseMessage.Key.LANGUAGE_MISSING, ResponseMessage.Message.LANGUAGE_MISSING), + timeStampRequired( + ResponseMessage.Key.TIMESTAMP_REQUIRED, ResponseMessage.Message.TIMESTAMP_REQUIRED), + phoneNoFormatError( + ResponseMessage.Key.INVALID_PHONE_NO_FORMAT, ResponseMessage.Message.INVALID_PHONE_NO_FORMAT), + invalidPhoneNumber( + ResponseMessage.Key.INVALID_PHONE_NUMBER, ResponseMessage.Message.INVALID_PHONE_NUMBER), + invalidCountryCode( + ResponseMessage.Key.INVALID_COUNTRY_CODE, ResponseMessage.Message.INVALID_COUNTRY_CODE), + emailorPhoneRequired( + ResponseMessage.Key.EMAIL_OR_PHONE_MISSING, ResponseMessage.Message.EMAIL_OR_PHONE_MISSING), + accountNotFound(ResponseMessage.Key.ACCOUNT_NOT_FOUND, ResponseMessage.Message.ACCOUNT_NOT_FOUND), + fromAccountIdRequired( + ResponseMessage.Key.FROM_ACCOUNT_ID_MISSING, ResponseMessage.Message.FROM_ACCOUNT_ID_MISSING), + toAccountIdRequired( + ResponseMessage.Key.TO_ACCOUNT_ID_MISSING, ResponseMessage.Message.TO_ACCOUNT_ID_MISSING), + fromAccountIdNotExists( + ResponseMessage.Key.FROM_ACCOUNT_ID_NOT_EXISTS, + ResponseMessage.Message.FROM_ACCOUNT_ID_NOT_EXISTS), + + // ------------------------------------------------------------------------- + // Organization Management + // ------------------------------------------------------------------------- + orgDoesNotExist(ResponseMessage.Key.ORG_NOT_EXIST, ResponseMessage.Message.ORG_NOT_EXIST), + invalidOrgData(ResponseMessage.Key.INVALID_ORG_DATA, ResponseMessage.Message.INVALID_ORG_DATA), + organisationIdRequiredError( + ResponseMessage.Key.ORGANISATION_ID_MISSING, ResponseMessage.Message.ORGANISATION_ID_MISSING), + orgIdRequired(ResponseMessage.Key.ORG_ID_MISSING, ResponseMessage.Message.ORG_ID_MISSING), + organisationNameRequired( + ResponseMessage.Key.ORGANISATION_NAME_MISSING, + ResponseMessage.Message.ORGANISATION_NAME_MISSING), + organisationNameError( + ResponseMessage.Key.NAME_OF_ORGANISATION_ERROR, + ResponseMessage.Message.NAME_OF_ORGANISATION_ERROR), + rootOrgIdRequired( + ResponseMessage.Key.ROOT_ORG_ID_REQUIRED, ResponseMessage.Message.ROOT_ORG_ID_REQUIRED), + sourceAndExternalIdValidationError( + ResponseMessage.Key.REQUIRED_DATA_ORG_MISSING, + ResponseMessage.Message.REQUIRED_DATA_ORG_MISSING), + invalidRootOrganisationId( + ResponseMessage.Key.INVALID_ROOT_ORGANIZATION, + ResponseMessage.Message.INVALID_ROOT_ORGANIZATION), + invalidParentId( + ResponseMessage.Key.INVALID_PARENT_ORGANIZATION_ID, + ResponseMessage.Message.INVALID_PARENT_ORGANIZATION_ID), + parentCodeAndIdValidationError( + ResponseMessage.Key.PARENT_CODE_AND_PARENT_ID_MISSING, + ResponseMessage.Message.PARENT_CODE_AND_PARENT_ID_MISSING), + invalidOrgId(ResponseMessage.Key.INVALID_ORG_ID, ResponseMessage.Key.INVALID_ORG_ID), + invalidOrgStatus(ResponseMessage.Key.INVALID_ORG_STATUS, ResponseMessage.Key.INVALID_ORG_STATUS), + invalidOrgStatusTransition( + ResponseMessage.Key.INVALID_ORG_STATUS_TRANSITION, + ResponseMessage.Key.INVALID_ORG_STATUS_TRANSITION), + orgTypeMandatory( + ResponseMessage.Key.ORG_TYPE_MANDATORY, ResponseMessage.Message.ORG_TYPE_MANDATORY), + orgTypeAlreadyExist( + ResponseMessage.Key.ORG_TYPE_ALREADY_EXIST, ResponseMessage.Message.ORG_TYPE_ALREADY_EXIST), + orgTypeIdRequired( + ResponseMessage.Key.ORG_TYPE_ID_REQUIRED_ERROR, + ResponseMessage.Message.ORG_TYPE_ID_REQUIRED_ERROR), + invalidOrgTypeId( + ResponseMessage.Key.INVALID_ORG_TYPE_ID_ERROR, + ResponseMessage.Message.INVALID_ORG_TYPE_ID_ERROR), + invalidOrgType( + ResponseMessage.Key.INVALID_ORG_TYPE_ERROR, ResponseMessage.Message.INVALID_ORG_TYPE_ERROR), + errorInactiveOrg( + ResponseMessage.Key.ERROR_INACTIVE_ORG, ResponseMessage.Message.ERROR_INACTIVE_ORG), + errorNoRootOrgAssociated( + ResponseMessage.Key.ERROR_NO_ROOT_ORG_ASSOCIATED, + ResponseMessage.Message.ERROR_NO_ROOT_ORG_ASSOCIATED), + errorInactiveCustodianOrg( + ResponseMessage.Key.ERROR_INACTIVE_CUSTODIAN_ORG, + ResponseMessage.Message.ERROR_INACTIVE_CUSTODIAN_ORG), + rootOrgAssociationError( + ResponseMessage.Key.ROOT_ORG_ASSOCIATION_ERROR, + ResponseMessage.Message.ROOT_ORG_ASSOCIATION_ERROR), + invalidRootOrgData( + ResponseMessage.Key.INVALID_ROOT_ORG_DATA, ResponseMessage.Message.INVALID_ROOT_ORG_DATA), + channelUniquenessInvalid( + ResponseMessage.Key.CHANNEL_SHOULD_BE_UNIQUE, + ResponseMessage.Message.CHANNEL_SHOULD_BE_UNIQUE), + invalidChannel(ResponseMessage.Key.INVALID_CHANNEL, ResponseMessage.Message.INVALID_CHANNEL), + channelRegFailed( + ResponseMessage.Key.CHANNEL_REG_FAILED, ResponseMessage.Message.CHANNEL_REG_FAILED), + slugIsNotUnique( + ResponseMessage.Key.SLUG_IS_NOT_UNIQUE, ResponseMessage.Message.SLUG_IS_NOT_UNIQUE), + slugRequired(ResponseMessage.Key.SLUG_REQUIRED, ResponseMessage.Message.SLUG_REQUIRED), + conflictingOrgLocations( + ResponseMessage.Key.CONFLICTING_ORG_LOCATIONS, + ResponseMessage.Message.CONFLICTING_ORG_LOCATIONS), + invalidLocationId( + ResponseMessage.Key.INVALID_LOCATION_ID, ResponseMessage.Message.INVALID_LOCATION_ID), + locationIdRequired( + ResponseMessage.Key.LOCATION_ID_REQUIRED, ResponseMessage.Message.LOCATION_ID_REQUIRED), + locationTypeRequired( + ResponseMessage.Key.LOCATION_TYPE_REQUIRED, ResponseMessage.Message.LOCATION_TYPE_REQUIRED), + invalidRequestDataForLocation( + ResponseMessage.Key.INVALID_REQUEST_DATA_FOR_LOCATION, + ResponseMessage.Message.INVALID_REQUEST_DATA_FOR_LOCATION), + invalidLocationDeleteRequest( + ResponseMessage.Key.INVALID_LOCATION_DELETE_REQUEST, + ResponseMessage.Message.INVALID_LOCATION_DELETE_REQUEST), + locationTypeConflicts( + ResponseMessage.Key.LOCATION_TYPE_CONFLICTS, ResponseMessage.Message.LOCATION_TYPE_CONFLICTS), + parentNotAllowed( + ResponseMessage.Key.PARENT_NOT_ALLOWED, ResponseMessage.Message.PARENT_NOT_ALLOWED), + invalidHashTagId( + ResponseMessage.Key.INVALID_HASHTAG_ID, ResponseMessage.Message.INVALID_HASHTAG_ID), + + // ------------------------------------------------------------------------- + // Course & Batch Management + // ------------------------------------------------------------------------- + courseIdRequired( + ResponseMessage.Key.COURSE_ID_MISSING_ERROR, ResponseMessage.Message.COURSE_ID_MISSING_ERROR), + courseIdRequiredError( + ResponseMessage.Key.COURSE_ID_MISSING, ResponseMessage.Message.COURSE_ID_MISSING), + invalidCourseId(ResponseMessage.Key.INVALID_COURSE_ID, ResponseMessage.Message.INVALID_COURSE_ID), + courseNameRequired( + ResponseMessage.Key.COURSE_NAME_MISSING, ResponseMessage.Message.COURSE_NAME_MISSING), + courseDescriptionError( + ResponseMessage.Key.COURSE_DESCRIPTION_MISSING, + ResponseMessage.Message.COURSE_DESCRIPTION_MISSING), + courseVersionRequiredError( + ResponseMessage.Key.COURSE_VERSION_MISSING, ResponseMessage.Message.COURSE_VERSION_MISSING), + courseDurationRequiredError( + ResponseMessage.Key.COURSE_DURATION_MISSING, ResponseMessage.Message.COURSE_DURATION_MISSING), + courseTocUrlError( + ResponseMessage.Key.COURSE_TOCURL_MISSING, ResponseMessage.Message.COURSE_TOCURL_MISSING), + courseCreatedForIsNull( + ResponseMessage.Key.COURSE_CREATED_FOR_NULL, ResponseMessage.Message.COURSE_CREATED_FOR_NULL), + courseBatchIdRequired( + ResponseMessage.Key.COURSE_BATCH_ID_MISSING, ResponseMessage.Message.COURSE_BATCH_ID_MISSING), + invalidCourseBatchId( + ResponseMessage.Key.INVALID_COURSE_BATCH_ID, ResponseMessage.Message.INVALID_COURSE_BATCH_ID), + courseBatchAlreadyCompleted( + ResponseMessage.Key.COURSE_BATCH_ALREADY_COMPLETED, + ResponseMessage.Message.COURSE_BATCH_ALREADY_COMPLETED), + courseBatchEnrollmentDateEnded( + ResponseMessage.Key.COURSE_BATCH_ENROLLMENT_DATE_ENDED, + ResponseMessage.Message.COURSE_BATCH_ENROLLMENT_DATE_ENDED), + courseBatchStartDateRequired( + ResponseMessage.Key.COURSE_BATCH_START_DATE_REQUIRED, + ResponseMessage.Message.COURSE_BATCH_START_DATE_REQUIRED), + courseBatchStartDateError( + ResponseMessage.Key.COURSE_BATCH_START_DATE_INVALID, + ResponseMessage.Message.COURSE_BATCH_START_DATE_INVALID), + courseBatchEndDateError( + ResponseMessage.Key.COURSE_BATCH_END_DATE_ERROR, + ResponseMessage.Message.COURSE_BATCH_END_DATE_ERROR), + BatchCloseError( + ResponseMessage.Key.COURSE_BATCH_IS_CLOSED_ERROR, + ResponseMessage.Message.COURSE_BATCH_IS_CLOSED_ERROR), + courseBatchStartPassedDateError( + ResponseMessage.Key.COURSE_BATCH_START_PASSED_DATE_INVALID, + ResponseMessage.Message.COURSE_BATCH_START_PASSED_DATE_INVALID), + invalidBatchStartDateError( + ResponseMessage.Key.INVALID_BATCH_START_DATE_ERROR, + ResponseMessage.Message.INVALID_BATCH_START_DATE_ERROR), + invalidBatchEndDateError( + ResponseMessage.Key.INVALID_BATCH_END_DATE_ERROR, + ResponseMessage.Message.INVALID_BATCH_END_DATE_ERROR), + multipleCoursesNotAllowedForBatch( + ResponseMessage.Key.MULTIPLE_COURSES_FOR_BATCH, + ResponseMessage.Message.MULTIPLE_COURSES_FOR_BATCH), + invalidCourseCreatorId( + ResponseMessage.Key.INVALID_COURSE_CREATOR_ID, + ResponseMessage.Message.INVALID_COURSE_CREATOR_ID), + enrollmentStartDateRequiredError( + ResponseMessage.Key.ENROLLMENT_START_DATE_MISSING, + ResponseMessage.Message.ENROLLMENT_START_DATE_MISSING), + enrollmentEndDateStartError( + ResponseMessage.Key.ENROLLMENT_END_DATE_START_ERROR, + ResponseMessage.Message.ENROLLMENT_END_DATE_START_ERROR), + enrollmentEndDateEndError( + ResponseMessage.Key.ENROLLMENT_END_DATE_END_ERROR, + ResponseMessage.Message.ENROLLMENT_END_DATE_END_ERROR), + enrollmentEndDateUpdateError( + ResponseMessage.Key.ENROLLMENT_END_DATE_UPDATE_ERROR, + ResponseMessage.Message.ENROLLMENT_END_DATE_UPDATE_ERROR), + enrolmentTypeRequired( + ResponseMessage.Key.ENROLMENT_TYPE_REQUIRED, ResponseMessage.Message.ENROLMENT_TYPE_REQUIRED), + enrolmentIncorrectValue( + ResponseMessage.Key.ENROLMENT_TYPE_VALUE_ERROR, + ResponseMessage.Message.ENROLMENT_TYPE_VALUE_ERROR), + enrollmentTypeValidation( + ResponseMessage.Key.ENROLLMENT_TYPE_VALIDATION, + ResponseMessage.Message.ENROLLMENT_TYPE_VALIDATION), + userAlreadyEnrolledCourse( + ResponseMessage.Key.USER_ALREADY_ENROLLED_COURSE, + ResponseMessage.Message.USER_ALREADY_ENROLLED_COURSE), + userNotEnrolledCourse( + ResponseMessage.Key.USER_NOT_ENROLLED_COURSE, + ResponseMessage.Message.USER_NOT_ENROLLED_COURSE), + userAlreadyCompletedCourse( + ResponseMessage.Key.USER_ALREADY_COMPLETED_COURSE, + ResponseMessage.Message.USER_ALREADY_COMPLETED_COURSE), + endDateError(ResponseMessage.Key.END_DATE_ERROR, ResponseMessage.Message.END_DATE_ERROR), + publishedCourseCanNotBeUpdated( + ResponseMessage.Key.PUBLISHED_COURSE_CAN_NOT_UPDATED, + ResponseMessage.Message.PUBLISHED_COURSE_CAN_NOT_UPDATED), + progressStatusError( + ResponseMessage.Key.INVALID_PROGRESS_STATUS, ResponseMessage.Message.INVALID_PROGRESS_STATUS), + missingData( + ResponseMessage.Key.MISSING_CODE, ResponseMessage.Message.MISSING_MESSAGE), + contentTypeMismatch( + ResponseMessage.Key.CONTENT_TYPE_MISMATCH, ResponseMessage.Message.CONTENT_TYPE_MISMATCH), + mimeTypeMismatch( + ResponseMessage.Key.MIME_TYPE_MISMATCH, ResponseMessage.Message.MIME_TYPE_MISMATCH), + + // ------------------------------------------------------------------------- + // Content & Assessment + // ------------------------------------------------------------------------- + contentIdRequired( + ResponseMessage.Key.CONTENT_ID_MISSING_ERROR, + ResponseMessage.Message.CONTENT_ID_MISSING_ERROR), + contentIdRequiredError( + ResponseMessage.Key.CONTENT_ID_MISSING, ResponseMessage.Message.CONTENT_ID_MISSING), + contentIdError(ResponseMessage.Key.CONTENT_ID_ERROR, ResponseMessage.Message.CONTENT_ID_ERROR), + contentVersionRequiredError( + ResponseMessage.Key.CONTENT_VERSION_MISSING, ResponseMessage.Message.CONTENT_VERSION_MISSING), + versionRequiredError( + ResponseMessage.Key.VERSION_MISSING, ResponseMessage.Message.VERSION_MISSING), + contentStatusRequired( + ResponseMessage.Key.CONTENT_STATUS_MISSING_ERROR, + ResponseMessage.Message.CONTENT_STATUS_MISSING_ERROR), + contentTypeRequiredError( + ResponseMessage.Key.CONTENT_TYPE_ERROR, ResponseMessage.Message.CONTENT_TYPE_ERROR), + assessmentItemIdRequired( + ResponseMessage.Key.ASSESSMENT_ITEM_ID_REQUIRED, + ResponseMessage.Message.ASSESSMENT_ITEM_ID_REQUIRED), + assessmentTypeRequired( + ResponseMessage.Key.ASSESSMENT_TYPE_REQUIRED, + ResponseMessage.Message.ASSESSMENT_TYPE_REQUIRED), + assessmentAttemptDateRequired( + ResponseMessage.Key.ATTEMPTED_DATE_REQUIRED, ResponseMessage.Message.ATTEMPTED_DATE_REQUIRED), + assessmentAnswersRequired( + ResponseMessage.Key.ATTEMPTED_ANSWERS_REQUIRED, + ResponseMessage.Message.ATTEMPTED_ANSWERS_REQUIRED), + assessmentmaxScoreRequired( + ResponseMessage.Key.MAX_SCORE_REQUIRED, ResponseMessage.Message.MAX_SCORE_REQUIRED), + attemptIdRequired( + ResponseMessage.Key.ATTEMPT_ID_MISSING_ERROR, + ResponseMessage.Message.ATTEMPT_ID_MISSING_ERROR), + + // ------------------------------------------------------------------------- + // Badge/Certificates (Issuer, Recipient, Assertion) + // ------------------------------------------------------------------------- + issuerIdRequired( + ResponseMessage.Key.ISSUER_ID_REQUIRED, ResponseMessage.Message.ISSUER_ID_REQUIRED), + invalidIssuerId(ResponseMessage.Key.INVALID_ISSUER_ID, ResponseMessage.Message.INVALID_ISSUER_ID), + recipientIdRequired( + ResponseMessage.Key.RECIPIENT_ID_REQUIRED, ResponseMessage.Message.RECIPIENT_ID_REQUIRED), + recipientTypeRequired( + ResponseMessage.Key.RECIPIENT_TYPE_REQUIRED, ResponseMessage.Message.RECIPIENT_TYPE_REQUIRED), + invalidRecipientType( + ResponseMessage.Key.INVALID_RECIPIENT_TYPE, ResponseMessage.Message.INVALID_RECIPIENT_TYPE), + recipientEmailRequired( + ResponseMessage.Key.RECIPIENT_EMAIL_REQUIRED, + ResponseMessage.Message.RECIPIENT_EMAIL_REQUIRED), + recipientAddressError( + ResponseMessage.Key.RECIPIENT_ADDRESS_ERROR, ResponseMessage.Message.RECIPIENT_ADDRESS_ERROR), + receiverIdMandatory( + ResponseMessage.Key.RECEIVER_ID_ERROR, ResponseMessage.Message.RECEIVER_ID_ERROR), + invalidReceiverId( + ResponseMessage.Key.INVALID_RECEIVER_ID, ResponseMessage.Message.INVALID_RECEIVER_ID), + assertionIdRequired( + ResponseMessage.Key.ASSERTION_ID_REQUIRED, ResponseMessage.Message.ASSERTION_ID_REQUIRED), + evidenceRequired( + ResponseMessage.Key.ASSERTION_EVIDENCE_REQUIRED, + ResponseMessage.Message.ASSERTION_EVIDENCE_REQUIRED), + revocationReasonRequired( + ResponseMessage.Key.REVOCATION_REASON_REQUIRED, + ResponseMessage.Message.REVOCATION_REASON_REQUIRED), + endorsedUserIdRequired( + ResponseMessage.Key.ENDORSED_USER_ID_REQUIRED, + ResponseMessage.Message.ENDORSED_USER_ID_REQUIRED), + canNotEndorse(ResponseMessage.Key.CAN_NOT_ENDORSE, ResponseMessage.Message.CAN_NOT_ENDORSE), + + // ------------------------------------------------------------------------- + // Notifications & Email + // ------------------------------------------------------------------------- + emailSubjectError( + ResponseMessage.Key.EMAIL_SUBJECT_ERROR, ResponseMessage.Message.EMAIL_SUBJECT_ERROR), + emailBodyError(ResponseMessage.Key.EMAIL_BODY_ERROR, ResponseMessage.Message.EMAIL_BODY_ERROR), + emailNotSentRecipientsExceededMaxLimit( + ResponseMessage.Key.EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT, + ResponseMessage.Message.EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT), + emailNotSentRecipientsZero( + ResponseMessage.Key.NO_EMAIL_RECIPIENTS, ResponseMessage.Message.NO_EMAIL_RECIPIENTS), + msgIdRequiredError( + ResponseMessage.Key.MESSAGE_ID_MISSING, ResponseMessage.Message.MESSAGE_ID_MISSING), + invalidNotificationType( + ResponseMessage.Key.INVALID_NOTIFICATION_TYPE, + ResponseMessage.Message.INVALID_NOTIFICATION_TYPE), + notificationTypeSupport( + ResponseMessage.Key.INVALID_NOTIFICATION_TYPE_SUPPORT, + ResponseMessage.Message.INVALID_NOTIFICATION_TYPE_SUPPORT), + invalidTopic(ResponseMessage.Key.INVALID_TOPIC_NAME, ResponseMessage.Message.INVALID_TOPIC_NAME), + invalidTopicData( + ResponseMessage.Key.INVALID_TOPIC_DATA, ResponseMessage.Message.INVALID_TOPIC_DATA), + + // ------------------------------------------------------------------------- + // System, Config & Infrastructure + // ------------------------------------------------------------------------- + errorInvalidConfigParamValue( + ResponseMessage.Key.ERROR_INVALID_CONFIG_PARAM_VALUE, + ResponseMessage.Message.ERROR_INVALID_CONFIG_PARAM_VALUE), + errorConfigLoadEmptyString( + ResponseMessage.Key.ERROR_CONFIG_LOAD_EMPTY_STRING, + ResponseMessage.Message.ERROR_CONFIG_LOAD_EMPTY_STRING), + errorConfigLoadParseString( + ResponseMessage.Key.ERROR_CONFIG_LOAD_PARSE_STRING, + ResponseMessage.Message.ERROR_CONFIG_LOAD_PARSE_STRING), + errorConfigLoadEmptyConfig( + ResponseMessage.Key.ERROR_CONFIG_LOAD_EMPTY_CONFIG, + ResponseMessage.Message.ERROR_CONFIG_LOAD_EMPTY_CONFIG), + errorConflictingFieldConfiguration( + ResponseMessage.Key.ERROR_CONFLICTING_FIELD_CONFIGURATION, + ResponseMessage.Message.ERROR_CONFLICTING_FIELD_CONFIGURATION), + mandatoryConfigParamMissing( + ResponseMessage.Key.MANDATORY_CONFIG_PARAMETER_MISSING, + ResponseMessage.Message.MANDATORY_CONFIG_PARAMETER_MISSING), + errorLoadConfig(ResponseMessage.Key.ERROR_LOAD_CONFIG, ResponseMessage.Message.ERROR_LOAD_CONFIG), + errorSystemSettingNotFound( + ResponseMessage.Key.ERROR_SYSTEM_SETTING_NOT_FOUND, + ResponseMessage.Message.ERROR_SYSTEM_SETTING_NOT_FOUND), + errorUpdateSettingNotAllowed( + ResponseMessage.Key.ERROR_UPDATE_SETTING_NOT_ALLOWED, + ResponseMessage.Message.ERROR_UPDATE_SETTING_NOT_ALLOWED), + dbInsertionError( + ResponseMessage.Key.DB_INSERTION_FAIL, ResponseMessage.Message.DB_INSERTION_FAIL), + dbUpdateError(ResponseMessage.Key.DB_UPDATE_FAIL, ResponseMessage.Message.DB_UPDATE_FAIL), + esError(ResponseMessage.Key.ES_ERROR, ResponseMessage.Message.ES_ERROR), + esUpdateFailed(ResponseMessage.Key.ES_UPDATE_FAILED, ResponseMessage.Message.ES_UPDATE_FAILED), + unableToConnect( + ResponseMessage.Key.UNABLE_TO_CONNECT_TO_EKSTEP, + ResponseMessage.Message.UNABLE_TO_CONNECT_TO_EKSTEP), + unableToConnectToES( + ResponseMessage.Key.UNABLE_TO_CONNECT_TO_ES, ResponseMessage.Message.UNABLE_TO_CONNECT_TO_ES), + unableToCommunicateWithActor( + ResponseMessage.Key.UNABLE_TO_COMMUNICATE_WITH_ACTOR, + ResponseMessage.Message.UNABLE_TO_COMMUNICATE_WITH_ACTOR), + actorConnectionError( + ResponseMessage.Key.ACTOR_CONNECTION_ERROR, ResponseMessage.Message.ACTOR_CONNECTION_ERROR), + cassandraConnectionEstablishmentFailed( + ResponseMessage.Key.CASSANDRA_CONNECTION_ESTABLISHMENT_FAILED, + ResponseMessage.Message.CASSANDRA_CONNECTION_ESTABLISHMENT_FAILED), + cloudServiceError( + ResponseMessage.Key.CLOUD_SERVICE_ERROR, ResponseMessage.Message.CLOUD_SERVICE_ERROR), + errorUnsupportedCloudStorage( + ResponseMessage.Key.ERROR_UNSUPPORTED_CLOUD_STORAGE, + ResponseMessage.Message.ERROR_UNSUPPORTED_CLOUD_STORAGE), + storageContainerNameMandatory( + ResponseMessage.Key.STORAGE_CONTAINER_NAME_MANDATORY, + ResponseMessage.Message.STORAGE_CONTAINER_NAME_MANDATORY), + errorGenerateDownloadLink( + ResponseMessage.Key.ERROR_GENERATE_DOWNLOAD_LINK, + ResponseMessage.Message.ERROR_GENERATE_DOWNLOAD_LINK), + errorUnavailableDownloadLink( + ResponseMessage.Key.ERROR_DOWNLOAD_LINK_UNAVAILABLE, + ResponseMessage.Message.ERROR_DOWNLOAD_LINK_UNAVAILABLE), + errorSavingStorageDetails( + ResponseMessage.Key.ERROR_SAVING_STORAGE_DETAILS, + ResponseMessage.Message.ERROR_SAVING_STORAGE_DETAILS), + errorUploadQRCodeCSVfailed( + ResponseMessage.Key.ERROR_UPLOAD_QRCODE_CSV_FAILED, + ResponseMessage.Message.ERROR_UPLOAD_QRCODE_CSV_FAILED), + erroCallGrooupAPI(ResponseMessage.Key.ERR_CALLING_GROUP_API, ResponseMessage.Message.ERR_CALLING_GROUP_API), + + // ------------------------------------------------------------------------- + // Files & Uploads + // ------------------------------------------------------------------------- + csvError(ResponseMessage.Key.INVALID_CSV_FILE, ResponseMessage.Message.INVALID_CSV_FILE), + errorCsvNoDataRows( + ResponseMessage.Key.ERROR_CSV_NO_DATA_ROWS, ResponseMessage.Message.ERROR_CSV_NO_DATA_ROWS), + csvFileEmpty(ResponseMessage.Key.EMPTY_CSV_FILE, ResponseMessage.Message.EMPTY_CSV_FILE), + emptyHeaderLine(ResponseMessage.Key.EMPTY_HEADER_LINE, ResponseMessage.Message.EMPTY_HEADER_LINE), + bulkUserUploadError( + ResponseMessage.Key.BULK_USER_UPLOAD_ERROR, ResponseMessage.Message.BULK_USER_UPLOAD_ERROR), + dataSizeError(ResponseMessage.Key.DATA_SIZE_EXCEEDED, ResponseMessage.Message.DATA_SIZE_EXCEEDED), + errorMaxSizeExceeded( + ResponseMessage.Key.ERROR_MAX_SIZE_EXCEEDED, ResponseMessage.Message.ERROR_MAX_SIZE_EXCEEDED), + missingFileAttachment( + ResponseMessage.Key.MISSING_FILE_ATTACHMENT, ResponseMessage.Message.MISSING_FILE_ATTACHMENT), + invalidFileExtension( + ResponseMessage.Key.INVALID_FILE_EXTENSION, ResponseMessage.Message.INVALID_FILE_EXTENSION), + emptyFile(ResponseMessage.Key.EMPTY_FILE, ResponseMessage.Message.EMPTY_FILE), + fileAttachmentSizeNotConfigured( + ResponseMessage.Key.FILE_ATTACHMENT_SIZE_NOT_CONFIGURED, + ResponseMessage.Message.FILE_ATTACHMENT_SIZE_NOT_CONFIGURED), + errorCreatingFile( + ResponseMessage.Key.ERROR_CREATING_FILE, ResponseMessage.Message.ERROR_CREATING_FILE), + errorProcessingFile( + ResponseMessage.Key.ERROR_PROCESSING_FILE, ResponseMessage.Message.ERROR_PROCESSING_FILE), + errorProcessingRequest( + ResponseMessage.Key.ERROR_PROCESSING_REQUEST, + ResponseMessage.Message.ERROR_PROCESSING_REQUEST), + + // ------------------------------------------------------------------------- + // Miscellaneous + // ------------------------------------------------------------------------- + pageNameRequired( + ResponseMessage.Key.PAGE_NAME_REQUIRED, ResponseMessage.Message.PAGE_NAME_REQUIRED), + pageIdRequired(ResponseMessage.Key.PAGE_ID_REQUIRED, ResponseMessage.Message.PAGE_ID_REQUIRED), + pageAlreadyExist( + ResponseMessage.Key.PAGE_ALREADY_EXIST, ResponseMessage.Message.PAGE_ALREADY_EXIST), + pageDoesNotExist(ResponseMessage.Key.PAGE_NOT_EXIST, ResponseMessage.Message.PAGE_NOT_EXIST), + invalidPageSource( + ResponseMessage.Key.INVALID_PAGE_SOURCE, ResponseMessage.Message.INVALID_PAGE_SOURCE), + sectionNameRequired( + ResponseMessage.Key.SECTION_NAME_MISSING, ResponseMessage.Message.SECTION_NAME_MISSING), + sectionDataTypeRequired( + ResponseMessage.Key.SECTION_DATA_TYPE_MISSING, + ResponseMessage.Message.SECTION_DATA_TYPE_MISSING), + sectionIdRequired( + ResponseMessage.Key.SECTION_ID_REQUIRED, ResponseMessage.Message.SECTION_ID_REQUIRED), + sectionDoesNotExist( + ResponseMessage.Key.SECTION_NOT_EXIST, ResponseMessage.Message.SECTION_NOT_EXIST), + errorInvalidPageSection( + ResponseMessage.Key.INVALID_PAGE_SECTION, ResponseMessage.Message.INVALID_PAGE_SECTION), + invalidWebPageData( + ResponseMessage.Key.INVALID_WEBPAGE_DATA, ResponseMessage.Message.INVALID_WEBPAGE_DATA), + invalidMediaType( + ResponseMessage.Key.INVALID_MEDIA_TYPE, ResponseMessage.Message.INVALID_MEDIA_TYPE), + invalidWebPageUrl( + ResponseMessage.Key.INVALID_WEBPAGE_URL, ResponseMessage.Message.INVALID_WEBPAGE_URL), + titleRequired(ResponseMessage.Key.TITLE_REQUIRED, ResponseMessage.Message.TITLE_REQUIRED), + noteRequired(ResponseMessage.Key.NOTE_REQUIRED, ResponseMessage.Message.NOTE_REQUIRED), + invalidNoteId(ResponseMessage.Key.NOTE_ID_INVALID, ResponseMessage.Message.NOTE_ID_INVALID), + invalidTags(ResponseMessage.Key.INVALID_TAGS, ResponseMessage.Message.INVALID_TAGS), + invalidClientName( + ResponseMessage.Key.INVALID_CLIENT_NAME, ResponseMessage.Message.INVALID_CLIENT_NAME), + invalidClientId(ResponseMessage.Key.INVALID_CLIENT_ID, ResponseMessage.Message.INVALID_CLIENT_ID), + tableOrDocNameError( + ResponseMessage.Key.TABLE_OR_DOC_NAME_ERROR, ResponseMessage.Message.TABLE_OR_DOC_NAME_ERROR), + invalidDuplicateValue( + ResponseMessage.Key.INVALID_DUPLICATE_VALUE, ResponseMessage.Message.INVALID_DUPLICATE_VALUE), + errorDuplicateEntry( + ResponseMessage.Key.ERROR_DUPLICATE_ENTRY, ResponseMessage.Message.ERROR_DUPLICATE_ENTRY), + errorDuplicateEntries( + ResponseMessage.Key.ERROR_DUPLICATE_ENTRIES, ResponseMessage.Message.ERROR_DUPLICATE_ENTRIES), + invalidPeriod(ResponseMessage.Key.INVALID_PERIOD, ResponseMessage.Message.INVALID_PERIOD), + invalidDateRange( + ResponseMessage.Key.INVALID_DATE_RANGE, ResponseMessage.Message.INVALID_DATE_RANGE), + cyclicValidationError( + ResponseMessage.Key.CYCLIC_VALIDATION_FAILURE, + ResponseMessage.Message.CYCLIC_VALIDATION_FAILURE), + unupdatableField( + ResponseMessage.Key.UPDATE_NOT_ALLOWED, ResponseMessage.Message.UPDATE_NOT_ALLOWED), + statusCanntBeUpdated( + ResponseMessage.Key.STATUS_CANNOT_BE_UPDATED, + ResponseMessage.Message.STATUS_CANNOT_BE_UPDATED), + updateFailed(ResponseMessage.Key.UPDATE_FAILED, ResponseMessage.Message.UPDATE_FAILED), + InvalidColumnError( + ResponseMessage.Key.INVALID_COLUMN_NAME, ResponseMessage.Message.INVALID_COLUMN_NAME), + invalidColumns(ResponseMessage.Key.INVALID_COLUMNS, ResponseMessage.Message.INVALID_COLUMNS), + requiredHeaderMissing( + ResponseMessage.Key.REQUIRED_HEADER_MISSING, ResponseMessage.Message.REQUIRED_HEADER_MISSING), + mandatoryHeadersMissing( + ResponseMessage.Key.MANDATORY_HEADER_MISSING, + ResponseMessage.Message.MANDATORY_HEADER_MISSING), + mandatoryHeaderParamsMissing( + ResponseMessage.Key.MANDATORY_HEADER_PARAMETER_MISSING, + ResponseMessage.Message.MANDATORY_HEADER_PARAMETER_MISSING), + invalidRequestParameter( + ResponseMessage.Key.INVALID_REQUEST_PARAMETER, + ResponseMessage.Message.INVALID_REQUEST_PARAMETER), + dependentParameterMissing( + ResponseMessage.Key.DEPENDENT_PARAMETER_MISSING, + ResponseMessage.Message.DEPENDENT_PARAMETER_MISSING), + dependentParamsMissing( + ResponseMessage.Key.DEPENDENT_PARAMETER_MISSING, + ResponseMessage.Message.DEPENDENT_PARAMS_MISSING), + commonAttributeMismatch( + ResponseMessage.Key.COMMON_ATTRIBUTE_MISMATCH, + ResponseMessage.Message.COMMON_ATTRIBUTE_MISMATCH), + errorAttributeConflict( + ResponseMessage.Key.ERROR_ATTRIBUTE_CONFLICT, + ResponseMessage.Message.ERROR_ATTRIBUTE_CONFLICT), + sourceRequired(ResponseMessage.Key.SOURCE_MISSING, ResponseMessage.Message.SOURCE_MISSING), + invaidConfiguration( + ResponseMessage.Key.INVALID_CONFIGURATION, ResponseMessage.Message.INVALID_CONFIGURATION), + invalidProcessId( + ResponseMessage.Key.INVALID_PROCESS_ID, ResponseMessage.Message.INVALID_PROCESS_ID), + invalidTypeValue(ResponseMessage.Key.INVALID_TYPE_VALUE, ResponseMessage.Key.INVALID_TYPE_VALUE), + errorNoFrameworkFound( + ResponseMessage.Key.ERROR_NO_FRAMEWORK_FOUND, + ResponseMessage.Message.ERROR_NO_FRAMEWORK_FOUND), + eventsRequired( + ResponseMessage.Key.EVENTS_DATA_MISSING, ResponseMessage.Message.EVENTS_DATA_MISSING), + groupIdMismatch(ResponseMessage.Key.GROUP_ID_MISSING, ResponseMessage.Message.GROUP_ID_MISSING), + activityIdMismatch(ResponseMessage.Key.ACTIVITY_ID_MISSING, ResponseMessage.Message.ACTIVITY_ID_MISSING), + activityTypeMismatch(ResponseMessage.Key.ACTIVITY_TYPE_MISSING, ResponseMessage.Message.ACTIVITY_TYPE_MISSING), + errorNoDialcodesLinked( + ResponseMessage.Key.ERROR_NO_DIALCODES_LINKED, + ResponseMessage.Message.ERROR_NO_DIALCODES_LINKED), + errorUnsupportedField( + ResponseMessage.Key.ERROR_UNSUPPORTED_FIELD, ResponseMessage.Message.ERROR_UNSUPPORTED_FIELD), + + // ------------------------------------------------------------------------- + // JSON Transform (Registry) + // ------------------------------------------------------------------------- + errorJsonTransformInvalidTypeConfig( + ResponseMessage.Key.ERROR_JSON_TRANSFORM_INVALID_TYPE_CONFIG, + ResponseMessage.Message.ERROR_JSON_TRANSFORM_INVALID_TYPE_CONFIG), + errorJsonTransformInvalidDateFormat( + ResponseMessage.Key.ERROR_JSON_TRANSFORM_INVALID_DATE_FORMAT, + ResponseMessage.Message.ERROR_JSON_TRANSFORM_INVALID_DATE_FORMAT), + errorJsonTransformInvalidInput( + ResponseMessage.Key.ERROR_JSON_TRANSFORM_INVALID_INPUT, + ResponseMessage.Message.ERROR_JSON_TRANSFORM_INVALID_INPUT), + errorJsonTransformInvalidEnumInput( + ResponseMessage.Key.ERROR_JSON_TRANSFORM_INVALID_ENUM_INPUT, + ResponseMessage.Message.ERROR_JSON_TRANSFORM_INVALID_ENUM_INPUT), + errorJsonTransformEnumValuesEmpty( + ResponseMessage.Key.ERROR_JSON_TRANSFORM_ENUM_VALUES_EMPTY, + ResponseMessage.Message.ERROR_JSON_TRANSFORM_ENUM_VALUES_EMPTY), + errorJsonTransformBasicConfigMissing( + ResponseMessage.Key.ERROR_JSON_TRANSFORM_BASIC_CONFIG_MISSING, + ResponseMessage.Message.ERROR_JSON_TRANSFORM_BASIC_CONFIG_MISSING), + errorJsonTransformInvalidFilterConfig( + ResponseMessage.Key.ERROR_JSON_TRANSFORM_INVALID_FILTER_CONFIG, + ResponseMessage.Message.ERROR_JSON_TRANSFORM_INVALID_FILTER_CONFIG), + errorRegistryClientCreation( + ResponseMessage.Key.ERROR_REGISTRY_CLIENT_CREATION, + ResponseMessage.Message.ERROR_REGISTRY_CLIENT_CREATION), + errorRegistryAddEntity( + ResponseMessage.Key.ERROR_REGISTRY_ADD_ENTITY, + ResponseMessage.Message.ERROR_REGISTRY_ADD_ENTITY), + errorRegistryReadEntity( + ResponseMessage.Key.ERROR_REGISTRY_READ_ENTITY, + ResponseMessage.Message.ERROR_REGISTRY_READ_ENTITY), + errorRegistryUpdateEntity( + ResponseMessage.Key.ERROR_REGISTRY_UPDATE_ENTITY, + ResponseMessage.Message.ERROR_REGISTRY_UPDATE_ENTITY), + errorRegistryDeleteEntity( + ResponseMessage.Key.ERROR_REGISTRY_DELETE_ENTITY, + ResponseMessage.Message.ERROR_REGISTRY_DELETE_ENTITY), + errorRegistryParseResponse( + ResponseMessage.Key.ERROR_REGISTRY_PARSE_RESPONSE, + ResponseMessage.Message.ERROR_REGISTRY_PARSE_RESPONSE), + errorRegistryEntityTypeBlank( + ResponseMessage.Key.ERROR_REGISTRY_ENTITY_TYPE_BLANK, + ResponseMessage.Message.ERROR_REGISTRY_ENTITY_TYPE_BLANK), + errorRegistryEntityIdBlank( + ResponseMessage.Key.ERROR_REGISTRY_ENTITY_ID_BLANK, + ResponseMessage.Message.ERROR_REGISTRY_ENTITY_ID_BLANK), + errorRegistryAccessTokenBlank( + ResponseMessage.Key.ERROR_REGISTRY_ACCESS_TOKEN_BLANK, + ResponseMessage.Message.ERROR_REGISTRY_ACCESS_TOKEN_BLANK), + invalidDuplicateValueInList( + ResponseMessage.Key.INVALID_DUPLICATE_VALUE, ResponseMessage.Message.INVALID_DUPLICATE_VALUE), + + // ------------------------------------------------------------------------- + // HTTP Status Codes & System Codes + // ------------------------------------------------------------------------- + OK(200), + SUCCESS(200), + CLIENT_ERROR(400), + SERVER_ERROR(500), + ERROR(ResponseMessage.Key.ERR_CALLING_EXHAUST_API, ResponseMessage.Message.ERR_CALLING_EXHAUST_API), + RESOURCE_NOT_FOUND(404), + UNAUTHORIZED(401), + FORBIDDEN(403), + REDIRECTION_REQUIRED(302), + TOO_MANY_REQUESTS(429), + SERVICE_UNAVAILABLE(503), + PARTIAL_SUCCESS_RESPONSE(206), + sizeLimitExceed(ResponseMessage.Key.SIZE_LIMIT_EXCEED, ResponseMessage.Message.SIZE_LIMIT_EXCEED), + invalidConsentStatus(ResponseMessage.Key.INVALID_CONSENT_STATUS, ResponseMessage.Message.INVALID_CONSENT_STATUS), + invalidCaptcha(ResponseMessage.Key.INVALID_CAPTCHA, ResponseMessage.Message.INVALID_CAPTCHA), + IM_A_TEAPOT(ResponseMessage.Key.IM_A_TEAPOT, ResponseMessage.Message.IM_A_TEAPOT, 418); + + private int responseCode; + /** error code contains String value */ + private String errorCode; + /** errorMessage contains proper error message. */ + private String errorMessage; + + /** + * Constructor for ResponseCode with errorCode and errorMessage. + * + * @param errorCode String - The unique error code identifier. + * @param errorMessage String - The human-readable error message. + */ + private ResponseCode(String errorCode, String errorMessage) { + this.errorCode = errorCode; + this.errorMessage = errorMessage; + } + + /** + * Constructor for ResponseCode with errorCode, errorMessage, and HTTP responseCode. + * + * @param errorCode String - The unique error code identifier. + * @param errorMessage String - The human-readable error message. + * @param responseCode int - The HTTP status code associated with this error. + */ + private ResponseCode(String errorCode, String errorMessage, int responseCode) { + this.errorCode = errorCode; + this.errorMessage = errorMessage; + this.responseCode = responseCode; + } + + /** + * Constructor for ResponseCode with just HTTP responseCode. + * + * @param responseCode int - The HTTP status code. + */ + ResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + /** + * Gets the error code identifier. + * + * @return String - The error code. + */ + public String getErrorCode() { + return errorCode; + } + + /** + * Sets the error code identifier. + * + * @param errorCode String - The error code to set. + */ + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + /** + * Gets the human-readable error message. + * + * @return String - The error message. + */ + public String getErrorMessage() { + return errorMessage; + } + + /** + * Sets the human-readable error message. + * + * @param errorMessage String - The error message to set. + */ + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + /** + * Gets the HTTP response code. + * + * @return int - The HTTP status code. + */ + public int getResponseCode() { + return responseCode; + } + + /** + * Sets the HTTP response code. + * + * @param responseCode int - The HTTP status code to set. + */ + public void setResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + /** + * Placeholder for retrieving message by error code. Currently returns empty string. + * + * @param errorCode int + * @return String - Empty string. + */ + public String getMessage(int errorCode) { + return ""; + } + + /** + * Retrieves the error message associated with a given error code string. + * + * @param code String - The error code to look up. + * @return String - The corresponding error message, or an empty string if not found. + */ + public static String getResponseMessage(String code) { + if (StringUtils.isBlank(code)) { + return ""; + } + ResponseCode[] responseCodes = ResponseCode.values(); + for (ResponseCode actionState : responseCodes) { + if (actionState.getErrorCode().equals(code)) { + return actionState.getErrorMessage(); + } + } + return ""; + } + + /** + * Maps an integer HTTP status code to a ResponseCode enum. + * If the code is not found or an error occurs, returns SERVER_ERROR. + * + * @param code int - The HTTP status code. + * @return ResponseCode - The matching ResponseCode enum value. + */ + public static ResponseCode getHeaderResponseCode(int code) { + if (code > 0) { + try { + ResponseCode[] arr = ResponseCode.values(); + if (null != arr) { + for (ResponseCode rc : arr) { + if (rc.getResponseCode() == code) return rc; + } + } + } catch (Exception e) { + return ResponseCode.SERVER_ERROR; + } + } + return ResponseCode.SERVER_ERROR; + } + + /** + * Retrieves the ResponseCode enum based on the error code string. + * Handles special cases like "UNAUTHORIZED" mapping to "unAuthorized" enum. + * + * @param errorCode String - The error code string. + * @return ResponseCode - The matching ResponseCode enum, or null if not found. + */ + public static ResponseCode getResponse(String errorCode) { + if (StringUtils.isBlank(errorCode)) { + return null; + } else if (JsonKey.UNAUTHORIZED.equals(errorCode)) { + return ResponseCode.unAuthorized; + } else { + ResponseCode[] responseCodes = ResponseCode.values(); + for (ResponseCode response : responseCodes) { + if (response.getErrorCode().equals(errorCode)) { + return response; + } + } + return null; + } + } + + public static ResponseCode getResponseCodeByCode(int code) { + return getHeaderResponseCode(code); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseMessage.java b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseMessage.java new file mode 100644 index 0000000000..94645db22e --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseMessage.java @@ -0,0 +1,900 @@ +package org.sunbird.response; + +/** + * This interface holds all the response keys and messages, logically grouped by functionality. + * + */ +public interface ResponseMessage { + + interface Message { + + // ------------------------------------------------------------------------- + // Generic / Common Messages + // ------------------------------------------------------------------------- + String SUCCESS_MESSAGE = "Success"; + String INTERNAL_ERROR = "Process failed,please try again later."; + String OPERATION_TIMEOUT = "Request processing taking too long time. Please try again later."; + String INVALID_OPERATION_NAME = + "Operation name is invalid. Please provide a valid operation name"; + String INVALID_REQUESTED_DATA = "Requested data for this operation is not valid."; + String INVALID_DATA = "Incorrect data."; + String DATA_TYPE_ERROR = "Data type of {0} should be {1}."; + String ID_REQUIRED_ERROR = "For deleting a record, Id is required."; + String MANDATORY_PARAMETER_MISSING = "Mandatory parameter {0} is missing."; + String ERROR_MANDATORY_PARAMETER_EMPTY = "Mandatory parameter {0} is empty."; + String INVALID_PARAMETER_VALUE = + "Invalid value {0} for parameter {1}. Please provide a valid value."; + String INVALID_PARAMETER = "Please provide valid {0}."; + String INVALID_REQUEST_PARAMETER = "Invalid request parameter {0}."; + String IDENTIFIER_VALIDATION_FAILED = "Identifier validation failed for {0}."; + String INVALID_VALUE = "Invalid {0}: {1}. Valid values are: {2}."; + String ALREADY_EXISTS = "A {0} with {1} already exists. Please retry with a unique value."; + String RESOURCE_NOT_FOUND = "Requested resource not found"; + String CUSTOM_SERVER_ERROR = "{0}"; + String MAX_ALLOWED_SIZE_LIMIT_EXCEED = "Max allowed size is {0}"; + String UNABLE_TO_PARSE_DATA = "Unable to parse the data"; + String INVALID_JSON = "Unable to process object to JSON/ JSON to Object"; + String NO_DATA = "You have uploaded an empty file. Fill mandatory details and upload the file."; + String INVALID_DATE_FORMAT = + "Invalid Date format . Date format should be : yyyy-MM-dd hh:mm:ss:SSSZ"; + String DATE_FORMAT_ERRROR = "Date format error."; + String INVALID_PROPERTY_ERROR = "Invalid property {0}."; + String INVALID_OBJECT_TYPE = "Invalid Object Type."; + String PROCESS_EXE_TIMEOUT = "PROCESS_EXE_TIMEOUT"; + String DATA_ALREADY_EXIST = "data already exist."; + String SERVICE_UNAVAILABLE = "SERVICE UNAVAILABLE"; + String OR_FORMAT = "{0} or {1}"; + String AND_FORMAT = "{0} and {1}"; + String NOT_SUPPORTED = "Not Supported."; + String ERROR_UNSUPPORTED_FIELD = "Unsupported field {0}."; + String INVALID_ELEMENT_IN_LIST = + "Invalid value supplied for parameter {0}.Supported values are {1}"; + String ERROR_RATE_LIMIT_EXCEEDED = + "Your per {0} rate limit has exceeded. You can retry after some time."; + String INVALID_REQUEST_TIMEOUT = "Invalid request timeout value {0}."; + + // ------------------------------------------------------------------------- + // Authentication & Authorization + // ------------------------------------------------------------------------- + String UNAUTHORIZED_USER = "You are not authorized."; + String INVALID_USER_CREDENTIALS = "Please check your credentials"; + String API_KEY_MISSING_ERROR = "APi key is mandatory."; + String API_KEY_INVALID_ERROR = "APi key is invalid."; + String SESSION_ID_MISSING = "Session id is mandatory."; + String AUTH_TOKEN_MISSING = "Auth token is mandatory."; + String INVALID_AUTH_TOKEN = "Auth token is invalid.Please login again."; + String INVALID_ROLE = "Invalid role value provided in request."; + String INVALID_SALT = "Please provide salt value."; + String KEY_CLOAK_DEFAULT_ERROR = "server error at sso."; + String OTP_VERIFICATION_FAILED = "OTP verification failed. Remaining attempt count is {0}."; + String ERROR_INVALID_OTP = "Invalid OTP."; + String FORBIDDEN = "You are forbidden from accessing specified resource."; + + // ------------------------------------------------------------------------- + // User Management + // ------------------------------------------------------------------------- + String USER_NOT_FOUND = "user not found."; + String USER_ALREADY_EXISTS = "User already exists for given {0}."; + String INVALID_USER_ID = "User Id does not exists in our records"; + String USERID_MISSING = "UserId is mandatory."; + String USERNAME_MISSING = "Username is mandatory."; + String FIRST_NAME_MISSING = "First name is mandatory."; + String EMAIL_MISSING = "Email is mandatory."; + String PHONE_NO_REQUIRED_ERROR = "Phone number is required."; + String PASSWORD_MISSING = "Password is mandatory."; + String INVALID_PASSWORD = + "Password must contain a minimum of 8 characters including numerals, lower and upper case alphabets and special characters"; + String PASSWORD_MIN_LENGHT = "Password should have at least 8 character."; + String PASSWORD_MAX_LENGHT = "Password should not be more than 12 character."; + String USERNAME_IN_USE = "Username already exists."; + String EMAIL_IN_USE = "Email already exists."; + String PHONE_ALREADY_IN_USE = "Phone already in use. Please provide different phone number."; + String USER_ACCOUNT_BLOCKED = "User account has been blocked ."; + String USER_ALREADY_ACTIVE = "User is already active."; + String USER_ALREADY_INACTIVE = "User is already inactive."; + String USER_REG_UNSUCCESSFUL = "User Registration unsuccessful."; + String USER_UPDATE_UNSUCCESSFUL = "User update operation is unsuccessful."; + String USER_PHONE_UPDATE_FAILED = "user phone update is failed."; + String USER_MIGRATION_FAILED = "user is failed to migrate"; + String USER_DATA_ENCRYPTION_ERROR = "Exception Occurred while encrypting user data."; + String INVALID_EXT_USER_ID = "provided ext user id {0} is incorrect"; + String EXTERNALID_NOT_FOUND = + "External ID (id: {0}, idType: {1}, provider: {2}) not found for given user."; + String EXTERNALID_ASSIGNED_TO_OTHER_USER = + "External ID (id: {0}, idType: {1}, provider: {2}) already assigned to another user."; + String DUPLICATE_EXTERNAL_IDS = + "Duplicate external IDs for given idType ({0}) and provider ({1})."; + String USERNAME_EMAIL_IN_USE = + "Username or Email is already in use. Please try with a different Username or Email."; + String USERNAME_CANNOT_BE_UPDATED = "UserName cann't be updated."; + String CONFIIRM_PASSWORD_MISSING = "Confirm password is mandatory."; + String CONFIIRM_PASSWORD_EMPTY = "Confirm password can not be empty."; + String SAME_PASSWORD_ERROR = "New password can't be same as old password."; + String EMAIL_VERIFY_ERROR = "Please provide a verified email in order to create user."; + String PHONE_VERIFY_ERROR = + "Please provide a verified phone number in order to create/update user."; + String LOGIN_TYPE_MISSING = "Login type is required."; + String LOGIN_TYPE_ERROR = "provide login type as null."; + String LOGIN_ID_MISSING = "loginId is required."; + String USER_NAME_OR_ID_ERROR = "Please provide either username or userId."; + String USERNAME_USERID_MISSING = "Please provide either userName or userId."; + String ROLES_MISSING = "user role is required."; + String EMPTY_ROLES_PROVIDED = "Roles cannot be empty."; + String ROLE_MISSING = "Role of the user is required"; + String INVALID_VISIBILITY_REQUEST = "Private and Public fields cannot be same."; + String ADDRESS_REQUIRED_ERROR = "Please provide address."; + String EDUCATION_REQUIRED_ERROR = "Please provide education details."; + String JOBDETAILS_REQUIRED_ERROR = "Please provide job details."; + String ADDRESS_ERROR = "In {0}, {1} is mandatory."; + String ADDRESS_TYPE_ERROR = "Please provide correct address Type."; + String NAME_OF_INSTITUTION_ERROR = "Please provide name of Institution."; + String EDUCATION_DEGREE_ERROR = "Education degree is required."; + String JOB_NAME_ERROR = "Job Name is required."; + String INVALID_USR_DATA = + "Given User Data doesn't exist in our records. Please provide a valid one"; + String USR_DATA_VALIDATION_ERROR = "Please provide valid userId or userName and provider"; + String INVALID_USR_ORG_DATA = + "Given User Data doesn't belongs to this organization. Please provide a valid one."; + String USER_NOT_BELONGS_TO_ANY_ORG = "User does not belongs to any org ."; + String USER_ORG_ASSOCIATION_ERROR = "User is already associated with another organization."; + String ERROR_USER_HAS_NOT_CREATED_ANY_COURSE = + "User hasn't created any course, or may not have a creator role"; + String USER_NOT_ASSOCIATED_TO_ROOT_ORG = + "User (ID = {0}) not associated to course batch creator root org."; + String INVALID_CREDENTIAL = "Invalid credential."; + String EMAIL_FORMAT = "Email is invalid."; + String URL_FORMAT_ERROR = "URL is invalid."; + String LANGUAGE_MISSING = "Language is mandatory."; + String TIMESTAMP_REQUIRED = "TimeStamp is required."; + String INVALID_PHONE_NO_FORMAT = "Please provide a valid phone number."; + String INVALID_PHONE_NUMBER = "Please send Phone and country code seprately."; + String INVALID_COUNTRY_CODE = "Please provide a valid country code."; + String EMAIL_OR_PHONE_MISSING = "Please provide either email or phone."; + String ACCOUNT_NOT_FOUND = "Account not found."; + String FROM_ACCOUNT_ID_MISSING = "From Account id is mandatory."; + String TO_ACCOUNT_ID_MISSING = "To Account id is mandatory."; + String FROM_ACCOUNT_ID_NOT_EXISTS = "From Account id not exists"; + + // ------------------------------------------------------------------------- + // Organization Management + // ------------------------------------------------------------------------- + String ORG_NOT_EXIST = "Requested organisation does not exist."; + String INVALID_ORG_DATA = + "Given Organization Data doesn't exist in our records. Please provide a valid one"; + String ORGANISATION_ID_MISSING = "Organization id is mandatory."; + String ORG_ID_MISSING = "Organization Id required."; + String ORGANISATION_NAME_MISSING = "organization name is mandatory."; + String NAME_OF_ORGANISATION_ERROR = "Organization Name is required."; + String ROOT_ORG_ID_REQUIRED = "Please provide root organisation ID."; + String REQUIRED_DATA_ORG_MISSING = + "Organization Id or Provider with External Id values are required for the operation"; + String INVALID_ROOT_ORGANIZATION = "Root organization id is invalid"; + String INVALID_PARENT_ORGANIZATION_ID = "Parent organization id is invalid"; + String PARENT_CODE_AND_PARENT_ID_MISSING = "Please provide either parentCode or parentId."; + String INVALID_ORG_ID = "Please provide valid location id."; // Note: Check context, might be generic org id + String INVALID_ORG_STATUS = "INVALID_ORG_STATUS"; + String INVALID_ORG_STATUS_TRANSITION = "INVALID_ORG_STATUS_TRANSITION"; + String ORG_TYPE_MANDATORY = "Org Type name is mandatory."; + String ORG_TYPE_ALREADY_EXIST = + "Org type with this name already exist.Please provide some other name."; + String ORG_TYPE_ID_REQUIRED_ERROR = "Org Type Id is required."; + String INVALID_ORG_TYPE_ID_ERROR = "Please provide valid orgTypeId."; + String INVALID_ORG_TYPE_ERROR = "Please provide valid orgType."; + String ERROR_INACTIVE_ORG = "Organisation corresponding to given {0} ({1}) is inactive."; + String ERROR_NO_ROOT_ORG_ASSOCIATED = "Not able to associate with root org"; + String ERROR_INACTIVE_CUSTODIAN_ORG = "Custodian organisation is inactive."; + String ROOT_ORG_ASSOCIATION_ERROR = + "No root organisation found which is associated with given {0}."; + String INVALID_ROOT_ORG_DATA = + "Root org doesn't exist for this Organization Id and channel {0}"; + String CHANNEL_SHOULD_BE_UNIQUE = + "Channel value already used by another organization. Provide different value for channel"; + String INVALID_CHANNEL = "Channel value is invalid."; + String CHANNEL_REG_FAILED = "Channel Registration failed."; + String SLUG_IS_NOT_UNIQUE = + "Please provide different channel value. This channel value already exist."; + String SLUG_REQUIRED = "Slug is required ."; + String CONFLICTING_ORG_LOCATIONS = + "An organisation cannot be associated to two conflicting locations ({0}, {1}) at {2} level. "; + String INVALID_LOCATION_ID = "Please provide valid location id."; + String LOCATION_ID_REQUIRED = "Please provide Location Id."; + String LOCATION_TYPE_REQUIRED = "Location type required."; + String INVALID_REQUEST_DATA_FOR_LOCATION = "{0} field required."; + String INVALID_LOCATION_DELETE_REQUEST = + "One or more locations have a parent reference to given location and hence cannot be deleted."; + String LOCATION_TYPE_CONFLICTS = "Location type conflicts with its parent location type."; + String PARENT_NOT_ALLOWED = "For top level location, {0} is not allowed."; + String INVALID_HASHTAG_ID = + "Please provide different hashTagId.This HashTagId is associated with some other organization."; + + // ------------------------------------------------------------------------- + // Course & Batch Management + // ------------------------------------------------------------------------- + String COURSE_ID_MISSING_ERROR = "Please provide course id."; + String COURSE_ID_MISSING = "Course id is mandatory."; + String INVALID_COURSE_ID = "Course doesnot exist. Please provide a valid course identifier"; + String COURSE_NAME_MISSING = "Please provide the course name."; + String COURSE_DESCRIPTION_MISSING = "Description is mandatory."; + String COURSE_VERSION_MISSING = "Course version is mandatory."; + String COURSE_DURATION_MISSING = "Course duration is mandatory."; + String COURSE_TOCURL_MISSING = "Course tocurl is mandatory."; + String COURSE_CREATED_FOR_NULL = "Batch does not belong to any organization ."; + String COURSE_BATCH_ID_MISSING = "Course batch Id required"; + String INVALID_COURSE_BATCH_ID = "Invalid course batch id "; + String COURSE_BATCH_ALREADY_COMPLETED = "Course batch is already completed."; + String COURSE_BATCH_ENROLLMENT_DATE_ENDED = "Course batch enrollment date has ended."; + String COURSE_BATCH_START_DATE_REQUIRED = "Batch start date is mandatory."; + String COURSE_BATCH_START_DATE_INVALID = + "Batch start date should be either today or future date."; + String COURSE_BATCH_END_DATE_ERROR = "Batch has been closed."; + String COURSE_BATCH_IS_CLOSED_ERROR = "Batch has been closed."; + String COURSE_BATCH_START_PASSED_DATE_INVALID = "This Batch already started."; + String INVALID_BATCH_START_DATE_ERROR = "Please provide valid Start Date."; + String INVALID_BATCH_END_DATE_ERROR = "Please provide valid End Date."; + String MULTIPLE_COURSES_FOR_BATCH = "A batch cannot belong to multiple courses."; + String INVALID_COURSE_CREATOR_ID = "Course creator id does not exist ."; + String ENROLLMENT_START_DATE_MISSING = "Enrollment start date is mandatory."; + String ENROLLMENT_END_DATE_START_ERROR = + "Enrollment End date should be greater than course batch start date."; + String ENROLLMENT_END_DATE_END_ERROR = + "Enrollment End date should be lesser than course batch end date."; + String ENROLLMENT_END_DATE_UPDATE_ERROR = + "Invalid Enrollment End date. Please provide future date."; + String ENROLMENT_TYPE_REQUIRED = "Enrolment type is mandatory."; + String ENROLMENT_TYPE_VALUE_ERROR = "EnrolmentType value must be either open or invite-only."; + String ENROLLMENT_TYPE_VALIDATION = "Enrollment type should be invite-only."; + String USER_ALREADY_ENROLLED_COURSE = "User has already Enrolled this course ."; + String USER_NOT_ENROLLED_COURSE = "User is not enrolled to given course batch."; + String USER_ALREADY_COMPLETED_COURSE = "User already completed given course batch."; + String END_DATE_ERROR = "End date should be greater than start date."; + String PUBLISHED_COURSE_CAN_NOT_UPDATED = "Published course can't be updated."; + String INVALID_PROGRESS_STATUS = + "Progress status value should be NOT_STARTED(0), STARTED(1), COMPLETED(2)."; + String MISSING_MESSAGE = "Required fields for create course are missing. {0}"; + String CONTENT_TYPE_MISMATCH = "Content Type should be Course."; + String MIME_TYPE_MISMATCH = "MimeType should be application/vnd.ekstep.content-collection"; + + // ------------------------------------------------------------------------- + // Content & Assessment + // ------------------------------------------------------------------------- + String CONTENT_ID_MISSING_ERROR = "Please provide content id."; + String CONTENT_ID_MISSING = "Content id is mandatory."; + String CONTENT_ID_ERROR = "Please provide content id or course id"; + String CONTENT_VERSION_MISSING = "Content version is mandatory."; + String VERSION_MISSING = "Version is mandatory."; + String CONTENT_STATUS_MISSING_ERROR = "content status is required ."; + String CONTENT_TYPE_ERROR = "Please add Content-Type header with value application/json"; + String ASSESSMENT_ITEM_ID_REQUIRED = "Assessment item id is required."; + String ASSESSMENT_TYPE_REQUIRED = "Assessment type is required."; + String ATTEMPTED_DATE_REQUIRED = "Attempted data is required."; + String ATTEMPTED_ANSWERS_REQUIRED = "Attempted answers is required."; + String MAX_SCORE_REQUIRED = "Max score is required."; + String ATTEMPT_ID_MISSING_ERROR = "Please provide attempt id."; + + // ------------------------------------------------------------------------- + // Badge/Certificates (Issuer, Recipient, Assertion) + // ------------------------------------------------------------------------- + String ISSUER_ID_REQUIRED = "Please provide issuer ID."; + String INVALID_ISSUER_ID = "Invalid issuer ID."; + String RECIPIENT_ID_REQUIRED = "Please provide a recipient id."; + String RECIPIENT_TYPE_REQUIRED = "Please provide recipient type."; + String INVALID_RECIPIENT_TYPE = "Please provide a valid recipient type."; + String RECIPIENT_EMAIL_REQUIRED = "Please provide recipient email."; + String RECIPIENT_ADDRESS_ERROR = "Please send recipientEmails or recipientUserIds."; + String RECEIVER_ID_ERROR = "Receiver id is mandatory."; + String INVALID_RECEIVER_ID = "Receiver id is invalid."; + String ASSERTION_ID_REQUIRED = "Please provide assertion ID."; + String ASSERTION_EVIDENCE_REQUIRED = "Please provide valid assertion url as an evidence."; + String REVOCATION_REASON_REQUIRED = "Please provide revocation reason."; + String ENDORSED_USER_ID_REQUIRED = " Endorsed user id required ."; + String CAN_NOT_ENDORSE = "Can not endorse since both belong to different orgs ."; + + // ------------------------------------------------------------------------- + // Notifications & Email + // ------------------------------------------------------------------------- + String EMAIL_SUBJECT_ERROR = "Email Subject is mandatory."; + String EMAIL_BODY_ERROR = "Email Body is mandatory."; + String EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT = + "Email notification is not sent as the number of recipients exceeded configured limit ({0})."; + String NO_EMAIL_RECIPIENTS = + "Email notification is not sent as the number of recipients is zero."; + String MESSAGE_ID_MISSING = "Message id is mandatory."; + String INVALID_NOTIFICATION_TYPE = "Please provide a valid notification type."; + String INVALID_NOTIFICATION_TYPE_SUPPORT = "Only notification type FCM is supported."; + String INVALID_TOPIC_NAME = "Please provide a valid toipc."; + String INVALID_TOPIC_DATA = "Please provide valid notification data."; + + // ------------------------------------------------------------------------- + // System, Config & Infrastructure + // ------------------------------------------------------------------------- + String ERROR_INVALID_CONFIG_PARAM_VALUE = "Invalid value {0} for config parameter {1}."; + String ERROR_CONFIG_LOAD_EMPTY_STRING = + "Loading {0} configuration failed as empty string is passed as parameter."; + String ERROR_CONFIG_LOAD_PARSE_STRING = + "Loading {0} configuration failed due to parsing error."; + String ERROR_CONFIG_LOAD_EMPTY_CONFIG = "Loading {0} configuration failed."; + String ERROR_CONFLICTING_FIELD_CONFIGURATION = + "Field {0} in {1} configuration is conflicting in {2} and {3}."; + String MANDATORY_CONFIG_PARAMETER_MISSING = + "Mandatory configuration parameter {0} missing which is required for service startup."; + String ERROR_LOAD_CONFIG = "Loading failed for configuration file {0}."; + String ERROR_SYSTEM_SETTING_NOT_FOUND = "System Setting not found for id: {0}"; + String ERROR_UPDATE_SETTING_NOT_ALLOWED = "Update of system setting {0} is not allowed."; + String DB_INSERTION_FAIL = "DB insert operation failed."; + String DB_UPDATE_FAIL = "Db update operation failed."; + String ES_ERROR = "Something went wrong when processing data for search"; + String ES_UPDATE_FAILED = "Data insertion to ES failed."; + String UNABLE_TO_CONNECT_TO_EKSTEP = "Unable to connect to Ekstep Server"; + String UNABLE_TO_CONNECT_TO_ES = "Unable to connect to Elastic Search"; + String UNABLE_TO_COMMUNICATE_WITH_ACTOR = "Unable to communicate with actor."; + String ACTOR_CONNECTION_ERROR = "Service is not able to connect with actor."; + String CASSANDRA_CONNECTION_ESTABLISHMENT_FAILED = + "Cassandra connection establishment failed in {0} mode."; + String CLOUD_SERVICE_ERROR = "Cloud storage service error."; + String ERROR_UNSUPPORTED_CLOUD_STORAGE = "Unsupported cloud storage type {0}."; + String STORAGE_CONTAINER_NAME_MANDATORY = " Container name can not be null or empty."; + String ERROR_GENERATE_DOWNLOAD_LINK = "Error in generating download link."; + String ERROR_DOWNLOAD_LINK_UNAVAILABLE = "Download link is unavailable."; + String ERROR_SAVING_STORAGE_DETAILS = "Error saving storage details for download link."; + String ERROR_UPLOAD_QRCODE_CSV_FAILED = "Uploading the html file to cloud storage has failed."; + String ERR_CALLING_GROUP_API = "Error while calling group api."; + String ERR_CALLING_EXHAUST_API = "Error while calling exhaust api"; + + // ------------------------------------------------------------------------- + // Files & Uploads + // ------------------------------------------------------------------------- + String INVALID_CSV_FILE = "Please provide valid csv file."; + String ERROR_CSV_NO_DATA_ROWS = "No data rows in CSV."; + String EMPTY_CSV_FILE = "CSV file is Empty."; + String EMPTY_HEADER_LINE = "Missing header line in CSV file."; + String BULK_USER_UPLOAD_ERROR = + "Please provide either organization Id or external Id & provider value."; + String DATA_SIZE_EXCEEDED = "Maximum upload data size should be {0}"; + String ERROR_MAX_SIZE_EXCEEDED = "Size of {0} exceeds max limit {1}"; + String MISSING_FILE_ATTACHMENT = "Missing file attachment."; + String EMPTY_FILE = "Attached file is empty."; + String FILE_ATTACHMENT_SIZE_NOT_CONFIGURED = "File attachment max size is not configured."; + String ERROR_CREATING_FILE = "Error Reading File"; + String ERROR_PROCESSING_FILE = + "Something Went Wrong While Reading File. Please Check The File."; + String ERROR_PROCESSING_REQUEST = "Something went wrong while Processing Request"; + + // ------------------------------------------------------------------------- + // Miscellaneous + // ------------------------------------------------------------------------- + String PAGE_NAME_REQUIRED = "Page name is required."; + String PAGE_ID_REQUIRED = "Page id is required."; + String PAGE_ALREADY_EXIST = "page already exist with this Page Name and Org Code."; + String PAGE_NOT_EXIST = "Requested page does not exist."; + String INVALID_PAGE_SOURCE = "Invalid page source."; + String SECTION_NAME_MISSING = "Section name is required."; + String SECTION_DATA_TYPE_MISSING = "Section data type missing."; + String SECTION_ID_REQUIRED = "Section id is required."; + String SECTION_NOT_EXIST = "Requested section does not exist."; + String INVALID_PAGE_SECTION = "Page section associated with the page is invalid."; + String INVALID_WEBPAGE_DATA = "Invalid webPage data"; + String INVALID_MEDIA_TYPE = "Invalid media type for webPage"; + String INVALID_WEBPAGE_URL = "Invalid URL for {0}."; + String TITLE_REQUIRED = "Title is required"; + String NOTE_REQUIRED = "No data to store for notes"; + String NOTE_ID_INVALID = "Invalid note id"; + String INVALID_TAGS = "Invalid data for tags"; + String INVALID_CLIENT_NAME = "Please provide unique valid client name"; + String INVALID_CLIENT_ID = "Please provide valid client id"; + String TABLE_OR_DOC_NAME_ERROR = "Please provide valid table or documentName."; + String INVALID_DUPLICATE_VALUE = "Values for {0} and {1} cannot be same."; + String ERROR_DUPLICATE_ENTRY = "Value {0} for {1} is already in use."; + String ERROR_DUPLICATE_ENTRIES = "System contains duplicate entry for {0}."; + String INVALID_PERIOD = "Time Period is invalid"; + String INVALID_DATE_RANGE = "Date range should be between 3 Month."; + String CYCLIC_VALIDATION_FAILURE = "The relation cannot be created as it is cyclic"; + String UPDATE_NOT_ALLOWED = "Update of {0} is not allowed."; + String STATUS_CANNOT_BE_UPDATED = "status cann't be updated."; + String UPDATE_FAILED = "Data updation failed due to invalid Request"; + String INVALID_COLUMN_NAME = "Invalid column name."; + String INVALID_COLUMNS = "Invalid column: {0}. Valid columns are: {1}."; + String REQUIRED_HEADER_MISSING = "Required set of header missing: "; + String MANDATORY_HEADER_MISSING = "Mandatory header {0} is missing."; + String MANDATORY_HEADER_PARAMETER_MISSING = "Mandatory header parameter {0} is missing."; + String PARAMETER_MISMATCH = "Mismatch of given parameters: {0}."; + String DEPENDENT_PARAMETER_MISSING = "Missing parameter {0} which is dependent on {1}."; + String DEPENDENT_PARAMS_MISSING = "Missing parameter value in {0}."; + String COMMON_ATTRIBUTE_MISMATCH = "{0} mismatch of {1} and {2}"; + String ERROR_ATTRIBUTE_CONFLICT = "Either pass attribute {0} or {1} but not both."; + String EVENTS_DATA_MISSING = "Events array is mandatory"; + String GROUP_ID_MISSING = "GroupId is mandatory."; + String ACTIVITY_ID_MISSING = "ActivityId is mandatory."; + String ACTIVITY_TYPE_MISSING = "ActivityType is mandatory."; + String ERROR_NO_DIALCODES_LINKED = "No dialcodes are linked to any courses created by user(s)"; + String SOURCE_MISSING = "Source is required."; + String INVALID_CONFIGURATION = "Invalid configuration data."; + String INVALID_PROCESS_ID = "Invalid Process Id."; + String INVALID_TYPE_VALUE = "INVALID_TYPE_VALUE"; + String ERROR_NO_FRAMEWORK_FOUND = "No framework found."; + + // ------------------------------------------------------------------------- + // JSON Transform (Registry) + // ------------------------------------------------------------------------- + String ERROR_JSON_TRANSFORM_INVALID_TYPE_CONFIG = + "JSON transformation failed as invalid type configuration found for field {0}."; + String ERROR_JSON_TRANSFORM_INVALID_DATE_FORMAT = + "JSON transformation failed as invalid date format configuration found for field {0}."; + String ERROR_JSON_TRANSFORM_INVALID_INPUT = + "JSON transformation failed as invalid input provided for field {0}."; + String ERROR_JSON_TRANSFORM_INVALID_ENUM_INPUT = + "JSON transformation failed as invalid enum input provided for field {0}."; + String ERROR_JSON_TRANSFORM_ENUM_VALUES_EMPTY = + "JSON transformation failed as enum values is empty in configuration for field {0}."; + String ERROR_JSON_TRANSFORM_BASIC_CONFIG_MISSING = + "JSON transformation failed as mandatory configuration (toFieldName, fromType or toType) is missing for field {0}."; + String ERROR_JSON_TRANSFORM_INVALID_FILTER_CONFIG = + "JSON transformation failed as invalid filter configuration found for field {0}."; + String ERROR_REGISTRY_CLIENT_CREATION = "Registry client creation failed."; + String ERROR_REGISTRY_ADD_ENTITY = "Registry add entity API failed."; + String ERROR_REGISTRY_READ_ENTITY = "Registry read entity API failed."; + String ERROR_REGISTRY_UPDATE_ENTITY = "Registry update entity API failed."; + String ERROR_REGISTRY_DELETE_ENTITY = "Registry delete entity API failed."; + String ERROR_REGISTRY_PARSE_RESPONSE = "Error while parsing response from registry."; + String ERROR_REGISTRY_ENTITY_TYPE_BLANK = "Request failed as entity type is blank."; + String ERROR_REGISTRY_ENTITY_ID_BLANK = "Request failed as entity id is not provided."; + String ERROR_REGISTRY_ACCESS_TOKEN_BLANK = + "Request failed as user access token is not provided."; + String INVALID_FILE_EXTENSION = "Please provide a valid file. File expected of format: {0}"; + String DATA_FORMAT_ERROR = "Invalid format for given {0}."; + String ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED = "Please provide only email or phone or managed by"; + String MANAGED_BY_NOT_ALLOWED = "managedBy cannot be updated."; + String MANAGED_USER_LIMIT_EXCEEDED = "Managed user creation limit exceeded"; + String USER_TYPE_CONFIG_IS_EMPTY = "userType config is empty for the statecode {0}"; + String ERROR_CONFLICTING_VALUES = "Conflicting values for {0} ({1}) and {2} ({3})."; + String ERROR_CONFLICTING_ROOT_ORG_ID = + "Root organisation channel of uploader user is conflicting with that of specified organisation ID/orgExternalId channel value."; + String ERROR_INVALID_PARAMETER_SIZE = + "Parameter {0} is of invalid size (expected: {1}, actual: {2})."; + String DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED = "Declared user error status is not updated"; + String INVALID_ENCRYPTION_FILE = "Please provide valid public key file."; + String ERROR_PARAM_EXISTS = "{0} already exists"; + String RECOVERY_PARAM_MATCH_EXCEPTION = "{0} could not be same as {1}"; + String INVALID_SECURITY_LEVEL = + "Invalid data security level {0} provided for job {1}. Please provide a valid data security level."; + String INVALID_SECURITY_LEVEL_LOWER = + "Invalid data security level {0} provided for job {1}. Cannot be set lower than the default security level: {2}"; + String MISSING_DEFAULT_SECURITY_LEVEL = + "Default data security policy settings is missing for the job: {0}"; + String INVALID_TENANT_SECURITY_LEVEL_LOWER = + "Tenant level's security {0} cannot be lower than system level's security {1}. Please provide a valid data security level."; + String ERROR_USER_MIGRATION_FAILED = "User migration failed."; + String DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED = + "Declared user validated status is not updated"; + String USER_STATUS_MSG = "User is already {0}."; + String ERROR_USER_UPDATE_PASSWORD = "User is created but password couldn't be updated."; + String EXTENDED_USER_PROFILE_NOT_LOADED = + "Failed to load extendedProfileSchemaConfig from System_Settings table"; + String EXTERNAL_ID_FORMAT = "externalId (id: {0}, idType: {1}, provider: {2})"; + String INACTIVE_USER = "User is Inactive. Please make it active to proceed."; + String ROLE_PROCESSING_INVALID_ORG = "Error while processing assign role. Invalid Organisation Id"; + String CANNOT_DELETE_USER = "User is restricted from deleting account based on roles!"; + String PARAM_NOT_MATCH = "Parameter mismatch."; + String CANNOT_TRANSFER_OWNERSHIP = "Ownership cannot be transferred."; + String SIZE_LIMIT_EXCEED = "Size limit exceeded."; + String INVALID_CONSENT_STATUS = "Invalid consent status."; + String INVALID_CAPTCHA = "Invalid captcha."; + String IM_A_TEAPOT = "I'm a teapot."; + } + + interface Key { + + // ------------------------------------------------------------------------- + // Generic / Common Keys + // ------------------------------------------------------------------------- + String SUCCESS_MESSAGE = "SUCCESS"; + String INTERNAL_ERROR = "INTERNAL_ERROR"; + String OPERATION_TIMEOUT = "PROCESS_EXE_TIMEOUT"; + String INVALID_REQUESTED_DATA = "INVALID_REQUESTED_DATA"; + String INVALID_DATA = "INVALID_DATA"; + String DATA_TYPE_ERROR = "DATA_TYPE_ERROR"; + String ID_REQUIRED_ERROR = "ID_REQUIRED_ERROR"; + String MANDATORY_PARAMETER_MISSING = "MANDATORY_PARAMETER_MISSING"; + String ERROR_MANDATORY_PARAMETER_EMPTY = "ERROR_MANDATORY_PARAMETER_EMPTY"; + String INVALID_PARAMETER_VALUE = "INVALID_PARAMETER_VALUE"; + String INVALID_PARAMETER = "INVALID_PARAMETER"; + String INVALID_REQUEST_PARAMETER = "INVALID_REQUEST_PARAMETER"; + String IDENTIFIER_VALIDATION_FAILED = "IDENTIFIER_VALIDATION_FAILED"; + String INVALID_VALUE = "INVALID_VALUE"; + String ALREADY_EXISTS = "ALREADY_EXISTS"; + String RESOURCE_NOT_FOUND = "RESOURCE_NOT_FOUND"; + String MAX_ALLOWED_SIZE_LIMIT_EXCEED = "MAX_ALLOWED_SIZE_LIMIT_EXCEED"; + String UNABLE_TO_PARSE_DATA = "UNABLE_TO_PARSE_DATA"; + String INVALID_JSON = "INVALID_JSON"; + String NO_DATA = "NO_DATA"; + String INVALID_DATE_FORMAT = "INVALID_DATE_FORMAT"; + String DECLARED_USER_VALIDATED_STATUS_IS_NOT_UPDATED = "0068"; + String USER_STATUS_MSG = "0008"; + String EXTENDED_USER_PROFILE_NOT_LOADED = "0075"; + String INACTIVE_USER = "0073"; + String ROLE_PROCESSING_INVALID_ORG = "0076"; + String CANNOT_DELETE_USER = "0083"; + String DATE_FORMAT_ERRROR = "DATE_FORMAT_ERRROR"; + String INVALID_PROPERTY_ERROR = "INVALID_PROPERTY_ERROR"; + String INVALID_OBJECT_TYPE = "INVALID_OBJECT_TYPE"; + String DATA_ALREADY_EXIST = "DATA_ALREADY_EXIST"; + String SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE"; + String CUSTOM_SERVER_ERROR = "SERVER_ERROR"; + String NOT_SUPPORTED = "NOT_SUPPORTED"; + String ERROR_UNSUPPORTED_FIELD = "ERROR_UNSUPPORTED_FIELD"; + String INVALID_ELEMENT_IN_LIST = "INVALID_ELEMENT_IN_LIST"; + String ERROR_RATE_LIMIT_EXCEEDED = "ERROR_RATE_LIMIT_EXCEEDED"; + String INVALID_REQUEST_TIMEOUT = "INVALID_REQUEST_TIMEOUT"; + String INVALID_OPERATION_NAME = "INVALID_OPERATION_NAME"; + + // ------------------------------------------------------------------------- + // Authentication & Authorization + // ------------------------------------------------------------------------- + String UNAUTHORIZED_USER = "UNAUTHORIZED_USER"; + String INVALID_USER_CREDENTIALS = "INVALID_USER_CREDENTIALS"; + String API_KEY_MISSING_ERROR = "API_KEY_REQUIRED_ERROR"; + String API_KEY_INVALID_ERROR = "API_KEY_INVALID_ERROR"; + String SESSION_ID_MISSING = "SESSION_ID_REQUIRED_ERROR"; + String AUTH_TOKEN_MISSING = "X_Authenticated_Userid_MISSING"; + String INVALID_AUTH_TOKEN = "INVALID_AUTH_TOKEN"; + String INVALID_ROLE = "INVALID_ROLE"; + String INVALID_SALT = "INVALID_SALT"; + String KEY_CLOAK_DEFAULT_ERROR = "KEY_CLOAK_DEFAULT_ERROR"; + String OTP_VERIFICATION_FAILED = "OTP_VERIFICATION_FAILED"; + String ERROR_INVALID_OTP = "ERROR_INVALID_OTP"; + String FORBIDDEN = "FORBIDDEN"; + + // ------------------------------------------------------------------------- + // User Management + // ------------------------------------------------------------------------- + String USER_NOT_FOUND = "USER_NOT_FOUND"; + String USER_ALREADY_EXISTS = "USER_ALREADY_EXISTS"; + String INVALID_USER_ID = "INVALID_USER_ID"; + String USERID_MISSING = "USERID_MISSING"; + String USERNAME_MISSING = "USERNAME_MISSING"; + String FIRST_NAME_MISSING = "FIRST_NAME_REQUIRED_ERROR"; + String EMAIL_MISSING = "EMAIL_ID_REQUIRED_ERROR"; + String PHONE_NO_REQUIRED_ERROR = "PHONE_NO_REQUIRED_ERROR"; + String PASSWORD_MISSING = "PASSWORD_REQUIRED_ERROR"; + String INVALID_PASSWORD = "INVALID_PASSWORD"; + String PASSWORD_MIN_LENGHT = "PASSWORD_MIN_LENGHT_ERROR"; + String PASSWORD_MAX_LENGHT = "PASSWORD_MAX_LENGHT_ERROR"; + String USERNAME_IN_USE = "USERNAME_IN_USE"; + String EMAIL_IN_USE = "EMAIL_IN_USE"; + String PHONE_ALREADY_IN_USE = "PHONE_ALREADY_IN_USE"; + String USER_ACCOUNT_BLOCKED = "USER_ACCOUNT_BLOCKED"; + String USER_ALREADY_ACTIVE = "USER_ALREADY_ACTIVE"; + String USER_ALREADY_INACTIVE = "USER_ALREADY_INACTIVE"; + String USER_REG_UNSUCCESSFUL = "USER_REG_UNSUCCESSFUL"; + String USER_UPDATE_UNSUCCESSFUL = "USER_UPDATE_UNSUCCESSFUL"; + String USER_PHONE_UPDATE_FAILED = "USER_PHONE_UPDATE_FAILED"; + String USER_MIGRATION_FAILED = "USER_MIGRATION_FAILED"; + String USER_DATA_ENCRYPTION_ERROR = "USER_DATA_ENCRYPTION_ERROR"; + String INVALID_EXT_USER_ID = "INVALID_EXT_USER_ID"; + String EXTERNALID_NOT_FOUND = "EXTERNALID_NOT_FOUND"; + String EXTERNALID_ASSIGNED_TO_OTHER_USER = "EXTERNALID_ASSIGNED_TO_OTHER_USER"; + String DUPLICATE_EXTERNAL_IDS = "DUPLICATE_EXTERNAL_IDS"; + String USERNAME_EMAIL_IN_USE = "USERNAME_EMAIL_IN_USE"; + String USERNAME_CANNOT_BE_UPDATED = "USERNAME_CANNOT_BE_UPDATED"; + String CONFIIRM_PASSWORD_MISSING = "CONFIIRM_PASSWORD_MISSING"; + String CONFIIRM_PASSWORD_EMPTY = "CONFIIRM_PASSWORD_EMPTY"; + String SAME_PASSWORD_ERROR = "SAME_PASSWORD_ERROR"; + String EMAIL_VERIFY_ERROR = "EMAIL_VERIFY_ERROR"; + String PHONE_VERIFY_ERROR = "PHONE_VERIFY_ERROR"; + String LOGIN_TYPE_MISSING = "LOGIN_TYPE_MISSING"; + String LOGIN_TYPE_ERROR = "LOGIN_TYPE_ERROR"; + String LOGIN_ID_MISSING = "LOGIN_ID_MISSING"; + String USER_NAME_OR_ID_ERROR = "USER_NAME_OR_ID_ERROR"; + String USERNAME_USERID_MISSING = "USERNAME_USERID_MISSING"; + String ROLES_MISSING = "ROLES_REQUIRED_ERROR"; + String EMPTY_ROLES_PROVIDED = "EMPTY_ROLES_PROVIDED"; + String ROLE_MISSING = "ROLE_MISSING"; + String INVALID_VISIBILITY_REQUEST = "INVALID_VISIBILITY_REQUEST"; + String ADDRESS_REQUIRED_ERROR = "ADDRESS_REQUIRED_ERROR"; + String EDUCATION_REQUIRED_ERROR = "EDUCATION_REQUIRED_ERROR"; + String JOBDETAILS_REQUIRED_ERROR = "JOBDETAILS_REQUIRED_ERROR"; + String ADDRESS_ERROR = "ADDRESS_ERROR"; + String ADDRESS_TYPE_ERROR = "ADDRESS_TYPE_ERROR"; + String NAME_OF_INSTITUTION_ERROR = "NAME_OF_INSTITUTION_ERROR"; + String EDUCATION_DEGREE_ERROR = "EDUCATION_DEGREE_ERROR"; + String JOB_NAME_ERROR = "JOB_NAME_ERROR"; + String INVALID_USR_DATA = "INVALID_USER_DATA"; + String USR_DATA_VALIDATION_ERROR = "USER_DATA_VALIDATION_ERROR"; + String INVALID_USR_ORG_DATA = "INVALID_USR_ORG_DATA"; + String USER_NOT_BELONGS_TO_ANY_ORG = "USER_NOT_BELONGS_TO_ANY_ORG"; + String USER_ORG_ASSOCIATION_ERROR = "USER_ORG_ASSOCIATION_ERROR"; + String ERROR_USER_HAS_NOT_CREATED_ANY_COURSE = "USER_HAS_NOT_CREATED_ANY_COURSE"; + String USER_NOT_ASSOCIATED_TO_ROOT_ORG = "USER_NOT_ASSOCIATED_TO_ROOT_ORG"; + String PARAM_NOT_MATCH = "PARAM_NOT_MATCH"; + String CANNOT_TRANSFER_OWNERSHIP = "CANNOT_TRANSFER_OWNERSHIP"; + String INVALID_CREDENTIAL = "INVALID_CREDENTIAL"; + String EMAIL_FORMAT = "EMAIL_FORMAT_ERROR"; + String URL_FORMAT_ERROR = "URL_FORMAT_ERROR"; + String LANGUAGE_MISSING = "LANGUAGE_REQUIRED_ERROR"; + String TIMESTAMP_REQUIRED = "TIMESTAMP_REQUIRED"; + String INVALID_PHONE_NO_FORMAT = "INVALID_PHONE_NO_FORMAT"; + String INVALID_PHONE_NUMBER = "INVALID_PHONE_NUMBER"; + String INVALID_COUNTRY_CODE = "INVALID_COUNTRY_CODE"; + String EMAIL_OR_PHONE_MISSING = "EMAIL_OR_PHONE_MISSING"; + String ACCOUNT_NOT_FOUND = "ACCOUNT_NOT_FOUND"; + String FROM_ACCOUNT_ID_MISSING = "FROM_ACCOUNT_ID_MISSING"; + String TO_ACCOUNT_ID_MISSING = "TO_ACCOUNT_ID_MISSING"; + String FROM_ACCOUNT_ID_NOT_EXISTS = "FROM_ACCOUNT_ID_NOT_EXISTS"; + + // ------------------------------------------------------------------------- + // Organization Management + // ------------------------------------------------------------------------- + String ORG_NOT_EXIST = "ORG_NOT_EXIST"; + String INVALID_ORG_DATA = "INVALID_ORGANIZATION_DATA"; + String ORGANISATION_ID_MISSING = "ORGANIZATION_ID_MISSING"; + String ORG_ID_MISSING = "ORG_ID_MISSING"; + String ORGANISATION_NAME_MISSING = "ORGANIZATION_NAME_MISSING"; + String NAME_OF_ORGANISATION_ERROR = "NAME_OF_ORGANIZATION_ERROR"; + String ROOT_ORG_ID_REQUIRED = "BADGE_ROOT_ORG_ID_REQUIRED"; + String REQUIRED_DATA_ORG_MISSING = "REQUIRED_DATA_MISSING"; + String INVALID_ROOT_ORGANIZATION = "INVALID ROOT ORGANIZATION"; + String INVALID_PARENT_ORGANIZATION_ID = "INVALID_PARENT_ORGANIZATION_ID"; + String PARENT_CODE_AND_PARENT_ID_MISSING = "PARENT_CODE_AND_PARENT_ID_MISSING"; + String INVALID_ORG_ID = "INVALID_ORG_ID"; + String INVALID_ORG_STATUS = "INVALID_ORG_STATUS"; + String INVALID_ORG_STATUS_TRANSITION = "INVALID_ORG_STATUS_TRANSITION"; + String ORG_TYPE_MANDATORY = "ORG_TYPE_MANDATORY"; + String ORG_TYPE_ALREADY_EXIST = "ORG_TYPE_ALREADY_EXIST"; + String ORG_TYPE_ID_REQUIRED_ERROR = "ORG_TYPE_ID_REQUIRED_ERROR"; + String INVALID_ORG_TYPE_ID_ERROR = "INVALID_ORG_TYPE_ID_ERROR"; + String INVALID_ORG_TYPE_ERROR = "INVALID_ORG_TYPE_ERROR"; + String ERROR_INACTIVE_ORG = "ERROR_INACTIVE_ORG"; + String ERROR_NO_ROOT_ORG_ASSOCIATED = "ERROR_NO_ROOT_ORG_ASSOCIATED"; + String ERROR_INACTIVE_CUSTODIAN_ORG = "ERROR_INACTIVE_CUSTODIAN_ORG"; + String ROOT_ORG_ASSOCIATION_ERROR = "ROOT_ORG_ASSOCIATION_ERROR"; + String INVALID_ROOT_ORG_DATA = "INVALID_ROOT_ORG_DATA"; + String CHANNEL_SHOULD_BE_UNIQUE = "CHANNEL_SHOULD_BE_UNIQUE"; + String INVALID_CHANNEL = "INVALID_CHANNEL"; + String CHANNEL_REG_FAILED = "CHANNEL_REG_FAILED"; + String SLUG_IS_NOT_UNIQUE = "SLUG_IS_NOT_UNIQUE"; + String SLUG_REQUIRED = "SLUG_REQUIRED"; + String CONFLICTING_ORG_LOCATIONS = "CONFLICTING_ORG_LOCATIONS"; + String INVALID_LOCATION_ID = "INVALID_LOCATION_ID"; + String LOCATION_ID_REQUIRED = "LOCATION_ID_REQUIRED"; + String LOCATION_TYPE_REQUIRED = "LOCATION_TYPE_REQUIRED"; + String INVALID_REQUEST_DATA_FOR_LOCATION = "INVALID_REQUEST_DATA_CREATE_LOCATION"; + String INVALID_LOCATION_DELETE_REQUEST = "INVALID_LOCATION_DELETE_REQUEST"; + String LOCATION_TYPE_CONFLICTS = "LOCATION_TYPE_CONFLICTS"; + String PARENT_NOT_ALLOWED = "PARENT_NOT_ALLOWED"; + String INVALID_HASHTAG_ID = "INVALID_HASHTAG_ID"; + + // ------------------------------------------------------------------------- + // Course & Batch Management + // ------------------------------------------------------------------------- + String COURSE_ID_MISSING_ERROR = "COURSE_ID_REQUIRED_ERROR"; + String COURSE_ID_MISSING = "COURSE_ID_REQUIRED_ERROR"; + String INVALID_COURSE_ID = "INVALID_COURSE_ID"; + String COURSE_NAME_MISSING = "COURSE_NAME_REQUIRED_ERROR"; + String COURSE_DESCRIPTION_MISSING = "COURSE_DESCRIPTION_REQUIRED_ERROR"; + String COURSE_VERSION_MISSING = "COURSE_VERSION_REQUIRED_ERROR"; + String COURSE_DURATION_MISSING = "COURSE_DURATION_MISSING"; + String COURSE_TOCURL_MISSING = "COURSE_TOCURL_REQUIRED_ERROR"; + String COURSE_CREATED_FOR_NULL = "COURSE_CREATED_FOR_NULL"; + String COURSE_BATCH_ID_MISSING = "COURSE_BATCH_ID_MISSING"; + String INVALID_COURSE_BATCH_ID = "INVALID_COURSE_BATCH_ID"; + String COURSE_BATCH_ALREADY_COMPLETED = "COURSE_BATCH_ALREADY_COMPLETED"; + String COURSE_BATCH_ENROLLMENT_DATE_ENDED = "COURSE_BATCH_ENROLLMENT_DATE_ENDED"; + String COURSE_BATCH_START_DATE_REQUIRED = "COURSE_BATCH_START_DATE_REQUIRED"; + String COURSE_BATCH_START_DATE_INVALID = "COURSE_BATCH_START_DATE_INVALID"; + String COURSE_BATCH_END_DATE_ERROR = "COURSE_BATCH_END_DATE_ERROR"; + String COURSE_BATCH_IS_CLOSED_ERROR = "COURSE_BATCH_IS_CLOSED_ERROR"; + String COURSE_BATCH_START_PASSED_DATE_INVALID = "COURSE_BATCH_START_PASSED_DATE_INVALID"; + String INVALID_BATCH_START_DATE_ERROR = "INVALID_BATCH_START_DATE_ERROR"; + String INVALID_BATCH_END_DATE_ERROR = "INVALID_BATCH_END_DATE_ERROR"; + String MULTIPLE_COURSES_FOR_BATCH = "MULTIPLE_COURSES_FOR_BATCH"; + String INVALID_COURSE_CREATOR_ID = "INVALID_COURSE_CREATOR_ID"; + String ENROLLMENT_START_DATE_MISSING = "ENROLLMENT_START_DATE_MISSING"; + String ENROLLMENT_END_DATE_START_ERROR = "ENROLLMENT_END_DATE_START_ERROR"; + String ENROLLMENT_END_DATE_END_ERROR = "ENROLLMENT_END_DATE_END_ERROR"; + String ENROLLMENT_END_DATE_UPDATE_ERROR = "ENROLLMENT_END_DATE_UPDATE_ERROR"; + String ENROLMENT_TYPE_REQUIRED = "ENROLMENT_TYPE_REQUIRED"; + String ENROLMENT_TYPE_VALUE_ERROR = "ENROLMENT_TYPE_VALUE_ERROR"; + String ENROLLMENT_TYPE_VALIDATION = "ENROLLMENT_TYPE_VALIDATION"; + String USER_ALREADY_ENROLLED_COURSE = "USER_ALREADY_ENROLLED_COURSE"; + String USER_NOT_ENROLLED_COURSE = "USER_NOT_ENROLLED_COURSE"; + String USER_ALREADY_COMPLETED_COURSE = "USER_ALREADY_COMPLETED_COURSE"; + String END_DATE_ERROR = "END_DATE_ERROR"; + String PUBLISHED_COURSE_CAN_NOT_UPDATED = "PUBLISHED_COURSE_CAN_NOT_UPDATED"; + String INVALID_PROGRESS_STATUS = "INVALID_PROGRESS_STATUS"; + String MISSING_CODE = "ERR_COURSE_CREATE_FIELDS_MISSING"; + String CONTENT_TYPE_MISMATCH = "CONTENT_TYPE_MISMATCH"; + String MIME_TYPE_MISMATCH = "MIME_TYPE_MISMATCH"; + + // ------------------------------------------------------------------------- + // Content & Assessment + // ------------------------------------------------------------------------- + String CONTENT_ID_MISSING_ERROR = "CONTENT_ID_REQUIRED_ERROR"; + String CONTENT_ID_MISSING = "CONTENT_ID_REQUIRED_ERROR"; + String CONTENT_ID_ERROR = "CONTENT_ID_OR_COURSE_ID_REQUIRED"; + String CONTENT_VERSION_MISSING = "CONTENT_VERSION_REQUIRED_ERROR"; + String VERSION_MISSING = "VERSION_REQUIRED_ERROR"; + String CONTENT_STATUS_MISSING_ERROR = "CONTENT_STATUS_MISSING_ERROR"; + String CONTENT_TYPE_ERROR = "CONTENT_TYPE_ERROR"; + String ASSESSMENT_ITEM_ID_REQUIRED = "ASSESSMENT_ITEM_ID_REQUIRED"; + String ASSESSMENT_TYPE_REQUIRED = "ASSESSMENT_TYPE_REQUIRED"; + String ATTEMPTED_DATE_REQUIRED = "ATTEMPTED_DATE_REQUIRED"; + String ATTEMPTED_ANSWERS_REQUIRED = "ATTEMPTED_ANSWERS_REQUIRED"; + String MAX_SCORE_REQUIRED = "MAX_SCORE_REQUIRED"; + String ATTEMPT_ID_MISSING_ERROR = "ATTEMPT_ID_REQUIRED_ERROR"; + + // ------------------------------------------------------------------------- + // Badge/Certificates (Issuer, Recipient, Assertion) + // ------------------------------------------------------------------------- + String ISSUER_ID_REQUIRED = "ISSUER_ID_REQUIRED"; + String INVALID_ISSUER_ID = "INVALID_ISSUER_ID"; + String RECIPIENT_ID_REQUIRED = "RECIPIENT_ID_REQUIRED"; + String RECIPIENT_TYPE_REQUIRED = "RECIPIENT_TYPE_REQUIRED"; + String INVALID_RECIPIENT_TYPE = "INVALID_RECIPIENT_TYPE"; + String RECIPIENT_EMAIL_REQUIRED = "RECIPIENT_EMAIL_REQUIRED"; + String RECIPIENT_ADDRESS_ERROR = "RECIPIENT_ADDRESS_ERROR"; + String RECEIVER_ID_ERROR = "RECEIVER_ID_ERROR"; + String INVALID_RECEIVER_ID = "INVALID_RECEIVER_ID"; + String ASSERTION_ID_REQUIRED = "ASSERTION_ID_REQUIRED"; + String ASSERTION_EVIDENCE_REQUIRED = "ASSERTION_EVIDENCE_REQUIRED"; + String REVOCATION_REASON_REQUIRED = "REVOCATION_REASON_REQUIRED"; + String ENDORSED_USER_ID_REQUIRED = "ENDORSED_USER_ID_REQUIRED"; + String CAN_NOT_ENDORSE = "CAN_NOT_ENDORSE"; + + // ------------------------------------------------------------------------- + // Notifications & Email + // ------------------------------------------------------------------------- + String EMAIL_SUBJECT_ERROR = "EMAIL_SUBJECT_ERROR"; + String EMAIL_BODY_ERROR = "EMAIL_BODY_ERROR"; + String EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT = "EMAIL_RECIPIENTS_EXCEEDS_MAX_LIMIT"; + String NO_EMAIL_RECIPIENTS = "NO_EMAIL_RECIPIENTS"; + String MESSAGE_ID_MISSING = "MESSAGE_ID_MISSING"; + String INVALID_NOTIFICATION_TYPE = "INVALID_NOTIFICATION_TYPE"; + String INVALID_NOTIFICATION_TYPE_SUPPORT = "INVALID_NOTIFICATION_TYPE_SUPPORT"; + String INVALID_TOPIC_NAME = "INVALID_TOPIC_NAME"; + String INVALID_TOPIC_DATA = "INVALID_TOPIC_DATA"; + + // ------------------------------------------------------------------------- + // System, Config & Infrastructure + // ------------------------------------------------------------------------- + String ERROR_INVALID_CONFIG_PARAM_VALUE = "ERROR_INVALID_CONFIG_PARAM_VALUE"; + String ERROR_CONFIG_LOAD_EMPTY_STRING = "ERROR_CONFIG_LOAD_EMPTY_STRING"; + String ERROR_CONFIG_LOAD_PARSE_STRING = "ERROR_CONFIG_LOAD_PARSE_STRING"; + String ERROR_CONFIG_LOAD_EMPTY_CONFIG = "ERROR_CONFIG_LOAD_EMPTY_CONFIG"; + String ERROR_CONFLICTING_FIELD_CONFIGURATION = "ERROR_CONFLICTING_FIELD_CONFIGURATION"; + String MANDATORY_CONFIG_PARAMETER_MISSING = "MANDATORY_CONFIG_PARAMETER_MISSING"; + String ERROR_LOAD_CONFIG = "ERROR_LOAD_CONFIG"; + String ERROR_SYSTEM_SETTING_NOT_FOUND = "ERROR_SYSTEM_SETTING_NOT_FOUND"; + String ERROR_UPDATE_SETTING_NOT_ALLOWED = "ERROR_UPDATE_SETTING_NOT_ALLOWED"; + String DB_INSERTION_FAIL = "DB_INSERTION_FAIL"; + String DB_UPDATE_FAIL = "DB_UPDATE_FAIL"; + String ES_ERROR = "ELASTICSEARCH_ERROR"; + String ES_UPDATE_FAILED = "ES_UPDATE_FAILED"; + String UNABLE_TO_CONNECT_TO_EKSTEP = "UNABLE_TO_CONNECT_TO_EKSTEP"; + String UNABLE_TO_CONNECT_TO_ES = "UNABLE_TO_CONNECT_TO_ES"; + String UNABLE_TO_COMMUNICATE_WITH_ACTOR = "UNABLE_TO_COMMUNICATE_WITH_ACTOR"; + String ACTOR_CONNECTION_ERROR = "ACTOR_CONNECTION_ERROR"; + String CASSANDRA_CONNECTION_ESTABLISHMENT_FAILED = "CASSANDRA_CONNECTION_ESTABLISHMENT_FAILED"; + String CLOUD_SERVICE_ERROR = "CLOUD_SERVICE_ERROR"; + String ERROR_UNSUPPORTED_CLOUD_STORAGE = "ERROR_ UNSUPPORTED_CLOUD_STORAGE"; + String STORAGE_CONTAINER_NAME_MANDATORY = "STORAGE_CONTAINER_NAME_MANDATORY"; + String ERROR_GENERATE_DOWNLOAD_LINK = "ERROR_GENERATING_DOWNLOAD_LINK"; + String ERROR_DOWNLOAD_LINK_UNAVAILABLE = "ERROR_DOWNLOAD_LINK_UNAVAILABLE"; + String ERROR_SAVING_STORAGE_DETAILS = "ERROR_SAVING_STORAGE_DETAILS"; + String ERROR_UPLOAD_QRCODE_CSV_FAILED = "ERROR_UPLOAD_QRCODE_CSV_FAILED"; + String ERR_CALLING_GROUP_API = "ERR_CALLING_GROUOP_API"; + String ERR_CALLING_EXHAUST_API = "ERR_CALLING_EXHAUST_API"; + + // ------------------------------------------------------------------------- + // Files & Uploads + // ------------------------------------------------------------------------- + String INVALID_CSV_FILE = "INVALID_CSV_FILE"; + String ERROR_CSV_NO_DATA_ROWS = "ERROR_CSV_NO_DATA_ROWS"; + String EMPTY_CSV_FILE = "EMPTY_CSV_FILE"; + String EMPTY_HEADER_LINE = "EMPTY_HEADER_LINE"; + String BULK_USER_UPLOAD_ERROR = "BULK_USER_UPLOAD_ERROR"; + String DATA_SIZE_EXCEEDED = "DATA_SIZE_EXCEEDED"; + String ERROR_MAX_SIZE_EXCEEDED = "ERROR_MAX_SIZE_EXCEEDED"; + String MISSING_FILE_ATTACHMENT = "MISSING_FILE_ATTACHMENT"; + String EMPTY_FILE = "EMPTY_FILE"; + String FILE_ATTACHMENT_SIZE_NOT_CONFIGURED = "ATTACHMENT_SIZE_NOT_CONFIGURED"; + String ERROR_CREATING_FILE = "ERROR_CREATING_FILE"; + String ERROR_PROCESSING_FILE = "ERROR_PROCESSING_FILE"; + String ERROR_PROCESSING_REQUEST = "ERROR_PROCESSING_REQUEST"; + + // ------------------------------------------------------------------------- + // Miscellaneous + // ------------------------------------------------------------------------- + String PAGE_NAME_REQUIRED = "PAGE_NAME_REQUIRED"; + String PAGE_ID_REQUIRED = "PAGE_ID_REQUIRED"; + String PAGE_ALREADY_EXIST = "PAGE_ALREADY_EXIST"; + String PAGE_NOT_EXIST = "PAGE_NOT_EXIST"; + String INVALID_PAGE_SOURCE = "INVALID_PAGE_SOURCE"; + String SECTION_NAME_MISSING = "SECTION_NAME_MISSING"; + String SECTION_DATA_TYPE_MISSING = "SECTION_DATA_TYPE_MISSING"; + String SECTION_ID_REQUIRED = "SECTION_ID_REQUIRED"; + String SECTION_NOT_EXIST = "SECTION_NOT_EXIST"; + String INVALID_PAGE_SECTION = "INVALID_PAGE_SECTION"; + String INVALID_WEBPAGE_DATA = "INVALID_WEBPAGE_DATA"; + String INVALID_MEDIA_TYPE = "INVALID_MEDIA_TYPE"; + String INVALID_WEBPAGE_URL = "INVALID_WEBPAGE_URL"; + String TITLE_REQUIRED = "TITLE_REQUIRED"; + String NOTE_REQUIRED = "NOTE_REQUIRED"; + String NOTE_ID_INVALID = "NOTE_ID_INVALID"; + String INVALID_TAGS = "INVALID_TAGS"; + String INVALID_CLIENT_NAME = "INVALID_CLIENT_NAME"; + String INVALID_CLIENT_ID = "INVALID_CLIENT_ID"; + String TABLE_OR_DOC_NAME_ERROR = "TABLE_OR_DOC_NAME_ERROR"; + String INVALID_DUPLICATE_VALUE = "INVALID_DUPLICATE_VALUE"; + String ERROR_DUPLICATE_ENTRY = "ERROR_DUPLICATE_ENTRY"; + String ERROR_DUPLICATE_ENTRIES = "ERROR_DUPLICATE_ENTRIES"; + String INVALID_PERIOD = "INVALID_PERIOD"; + String INVALID_DATE_RANGE = "INVALID_DATE_RANGE"; + String CYCLIC_VALIDATION_FAILURE = "CYCLIC_VALIDATION_FAILURE"; + String UPDATE_NOT_ALLOWED = "UPDATE_NOT_ALLOWED"; + String STATUS_CANNOT_BE_UPDATED = "STATUS_CANNOT_BE_UPDATED"; + String UPDATE_FAILED = "UPDATE_FAILED"; + String INVALID_COLUMN_NAME = "INVALID_COLUMN_NAME"; + String INVALID_COLUMNS = "INVALID_COLUMNS"; + String REQUIRED_HEADER_MISSING = "REQUIRED_HEADER_MISSING"; + String MANDATORY_HEADER_MISSING = "MANDATORY_HEADER_MISSING"; + String MANDATORY_HEADER_PARAMETER_MISSING = "MANDATORY_HEADER_PARAMETER_MISSING"; + String PARAMETER_MISMATCH = "PARAMETER_MISMATCH"; + String DEPENDENT_PARAMETER_MISSING = "DEPENDENT_PARAMETER_MISSING"; + String DEPENDENT_PARAMS_MISSING = "DEPENDENT_PARAMETER_MISSING"; + String COMMON_ATTRIBUTE_MISMATCH = "COMMON_ATTRIBUTE_MISMATCH"; + String ERROR_ATTRIBUTE_CONFLICT = "ERROR_ATTRIBUTE_CONFLICT"; + String EVENTS_DATA_MISSING = "EVENTS_DATA_MISSING"; + String GROUP_ID_MISSING = "GROUP_ID_MISSING"; + String ACTIVITY_ID_MISSING = "ACTIVITY_ID_MISSING"; + String ACTIVITY_TYPE_MISSING = "ACTIVITY_TYPE_MISSING"; + String DATA_FORMAT_ERROR = "0009"; + String ONLY_EMAIL_OR_PHONE_OR_MANAGEDBY_REQUIRED = "0011"; + String MANAGED_BY_NOT_ALLOWED = "0065"; + String MANAGED_USER_LIMIT_EXCEEDED = "0066"; + String ERROR_CONFLICTING_VALUES = "0055"; + String ERROR_CONFLICTING_ROOT_ORG_ID = "0056"; + String ERROR_INVALID_PARAMETER_SIZE = "0058"; + String DECLARED_USER_ERROR_STATUS_IS_NOT_UPDATED = "0067"; + String INVALID_ENCRYPTION_FILE = "0078"; + String ERROR_PARAM_EXISTS = "0002"; + String RECOVERY_PARAM_MATCH_EXCEPTION = "0062"; + String INVALID_SECURITY_LEVEL = "0079"; + String INVALID_SECURITY_LEVEL_LOWER = "0080"; + String MISSING_DEFAULT_SECURITY_LEVEL = "0081"; + String INVALID_TENANT_SECURITY_LEVEL_LOWER = "0082"; + String ERROR_USER_MIGRATION_FAILED = "0060"; + String ERROR_NO_DIALCODES_LINKED = "ERROR_NO_DIALCODES_LINKED"; + String SOURCE_MISSING = "SOURCE_MISSING"; + String INVALID_CONFIGURATION = "INVALID_CONFIGURATION"; + String INVALID_PROCESS_ID = "INVALID_PROCESS_ID"; + String INVALID_TYPE_VALUE = "INVALID_TYPE_VALUE"; + String ERROR_NO_FRAMEWORK_FOUND = "ERROR_NO_FRAMEWORK_FOUND"; + String VALID_IDENTIFIER_ABSENSE = "IDENTIFIER IN LIST IS NOT SUPPORTED OR INCORRECT"; + + // ------------------------------------------------------------------------- + // JSON Transform (Registry) + // ------------------------------------------------------------------------- + String ERROR_JSON_TRANSFORM_INVALID_TYPE_CONFIG = "ERROR_JSON_TRANSFORM_INVALID_TYPE_CONFIG"; + String ERROR_JSON_TRANSFORM_INVALID_DATE_FORMAT = "ERROR_JSON_TRANSFORM_INVALID_DATE_FORMAT"; + String ERROR_JSON_TRANSFORM_INVALID_INPUT = "ERROR_JSON_TRANSFORM_INVALID_INPUT"; + String ERROR_JSON_TRANSFORM_INVALID_ENUM_INPUT = "ERROR_JSON_TRANSFORM_INVALID_ENUM_INPUT"; + String ERROR_JSON_TRANSFORM_ENUM_VALUES_EMPTY = "ERROR_JSON_TRANSFORM_ENUM_VALUES_EMPTY"; + String ERROR_JSON_TRANSFORM_BASIC_CONFIG_MISSING = "ERROR_JSON_TRANSFORM_BASIC_CONFIG_MISSING"; + String ERROR_JSON_TRANSFORM_INVALID_FILTER_CONFIG = + "ERROR_JSON_TRANSFORM_INVALID_FILTER_CONFIG"; + String ERROR_REGISTRY_CLIENT_CREATION = "ERROR_REGISTRY_CLIENT_CREATION"; + String ERROR_REGISTRY_ADD_ENTITY = "ERROR_REGISTRY_ADD_ENTITY"; + String ERROR_REGISTRY_READ_ENTITY = "ERROR_REGISTRY_READ_ENTITY"; + String ERROR_REGISTRY_UPDATE_ENTITY = "ERROR_REGISTRY_UPDATE_ENTITY"; + String ERROR_REGISTRY_DELETE_ENTITY = "ERROR_REGISTRY_DELETE_ENTITY"; + String ERROR_REGISTRY_PARSE_RESPONSE = "ERROR_REGISTRY_PARSE_RESPONSE"; + String ERROR_REGISTRY_ENTITY_TYPE_BLANK = "ERROR_REGISTRY_ENTITY_TYPE_BLANK"; + String ERROR_REGISTRY_ENTITY_ID_BLANK = "ERROR_REGISTRY_ENTITY_ID_BLANK"; + String ERROR_REGISTRY_ACCESS_TOKEN_BLANK = "ERROR_REGISTRY_ACCESS_TOKEN_BLANK"; + String INVALID_FILE_EXTENSION = "INVALID_FILE_EXTENSION"; + String SIZE_LIMIT_EXCEED = "SIZE_LIMIT_EXCEED"; + String INVALID_CONSENT_STATUS = "INVALID_CONSENT_STATUS"; + String INVALID_CAPTCHA = "INVALID_CAPTCHA"; + String IM_A_TEAPOT = "IM_A_TEAPOT"; + } + +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseParams.java b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseParams.java new file mode 100644 index 0000000000..09855e6a31 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/response/ResponseParams.java @@ -0,0 +1,128 @@ +package org.sunbird.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; + +/** + * Encapsulates the response parameter envelope for API responses. + * Contains metadata such as message IDs, status (SUCCESSFUL/FAILED), and error details. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ResponseParams implements Serializable { + + private static final long serialVersionUID = 6772142067149203497L; + + /** Unique response message ID. */ + private String resmsgid; + + /** Request-specific message ID. */ + private String msgid; + + /** Error code, if applicable. */ + private String err; + + /** API call status (e.g., "successful"). */ + private String status; + + /** Descriptive error message in English. */ + private String errmsg; + + /** + * Enum representing standard API status types. + */ + public enum StatusType { + SUCCESSFUL, + WARNING, + FAILED; + } + + /** + * Gets the unique response message ID. + * + * @return The response message ID string. + */ + public String getResmsgid() { + return resmsgid; + } + + /** + * Sets the unique response message ID. + * + * @param resmsgid The response message ID string. + */ + public void setResmsgid(String resmsgid) { + this.resmsgid = resmsgid; + } + + /** + * Gets the request-specific message ID. + * + * @return The message ID string. + */ + public String getMsgid() { + return msgid; + } + + /** + * Sets the request-specific message ID. + * + * @param msgid The message ID string. + */ + public void setMsgid(String msgid) { + this.msgid = msgid; + } + + /** + * Gets the error code. + * + * @return The error code string, or null if successful. + */ + public String getErr() { + return err; + } + + /** + * Sets the error code. + * + * @param err The error code string. + */ + public void setErr(String err) { + this.err = err; + } + + /** + * Gets the API status. + * + * @return The status string. + */ + public String getStatus() { + return status; + } + + /** + * Sets the API status. + * + * @param status The status string. + */ + public void setStatus(String status) { + this.status = status; + } + + /** + * Gets the descriptive error message. + * + * @return The error message string. + */ + public String getErrmsg() { + return errmsg; + } + + /** + * Sets the descriptive error message. + * + * @param message The error message string. + */ + public void setErrmsg(String message) { + this.errmsg = message; + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java new file mode 100644 index 0000000000..7446b11d44 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryAssemblerFactory.java @@ -0,0 +1,32 @@ +package org.sunbird.telemetry.collector; + +/** + * Factory class to provide an instance of TelemetryDataAssembler. + * This class follows the creation pattern to ensure a single instance of TelemetryDataAssembler is used. + */ +public class TelemetryAssemblerFactory { + + private static TelemetryDataAssembler telemetryDataAssembler = null; + + /** + * Private constructor to prevent instantiation. + */ + private TelemetryAssemblerFactory() {} + + /** + * Returns the singleton instance of TelemetryDataAssembler. + * If the instance supports lazy initialization, it creates one in a thread-safe manner. + * + * @return TelemetryDataAssembler instance + */ + public static TelemetryDataAssembler get() { + if (telemetryDataAssembler == null) { + synchronized (TelemetryAssemblerFactory.class) { + if (telemetryDataAssembler == null) { + telemetryDataAssembler = new TelemetryDataAssemblerImpl(); + } + } + } + return telemetryDataAssembler; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java new file mode 100644 index 0000000000..1b061b677e --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssembler.java @@ -0,0 +1,45 @@ +package org.sunbird.telemetry.collector; + +import java.util.Map; + +/** + * Interface defining the contract for assembling and generating various telemetry events. + */ +public interface TelemetryDataAssembler { + + /** + * Generates an AUDIT telemetry event. + * + * @param context Context map containing telemetry context information (e.g., channel, pdata, env, etc.) + * @param params Parameters map containing event-specific data + * @return The generated telemetry event as a JSON string + */ + String audit(Map context, Map params); + + /** + * Generates a SEARCH telemetry event. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing search-specific data (e.g., query, filters, sort, correlation) + * @return The generated telemetry event as a JSON string + */ + String search(Map context, Map params); + + /** + * Generates a LOG telemetry event. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing log-specific data (e.g., type, level, message, params) + * @return The generated telemetry event as a JSON string + */ + String log(Map context, Map params); + + /** + * Generates an ERROR telemetry event. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing error-specific data (e.g., err, errtype, stacktrace) + * @return The generated telemetry event as a JSON string + */ + String error(Map context, Map params); +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java new file mode 100644 index 0000000000..9d133a8560 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/collector/TelemetryDataAssemblerImpl.java @@ -0,0 +1,59 @@ +package org.sunbird.telemetry.collector; + +import java.util.Map; +import org.sunbird.telemetry.util.TelemetryGenerator; + +/** + * Implementation of the TelemetryDataAssembler interface. + * Delegates the actual generation of telemetry events to the TelemetryGenerator utility. + */ +public class TelemetryDataAssemblerImpl implements TelemetryDataAssembler { + + /** + * Generates an AUDIT telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing event-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String audit(Map context, Map params) { + return TelemetryGenerator.audit(context, params); + } + + /** + * Generates a SEARCH telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing search-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String search(Map context, Map params) { + return TelemetryGenerator.search(context, params); + } + + /** + * Generates a LOG telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing log-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String log(Map context, Map params) { + return TelemetryGenerator.log(context, params); + } + + /** + * Generates an ERROR telemetry event using TelemetryGenerator. + * + * @param context Context map containing telemetry context information + * @param params Parameters map containing error-specific data + * @return The generated telemetry event as a JSON string + */ + @Override + public String error(Map context, Map params) { + return TelemetryGenerator.error(context, params); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java new file mode 100644 index 0000000000..8617b27714 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Actor.java @@ -0,0 +1,64 @@ +package org.sunbird.telemetry.dto; + +/** + * Represents the 'Actor' in a telemetry event. + * The Actor is the entity (User, System, etc.) that performs the action being logged. + */ +public class Actor { + + private String id; + private String type; + + /** + * Default constructor. + */ + public Actor() {} + + /** + * Parameterized constructor to initialize the Actor. + * + * @param id The unique identifier of the actor (e.g., User ID). + * @param type The type of the actor (e.g., 'User', 'System'). + */ + public Actor(String id, String type) { + super(); + this.id = id; + this.type = type; + } + + /** + * Gets the unique identifier of the actor. + * + * @return the id of the actor + */ + public String getId() { + return id; + } + + /** + * Sets the unique identifier of the actor. + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the type of the actor. + * + * @return the type of the actor + */ + public String getType() { + return type; + } + + /** + * Sets the type of the actor. + * + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Context.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Context.java new file mode 100644 index 0000000000..dedaaaf473 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Context.java @@ -0,0 +1,150 @@ +package org.sunbird.telemetry.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents the context of a telemetry event. + * Contains information about the environment, actor, channel, and other contextual data. + */ +@JsonInclude(Include.NON_NULL) +public class Context { + + private String channel; + private Producer pdata; + private String env; + private String did; + private List> cdata = new ArrayList<>(); + private Map rollup = new HashMap<>(); + + /** + * Default constructor. + */ + public Context() {} + + /** + * Parameterized constructor to initialize the Context. + * + * @param channel The channel ID + * @param env The environment (e.g., 'dev', 'prod') + * @param pdata The producer data + */ + public Context(String channel, String env, Producer pdata) { + super(); + this.channel = channel; + this.env = env; + this.pdata = pdata; + } + + /** + * Gets the rollup data. + * + * @return a map containing rollup data + */ + public Map getRollup() { + return rollup; + } + + /** + * Sets the rollup data. + * + * @param rollup a map containing rollup data to set + */ + public void setRollup(Map rollup) { + this.rollup = rollup; + } + + /** + * Gets the correlation data (cdata). + * + * @return a list of maps containing correlation data + */ + public List> getCdata() { + return cdata; + } + + /** + * Sets the correlation data (cdata). + * + * @param cdata a list of maps containing correlation data to set + */ + public void setCdata(List> cdata) { + this.cdata = cdata; + } + + /** + * Gets the channel ID. + * + * @return the channel + */ + public String getChannel() { + return channel; + } + + /** + * Sets the channel ID. + * + * @param channel the channel to set + */ + public void setChannel(String channel) { + this.channel = channel; + } + + /** + * Gets the producer data. + * + * @return the pdata + */ + public Producer getPdata() { + return pdata; + } + + /** + * Sets the producer data. + * + * @param pdata the pdata to set + */ + public void setPdata(Producer pdata) { + this.pdata = pdata; + } + + /** + * Gets the environment. + * + * @return the env + */ + public String getEnv() { + return env; + } + + /** + * Sets the environment. + * + * @param env the env to set + */ + public void setEnv(String env) { + this.env = env; + } + + /** + * Gets the device ID. + * + * @return the did + */ + public String getDid() { + return did; + } + + /** + * Sets the device ID. + * + * @param did the did to set + */ + public void setDid(String did) { + this.did = did; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java new file mode 100644 index 0000000000..be49c81824 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Producer.java @@ -0,0 +1,100 @@ +package org.sunbird.telemetry.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +/** + * Represents the producer of a telemetry event. + * The Producer is the system/subsystem that generated the event. + */ +@JsonInclude(Include.NON_NULL) +public class Producer { + + private String id; + private String pid; + private String ver; + + /** + * Default constructor. + */ + public Producer() {} + + /** + * Parameterized constructor. + * + * @param id The unique identifier of the producer + * @param ver The version of the producer + */ + public Producer(String id, String ver) { + super(); + this.id = id; + this.ver = ver; + } + + /** + * Parameterized constructor. + * + * @param id The unique identifier of the producer + * @param pid The producer ID (optional/alternative) + * @param ver The version of the producer + */ + public Producer(String id, String pid, String ver) { + this.id = id; + this.pid = pid; + this.ver = ver; + } + + /** + * Gets the producer ID. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the producer ID. + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the producer PID. + * + * @return the pid + */ + public String getPid() { + return pid; + } + + /** + * Sets the producer PID. + * + * @param pid the pid to set + */ + public void setPid(String pid) { + this.pid = pid; + } + + /** + * Gets the producer version. + * + * @return the ver + */ + public String getVer() { + return ver; + } + + /** + * Sets the producer version. + * + * @param ver the ver to set + */ + public void setVer(String ver) { + this.ver = ver; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java new file mode 100644 index 0000000000..75bc947d26 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Target.java @@ -0,0 +1,107 @@ +package org.sunbird.telemetry.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.Map; + +/** + * Represents the target object of a telemetry event. + * The Target identifies the object being acted upon (e.g., Content, Item, User). + */ +@JsonInclude(Include.NON_NULL) +public class Target { + + private String id; + private String type; + private String ver; + private Map rollup; + + /** + * Default constructor. + */ + public Target() {} + + /** + * Parameterized constructor to initialize the Target. + * + * @param id The unique identifier of the target object + * @param type The type of the target object + */ + public Target(String id, String type) { + super(); + this.id = id; + this.type = type; + } + + /** + * Gets the rollup data. + * + * @return a map containing rollup data + */ + public Map getRollup() { + return rollup; + } + + /** + * Sets the rollup data. + * + * @param rollup a map containing rollup data to set + */ + public void setRollup(Map rollup) { + this.rollup = rollup; + } + + /** + * Gets the target ID. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the target ID. + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the target type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the target type. + * + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the target version. + * + * @return the ver + */ + public String getVer() { + return ver; + } + + /** + * Sets the target version. + * + * @param ver the ver to set + */ + public void setVer(String ver) { + this.ver = ver; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Telemetry.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Telemetry.java new file mode 100644 index 0000000000..bbe878a0e3 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/Telemetry.java @@ -0,0 +1,227 @@ +package org.sunbird.telemetry.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * Telemetry V3 POJO to generate telemetry event. + * Represents the structure of a standard Sunbird telemetry event. + */ +@JsonInclude(Include.NON_NULL) +public class Telemetry { + + private String eid; + private long ets = System.currentTimeMillis(); + private String ver = "3.0"; + private String mid = System.currentTimeMillis() + "." + UUID.randomUUID(); + private Actor actor; + private Context context; + private Target object; + private Map edata; + private List tags; + + /** + * Default constructor. + */ + public Telemetry() {} + + /** + * Parameterized constructor. + * + * @param eid The event ID (e.g., AUDIT, LOG, SEARCH) + * @param actor The actor performing the event + * @param context The context of the event + * @param edata The event data + * @param object The target object of the event + */ + public Telemetry( + String eid, Actor actor, Context context, Map edata, Target object) { + super(); + this.eid = eid; + this.actor = actor; + this.context = context; + this.edata = edata; + this.object = object; + } + + /** + * Parameterized constructor (without target object). + * + * @param eid The event ID + * @param actor The actor performing the event + * @param context The context of the event + * @param edata The event data + */ + public Telemetry(String eid, Actor actor, Context context, Map edata) { + super(); + this.eid = eid; + this.actor = actor; + this.context = context; + this.edata = edata; + } + + /** + * Gets the event ID. + * + * @return the eid + */ + public String getEid() { + return eid; + } + + /** + * Sets the event ID. + * + * @param eid the eid to set + */ + public void setEid(String eid) { + this.eid = eid; + } + + /** + * Gets the event timestamp. + * + * @return the ets + */ + public long getEts() { + return ets; + } + + /** + * Sets the event timestamp. + * + * @param ets the ets to set + */ + public void setEts(long ets) { + this.ets = ets; + } + + /** + * Gets the version. + * + * @return the ver + */ + public String getVer() { + return ver; + } + + /** + * Sets the version. + * + * @param ver the ver to set + */ + public void setVer(String ver) { + this.ver = ver; + } + + /** + * Gets the message ID. + * + * @return the mid + */ + public String getMid() { + return mid; + } + + /** + * Sets the message ID. + * + * @param mid the mid to set + */ + public void setMid(String mid) { + this.mid = mid; + } + + /** + * Gets the actor. + * + * @return the actor + */ + public Actor getActor() { + return actor; + } + + /** + * Sets the actor. + * + * @param actor the actor to set + */ + public void setActor(Actor actor) { + this.actor = actor; + } + + /** + * Gets the context. + * + * @return the context + */ + public Context getContext() { + return context; + } + + /** + * Sets the context. + * + * @param context the context to set + */ + public void setContext(Context context) { + this.context = context; + } + + /** + * Gets the target object. + * + * @return the object + */ + public Target getObject() { + return object; + } + + /** + * Sets the target object. + * + * @param object the object to set + */ + public void setObject(Target object) { + this.object = object; + } + + /** + * Gets the event data. + * + * @return the edata + */ + public Map getEdata() { + return edata; + } + + /** + * Sets the event data. + * + * @param edata the edata to set + */ + public void setEdata(Map edata) { + this.edata = edata; + } + + /** + * Gets the tags. + * + * @return the tags + */ + public List getTags() { + return tags; + } + + /** + * Sets the tags. + * + * @param tags the tags to set + */ + public void setTags(List tags) { + this.tags = tags; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java new file mode 100644 index 0000000000..c13da222f1 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBEEvent.java @@ -0,0 +1,234 @@ +package org.sunbird.telemetry.dto; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a Backend (BE) Telemetry Event. + * This class captures telemetry data generated by backend services. + */ +public class TelemetryBEEvent { + + private String eid; + private long ets; + private String mid; + private String ver; + private String channel; + private Map pdata; + private Map edata; + + /** + * Gets the event ID. + * + * @return the eid + */ + public String getEid() { + return eid; + } + + /** + * Sets the event ID. + * + * @param eid the eid to set + */ + public void setEid(String eid) { + this.eid = eid; + } + + /** + * Gets the event timestamp. + * + * @return the ets + */ + public long getEts() { + return ets; + } + + /** + * Sets the event timestamp. + * + * @param ets the ets to set + */ + public void setEts(long ets) { + this.ets = ets; + } + + /** + * Gets the version. + * + * @return the ver + */ + public String getVer() { + return ver; + } + + /** + * Sets the version. + * + * @param ver the ver to set + */ + public void setVer(String ver) { + this.ver = ver; + } + + /** + * Gets the producer data. + * + * @return the pdata + */ + public Map getPdata() { + return pdata; + } + + /** + * Sets the producer data. + * + * @param pdata the pdata to set + */ + public void setPdata(Map pdata) { + this.pdata = pdata; + } + + /** + * Gets the event data. + * + * @return the edata + */ + public Map getEdata() { + return edata; + } + + /** + * Sets the event data with specific eks map. + * + * @param eks the eks map to be put inside edata + */ + public void setEdata(Map eks) { + this.edata = new HashMap<>(); + edata.put("eks", eks); + } + + /** + * Sets the producer data with specific fields. + * + * @param id Producer ID + * @param pid Producer PID + * @param ver Producer Version + * @param uid User ID (Note: unused in implementation but present in signature) + */ + public void setPdata(String id, String pid, String ver, String uid) { + this.pdata = new HashMap<>(); + this.pdata.put("id", id); + this.pdata.put("pid", pid); + this.pdata.put("ver", ver); + } + + /** + * Sets edata for Content events. + * + * @param cid Content ID + * @param status Content Status + * @param prevState Previous State + * @param size Size + * @param pkgVersion Package Version + * @param concepts Concepts + */ + public void setEdata( + String cid, + Object status, + Object prevState, + Object size, + Object pkgVersion, + Object concepts) { + this.edata = new HashMap<>(); + Map eks = new HashMap<>(); + eks.put("cid", cid); + eks.put("state", status); + eks.put("prevstate", prevState); + eks.put("size", size); + eks.put("pkgVersion", pkgVersion); + eks.put("concepts", concepts); + edata.put("eks", eks); + } + + /** + * Sets edata for Search events. + * + * @param query Search query + * @param filters Search filters + * @param sort Search sort order + * @param correlationId Correlation ID + * @param size Result size + */ + public void setEdata(String query, Object filters, Object sort, String correlationId, int size) { + this.edata = new HashMap<>(); + Map eks = new HashMap<>(); + eks.put("query", query); + eks.put("filters", filters); + eks.put("sort", sort); + eks.put("correlationid", correlationId); + eks.put("size", size); + edata.put("eks", eks); + } + + /** + * Sets edata for Lifecycle/State change events. + * + * @param id Target ID + * @param state Current State + * @param prevState Previous State + * @param lemma Lemma (used in wordnet/language) or auxiliary data + */ + public void setEdata(String id, Object state, Object prevState, Object lemma) { + this.edata = new HashMap<>(); + Map eks = new HashMap<>(); + eks.put("id", id); + eks.put("state", state); + eks.put("prevstate", prevState); + eks.put("lemma", lemma); + edata.put("eks", eks); + } + + /** + * Gets the message ID. + * + * @return the mid + */ + public String getMid() { + return mid; + } + + /** + * Sets the message ID. + * + * @param mid the mid to set + */ + public void setMid(String mid) { + this.mid = mid; + } + + /** + * Gets the channel ID. + * + * @return the channel, or empty string if null + */ + public String getChannel() { + if (null == channel) { + channel = ""; + } + return channel; + } + + /** + * Sets the channel ID. + * + * @param channel the channel to set + */ + public void setChannel(String channel) { + String tempChannel = channel; + if (null == channel) { + tempChannel = ""; + } + this.channel = tempChannel; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java new file mode 100644 index 0000000000..2250dbec7e --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryBJREvent.java @@ -0,0 +1,144 @@ +package org.sunbird.telemetry.dto; + +import java.util.Map; + +/** + * Represents a Backend Job/Request (BJR) Telemetry Event. + * This class captures telemetry data for background jobs or requests, often used for map-based telemetry structures. + */ +public class TelemetryBJREvent { + + private String eid; + private long ets; + private String mid; + private Map actor; + private Map context; + private Map object; + private Map edata; + + /** + * Gets the event ID. + * + * @return the eid + */ + public String getEid() { + return eid; + } + + /** + * Sets the event ID. + * + * @param eid the eid to set + */ + public void setEid(String eid) { + this.eid = eid; + } + + /** + * Gets the event timestamp. + * + * @return the ets + */ + public long getEts() { + return ets; + } + + /** + * Sets the event timestamp. + * + * @param ets the ets to set + */ + public void setEts(long ets) { + this.ets = ets; + } + + /** + * Gets the message ID. + * + * @return the mid + */ + public String getMid() { + return mid; + } + + /** + * Sets the message ID. + * + * @param mid the mid to set + */ + public void setMid(String mid) { + this.mid = mid; + } + + /** + * Gets the actor data map. + * + * @return the actor map + */ + public Map getActor() { + return actor; + } + + /** + * Sets the actor data map. + * + * @param actor the actor map to set + */ + public void setActor(Map actor) { + this.actor = actor; + } + + /** + * Gets the context data map. + * + * @return the context map + */ + public Map getContext() { + return context; + } + + /** + * Sets the context data map. + * + * @param context the context map to set + */ + public void setContext(Map context) { + this.context = context; + } + + /** + * Gets the object/target data map. + * + * @return the object map + */ + public Map getObject() { + return object; + } + + /** + * Sets the object/target data map. + * + * @param object the object map to set + */ + public void setObject(Map object) { + this.object = object; + } + + /** + * Gets the event data map. + * + * @return the edata map + */ + public Map getEdata() { + return edata; + } + + /** + * Sets the event data map. + * + * @param edata the edata map to set + */ + public void setEdata(Map edata) { + this.edata = edata; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java new file mode 100644 index 0000000000..6244277081 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/dto/TelemetryEnvKey.java @@ -0,0 +1,56 @@ +package org.sunbird.telemetry.dto; + +/** + * Constants for Telemetry Environment Keys. + * Defines the environment names used in various telemetry events. + */ +public class TelemetryEnvKey { + + /** Constant for User environment */ + public static final String USER = "User"; + + /** Constant for Organisation environment */ + public static final String ORGANISATION = "Organisation"; + + /** Constant for GeoLocation environment */ + public static final String GEO_LOCATION = "GeoLocation"; + + /** Constant for MasterKey environment */ + public static final String MASTER_KEY = "MasterKey"; + + /** Constant for ObjectStore environment */ + public static final String OBJECT_STORE = "ObjectStore"; + + /** Constant for Location environment */ + public static final String LOCATION = "Location"; + + /** Constant for Request environment */ + public static final String REQUEST_UPPER_CAMEL = "Request"; + + /** Constant for UserConsent environment */ + public static final String USER_CONSENT = "UserConsent"; + + /** Constant for Edata Type User Consent */ + public static final String EDATA_TYPE_USER_CONSENT = "user-consent"; + + /** Constant for CourseBatch environment */ + public static final String BATCH = "CourseBatch"; + + /** Constant for Page environment */ + public static final String PAGE = "Page"; + + /** Constant for PageSection environment */ + public static final String PAGE_SECTION = "PageSection"; + + /** Constant for QRCodeDownload environment */ + public static final String QR_CODE_DOWNLOAD = "QRCodeDownload"; + + /** Constant for COURSE_CREATE environment */ + public static final String COURSE_CREATE = "COURSE_CREATE"; + + /** Constant for Notification Created environment */ + public static final String NOTIFICATION_CREATED = "create-notification"; + + /** Private constructor to prevent instantiation. */ + private TelemetryEnvKey() {} +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java new file mode 100644 index 0000000000..059fa18ad7 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryConstant.java @@ -0,0 +1,14 @@ +package org.sunbird.telemetry.util; + +/** + * Class contains Constants for telemetry. + * Defines standard constant values used for telemetry logging and processing. + */ +public class TelemetryConstant { + + /** Constant for Error log level */ + public static final String LOG_LEVEL_ERROR = "error"; + + /** Private constructor to prevent instantiation. */ + private TelemetryConstant() {} +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java new file mode 100644 index 0000000000..f76f282e6d --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryEvents.java @@ -0,0 +1,40 @@ +package org.sunbird.telemetry.util; + +/** + * Enumeration for telemetry events types. + * Defines the standard event names supported by the telemetry system. + */ +public enum TelemetryEvents { + + /** AUDIT Telemetry Event */ + AUDIT("AUDIT"), + + /** SEARCH Telemetry Event */ + SEARCH("SEARCH"), + + /** LOG Telemetry Event */ + LOG("LOG"), + + /** ERROR Telemetry Event */ + ERROR("ERROR"); + + private final String name; + + /** + * Private constructor for enum. + * + * @param name The name of the event + */ + TelemetryEvents(String name) { + this.name = name; + } + + /** + * Gets the name of the telemetry event. + * + * @return the name + */ + public String getName() { + return name; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java new file mode 100644 index 0000000000..e7f40cd166 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryGenerator.java @@ -0,0 +1,464 @@ +package org.sunbird.telemetry.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.*; +import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.ProjectUtil; +import org.sunbird.telemetry.dto.*; +import org.sunbird.telemetry.dto.TelemetryEnvKey; + +/** + * Utility class to generate telemetry events. + * Provides static methods to construct standard telemetry objects. + */ +public class TelemetryGenerator { + + private static final ObjectMapper mapper = new ObjectMapper(); + private static final LoggerUtil logger = new LoggerUtil(TelemetryGenerator.class); + + /** Private constructor to prevent instantiation. */ + private TelemetryGenerator() {} + + /** + * Generates api_access AUDIT telemetry JSON string. + * + * @param context Map contains the telemetry context info like actor info, env info etc. + * @param params Map contains the telemetry event data info + * @return Telemetry event as JSON string + */ + public static String audit(Map context, Map params) { + if (!validateRequest(context, params)) { + return ""; + } + String actorId = (String) context.get(JsonKey.ACTOR_ID); + String actorType = (String) context.get(JsonKey.ACTOR_TYPE); + Target targetObject = + generateTargetObject((Map) params.get(JsonKey.TARGET_OBJECT)); + + Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); + Context eventContext = getContext(context); + Map edata = generateAuditEdata(params); + + /* Assign cdata into context from params correlated objects */ + if (params.containsKey(JsonKey.CORRELATED_OBJECTS)) { + setCorrelatedDataToContext(params.get(JsonKey.CORRELATED_OBJECTS), eventContext); + } + + /* Assign request id into context cdata */ + String reqId = (String) context.get(JsonKey.X_REQUEST_ID); + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { + Map map = new HashMap<>(); + map.put(JsonKey.ID, reqId); + map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); + eventContext.getCdata().add(map); + } + + /* Construct telemetry object and set message ID */ + Telemetry telemetry = + new Telemetry(TelemetryEvents.AUDIT.getName(), actor, eventContext, edata, targetObject); + telemetry.setMid(reqId); + return getTelemetry(telemetry); + } + + /** + * Sets correlated data (cdata) to the telemetry context. + * + * @param correlatedObjects List of correlated objects + * @param eventContext The context object to update + */ + private static void setCorrelatedDataToContext(Object correlatedObjects, Context eventContext) { + ArrayList> list = (ArrayList>) correlatedObjects; + ArrayList> targetList = new ArrayList<>(); + + /* Convert correlated objects to standardized map format */ + if (null != list && !list.isEmpty()) { + for (Map m : list) { + Map map = new HashMap<>(); + map.put(JsonKey.ID, m.get(JsonKey.ID)); + map.put(JsonKey.TYPE, StringUtils.capitalize((String) m.get(JsonKey.TYPE))); + targetList.add(map); + } + } + eventContext.setCdata(targetList); + } + + /** + * Generates a Target object from the provided map. + * + * @param targetObject Map containing target object properties (ID, Type, Rollup) + * @return Constructed Target object + */ + private static Target generateTargetObject(Map targetObject) { + Target target = + new Target( + (String) targetObject.get(JsonKey.ID), + StringUtils.capitalize((String) targetObject.get(JsonKey.TYPE))); + if (targetObject.get(JsonKey.ROLLUP) != null) { + target.setRollup((Map) targetObject.get(JsonKey.ROLLUP)); + } + return target; + } + + /** + * Generates event data (edata) for AUDIT telemetry events. + * + * @param params Map containing event parameters (props, type, target object) + * @return Constructed edata map + */ + private static Map generateAuditEdata(Map params) { + Map edata = new HashMap<>(); + Map props = (Map) params.get(JsonKey.PROPS); + + // TODO: need to rethink about this one .. if map is null then what to do + if (null != props) { + edata.put(JsonKey.PROPS, getProps(props)); + } + + String type = (String) params.get(JsonKey.TYPE); + if (null != type) { + edata.put(JsonKey.TYPE, type); + } + + Map target = (Map) params.get(JsonKey.TARGET_OBJECT); + if (target != null && target.get(JsonKey.CURRENT_STATE) != null) { + edata.put(JsonKey.STATE, StringUtils.capitalize((String) target.get(JsonKey.CURRENT_STATE))); + if (JsonKey.UPDATE.equalsIgnoreCase((String) target.get(JsonKey.CURRENT_STATE)) + && edata.get(props) != null) { + removeAttributes((Map) edata.get(props), JsonKey.ID); + } + } + return edata; + } + + /** + * Removes specified attributes from the map. + * + * @param map The map to modify + * @param properties The keys to remove + */ + private static void removeAttributes(Map map, String... properties) { + for (String property : properties) { + map.remove(property); + } + } + + /** + * Recursively extracts properties from a map, flattening nested keys. + * + * @param map The map to extract properties from + * @return List of property keys (dot-separated for nested keys) + */ + private static List getProps(Map map) { + try { + return map.entrySet() + .stream() + .map(entry -> entry.getKey()) + .map( + key -> { + if (map.get(key) instanceof Map) { + List keys = getProps((Map) map.get(key)); + return keys.stream() + .map(childKey -> key + "." + childKey) + .collect(Collectors.toList()); + } else { + return Arrays.asList(key); + } + }) + .flatMap(List::stream) + .collect(Collectors.toList()); + } catch (Exception e) { + logger.error("TelemetryGenerator:getProps error =", e); + } + return new ArrayList<>(); + } + + /** + * Constructs the Context object from the context map. + * + * @param context Map containing context info + * @return Constructed Context object + */ + private static Context getContext(Map context) { + String channel = (String) context.get(JsonKey.CHANNEL); + String env = (String) context.get(JsonKey.ENV); + String did = (String) context.get(JsonKey.DEVICE_ID); + Producer producer = getProducer(context); + Context eventContext = new Context(channel, StringUtils.capitalize(env), producer); + eventContext.setDid(did); + if (context.get(JsonKey.ROLLUP) != null + && !((Map) context.get(JsonKey.ROLLUP)).isEmpty()) { + eventContext.setRollup((Map) context.get(JsonKey.ROLLUP)); + } + return eventContext; + } + + /** + * Constructs a Producer object from the context map. + * + * @param context Map containing producer info + * @return Constructed Producer object + */ + private static Producer getProducer(Map context) { + String id = ""; + if (context != null && context.size() != 0) { + if (StringUtils.isNotBlank((String) context.get(JsonKey.APP_ID))) { + id = (String) context.get(JsonKey.APP_ID); + } else { + id = (String) context.get(JsonKey.PDATA_ID); + } + String pid = (String) context.get(JsonKey.PDATA_PID); + String ver = (String) context.get(JsonKey.PDATA_VERSION); + return new Producer(id, pid, ver); + } else { + return new Producer("", "", ""); + } + } + + /** + * Serializes the Telemetry object to a JSON string. + * + * @param telemetry Telemetry object + * @return JSON string representation + */ + private static String getTelemetry(Telemetry telemetry) { + String event = ""; + try { + event = mapper.writeValueAsString(telemetry); + logger.info("TelemetryGenerator:getTelemetry = Telemetry Event : " + event); + } catch (Exception e) { + logger.error( + "TelemetryGenerator:getTelemetry = Telemetry Event: failed to generate audit events:", e); + } + return event; + } + + /** + * Generates SEARCH telemetry event. + * + * @param context Map contains the telemetry context info like actor info, env info etc. + * @param params Map contains the telemetry event data info + * @return Search Telemetry event as JSON string + */ + public static String search(Map context, Map params) { + if (!validateRequest(context, params)) { + return ""; + } + String actorId = (String) context.get(JsonKey.ACTOR_ID); + String actorType = (String) context.get(JsonKey.ACTOR_TYPE); + Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); + + Context eventContext = getContext(context); + + /* Assign request id into context cdata */ + String reqId = (String) context.get(JsonKey.X_REQUEST_ID); + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { + Map map = new HashMap<>(); + map.put(JsonKey.ID, reqId); + map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); + eventContext.getCdata().add(map); + } + + Map edata = generateSearchEdata(params); + Telemetry telemetry = + new Telemetry(TelemetryEvents.SEARCH.getName(), actor, eventContext, edata); + telemetry.setMid(reqId); + return getTelemetry(telemetry); + } + + /** + * Generates event data (edata) for SEARCH telemetry events. + * + * @param params Map containing search event parameters + * @return Constructed edata map + */ + private static Map generateSearchEdata(Map params) { + Map edata = new HashMap<>(); + String type = (String) params.get(JsonKey.TYPE); + String query = (String) params.get(JsonKey.QUERY); + Map filters = (Map) params.get(JsonKey.FILTERS); + Map sort = (Map) params.get(JsonKey.SORT); + List topn = (List) params.get(JsonKey.TOPN); + + edata.put(JsonKey.TYPE, StringUtils.capitalize(type)); + if (null == query) { + query = ""; + } + edata.put(JsonKey.QUERY, query); + edata.put(JsonKey.FILTERS, filters); + edata.put(JsonKey.SORT, sort); + edata.put(JsonKey.SIZE, params.get(JsonKey.SIZE)); + edata.put(JsonKey.TOPN, topn); + return edata; + } + + /** + * Generates LOG telemetry event. + * + * @param context Map contains the telemetry context info like actor info, env info etc. + * @param params Map contains the telemetry event data info + * @return Log Telemetry event as JSON string + */ + public static String log(Map context, Map params) { + if (!validateRequest(context, params)) { + return ""; + } + String actorId = (String) context.get(JsonKey.ACTOR_ID); + String actorType = (String) context.get(JsonKey.ACTOR_TYPE); + Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); + + Context eventContext = getContext(context); + + /* Assign request id into context cdata */ + String reqId = (String) context.get(JsonKey.X_REQUEST_ID); + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { + Map map = new HashMap<>(); + map.put(JsonKey.ID, reqId); + map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); + eventContext.getCdata().add(map); + } + + Map edata = generateLogEdata(params); + Telemetry telemetry = new Telemetry(TelemetryEvents.LOG.getName(), actor, eventContext, edata); + telemetry.setMid(reqId); + return getTelemetry(telemetry); + } + + /** + * Generates event data (edata) for LOG telemetry events. + * + * @param params Map containing log event parameters + * @return Constructed edata map + */ + private static Map generateLogEdata(Map params) { + Map edata = new HashMap<>(); + String logType = (String) params.get(JsonKey.LOG_TYPE); + String logLevel = (String) params.get(JsonKey.LOG_LEVEL); + String message = (String) params.get(JsonKey.MESSAGE); + + edata.put(JsonKey.TYPE, StringUtils.capitalize(logType)); + edata.put(JsonKey.LEVEL, logLevel); + edata.put(JsonKey.MESSAGE, message != null ? message : ""); + + edata.put( + JsonKey.PARAMS, + getParamsList(params, Arrays.asList(JsonKey.LOG_TYPE, JsonKey.LOG_LEVEL, JsonKey.MESSAGE))); + return edata; + } + + /** + * Extracts parameters from a map, excluding specified keys. + * + * @param params Map to extract parameters from + * @param ignore List of keys to exclude + * @return List of parameter maps + */ + private static List> getParamsList( + Map params, List ignore) { + List> paramsList = new ArrayList<>(); + if (null != params && !params.isEmpty()) { + for (Map.Entry entry : params.entrySet()) { + if (!ignore.contains(entry.getKey())) { + Map param = new HashMap<>(); + param.put(entry.getKey(), entry.getValue()); + paramsList.add(param); + } + } + } + return paramsList; + } + + /** + * Generates ERROR telemetry event. + * + * @param context Map contains the telemetry context info like actor info, env info etc. + * @param params Map contains the error event data info + * @return Error Telemetry event as JSON string + */ + public static String error(Map context, Map params) { + if (!validateRequest(context, params)) { + return ""; + } + String actorId = (String) context.get(JsonKey.ACTOR_ID); + String actorType = (String) context.get(JsonKey.ACTOR_TYPE); + Actor actor = new Actor(actorId, StringUtils.capitalize(actorType)); + + Context eventContext = getContext(context); + + /* Assign request id into context cdata */ + String reqId = (String) context.get(JsonKey.X_REQUEST_ID); + if (StringUtils.isBlank(reqId)) { + reqId = (String) context.get(JsonKey.REQUEST_ID); + } + + if (StringUtils.isNotBlank(reqId)) { + Map map = new HashMap<>(); + map.put(JsonKey.ID, reqId); + map.put(JsonKey.TYPE, TelemetryEnvKey.REQUEST_UPPER_CAMEL); + eventContext.getCdata().add(map); + } + + Map edata = generateErrorEdata(params); + edata.put(JsonKey.REQUEST_ID, reqId); + Telemetry telemetry = + new Telemetry(TelemetryEvents.ERROR.getName(), actor, eventContext, edata); + telemetry.setMid(reqId); + return getTelemetry(telemetry); + } + + /** + * Generates event data (edata) for ERROR telemetry events. + * + * @param params Map contains error event parameters + * @return Constructed edata map + */ + private static Map generateErrorEdata(Map params) { + Map edata = new HashMap<>(); + String error = (String) params.get(JsonKey.ERROR); + String errorType = (String) params.get(JsonKey.ERR_TYPE); + String stackTrace = (String) params.get(JsonKey.STACKTRACE); + edata.put(JsonKey.ERROR, error); + edata.put(JsonKey.ERR_TYPE, errorType); + + int stackTraceLength = 100; + try { + String lengthStr = ProjectUtil.getConfigValue(JsonKey.STACKTRACE_CHAR_LENGTH); + if (StringUtils.isNotBlank(lengthStr)) { + stackTraceLength = Integer.parseInt(lengthStr); + } + } catch (Exception e) { + logger.error("TelemetryGenerator:generateErrorEdata: Error parsing stacktrace length", e); + } + + edata.put( + JsonKey.STACKTRACE, + ProjectUtil.getFirstNCharacterString(stackTrace, stackTraceLength)); + return edata; + } + + /** + * Validates if context and params are present. + * + * @param context Telemetry context map + * @param params Telemetry params map + * @return true if valid, false otherwise + */ + private static boolean validateRequest(Map context, Map params) { + return context != null && !context.isEmpty() && params != null && !params.isEmpty(); + } + +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java new file mode 100644 index 0000000000..b761258a02 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryParams.java @@ -0,0 +1,21 @@ +package org.sunbird.telemetry.util; + +/** + * Enum to represent standard Telemetry parameters. + */ +public enum TelemetryParams { + /** + * Represents the channel ID. + */ + CHANNEL, + + /** + * Represents the environment ID. + */ + ENV, + + /** + * Represents the actor information. + */ + ACTOR; +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java new file mode 100644 index 0000000000..441f6a4179 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryUtil.java @@ -0,0 +1,149 @@ +package org.sunbird.telemetry.util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.keys.JsonKey; +import org.sunbird.request.Request; + +/** + * Utility class for generating and processing telemetry events. + * Provides helper methods to construct telemetry objects and requests. + */ +public final class TelemetryUtil { + + private TelemetryUtil() {} + + /** + * Generates a target object map for telemetry. + * + * @param id The ID of the target object. + * @param type The type of the target object. + * @param currentState The current state of the object. + * @param prevState The previous state of the object. + * @return A map representing the target object. + */ + public static Map generateTargetObject( + String id, String type, String currentState, String prevState) { + + Map target = new HashMap<>(); + target.put(JsonKey.ID, id); + target.put(JsonKey.TYPE, StringUtils.capitalize(type)); + target.put(JsonKey.CURRENT_STATE, currentState); + target.put(JsonKey.PREV_STATE, prevState); + return target; + } + + /** + * Generates the telemetry request map. + * + * @param targetObject The target object map. + * @param correlatedObject List of correlated objects. + * @param eventType The type of telemetry event. + * @param params Additional parameters for the event. + * @param context The context map. + * @return A map representing the telemetry request. + */ + public static Map generateTelemetryRequest( + Map targetObject, + List> correlatedObject, + String eventType, + Map params, + Map context) { + + Map map = new HashMap<>(); + map.put(JsonKey.TARGET_OBJECT, targetObject); + map.put(JsonKey.CORRELATED_OBJECTS, correlatedObject); + map.put(JsonKey.TELEMETRY_EVENT_TYPE, eventType); + map.put(JsonKey.PARAMS, params); + map.put(JsonKey.CONTEXT, context); + return map; + } + + /** + * Generates a correlated object and adds it to the provided list. + * + * @param id The ID of the correlated object. + * @param type The type of the correlated object. + * @param correlation The relation string. + * @param correlationList The list to which the correlated object will be added. + */ + public static void generateCorrelatedObject( + String id, String type, String correlation, List> correlationList) { + + Map correlatedObject = new HashMap<>(); + correlatedObject.put(JsonKey.ID, id); + correlatedObject.put(JsonKey.TYPE, StringUtils.capitalize(type)); + correlatedObject.put(JsonKey.RELATION, correlation); + + correlationList.add(correlatedObject); + } + + /** + * Adds rollup data to the target object. + * + * @param rollUpMap The rollup map. + * @param targetObject The target object to modify. + */ + public static void addTargetObjectRollUp( + Map rollUpMap, Map targetObject) { + targetObject.put(JsonKey.ROLLUP, rollUpMap); + } + + /** + * Processes the telemetry call for Audit events. + * + * @param request The request properties map. + * @param targetObject The target object map. + * @param correlatedObject List of correlated objects. + * @param context The context map. + */ + public static void telemetryProcessingCall( + Map request, + Map targetObject, + List> correlatedObject, + Map context) { + Map params = new HashMap<>(); + params.put(JsonKey.PROPS, request); + Request req = new Request(); + req.setRequest( + TelemetryUtil.generateTelemetryRequest( + targetObject, correlatedObject, TelemetryEvents.AUDIT.getName(), params, context)); + generateTelemetry(req); + } + + /** + * Processes the telemetry call for Audit events with a specific type. + * + * @param type The type of the event. + * @param request The request properties map. + * @param targetObject The target object map. + * @param correlatedObject List of correlated objects. + * @param context The context map. + */ + public static void telemetryProcessingCall( + String type, + Map request, + Map targetObject, + List> correlatedObject, + Map context) { + Map params = new HashMap<>(); + params.put(JsonKey.PROPS, request); + params.put(JsonKey.TYPE, type); + Request req = new Request(); + req.setRequest( + TelemetryUtil.generateTelemetryRequest( + targetObject, correlatedObject, TelemetryEvents.AUDIT.getName(), params, context)); + generateTelemetry(req); + } + + /** + * Helper method to trigger the telemetry writer. + * + * @param request The request object containing telemetry data. + */ + private static void generateTelemetry(Request request) { + TelemetryWriter.write(request); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java new file mode 100644 index 0000000000..d9e7a77fc7 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/util/TelemetryWriter.java @@ -0,0 +1,137 @@ +package org.sunbird.telemetry.util; + +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.Request; +import org.sunbird.telemetry.collector.TelemetryAssemblerFactory; +import org.sunbird.telemetry.collector.TelemetryDataAssembler; +import org.sunbird.telemetry.validator.TelemetryObjectValidator; +import org.sunbird.telemetry.validator.TelemetryObjectValidatorV3; + +/** + * This class writes telemetry events to the configured logger. + * It processes different types of telemetry events such as AUDIT, SEARCH, ERROR, and LOG. + */ +public class TelemetryWriter { + + private static final TelemetryDataAssembler telemetryDataAssembler = + TelemetryAssemblerFactory.get(); + private static final TelemetryObjectValidator telemetryObjectValidator = + new TelemetryObjectValidatorV3(); + private static final LoggerUtil logger = new LoggerUtil(TelemetryWriter.class); + private static final Logger telemetryEventLogger = + LoggerFactory.getLogger("TelemetryEventLogger"); + + /** + * Private constructor to prevent instantiation. + */ + private TelemetryWriter() {} + + /** + * Writes the telemetry event based on the request content. + * + * @param request The request object containing telemetry data. + */ + public static void write(Request request) { + try { + String eventType = (String) request.getRequest().get(JsonKey.TELEMETRY_EVENT_TYPE); + + if (TelemetryEvents.AUDIT.getName().equalsIgnoreCase(eventType)) { + processAuditEvent(request); + } else if (TelemetryEvents.SEARCH.getName().equalsIgnoreCase(eventType)) { + processSearchEvent(request); + } else if (TelemetryEvents.ERROR.getName().equalsIgnoreCase(eventType)) { + processErrorEvent(request); + } else if (TelemetryEvents.LOG.getName().equalsIgnoreCase(eventType)) { + processLogEvent(request); + } + } catch (Exception ex) { + logger.info("Exception occurred while writing telemetry"); + } + } + + /** + * Processes LOG telemetry events. + * + * @param request The request object. + */ + private static void processLogEvent(Request request) { + Map context = (Map) request.getRequest().get(JsonKey.CONTEXT); + Map params = (Map) request.getRequest().get(JsonKey.PARAMS); + String telemetry = telemetryDataAssembler.log(context, params); + + // Validate and write telemetry event + if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateLog(telemetry)) { + telemetryEventLogger.info(telemetry); + } else { + logger.info( + "TelemetryWriter:processLogEvent: Audit Telemetry validation failed: " + telemetry); + } + } + + /** + * Processes ERROR telemetry events. + * + * @param request The request object. + */ + private static void processErrorEvent(Request request) { + Map context = (Map) request.get(JsonKey.CONTEXT); + Map params = (Map) request.get(JsonKey.PARAMS); + String telemetry = telemetryDataAssembler.error(context, params); + + // Validate and write telemetry event + if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateError(telemetry)) { + telemetryEventLogger.info(telemetry); + } + } + + /** + * Processes SEARCH telemetry events. + * + * @param request The request object. + */ + private static void processSearchEvent(Request request) { + Map context = (Map) request.get(JsonKey.CONTEXT); + Map params = (Map) request.get(JsonKey.PARAMS); + String telemetry = telemetryDataAssembler.search(context, params); + + // Validate and write telemetry event + if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateSearch(telemetry)) { + telemetryEventLogger.info(telemetry); + } + } + + /** + * Processes AUDIT telemetry events. + * + * @param request The request object. + */ + private static void processAuditEvent(Request request) { + Map context = (Map) request.get(JsonKey.CONTEXT); + Map targetObject = (Map) request.get(JsonKey.TARGET_OBJECT); + List> correlatedObjects = + (List>) request.get(JsonKey.CORRELATED_OBJECTS); + Map params = (Map) request.get(JsonKey.PARAMS); + Map props = (Map) params.get(JsonKey.PROPS); + + // Check for type in props and add to params if present + if (props != null && props.containsKey(JsonKey.TYPE)) { + String type = (String) props.get(JsonKey.TYPE); + params.put(JsonKey.TYPE, type); + } + params.put(JsonKey.TARGET_OBJECT, targetObject); + params.put(JsonKey.CORRELATED_OBJECTS, correlatedObjects); + + String telemetry = telemetryDataAssembler.audit(context, params); + + // Validate and write telemetry event + if (StringUtils.isNotBlank(telemetry) && telemetryObjectValidator.validateAudit(telemetry)) { + telemetryEventLogger.info(telemetry); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java new file mode 100644 index 0000000000..7c1f79778a --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidator.java @@ -0,0 +1,39 @@ +package org.sunbird.telemetry.validator; + +/** + * Interface for validating telemetry event objects against their schemas. + */ +public interface TelemetryObjectValidator { + + /** + * Validates an AUDIT telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateAudit(String jsonString); + + /** + * Validates a SEARCH telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateSearch(String jsonString); + + /** + * Validates a LOG telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateLog(String jsonString); + + /** + * Validates an ERROR telemetry event JSON string. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + boolean validateError(String jsonString); +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java new file mode 100644 index 0000000000..efb125f310 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/telemetry/validator/TelemetryObjectValidatorV3.java @@ -0,0 +1,285 @@ +package org.sunbird.telemetry.validator; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.telemetry.dto.Telemetry; +import org.sunbird.telemetry.util.TelemetryEvents; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Validator class for Version 3 Telemetry events. + * Implements the TelemetryObjectValidator interface to provide validation logic for various telemetry event types. + */ +public class TelemetryObjectValidatorV3 implements TelemetryObjectValidator { + + private static final LoggerUtil logger = new LoggerUtil(TelemetryObjectValidatorV3.class); + private static TelemetryObjectValidator telemetryObjectValidator = null; + private final ObjectMapper mapper = new ObjectMapper(); + + /** + * Returns the singleton instance of TelemetryObjectValidatorV3. + * + * @return The singleton instance. + */ + public static TelemetryObjectValidator getInstance() { + if (telemetryObjectValidator == null) { + telemetryObjectValidator = new TelemetryObjectValidatorV3(); + } + return telemetryObjectValidator; + } + + @Override + public boolean validateAudit(String jsonString) { + boolean validationSuccess = true; + List missingFields = new ArrayList<>(); + Telemetry telemetryObj = null; + try { + // Parse JSON string to Telemetry object + telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields + validateBasics(telemetryObj, missingFields); + // Validate Audit specific data + validateAuditEventData(telemetryObj.getEdata(), missingFields); + + if (!missingFields.isEmpty()) { + logger.info( + "TelemetryObjectValidatorV3:validateAudit: Validation failed for event: " + + TelemetryEvents.AUDIT.getName() + + ". Missing required fields: " + + String.join(", ", missingFields)); + validationSuccess = false; + } + } catch (IOException e) { + validationSuccess = false; + logger.error("TelemetryObjectValidatorV3:validateAudit: Error parsing JSON: " + e.getMessage(), e); + } + return validationSuccess; + } + + @Override + public boolean validateSearch(String jsonString) { + boolean validationSuccess = true; + List missingFields = new ArrayList<>(); + Telemetry telemetryObj = null; + try { + // Parse JSON string to Telemetry object + telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields + validateBasics(telemetryObj, missingFields); + // Validate Search specific data + validateSearchEventData(telemetryObj.getEdata(), missingFields); + + if (!missingFields.isEmpty()) { + logger.info( + "TelemetryObjectValidatorV3:validateSearch: Validation failed for event: " + + TelemetryEvents.SEARCH.getName() + + ". Missing required fields: " + + String.join(", ", missingFields)); + validationSuccess = false; + } + } catch (IOException e) { + validationSuccess = false; + logger.error("TelemetryObjectValidatorV3:validateSearch: Error parsing JSON: " + e.getMessage(), e); + } + return validationSuccess; + } + + /** + * Validates search event data structure. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ + private void validateSearchEventData(Map edata, List missingFields) { + if (edata == null || edata.isEmpty()) { + missingFields.add("edata"); + } else { + if (null == edata.get(JsonKey.QUERY)) { + missingFields.add(JsonKey.QUERY); + } + if (null == edata.get(JsonKey.SIZE)) { + missingFields.add(JsonKey.SIZE); + } + if (null == edata.get(JsonKey.TOPN)) { + missingFields.add(JsonKey.TOPN); + } + } + } + + /** + * Validates audit event data presence. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ + private void validateAuditEventData(Map edata, List missingFields) { + if (edata == null) { + missingFields.add("edata"); + } + } + + /** + * Validates basic telemetry fields (eid, mid, ver, actor, context). + * + * @param telemetryObj The telemetry object. + * @param missingFields List to populate with missing keys. + */ + private void validateBasics(Telemetry telemetryObj, List missingFields) { + // Check mandatory top-level fields + if (StringUtils.isBlank(telemetryObj.getEid())) { + missingFields.add("eid"); + } + if (StringUtils.isBlank(telemetryObj.getMid())) { + missingFields.add("mid"); + } + if (StringUtils.isBlank(telemetryObj.getVer())) { + missingFields.add("ver"); + } + + // Check actor details + if (null == telemetryObj.getActor()) { + missingFields.add("actor"); + } else { + if (StringUtils.isBlank(telemetryObj.getActor().getId())) { + missingFields.add("actor.id"); + } + if (StringUtils.isBlank(telemetryObj.getActor().getType())) { + missingFields.add("actor.type"); + } + } + + // Check context details + if (null == telemetryObj.getContext()) { + missingFields.add(JsonKey.CONTEXT); + } else { + if (StringUtils.isBlank(telemetryObj.getContext().getChannel())) { + missingFields.add(JsonKey.CONTEXT + "." + JsonKey.CHANNEL); + } + if (StringUtils.isBlank(telemetryObj.getContext().getEnv())) { + missingFields.add(JsonKey.CONTEXT + "." + JsonKey.ENV); + } + } + } + + /** + * Validates a LOG telemetry event. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + @Override + public boolean validateLog(String jsonString) { + boolean validationSuccess = true; + List missingFields = new ArrayList<>(); + Telemetry telemetryObj = null; + try { + // Parse JSON string to Telemetry object + telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields + validateBasics(telemetryObj, missingFields); + // Validate Log specific data + validateLogEventData(telemetryObj.getEdata(), missingFields); + + if (!missingFields.isEmpty()) { + logger.info( + "TelemetryObjectValidatorV3:validateLog: Validation failed for event: " + + TelemetryEvents.LOG.getName() + + ". Missing required fields: " + + String.join(", ", missingFields)); + validationSuccess = false; + } + } catch (IOException e) { + validationSuccess = false; + logger.error("TelemetryObjectValidatorV3:validateLog: Error parsing JSON: " + e.getMessage(), e); + } + return validationSuccess; + } + + /** + * Validates log event data structure. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ + private void validateLogEventData(Map edata, List missingFields) { + if (edata == null || edata.isEmpty()) { + missingFields.add("edata"); + } else { + if (StringUtils.isBlank((String) edata.get(JsonKey.TYPE))) { + missingFields.add(JsonKey.TYPE); + } + if (StringUtils.isBlank((String) edata.get(JsonKey.LEVEL))) { + missingFields.add(JsonKey.LEVEL); + } + // TODO: remember and make this change at the time of re-factoring. + if (StringUtils.isBlank((String) edata.get(JsonKey.MESSAGE))) { + edata.remove(JsonKey.MESSAGE); + } + } + } + + /** + * Validates an ERROR telemetry event. + * + * @param jsonString The JSON string representation of the telemetry event. + * @return true if valid, false otherwise. + */ + @Override + public boolean validateError(String jsonString) { + boolean validationSuccess = true; + List missingFields = new ArrayList<>(); + Telemetry telemetryObj = null; + try { + // Parse JSON string to Telemetry object + telemetryObj = mapper.readValue(jsonString, Telemetry.class); + + // Validate basic fields + validateBasics(telemetryObj, missingFields); + // Validate Error specific data + validateErrorEventData(telemetryObj.getEdata(), missingFields); + + if (!missingFields.isEmpty()) { + logger.info( + "TelemetryObjectValidatorV3:validateError: Validation failed for event: " + + TelemetryEvents.ERROR.getName() + + ". Missing required fields: " + + String.join(", ", missingFields)); + validationSuccess = false; + } + } catch (IOException e) { + validationSuccess = false; + logger.error("TelemetryObjectValidatorV3:validateError: Error parsing JSON: " + e.getMessage(), e); + } + return validationSuccess; + } + + /** + * Validates error event data structure. + * + * @param edata The event data map. + * @param missingFields List to populate with missing keys. + */ + private void validateErrorEventData(Map edata, List missingFields) { + if (edata == null || edata.isEmpty()) { + missingFields.add("edata"); + } else { + if (StringUtils.isBlank((String) edata.get(JsonKey.ERROR))) { + missingFields.add(JsonKey.ERROR); + } + if (StringUtils.isBlank((String) edata.get(JsonKey.ERR_TYPE))) { + missingFields.add(JsonKey.ERR_TYPE); + } + if (StringUtils.isBlank((String) edata.get(JsonKey.STACKTRACE))) { + missingFields.add(JsonKey.STACKTRACE); + } + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortner.java b/core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortner.java new file mode 100644 index 0000000000..b676549160 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortner.java @@ -0,0 +1,18 @@ +package org.sunbird.url; + +import org.sunbird.request.RequestContext; + +/** + * Interface for URL shortening service. + */ +public interface URLShortner { + + /** + * Shortens the provided long URL. + * + * @param url The long URL to shorten. + * @param context The request context for logging. + * @return The shortened URL string, or the original URL if shortening fails or is disabled. + */ + String shortUrl(String url, RequestContext context); +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java b/core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java new file mode 100644 index 0000000000..f6c24e78eb --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/url/URLShortnerImpl.java @@ -0,0 +1,87 @@ +package org.sunbird.url; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; +import org.sunbird.http.HttpClientUtil; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; + +/** + * Implementation of URLShortner interface. + * Uses an external service to shorten URLs if enabled in configuration. + */ +public class URLShortnerImpl implements URLShortner { + private static final LoggerUtil logger = new LoggerUtil(URLShortnerImpl.class); + + private static String resUrl = null; + private static final String SUNBIRD_WEB_URL = "sunbird_web_url"; + + /** + * Shortens the provided long URL using an external service. + * + * @param url The long URL to shorten. + * @param context The request context for logging. + * @return The shortened URL, or the original URL if shortening fails or is disabled. + */ + @Override + public String shortUrl(String url, RequestContext context) { + boolean isEnabled = false; + try { + isEnabled = Boolean.parseBoolean(ProjectUtil.getConfigValue(JsonKey.SUNBIRD_URL_SHORTNER_ENABLE)); + } catch (Exception ex) { + logger.error(context, "URLShortnerImpl:shortUrl: Exception occurred while parsing " + JsonKey.SUNBIRD_URL_SHORTNER_ENABLE, ex); + } + + if (isEnabled) { + String baseUrl = PropertiesCache.getInstance().getProperty("sunbird_url_shortner_base_url"); + String accessToken = System.getenv("url_shortner_access_token"); + if (StringUtils.isBlank(accessToken)) { + accessToken = PropertiesCache.getInstance().getProperty("sunbird_url_shortner_access_token"); + } + + String requestURL = baseUrl + accessToken + "&longUrl=" + url; + logger.debug(context, "URLShortnerImpl:shortUrl: Making request to URL: " + requestURL); + String response = HttpClientUtil.get(requestURL, null, context); + + if (StringUtils.isNotBlank(response)) { + try { + ObjectMapper mapper = new ObjectMapper(); + Map map = mapper.readValue(response, HashMap.class); + Map dataMap = (Map) map.get("data"); + if (dataMap != null && dataMap.containsKey("url")) { + return dataMap.get("url"); + } + } catch (IOException | ClassCastException e) { + logger.error(context, "URLShortnerImpl:shortUrl: Exception occurred while parsing response: " + e.getMessage(), e); + } + } else { + logger.warn(context, "URLShortnerImpl:shortUrl: Received empty response from URL shortener service", null); + } + } + return url; + } + + /** + * Retrieves the shortened version of the configured SUNBIRD_WEB_URL. + * + * @param context The request context. + * @return The shortened URL. + */ + public String getUrl(RequestContext context) { + if (StringUtils.isBlank(resUrl)) { + String webUrl = System.getenv(SUNBIRD_WEB_URL); + if (StringUtils.isBlank(webUrl)) { + webUrl = PropertiesCache.getInstance().getProperty(SUNBIRD_WEB_URL); + } + return shortUrl(webUrl, context); + } else { + return resUrl; + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/CloudStorageUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/CloudStorageUtil.java new file mode 100644 index 0000000000..c1c086bf37 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/CloudStorageUtil.java @@ -0,0 +1,168 @@ +package org.sunbird.utils; + +import static org.sunbird.keys.JsonKey.CLOUD_STORAGE_CNAME_URL; +import static org.sunbird.keys.JsonKey.CLOUD_STORE_BASE_PATH; +import static org.sunbird.common.ProjectUtil.getConfigValue; + +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.lang.StringUtils; +import org.sunbird.cloud.storage.BaseStorageService; +import org.sunbird.cloud.storage.factory.StorageConfig; +import org.sunbird.cloud.storage.factory.StorageServiceFactory; +import org.sunbird.keys.JsonKey; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; +import scala.Option; +import scala.Some; + +public class CloudStorageUtil { + private static final int STORAGE_SERVICE_API_RETRY_COUNT = 3; + private static final Map storageServiceMap = new HashMap<>(); + + /** + * Uploads a file to the cloud storage. + * + * @param storageType The type of storage (e.g., azure, aws). + * @param container The container or bucket name. + * @param objectKey The key (path) for the object in storage. + * @param filePath The local path of the file to upload. + * @return The URL of the uploaded file. + */ + public static String upload( + String storageType, String container, String objectKey, String filePath) { + BaseStorageService storageService = getStorageService(storageType); + return storageService.upload( + container, + filePath, + objectKey, + Option.apply(false), + Option.apply(1), + Option.apply(STORAGE_SERVICE_API_RETRY_COUNT), + Option.empty()); + } + + /** + * Generates a signed URL for an object in cloud storage. + * + * @param storageType The type of storage. + * @param container The container or bucket name. + * @param objectKey The key of the object. + * @return The signed URL. + */ + public static String getSignedUrl(String storageType, String container, String objectKey) { + BaseStorageService storageService = getStorageService(storageType); + return getSignedUrl(storageService, container, objectKey, storageType); + } + + /** + * Generates a signed URL for an object using a specific storage service instance. + * + * @param storageService The storage service instance. + * @param container The container or bucket name. + * @param objectKey The key of the object. + * @param cloudType The cloud type (not directly used but part of signature). + * @return The signed URL. + */ + public static String getSignedUrl( + BaseStorageService storageService, String container, String objectKey, String cloudType) { + return storageService.getSignedURLV2( + container, + objectKey, + Some.apply(getTimeoutInSeconds()), + Some.apply("r"), + Some.apply("application/pdf"), + Option.empty()); + } + + /** + * Deletes a file from cloud storage. + * + * @param storageType The type of storage. + * @param container The container or bucket name. + * @param objectKey The key of the object to delete. + */ + public static void deleteFile(String storageType, String container, String objectKey) { + BaseStorageService storageService = getStorageService(storageType); + storageService.deleteObject(container, objectKey, Option.apply(false)); + } + + /** + * Gets the URI for a specific prefix in the container. + * + * @param storageType The type of storage. + * @param container The container name. + * @param prefix The prefix to list/get. + * @param isDirectory Whether it is a directory. + * @return The URI. + */ + public static String getUri( + String storageType, String container, String prefix, boolean isDirectory) { + BaseStorageService storageService = getStorageService(storageType); + return storageService.getUri(container, prefix, Option.apply(isDirectory)); + } + + /** + * Gets the base URL for cloud storage from configuration. + * + * @return The base URL. + */ + public static String getBaseUrl() { + String baseUrl = getConfigValue(CLOUD_STORAGE_CNAME_URL); + if (StringUtils.isEmpty(baseUrl)) baseUrl = getConfigValue(CLOUD_STORE_BASE_PATH); + return baseUrl; + } + + /** + * Retrieves a storage service instance based on the provided storage type. + * Loads account name and key from properties cache. + * + * @param storageType The type of storage (e.g., azure, aws). + * @return A BaseStorageService instance. + */ + private static BaseStorageService getStorageService(String storageType) { + String storageKey = PropertiesCache.getInstance().getProperty(JsonKey.ACCOUNT_NAME); + String storageSecret = PropertiesCache.getInstance().getProperty(JsonKey.ACCOUNT_KEY); + return getStorageService(storageType, storageKey, storageSecret); + } + + /** + * Retrieves or creates a storage service instance. + * Uses a composite key (type-key) to cache instances. + * + * @param storageType The type of storage. + * @param storageKey The storage account key/name. + * @param storageSecret The storage account secret. + * @return A BaseStorageService instance. + */ + private static BaseStorageService getStorageService( + String storageType, String storageKey, String storageSecret) { + String compositeKey = storageType + "-" + storageKey; + if (storageServiceMap.containsKey(compositeKey)) { + return storageServiceMap.get(compositeKey); + } + synchronized (CloudStorageUtil.class) { + if (storageServiceMap.containsKey(compositeKey)) { + return storageServiceMap.get(compositeKey); + } + scala.Option storageEndpoint = + scala.Option.apply(PropertiesCache.getInstance().getProperty(JsonKey.ACCOUNT_ENDPOINT)); + scala.Option storageRegion = scala.Option.apply(""); + StorageConfig storageConfig = + new StorageConfig(storageType, storageKey, storageSecret, storageEndpoint, storageRegion); + BaseStorageService storageService = StorageServiceFactory.getStorageService(storageConfig); + storageServiceMap.put(compositeKey, storageService); + } + return storageServiceMap.get(compositeKey); + } + + /** + * Retrieves the download link expiry timeout from configuration. + * + * @return The timeout in seconds. + */ + private static int getTimeoutInSeconds() { + String timeoutInSecondsStr = ProjectUtil.getConfigValue(JsonKey.DOWNLOAD_LINK_EXPIRY_TIMEOUT); + return Integer.parseInt(timeoutInSecondsStr); + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/ConfigUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/ConfigUtil.java new file mode 100644 index 0000000000..0b8e7cbd35 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/ConfigUtil.java @@ -0,0 +1,124 @@ +package org.sunbird.utils; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.ProjectUtil; +import org.sunbird.response.ResponseCode; + +/** + * Utility class for type-safe configuration management. + * Provides methods to load configuration from system environment or files. + */ +public class ConfigUtil { + + public static LoggerUtil logger = new LoggerUtil(ConfigUtil.class); + private static Config config; + private static final String DEFAULT_TYPE_SAFE_CONFIG_FILE_NAME = "service.conf"; + private static final String INVALID_FILE_NAME = "Please provide a valid file name."; + + private ConfigUtil() {} + + /** + * Loads the type-safe config object. + * Reads from system environment first, falling back to 'service.conf'. + * + * @return The loaded type-safe Config object. + */ + public static Config getConfig() { + if (config == null) { + synchronized (ConfigUtil.class) { + config = createConfig(DEFAULT_TYPE_SAFE_CONFIG_FILE_NAME); + } + } + return config; + } + + /** + * Loads the type-safe config object from a specific file. + * Reads from system environment first, falling back to the provided file name. + * + * @param fileName The name of the configuration file to load. + * @return The loaded type-safe Config object. + * @throws ProjectCommonException If the file name is null or empty. + */ + public static Config getConfig(String fileName) { + if (StringUtils.isBlank(fileName)) { + logger.info("ConfigUtil:getConfig: Given file name is null or empty: " + fileName); + throw new ProjectCommonException( + ResponseCode.internalError.getErrorCode(), + INVALID_FILE_NAME, + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + if (config == null) { + synchronized (ConfigUtil.class) { + config = createConfig(fileName); + } + } + return config; + } + + /** + * Validates if a mandatory configuration parameter is present. + * + * @param configParameter The configuration parameter value to check. + * @throws ProjectCommonException If the parameter is null or empty. + */ + public static void validateMandatoryConfigValue(String configParameter) { + if (StringUtils.isBlank(configParameter)) { + logger.error("ConfigUtil:validateMandatoryConfigValue: Missing mandatory configuration parameter: " + configParameter, null); + throw new ProjectCommonException( + ResponseCode.mandatoryConfigParamMissing, + ResponseCode.mandatoryConfigParamMissing.getErrorMessage(), + ResponseCode.SERVER_ERROR.getResponseCode(), + configParameter); + } + } + + private static Config createConfig(String fileName) { + Config defaultConf = ConfigFactory.load(fileName); + Config envConf = ConfigFactory.systemEnvironment(); + return envConf.withFallback(defaultConf); + } + + /** + * Parses a JSON string into a type-safe config object. + * + * @param jsonString The configuration string in JSON format. + * @param configType A label for the configuration type (used in error messages). + * @return The parsed Config object. + * @throws ProjectCommonException If the string is empty, parsing fails, or the result is empty. + */ + public static Config getConfigFromJsonString(String jsonString, String configType) { + if (StringUtils.isBlank(jsonString)) { + logger.error("ConfigUtil:getConfigFromJsonString: Empty string provided for " + configType, null); + ProjectCommonException.throwServerErrorException( + ResponseCode.errorConfigLoadEmptyString, + ProjectUtil.formatMessage( + ResponseCode.errorConfigLoadEmptyString.getErrorMessage(), configType)); + } + + Config jsonConfig = null; + try { + jsonConfig = ConfigFactory.parseString(jsonString); + logger.info("ConfigUtil:getConfigFromJsonString: Successfully constructed configuration for " + configType); + } catch (Exception e) { + logger.error("ConfigUtil:getConfigFromJsonString: Exception occurred during parse", e); + ProjectCommonException.throwServerErrorException( + ResponseCode.errorConfigLoadParseString, + ProjectUtil.formatMessage( + ResponseCode.errorConfigLoadParseString.getErrorMessage(), configType)); + } + + if (jsonConfig == null || jsonConfig.isEmpty()) { + logger.error("ConfigUtil:getConfigFromJsonString: Empty configuration resulting from parse for " + configType, null); + ProjectCommonException.throwServerErrorException( + ResponseCode.errorConfigLoadEmptyConfig, + ProjectUtil.formatMessage( + ResponseCode.errorConfigLoadEmptyConfig.getErrorMessage(), configType)); + } + return jsonConfig; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/EsConfigUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/EsConfigUtil.java new file mode 100644 index 0000000000..7b7dab28e4 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/EsConfigUtil.java @@ -0,0 +1,26 @@ +package org.sunbird.utils; + +import org.apache.commons.lang3.StringUtils; + +/** + * Utility class for retrieving Elasticsearch configuration values. + * Checks system environment variables first, then falls back to properties cache. + */ +public class EsConfigUtil { + + private EsConfigUtil() {} + + /** + * Retrieves the configuration value for the given key. + * Priority: System Environment Variable -> Properties Cache. + * + * @param key The configuration key. + * @return The configuration value. + */ + public static String getConfigValue(String key) { + if (StringUtils.isNotBlank(System.getenv(key))) { + return System.getenv(key); + } + return org.sunbird.common.PropertiesCache.getInstance().getProperty(key); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/ExcelFileUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/ExcelFileUtil.java new file mode 100644 index 0000000000..8d53946878 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/ExcelFileUtil.java @@ -0,0 +1,89 @@ +package org.sunbird.utils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.sunbird.logging.LoggerUtil; + +/** + * Utility class to generate Excel files using Apache POI. + * Extends basic FileUtil functionalities. + */ +public class ExcelFileUtil extends FileUtil { + + private static final LoggerUtil logger = new LoggerUtil(ExcelFileUtil.class); + + /** + * Writes the provided data values to an Excel file (.xlsx). + * + * @param fileName The name of the file to be created (without extension). + * @param dataValues A list of rows, where each row is a list of cell objects (Strings, Integers, etc.). + * @return The created File object, or null (and fails gracefully) if an error occurs. + */ + @SuppressWarnings({"resource", "unused"}) + public File writeToFile(String fileName, List> dataValues) { + // Blank workbook + XSSFWorkbook workbook = new XSSFWorkbook(); + // Create a blank sheet + XSSFSheet sheet = workbook.createSheet("Data"); + FileOutputStream out = null; + File file = null; + int rownum = 0; + + logger.info("ExcelFileUtil:writeToFile: Starting file creation for: " + fileName); + + for (Object key : dataValues) { + Row row = sheet.createRow(rownum); + List objArr = dataValues.get(rownum); + int cellnum = 0; + for (Object obj : objArr) { + Cell cell = row.createCell(cellnum++); + if (obj instanceof String) { + cell.setCellValue((String) obj); + } else if (obj instanceof Integer) { + cell.setCellValue((Integer) obj); + } else if (obj instanceof List) { + cell.setCellValue(getListValue(obj)); + } else if (obj instanceof Double) { + cell.setCellValue((Double) obj); + } else { + if (null != (obj)) { + cell.setCellValue(obj.toString()); + } + } + } + rownum++; + } + + try { + // Write the workbook in file system + file = new File(fileName + ".xlsx"); + out = new FileOutputStream(file); + workbook.write(out); + logger.info( + "ExcelFileUtil:writeToFile: File created successfully. Name: " + + fileName + + ", Rows: " + + rownum); + + } catch (Exception e) { + logger.error( + "ExcelFileUtil:writeToFile: Error occurred while creating file: " + fileName, e); + } finally { + if (null != out) { + try { + out.close(); + } catch (IOException e) { + logger.error( + "ExcelFileUtil:writeToFile: Error closing output stream for file: " + fileName, e); + } + } + } + return file; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/FileUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/FileUtil.java new file mode 100644 index 0000000000..e178995afc --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/FileUtil.java @@ -0,0 +1,60 @@ +package org.sunbird.utils; + +import java.io.File; +import java.util.List; +import org.apache.commons.lang3.StringUtils; + +/** + * Abstract factory and utility class for file operations. + * Provides methods to write list data to files and instantiate specific file utilities. + */ +public abstract class FileUtil { + + /** + * Abstract method to write data to a file. + * + * @param fileName The name of the file. + * @param dataValues The data to be written. + * @return The created File object. + */ + public abstract File writeToFile(String fileName, List> dataValues); + + /** + * Helper method to convert a List of objects into a comma-separated String. + * + * @param obj The object which must be a List. + * @return A comma-separated string representation of the list, or empty string if empty. + */ + @SuppressWarnings("unchecked") + protected static String getListValue(Object obj) { + List data = (List) obj; + if (!(data.isEmpty())) { + StringBuilder sb = new StringBuilder(); + for (Object value : data) { + sb.append((String) value).append(","); + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } + return ""; + } + + /** + * Factory method to get a specific FileUtil implementation based on format. + * + * @param format The desired file format (e.g., "excel"). + * @return An instance of the corresponding FileUtil implementation. + */ + public static FileUtil getFileUtil(String format) { + String tempformat = ""; + if (!StringUtils.isBlank(format)) { + tempformat = format.toLowerCase(); + } + switch (tempformat) { + case "excel": + return (new ExcelFileUtil()); + default: + return (new ExcelFileUtil()); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/JsonUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/JsonUtil.java new file mode 100644 index 0000000000..64bab9edaf --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/JsonUtil.java @@ -0,0 +1,146 @@ +package org.sunbird.utils; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.RequestContext; + +/** + * Utility class for JSON operations using Jackson. + * Provides static methods for serialization, deserialization, and conversion. + */ +public class JsonUtil { + + private static final LoggerUtil logger = new LoggerUtil(JsonUtil.class); + private static ObjectMapper mapper = new ObjectMapper(); + private static ObjectMapper mapperWithDateFormat = new ObjectMapper(); + + static { + // Configure default mapper + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.setSerializationInclusion(Include.NON_NULL); + + // Configure mapper with date format support base settings + mapperWithDateFormat.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapperWithDateFormat.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + /** + * Serializes an object to a JSON string. + * + * @param obj The object to serialize. + * @return The JSON string representation. + * @throws Exception If serialization fails. + */ + public static String serialize(Object obj) throws Exception { + return mapper.writeValueAsString(obj); + } + + /** + * Deserializes a JSON string to a POJO. + * + * @param value The JSON string. + * @param clazz The target class. + * @param The type of the target class. + * @return The deserialized object. + * @throws Exception If deserialization fails. + */ + public static T deserialize(String value, Class clazz) throws Exception { + return mapper.readValue(value, clazz); + } + + /** + * Deserializes an InputStream to a POJO. + * + * @param value The InputStream containing JSON. + * @param clazz The target class. + * @param The type of the target class. + * @return The deserialized object. + * @throws Exception If deserialization fails. + */ + public static T deserialize(InputStream value, Class clazz) throws Exception { + return mapper.readValue(value, clazz); + } + + /** + * Converts an object to the target class type using Jackson conversion. + * + * @param value The source object. + * @param clazz The target class. + * @param The type of the target class. + * @return The converted object. + * @throws Exception If conversion fails. + */ + public static T convert(Object value, Class clazz) throws Exception { + return mapper.convertValue(value, clazz); + } + + /** + * Converts an object to the target class using a specific date format. + * + * @param value The source object. + * @param clazz The target class. + * @param dateFormat The SimpleDateFormat to use. + * @param The type of the target class. + * @return The converted object. + * @throws Exception If conversion fails. + */ + public static T convertWithDateFormat( + Object value, Class clazz, SimpleDateFormat dateFormat) throws Exception { + mapperWithDateFormat.setDateFormat(dateFormat); + return mapperWithDateFormat.convertValue(value, clazz); + } + + /** + * Serializes an object to a JSON string, logging any errors instead of throwing. + * + * @param object The object to serialize. + * @param context The request context for logging. + * @return The JSON string, or null if an error occurs. + */ + public static String toJson(Object object, RequestContext context) { + try { + return mapper.writeValueAsString(object); + } catch (Exception e) { + logger.error(context, "JsonUtil:toJson: Error occurred while serializing object to JSON string.", e); + } + return null; + } + + /** + * Checks if a string is null or empty (after trimming). + * + * @param value The string to check. + * @return True if null or empty/whitespace, false otherwise. + */ + public static boolean isStringNullOREmpty(String value) { + return value == null || "".equals(value.trim()); + } + + /** + * Deserializes a JSON string to a POJO, logging any errors instead of throwing. + * + * @param res The JSON string. + * @param clazz The target class. + * @param context The request context for logging. + * @param The type of the target class. + * @return The deserialized object, or null if an error occurs. + */ + public static T getAsObject(String res, Class clazz, RequestContext context) { + T result = null; + try { + JsonNode node = mapper.readTree(res); + result = mapper.convertValue(node, clazz); + } catch (Exception e) { + logger.error(context, "JsonUtil:getAsObject: Error occurred while deserializing JSON string to Object.", e); + } + return result; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/Matcher.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/Matcher.java new file mode 100644 index 0000000000..117aea2693 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/Matcher.java @@ -0,0 +1,35 @@ +package org.sunbird.utils; + +import org.apache.commons.lang3.StringUtils; + +/** + * Utility class for matching identifiers and other string values. + * + *

This class provides standardized static methods for string comparison, primarily dealing with + * case-insensitive matching logic used throughout the application for identifiers. + */ +public class Matcher { + + /** Private constructor to prevent instantiation of utility class. */ + private Matcher() {} + + /** + * Compares two identifier strings for equality, ignoring case considerations. + * + *

This method delegates to {@link StringUtils#equalsIgnoreCase(CharSequence, CharSequence)}. + * It handles {@code null} inputs gracefully: + * + *

    + *
  • If both identifiers are {@code null}, it returns {@code true}. + *
  • If one is {@code null} and the other is not, it returns {@code false}. + *
  • Otherwise, it compares them ignoring case (e.g., "abc" equals "ABC"). + *
+ * + * @param firstVal The first identifier string to compare. + * @param secondVal The second identifier string to compare. + * @return {@code true} if the identifiers are equal (ignoring case), {@code false} otherwise. + */ + public static boolean matchIdentifiers(String firstVal, String secondVal) { + return StringUtils.equalsIgnoreCase(firstVal, secondVal); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/RestUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/RestUtil.java new file mode 100644 index 0000000000..1636f01ec4 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/RestUtil.java @@ -0,0 +1,112 @@ +package org.sunbird.utils; + +import org.apache.pekko.dispatch.Futures; +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.JsonNode; +import com.mashape.unirest.http.Unirest; +import com.mashape.unirest.http.async.Callback; +import com.mashape.unirest.http.exceptions.UnirestException; +import com.mashape.unirest.request.BaseRequest; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.keys.JsonKey; +import org.sunbird.common.PropertiesCache; +import scala.concurrent.Future; +import scala.concurrent.Promise; + +/** + * Utility class for performing REST API operations using Unirest. + * Supports synchronous and asynchronous JSON requests. + */ +public class RestUtil { + + private static final LoggerUtil logger = new LoggerUtil(RestUtil.class); + + static { + String apiKey = System.getenv(JsonKey.EKSTEP_AUTHORIZATION); + if (StringUtils.isBlank(apiKey)) { + apiKey = PropertiesCache.getInstance().getProperty(JsonKey.EKSTEP_AUTHORIZATION); + } + Unirest.setDefaultHeader("Content-Type", "application/json"); + Unirest.setDefaultHeader("Authorization", "Bearer " + apiKey); + Unirest.setDefaultHeader("Connection", "Keep-Alive"); + } + + private RestUtil() {} + + /** + * Executes an asynchronous JSON request. + * + * @param request The Unirest BaseRequest to execute. + * @return A Future containing the HttpResponse with JsonNode. + */ + public static Future> executeAsync(BaseRequest request) { + logger.debug("RestUtil:executeAsync: request url = " + request.getHttpRequest().getUrl()); + Promise> promise = Futures.promise(); + + request.asJsonAsync( + new Callback() { + + @Override + public void failed(UnirestException e) { + promise.failure(e); + } + + @Override + public void completed(HttpResponse response) { + promise.success(response); + } + + @Override + public void cancelled() { + promise.failure(new Exception("cancelled")); + } + }); + + return promise.future(); + } + + /** + * Executes a synchronous JSON request. + * + * @param request The Unirest BaseRequest to execute. + * @return The HttpResponse with JsonNode. + * @throws Exception If the request fails. + */ + public static HttpResponse execute(BaseRequest request) throws Exception { + return request.asJson(); + } + + /** + * Extracts a value from a nested JSON response using a dot-separated key. + * + * @param resp The HttpResponse containing the JSON body. + * @param key The dot-separated key to locate the value. + * @return The string value at the specified key. + * @throws Exception If extracting the value fails. + */ + public static String getFromResponse(HttpResponse resp, String key) throws Exception { + String[] nestedKeys = key.split("\\."); + JSONObject obj = resp.getBody().getObject(); + + for (int i = 0; i < nestedKeys.length - 1; i++) { + String nestedKey = nestedKeys[i]; + if (obj.has(nestedKey)) { + obj = obj.getJSONObject(nestedKey); + } + } + + return obj.getString(nestedKeys[nestedKeys.length - 1]); + } + + /** + * Checks if the response status indicates success (HTTP 200). + * + * @param resp The HttpResponse to check. + * @return True if status is 200, false otherwise. + */ + public static boolean isSuccessful(HttpResponse resp) { + return resp.getStatus() == 200; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/Slug.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/Slug.java new file mode 100644 index 0000000000..db80e7ee14 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/Slug.java @@ -0,0 +1,138 @@ +package org.sunbird.utils; + +import java.net.URLDecoder; +import java.text.Normalizer; +import java.text.Normalizer.Form; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Locale; +import java.util.Set; +import java.util.regex.Pattern; +import net.sf.junidecode.Junidecode; +import org.sunbird.logging.LoggerUtil; + +/** + * Utility class for slugifying strings. + * Removes special characters, spaces, and handles transliteration. + */ +public class Slug { + private static final LoggerUtil logger = new LoggerUtil(Slug.class); + + private static final Pattern NONLATIN = Pattern.compile("[^\\w-\\.]"); + private static final Pattern WHITESPACE = Pattern.compile("[\\s]"); + private static final Pattern DUPDASH = Pattern.compile("-+"); + + private Slug() {} + + /** + * Creates a slug from the input string. + * + * @param input The string to slugify. + * @param transliterate Whether to transliterate characters to ASCII. + * @return The slugified string. + */ + public static String makeSlug(String input, boolean transliterate) { + String origInput = input; + // Validate the input + if (input == null) { + logger.debug("Slug:makeSlug: Provided input value is null."); + return input; + } + // Remove extra spaces + String tempInputValue = input.trim(); + // Remove URL encoding + tempInputValue = urlDecode(tempInputValue); + // If transliterate is required + if (transliterate) { + // Transliterate & cleanup + tempInputValue = transliterate(tempInputValue); + } + // Replace all whitespace with dashes + tempInputValue = WHITESPACE.matcher(tempInputValue).replaceAll("-"); + // Remove all accent chars + tempInputValue = Normalizer.normalize(tempInputValue, Form.NFD); + // Remove all non-latin special characters + tempInputValue = NONLATIN.matcher(tempInputValue).replaceAll(""); + // Remove any consecutive dashes + tempInputValue = normalizeDashes(tempInputValue); + // Validate before returning + validateResult(tempInputValue, origInput); + // Slug is always lowercase + return tempInputValue.toLowerCase(Locale.ENGLISH); + } + + private static void validateResult(String input, String origInput) { + // Check if we are not left with a blank + if (input.length() == 0) { + logger.debug( + "Slug:validateResult: Failed to cleanup the input, resulted in empty string. Original input: " + + origInput); + } + } + + /** + * Transliterates the input string to ASCII. + * + * @param input The string to transliterate. + * @return The transliterated string. + */ + public static String transliterate(String input) { + return Junidecode.unidecode(input); + } + + /** + * Decodes a URL encoded string. + * + * @param input The URL encoded string. + * @return The decoded string, or the original if decoding fails. + */ + public static String urlDecode(String input) { + String value = ""; + try { + value = URLDecoder.decode(input, "UTF-8"); + } catch (Exception ex) { + logger.error("Slug:urlDecode: Exception occurred while decoding url: " + ex.getMessage(), ex); + } + return value; + } + + /** + * Removes duplicate characters from a string. + * + * @param text The input string. + * @return The string with unique characters preserving order. + */ + public static String removeDuplicateChars(String text) { + if (text == null || text.length() == 0) { + return ""; + } + Set set = new LinkedHashSet<>(); + StringBuilder ret = new StringBuilder(text.length()); + for (int i = 0; i < text.length(); i++) { + set.add(text.charAt(i)); + } + Iterator itr = set.iterator(); + while (itr.hasNext()) { + ret.append(itr.next()); + } + return ret.toString(); + } + + /** + * Normalizes dashes in the text (removes duplicates and leading/trailing dashes). + * + * @param text The input text. + * @return The text with normalized dashes. + */ + public static String normalizeDashes(String text) { + String clean = DUPDASH.matcher(text).replaceAll("-"); + // Special case that only dashes remain + if ("-".equals(clean) || "--".equals(clean)) { + return ""; + } + int startIdx = (clean.startsWith("-") ? 1 : 0); + int endIdx = (clean.endsWith("-") ? 1 : 0); + clean = clean.substring(startIdx, (clean.length() - endIdx)); + return clean; + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/StringFormatter.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/StringFormatter.java new file mode 100644 index 0000000000..1122a092aa --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/StringFormatter.java @@ -0,0 +1,55 @@ +package org.sunbird.utils; + +/** + * Helper class for String formatting operations. + * Provides methods for joining strings with various delimiters (dot, comma, 'and', 'or'). + */ +public class StringFormatter { + + public static final String DOT = "."; + public static final String AND = " and "; + public static final String OR = " or "; + public static final String COMMA = ", "; + + private StringFormatter() {} + + /** + * Joins multiple strings with a dot delimiter. + * + * @param params One or more strings to be joined. + * @return The dot-separated string. + */ + public static String joinByDot(String... params) { + return String.join(DOT, params); + } + + /** + * Joins multiple strings with an 'or' delimiter. + * + * @param params One or more strings to be joined. + * @return The 'or'-separated string. + */ + public static String joinByOr(String... params) { + return String.join(OR, params); + } + + /** + * Joins multiple strings with an 'and' delimiter. + * + * @param params One or more strings to be joined. + * @return The 'and'-separated string. + */ + public static String joinByAnd(String... params) { + return String.join(AND, params); + } + + /** + * Joins multiple strings with a comma delimiter. + * + * @param params One or more strings to be joined. + * @return The comma-separated string. + */ + public static String joinByComma(String... params) { + return String.join(COMMA, params); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/utils/TableNameUtil.java b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/TableNameUtil.java new file mode 100644 index 0000000000..131c68c175 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/utils/TableNameUtil.java @@ -0,0 +1,26 @@ +package org.sunbird.utils; + +/** + * Utility class to hold table names used in the application. + */ +public class TableNameUtil { + + private TableNameUtil() {} + + public static final String USER_ENROLLMENTS_TABLENAME = "user_enrolments"; + public static final String USER_CONTENT_CONSUMPTION_TABLENAME = "user_content_consumption"; + public static final String COURSE_MANAGEMENT_TABLENAME = "course_management"; + public static final String PAGE_MANAGEMENT_TABLENAME = "page_management"; + public static final String PAGE_SECTION_TABLENAME="page_section"; + public static final String ASSESSMENT_EVAL_TABLENAME="assessment_eval"; + public static final String ASSESSMENT_ITEM_TABLENAME="assessment_item"; + public static final String BULK_UPLOAD_PROCESS_TABLENAME="bulk_upload_process"; + public static final String COURSE_BATCH_TABLENAME="course_batch"; + public static final String CLIENT_INFO_TABLENAME="client_info"; + public static final String USER_AUTH_TABLENAME="user_auth"; + public static final String DIALCODE_IMAGES_TABLENAME="dialcode_images"; + public static final String USER_ACTIVITY_AGG_TABLENAME="user_activity_agg"; + public static final String ASSESSMENT_AGGREGATOR_TABLENAME= "assessment_aggregator"; + public static final String USER_ENROLMENTS_TABLENAME="user_enrolments"; + +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/BaseRequestValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/BaseRequestValidator.java new file mode 100644 index 0000000000..2e752cf4ce --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/BaseRequestValidator.java @@ -0,0 +1,541 @@ +package org.sunbird.validators; + +import com.typesafe.config.ConfigFactory; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.common.ProjectUtil; +import org.sunbird.request.Request; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.utils.StringFormatter; + +/** + * Base request validator class to house common validation methods. + * Provides utility methods for validating request parameters, headers, and data types. + * + * @author B Vinaya Kumar + */ +public class BaseRequestValidator { + public LoggerUtil logger = new LoggerUtil(this.getClass()); + + /** + * Helper method which throws an exception if given parameter value is blank (null or empty). + * + * @param value Request parameter value. + * @param error Error to be thrown in case of validation error. + */ + public void validateParam(String value, ResponseCode error) { + if (StringUtils.isBlank(value)) { + throw new ProjectCommonException( + error.getErrorCode(), + error.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + /** + * Helper method which throws an exception if given parameter value is blank (null or empty). + * + * @param value Request parameter value. + * @param error Error to be thrown in case of validation error. + * @param errorMsgArgument Argument for error message. + */ + public void validateParam(String value, ResponseCode error, String errorMsgArgument) { + if (StringUtils.isBlank(value)) { + throw new ProjectCommonException( + error.getErrorCode(), + MessageFormat.format(error.getErrorMessage(), errorMsgArgument), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + /** + * Helper method which throws an exception if the given parameter list size exceeds the expected + * size. + * + * @param paramName Configuration parameter name + * @param key Request parameter name + * @param listValue Request parameter value + */ + public void validateListParamSize(String paramName, String key, List listValue) { + int maximumSizeAllowed = 0; + try { + maximumSizeAllowed = Integer.valueOf(ProjectUtil.getConfigValue(paramName).trim()); + } catch (NumberFormatException e) { + ProjectCommonException.throwServerErrorException( + ResponseCode.errorInvalidConfigParamValue, + MessageFormat.format( + ResponseCode.errorInvalidConfigParamValue.getErrorMessage(), + ProjectUtil.getConfigValue(key).trim(), + key)); + } + if (listValue.size() > maximumSizeAllowed) { + ProjectCommonException.throwClientErrorException( + ResponseCode.errorMaxSizeExceeded, + MessageFormat.format( + ResponseCode.errorMaxSizeExceeded.getErrorMessage(), + key, + String.valueOf(maximumSizeAllowed))); + } + } + + /** + * This method will create the ProjectCommonException by reading ResponseCode and errorCode. Use + * case: If ResponseCode is null then it will throw invalidData error. + * + * @param code Error response code + * @param errorCode (Http error code) + * @return Custom project exception + */ + public ProjectCommonException createExceptionByResponseCode(ResponseCode code, int errorCode) { + if (code == null) { + logger.info(null, "ResponseCode object is coming as null"); + return new ProjectCommonException( + ResponseCode.invalidData.getErrorCode(), + ResponseCode.invalidData.getErrorMessage(), + errorCode); + } + return new ProjectCommonException(code.getErrorCode(), code.getErrorMessage(), errorCode); + } + + /** + * This method will create the ProjectCommonException by reading ResponseCode and errorCode. Use + * case: If ResponseCode is null then it will throw invalidData error. + * + * @param code Error response code + * @param errorCode (Http error code) + * @param errorMsgArgument Argument for error message + * @return Custom project exception + */ + public ProjectCommonException createExceptionByResponseCode( + ResponseCode code, int errorCode, String errorMsgArgument) { + if (code == null) { + logger.info(null, "ResponseCode object is coming as null"); + return new ProjectCommonException( + ResponseCode.invalidData.getErrorCode(), + ResponseCode.invalidData.getErrorMessage(), + errorCode); + } + return new ProjectCommonException( + code.getErrorCode(), + MessageFormat.format(code.getErrorMessage(), errorMsgArgument), + errorCode); + } + + /** + * Method to check whether given mandatory fields is in given map or not. + * + * @param data Map contains the key value. + * @param keys List of string represents the mandatory fields. + */ + public void checkMandatoryFieldsPresent(Map data, String... keys) { + if (MapUtils.isEmpty(data)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + Arrays.stream(keys) + .forEach( + key -> { + if (StringUtils.isEmpty((String) data.get(key))) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing, + ResponseCode.mandatoryParamsMissing.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode(), + key); + } + }); + } + + /** + * Method to check whether given mandatory fields is in given map or not. Also checks the instance + * of request attributes. + * + * @param data Map contains the key value. + * @param mandatoryParamsList List of strings representing the mandatory fields. + */ + public void checkMandatoryFieldsPresent( + Map data, List mandatoryParamsList) { + if (MapUtils.isEmpty(data)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + mandatoryParamsList.forEach( + key -> { + if (StringUtils.isEmpty((String) data.get(key))) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing, + ResponseCode.mandatoryParamsMissing.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode(), + key); + } + if (!(data.get(key) instanceof String)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + MessageFormat.format(ResponseCode.dataTypeError.getErrorMessage(), key, "String"), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + }); + } + + /** + * Method to check whether given mandatory fields is in given map or not. + * + * @param data Map contains the key value + * @param keys List of string represents the mandatory fields + * @param exceptionMsg Exception message + */ + public void checkMandatoryParamsPresent( + Map data, String exceptionMsg, String... keys) { + if (MapUtils.isEmpty(data)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + Arrays.stream(keys) + .forEach( + key -> { + if (StringUtils.isEmpty((String) data.get(key))) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing, + ProjectUtil.formatMessage( + ResponseCode.mandatoryParamsMissing.getErrorMessage(), exceptionMsg), + ResponseCode.CLIENT_ERROR.getResponseCode(), + key); + } + }); + } + + /** + * Method to check whether given fields are present in given map. If present, throws exception. + * Used for update requests where certain properties cannot be updated. + * + * @param data Map contains the key value + * @param keys List of string represents the fields that must NOT be present. + */ + public void checkReadOnlyAttributesAbsent(Map data, String... keys) { + + if (MapUtils.isEmpty(data)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + Arrays.stream(keys) + .forEach( + key -> { + if (data.containsKey(key)) { + throw new ProjectCommonException( + ResponseCode.unupdatableField, + ResponseCode.unupdatableField.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode(), + key); + } + }); + } + + /** + * Method to check whether given header fields present or not. + * + * @param data List of strings representing the header names in received request. + * @param keys List of string represents the headers fields. + */ + public void checkMandatoryHeadersPresent(Map data, String... keys) { + if (MapUtils.isEmpty(data)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + Arrays.stream(keys) + .forEach( + key -> { + if (ArrayUtils.isEmpty(data.get(key))) { + throw new ProjectCommonException( + ResponseCode.mandatoryHeadersMissing, + ResponseCode.mandatoryHeadersMissing.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode(), + key); + } + }); + } + + /** + * Ensures not allowed fields are absent in given request. + * + * @param requestMap Request information + * @param fields List of not allowed fields + */ + public void checkForFieldsNotAllowed(Map requestMap, List fields) { + fields + .stream() + .forEach( + field -> { + if (requestMap.containsKey(field)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestParameter.getErrorCode(), + ProjectUtil.formatMessage( + ResponseCode.invalidRequestParameter.getErrorMessage(), field), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + }); + } + + /** + * Helper method which throws an exception if each field is not of type List. + * + * @param requestMap Request information + * @param fieldPrefix Field prefix + * @param fields List of fields + */ + public void validateListParamWithPrefix( + Map requestMap, String fieldPrefix, String... fields) { + Arrays.stream(fields) + .forEach( + field -> { + if (requestMap.containsKey(field) + && null != requestMap.get(field) + && !(requestMap.get(field) instanceof List)) { + + String fieldWithPrefix = + fieldPrefix != null ? StringFormatter.joinByDot(fieldPrefix, field) : field; + + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + ProjectUtil.formatMessage( + ResponseCode.dataTypeError.getErrorMessage(), + fieldWithPrefix, + JsonKey.LIST), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + }); + } + + /** + * Helper method which throws an exception if each field is not of type List. + * + * @param requestMap Request information + * @param fields List of fields + */ + public void validateListParam(Map requestMap, String... fields) { + validateListParamWithPrefix(requestMap, null, fields); + } + + /** + * Helper method which throws an exception if given date is not in YYYY-MM-DD format. + * + * @param dob Date of birth. + */ + public void validateDateParam(String dob) { + if (StringUtils.isNotBlank(dob)) { + boolean isValidDate = ProjectUtil.isDateValidFormat(ProjectUtil.YEAR_MONTH_DATE_FORMAT, dob); + if (!isValidDate) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + } + + /** + * Helper method which throws an exception if given parameter value is blank (null or empty). + * + * @param value Request parameter value. + * @param error Error to be thrown in case of validation error. + * @param errorMsg Error message. + */ + public void validateParamValue(String value, ResponseCode error, String errorMsg) { + if (StringUtils.isBlank(value)) { + throw new ProjectCommonException( + error.getErrorCode(), + MessageFormat.format(error.getErrorMessage(), errorMsg), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + /** + * Helper method which throws an exception if user ID in request is not same as that in user + * token. + * + * @param request API request + * @param userIdKey Attribute name for user ID in API request + */ + public static void validateUserId(Request request, String userIdKey) { + if (!(request + .getRequest() + .get(userIdKey) + .equals(request.getContext().get(JsonKey.REQUESTED_BY)))) { + throw new ProjectCommonException( + ResponseCode.invalidParameterValue, + ResponseCode.invalidParameterValue.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode(), + (String) request.getRequest().get(JsonKey.USER_ID), + JsonKey.USER_ID); + } + } + + /** + * Validates a search request ensuring filters are present and correctly typed. + * + * @param request The search request. + */ + public void validateSearchRequest(Request request) { + if (null == request.getRequest().get(JsonKey.FILTERS)) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing.getErrorCode(), + MessageFormat.format( + ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.FILTERS), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + if (request.getRequest().containsKey(JsonKey.FILTERS) + && (!(request.getRequest().get(JsonKey.FILTERS) instanceof Map))) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + MessageFormat.format( + ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FILTERS, "Map"), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + validateSearchRequestFiltersValues(request); + validateSearchRequestFieldsValues(request); + } + + private void validateSearchRequestFieldsValues(Request request) { + if (request.getRequest().containsKey(JsonKey.FIELDS) + && (!(request.getRequest().get(JsonKey.FIELDS) instanceof List))) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + MessageFormat.format( + ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FIELDS, "List"), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + if (request.getRequest().containsKey(JsonKey.FIELDS) + && (request.getRequest().get(JsonKey.FIELDS) instanceof List)) { + for (Object obj : (List) request.getRequest().get(JsonKey.FIELDS)) { + if (!(obj instanceof String)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + MessageFormat.format( + ResponseCode.dataTypeError.getErrorMessage(), JsonKey.FIELDS, "List of String"), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + } + } + + @SuppressWarnings("unchecked") + private void validateSearchRequestFiltersValues(Request request) { + if (request.getRequest().containsKey(JsonKey.FILTERS) + && ((request.getRequest().get(JsonKey.FILTERS) instanceof Map))) { + Map map = (Map) request.getRequest().get(JsonKey.FILTERS); + + map.forEach( + (key, val) -> { + if (key == null) { + throw new ProjectCommonException( + ResponseCode.invalidParameterValue.getErrorCode(), + MessageFormat.format( + ResponseCode.invalidParameterValue.getErrorMessage(), key, JsonKey.FILTERS), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + if (val instanceof List) { + validateListValues((List) val, key); + } else if (val instanceof Map) { + validateMapValues((Map) val); + } else if (val instanceof String && StringUtils.isEmpty((String) val)) { + throw new ProjectCommonException( + ResponseCode.invalidParameterValue.getErrorCode(), + MessageFormat.format( + ResponseCode.invalidParameterValue.getErrorMessage(), val, key), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + }); + } + } + + private void validateMapValues(Map val) { + val.forEach( + (k, v) -> { + if (k == null || v == null) { + throw new ProjectCommonException( + ResponseCode.invalidParameterValue.getErrorCode(), + MessageFormat.format(ResponseCode.invalidParameterValue.getErrorMessage(), v, k), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + }); + } + + private void validateListValues(List val, String key) { + val.forEach( + v -> { + if (v == null) { + throw new ProjectCommonException( + ResponseCode.invalidParameterValue.getErrorCode(), + MessageFormat.format(ResponseCode.invalidParameterValue.getErrorMessage(), v, key), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + }); + } + + /** + * Validates the email format. + * + * @param email The email string to validate. + */ + public void validateEmail(String email) { + if (!EmailValidator.isEmailValid(email)) { + throw new ProjectCommonException( + ResponseCode.emailFormatError.getErrorCode(), + ResponseCode.emailFormatError.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + /** + * Validates the phone format. + * + * @param phone The phone string to validate. + */ + public void validatePhone(String phone) { + if (!ProjectUtil.validatePhone(phone, null)) { + throw new ProjectCommonException( + ResponseCode.phoneNoFormatError.getErrorCode(), + ResponseCode.phoneNoFormatError.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + /** + * Validates if the requestedBy user is authorized. + * + * @param requestedBy The user ID making the request. + */ + public void validateRequestedBy(String requestedBy) { + if (ConfigFactory.load().getBoolean(JsonKey.AUTH_ENABLED)) { + if (StringUtils.isBlank(requestedBy) || JsonKey.ANONYMOUS.contentEquals(requestedBy)) { + throw new ProjectCommonException( + ResponseCode.unAuthorized.getErrorCode(), + ResponseCode.unAuthorized.getErrorMessage(), + ResponseCode.UNAUTHORIZED.getResponseCode()); + } + } + } + + public static void createClientError(ResponseCode responseCode, String field) { + throw new ProjectCommonException( + responseCode.getErrorCode(), + ProjectUtil.formatMessage(responseCode.getErrorMessage(), field), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/EmailValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/EmailValidator.java new file mode 100644 index 0000000000..fc05669387 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/EmailValidator.java @@ -0,0 +1,37 @@ +package org.sunbird.validators; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang.StringUtils; + +/** + * Helper class for validating email addresses. + * Uses regex patterns to ensure email format correctness. + */ +public class EmailValidator { + + private static Pattern pattern; + private static final String EMAIL_PATTERN = + "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; + + private EmailValidator() {} + + static { + pattern = Pattern.compile(EMAIL_PATTERN); + } + + /** + * Validates the format of an email address. + * + * @param email The email address to validate. + * @return True if the email format is valid, otherwise false. + */ + public static boolean isEmailValid(String email) { + if (StringUtils.isBlank(email)) { + return false; + } + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/LearnerStateRequestValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/LearnerStateRequestValidator.java new file mode 100644 index 0000000000..7286bcb477 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/LearnerStateRequestValidator.java @@ -0,0 +1,49 @@ +package org.sunbird.validators; + +import org.apache.commons.collections.CollectionUtils; +import org.sunbird.keys.JsonKey; +import org.sunbird.request.Request; + +import java.util.List; + +/** + * Validator for Learner State related requests. + * Handles validation logic for fetching content state. + */ +public class LearnerStateRequestValidator extends BaseRequestValidator { + + /** + * Validates the 'get content state' request. + * Checks for mandatory parameters and validates course/collection IDs. + * + * @param request The request object containing payload. + */ + @SuppressWarnings("unchecked") + public void validateGetContentState(Request request) { + validateListParam(request.getRequest(), JsonKey.COURSE_IDS, JsonKey.CONTENT_IDS); + + if (request.getRequest().containsKey(JsonKey.COURSE_IDS)) { + List courseIds = (List) request.getRequest().get(JsonKey.COURSE_IDS); + request.getRequest().remove(JsonKey.COURSE_IDS); + + if (!request.getRequest().containsKey(JsonKey.COURSE_ID) + && !request.getRequest().containsKey(JsonKey.COLLECTION_ID) + && CollectionUtils.isNotEmpty(courseIds)) { + request.getRequest().put(JsonKey.COURSE_ID, courseIds.get(0)); + } + } + + String courseIdKey = + request.getRequest().containsKey(JsonKey.COURSE_ID) + ? JsonKey.COURSE_ID + : JsonKey.COLLECTION_ID; + + // Ensure the key exists before putting it back to avoid null values if logic changes + if (request.getRequest().containsKey(courseIdKey)) { + request.getRequest().put(JsonKey.COURSE_ID, request.getRequest().get(courseIdKey)); + } + + checkMandatoryFieldsPresent( + request.getRequest(), JsonKey.USER_ID, JsonKey.COURSE_ID, JsonKey.BATCH_ID); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/PhoneValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/PhoneValidator.java new file mode 100644 index 0000000000..822beaf57d --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/PhoneValidator.java @@ -0,0 +1,119 @@ +package org.sunbird.validators; + +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.PropertiesCache; +import org.sunbird.response.ResponseCode; + +/** + * Utility class for validating phone numbers and country codes. + * Uses Google's libphonenumber for validation. + */ +public class PhoneValidator { + + private static final LoggerUtil logger = new LoggerUtil(PhoneValidator.class); + private static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); + + private PhoneValidator() {} + + /** + * Validates a phone number against a country code. + * + * @param phone The phone number to validate. + * @param countryCode The country code for the phone number. + * @return True if valid. + * @throws ProjectCommonException If the phone number or country code is invalid. + */ + public static boolean validatePhoneNumber(String phone, String countryCode) { + if (phone.contains("+")) { + throw new ProjectCommonException( + ResponseCode.invalidPhoneNumber.getErrorCode(), + ResponseCode.invalidPhoneNumber.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isNotBlank(countryCode)) { + boolean isCountryCodeValid = validateCountryCode(countryCode); + if (!isCountryCodeValid) { + throw new ProjectCommonException( + ResponseCode.invalidCountryCode.getErrorCode(), + ResponseCode.invalidCountryCode.getErrorMessage(), + ERROR_CODE); + } + } + if (validatePhone(phone, countryCode)) { + return true; + } else { + throw new ProjectCommonException( + ResponseCode.phoneNoFormatError.getErrorCode(), + ResponseCode.phoneNoFormatError.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates if the provided country code string is in a valid format. + * + * @param countryCode The country code to check. + * @return True if format is valid, false otherwise. + */ + public static boolean validateCountryCode(String countryCode) { + String countryCodePattern = "^(?:[+] ?){0,1}(?:[0-9] ?){1,3}"; + try { + Pattern pattern = Pattern.compile(countryCodePattern); + Matcher matcher = pattern.matcher(countryCode); + return matcher.matches(); + } catch (Exception e) { + return false; + } + } + + /** + * Validates phone number using Google's PhoneNumberUtil. + * + * @param phone The phone number. + * @param countryCode The country code. + * @return True if the number is valid for the region. + */ + public static boolean validatePhone(String phone, String countryCode) { + PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); + String code = countryCode; + if (StringUtils.isNotBlank(countryCode) && (countryCode.charAt(0) != '+')) { + code = "+" + countryCode; + } + Phonenumber.PhoneNumber phoneNumber = null; + try { + if (StringUtils.isBlank(countryCode)) { + code = PropertiesCache.getInstance().getProperty("sunbird_default_country_code"); + } + String isoCode = phoneNumberUtil.getRegionCodeForCountryCode(Integer.parseInt(code)); + phoneNumber = phoneNumberUtil.parse(phone, isoCode); + return phoneNumberUtil.isValidNumber(phoneNumber); + } catch (NumberParseException e) { + logger.error( + "PhoneValidator:validatePhone: Exception occurred while validating phone number = ", e); + } + return false; + } + + /** + * Validates a phone number using a basic regex pattern for Indian numbers. + * + * @param phoneNumber The phone number string. + * @return True if matches pattern. + */ + public static boolean validatePhoneNumber(String phoneNumber) { + if (StringUtils.isBlank(phoneNumber)) { + return false; + } + String phonePattern = "([+]?(91)?[-]?[0-9]{10}$)"; + Pattern pattern = Pattern.compile(phonePattern); + Matcher matcher = pattern.matcher(phoneNumber); + return matcher.matches(); + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/RequestValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/RequestValidator.java new file mode 100644 index 0000000000..68d4b4ef36 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/RequestValidator.java @@ -0,0 +1,1099 @@ +package org.sunbird.validators; + +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; +import org.sunbird.utils.StringFormatter; +import org.sunbird.request.Request; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; + +/** + * Validates the request structure and data for various operations. + * + * @author Manzarul + */ +public final class RequestValidator { + + private static final LoggerUtil logger = new LoggerUtil(RequestValidator.class); + + private static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); + + private RequestValidator() {} + + /** + * Validates the request structure and data for updating content. + * Checks for mandatory fields and format validity. + * + * @param contentRequestDto The request object containing content update data. + * @throws ProjectCommonException If validation fails. + */ + @SuppressWarnings("unchecked") + public static void validateUpdateContent(Request contentRequestDto) { + List> list = + (List>) (contentRequestDto.getRequest().get(JsonKey.CONTENTS)); + if (CollectionUtils.isNotEmpty(list)) { + for (Map map : list) { + if (null != map.get(JsonKey.LAST_UPDATED_TIME)) { + boolean bool = + ProjectUtil.isDateValidFormat( + "yyyy-MM-dd HH:mm:ss:SSSZ", (String) map.get(JsonKey.LAST_UPDATED_TIME)); + if (!bool) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ERROR_CODE); + } + } + if (null != map.get(JsonKey.LAST_COMPLETED_TIME)) { + boolean bool = + ProjectUtil.isDateValidFormat( + "yyyy-MM-dd HH:mm:ss:SSSZ", (String) map.get(JsonKey.LAST_COMPLETED_TIME)); + if (!bool) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ERROR_CODE); + } + } + if (map.containsKey(JsonKey.CONTENT_ID)) { + if (null == map.get(JsonKey.CONTENT_ID)) { + throw new ProjectCommonException( + ResponseCode.contentIdRequired.getErrorCode(), + ResponseCode.contentIdRequiredError.getErrorMessage(), + ERROR_CODE); + } + if (ProjectUtil.isNull(map.get(JsonKey.STATUS))) { + throw new ProjectCommonException( + ResponseCode.contentStatusRequired.getErrorCode(), + ResponseCode.contentStatusRequired.getErrorMessage(), + ERROR_CODE); + } + } else { + throw new ProjectCommonException( + ResponseCode.contentIdRequired.getErrorCode(), + ResponseCode.contentIdRequiredError.getErrorMessage(), + ERROR_CODE); + } + } + } + List> assessmentData = + (List>) + contentRequestDto.getRequest().get(JsonKey.ASSESSMENT_EVENTS); + if (!CollectionUtils.isEmpty(assessmentData)) { + for (Map map : assessmentData) { + if (!map.containsKey(JsonKey.ASSESSMENT_TS)) { + throw new ProjectCommonException( + ResponseCode.assessmentAttemptDateRequired.getErrorCode(), + ResponseCode.assessmentAttemptDateRequired.getErrorMessage(), + ERROR_CODE); + } + + if (!map.containsKey(JsonKey.COURSE_ID) + || StringUtils.isBlank((String) map.get(JsonKey.COURSE_ID))) { + throw new ProjectCommonException( + ResponseCode.courseIdRequired.getErrorCode(), + ResponseCode.courseIdRequiredError.getErrorMessage(), + ERROR_CODE); + } + + if (!map.containsKey(JsonKey.CONTENT_ID) + || StringUtils.isBlank((String) map.get(JsonKey.CONTENT_ID))) { + throw new ProjectCommonException( + ResponseCode.contentIdRequired.getErrorCode(), + ResponseCode.contentIdRequiredError.getErrorMessage(), + ERROR_CODE); + } + + if (!map.containsKey(JsonKey.BATCH_ID) + || StringUtils.isBlank((String) map.get(JsonKey.BATCH_ID))) { + throw new ProjectCommonException( + ResponseCode.courseBatchIdRequired.getErrorCode(), + ResponseCode.courseBatchIdRequired.getErrorMessage(), + ERROR_CODE); + } + + if (!map.containsKey(JsonKey.USER_ID) + || StringUtils.isBlank((String) map.get(JsonKey.USER_ID))) { + throw new ProjectCommonException( + ResponseCode.userIdRequired.getErrorCode(), + ResponseCode.userIdRequired.getErrorMessage(), + ERROR_CODE); + } + + if (!map.containsKey(JsonKey.ATTEMPT_ID) + || StringUtils.isBlank((String) map.get(JsonKey.ATTEMPT_ID))) { + throw new ProjectCommonException( + ResponseCode.attemptIdRequired.getErrorCode(), + ResponseCode.attemptIdRequired.getErrorMessage(), + ERROR_CODE); + } + + if (!map.containsKey(JsonKey.EVENTS)) { + throw new ProjectCommonException( + ResponseCode.eventsRequired.getErrorCode(), + ResponseCode.eventsRequired.getErrorMessage(), + ERROR_CODE); + } + } + } + } + + /** + * Validates the request data for getting page data. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateGetPageData(Request request) { + if (request == null || (StringUtils.isBlank((String) request.get(JsonKey.SOURCE)))) { + throw new ProjectCommonException( + ResponseCode.sourceRequired.getErrorCode(), + ResponseCode.sourceRequired.getErrorMessage(), + ERROR_CODE); + } + if (!validPageSourceType((String) request.get(JsonKey.SOURCE))) { + throw new ProjectCommonException( + ResponseCode.invalidPageSource.getErrorCode(), + ResponseCode.invalidPageSource.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank((String) request.get(JsonKey.PAGE_NAME))) { + throw new ProjectCommonException( + ResponseCode.pageNameRequired.getErrorCode(), + ResponseCode.pageNameRequired.getErrorMessage(), + ERROR_CODE); + } + } + + private static boolean validPageSourceType(String source) { + boolean isValidSource = false; + for (ProjectUtil.Source src : ProjectUtil.Source.values()) { + if (src.getValue().equalsIgnoreCase(source)) { + isValidSource = true; + break; + } + } + return isValidSource; + } + + /** + * Validates the request data for adding a batch to a course. + * + * @param courseRequest The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateAddBatchCourse(Request courseRequest) { + if (courseRequest.getRequest().get(JsonKey.BATCH_ID) == null) { + throw new ProjectCommonException( + ResponseCode.courseBatchIdRequired.getErrorCode(), + ResponseCode.courseBatchIdRequired.getErrorMessage(), + ERROR_CODE); + } + if (courseRequest.getRequest().get(JsonKey.USER_IDs) == null) { + throw new ProjectCommonException( + ResponseCode.userIdRequired.getErrorCode(), + ResponseCode.userIdRequired.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for getting a batch. + * + * @param courseRequest The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateGetBatchCourse(Request courseRequest) { + if (courseRequest.getRequest().get(JsonKey.BATCH_ID) == null) { + throw new ProjectCommonException( + ResponseCode.courseBatchIdRequired.getErrorCode(), + ResponseCode.courseBatchIdRequired.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for updating a course. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUpdateCourse(Request request) { + if (request.getRequest().get(JsonKey.COURSE_ID) == null) { + throw new ProjectCommonException( + ResponseCode.courseIdRequired.getErrorCode(), + ResponseCode.courseIdRequired.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for publishing a course. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validatePublishCourse(Request request) { + if (request.getRequest().get(JsonKey.COURSE_ID) == null) { + throw new ProjectCommonException( + ResponseCode.courseIdRequiredError.getErrorCode(), + ResponseCode.courseIdRequiredError.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for deleting a course. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateDeleteCourse(Request request) { + if (request.getRequest().get(JsonKey.COURSE_ID) == null) { + throw new ProjectCommonException( + ResponseCode.courseIdRequiredError.getErrorCode(), + ResponseCode.courseIdRequiredError.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for creating a section. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateCreateSection(Request request) { + if (StringUtils.isBlank( + (String) + (request.getRequest().get(JsonKey.SECTION_NAME) != null + ? request.getRequest().get(JsonKey.SECTION_NAME) + : ""))) { + throw new ProjectCommonException( + ResponseCode.sectionNameRequired.getErrorCode(), + ResponseCode.sectionNameRequired.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank( + (String) + (request.getRequest().get(JsonKey.SECTION_DATA_TYPE) != null + ? request.getRequest().get(JsonKey.SECTION_DATA_TYPE) + : ""))) { + throw new ProjectCommonException( + ResponseCode.sectionDataTypeRequired.getErrorCode(), + ResponseCode.sectionDataTypeRequired.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for updating a section. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUpdateSection(Request request) { + if (request.getRequest().containsKey(JsonKey.SECTION_NAME) + && StringUtils.isBlank( + (String) + (request.getRequest().get(JsonKey.SECTION_NAME) != null + ? request.getRequest().get(JsonKey.SECTION_NAME) + : ""))) { + throw new ProjectCommonException( + ResponseCode.sectionNameRequired.getErrorCode(), + ResponseCode.sectionNameRequired.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank( + (String) + (request.getRequest().get(JsonKey.ID) != null + ? request.getRequest().get(JsonKey.ID) + : ""))) { + throw new ProjectCommonException( + ResponseCode.sectionIdRequired.getErrorCode(), + ResponseCode.sectionIdRequired.getErrorMessage(), + ERROR_CODE); + } + if (request.getRequest().containsKey(JsonKey.SECTION_DATA_TYPE) + && StringUtils.isBlank( + (String) + (request.getRequest().get(JsonKey.SECTION_DATA_TYPE) != null + ? request.getRequest().get(JsonKey.SECTION_DATA_TYPE) + : ""))) { + throw new ProjectCommonException( + ResponseCode.sectionDataTypeRequired.getErrorCode(), + ResponseCode.sectionDataTypeRequired.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for creating a page. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateCreatePage(Request request) { + if (StringUtils.isEmpty( + (String) + (request.getRequest().get(JsonKey.PAGE_NAME) != null + ? request.getRequest().get(JsonKey.PAGE_NAME) + : ""))) { + throw new ProjectCommonException( + ResponseCode.pageNameRequired.getErrorCode(), + ResponseCode.pageNameRequired.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for updating a page. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUpdatepage(Request request) { + if (request.getRequest().containsKey(JsonKey.PAGE_NAME) + && StringUtils.isEmpty( + (String) + (request.getRequest().get(JsonKey.PAGE_NAME) != null + ? request.getRequest().get(JsonKey.PAGE_NAME) + : ""))) { + throw new ProjectCommonException( + ResponseCode.pageNameRequired.getErrorCode(), + ResponseCode.pageNameRequired.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank( + (String) + (request.getRequest().get(JsonKey.ID) != null + ? request.getRequest().get(JsonKey.ID) + : ""))) { + throw new ProjectCommonException( + ResponseCode.pageIdRequired.getErrorCode(), + ResponseCode.pageIdRequired.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for uploading users. + * + * @param reqObj The request object containing user upload data. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUploadUser(Map reqObj) { + if (StringUtils.isBlank((String) reqObj.get(JsonKey.ORGANISATION_ID)) + && (StringUtils.isBlank((String) reqObj.get(JsonKey.ORG_EXTERNAL_ID)) + || StringUtils.isBlank((String) reqObj.get(JsonKey.ORG_PROVIDER)))) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing.getErrorCode(), + ProjectUtil.formatMessage( + ResponseCode.mandatoryParamsMissing.getErrorMessage(), + (ProjectUtil.formatMessage( + ResponseMessage.Message.OR_FORMAT, + JsonKey.ORGANISATION_ID, + ProjectUtil.formatMessage( + ResponseMessage.Message.AND_FORMAT, + JsonKey.ORG_EXTERNAL_ID, + JsonKey.ORG_PROVIDER)))), + ERROR_CODE); + } + if (null == reqObj.get(JsonKey.FILE)) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing.getErrorCode(), + ProjectUtil.formatMessage( + ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.FILE), + ERROR_CODE); + } + } + + /** + * Validates the request data for creating a batch. + *
    + *
  • courseId : Should be a valid courseId under EKStep.
  • + *
  • name : should not be null or empty.
  • + *
  • enrolmentType: can have only following two values {"open","invite-only"}.
  • + *
  • startDate : In yyyy-MM-DD format, and must be >= today date.
  • + *
  • endDate : In yyyy-MM-DD format and must be > startDate.
  • + *
  • createdFor : List of valid organisation ids. Used in case of "invite-only" enrolmentType.
  • + *
  • mentors : List of user ids, who will work as a mentor.
  • + *
+ * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateCreateBatchReq(Request request) { + if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.COURSE_ID))) { + throw new ProjectCommonException( + ResponseCode.invalidCourseId.getErrorCode(), + ResponseCode.invalidCourseId.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.NAME))) { + throw new ProjectCommonException( + ResponseCode.courseNameRequired.getErrorCode(), + ResponseCode.courseNameRequired.getErrorMessage(), + ERROR_CODE); + } + String enrolmentType = (String) request.getRequest().get(JsonKey.ENROLLMENT_TYPE); + validateEnrolmentType(enrolmentType); + String startDate = (String) request.getRequest().get(JsonKey.START_DATE); + String endDate = (String) request.getRequest().get(JsonKey.END_DATE); + validateStartDate(startDate); + validateEndDate(startDate, endDate); + + if (request.getRequest().containsKey(JsonKey.COURSE_CREATED_FOR) + && !(request.getRequest().get(JsonKey.COURSE_CREATED_FOR) instanceof List)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + ResponseCode.dataTypeError.getErrorMessage(), + ERROR_CODE); + } + } + + private static boolean checkProgressStatus(int status) { + for (ProjectUtil.ProgressStatus pstatus : ProjectUtil.ProgressStatus.values()) { + if (pstatus.getValue() == status) { + return true; + } + } + return false; + } + + /** + * Validates the request data for updating a batch. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUpdateCourseBatchReq(Request request) { + + if (null != request.getRequest().get(JsonKey.STATUS)) { + boolean status = validateBatchStatus(request); + if (!status) { + throw new ProjectCommonException( + ResponseCode.progressStatusError.getErrorCode(), + ResponseCode.progressStatusError.getErrorMessage(), + ERROR_CODE); + } + } + if (request.getRequest().containsKey(JsonKey.NAME) + && StringUtils.isEmpty((String) request.getRequest().get(JsonKey.NAME))) { + throw new ProjectCommonException( + ResponseCode.courseNameRequired.getErrorCode(), + ResponseCode.courseNameRequired.getErrorMessage(), + ERROR_CODE); + } + if (request.getRequest().containsKey(JsonKey.ENROLLMENT_TYPE)) { + String enrolmentType = (String) request.getRequest().get(JsonKey.ENROLLMENT_TYPE); + validateEnrolmentType(enrolmentType); + } + String startDate = (String) request.getRequest().get(JsonKey.START_DATE); + String endDate = (String) request.getRequest().get(JsonKey.END_DATE); + + validateUpdateBatchStartDate(startDate); + validateEndDate(startDate, endDate); + + boolean bool = validateDateWithTodayDate(endDate); + if (!bool) { + throw new ProjectCommonException( + ResponseCode.invalidBatchEndDateError.getErrorCode(), + ResponseCode.invalidBatchEndDateError.getErrorMessage(), + ERROR_CODE); + } + + validateUpdateBatchEndDate(request); + if (request.getRequest().containsKey(JsonKey.COURSE_CREATED_FOR) + && !(request.getRequest().get(JsonKey.COURSE_CREATED_FOR) instanceof List)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + ResponseCode.dataTypeError.getErrorMessage(), + ERROR_CODE); + } + + if (request.getRequest().containsKey(JsonKey.MENTORS) + && !(request.getRequest().get(JsonKey.MENTORS) instanceof List)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + ResponseCode.dataTypeError.getErrorMessage(), + ERROR_CODE); + } + } + + private static void validateUpdateBatchStartDate(String startDate) { + if (StringUtils.isNotBlank(startDate)) { + try { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + format.parse(startDate); + } catch (Exception e) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ERROR_CODE); + } + } else { + throw new ProjectCommonException( + ResponseCode.courseBatchStartDateRequired.getErrorCode(), + ResponseCode.courseBatchStartDateRequired.getErrorMessage(), + ERROR_CODE); + } + } + + private static boolean validateBatchStatus(Request request) { + boolean status = false; + try { + status = checkProgressStatus(Integer.parseInt("" + request.getRequest().get(JsonKey.STATUS))); + + } catch (Exception e) { + logger.error("RequestValidator:validateBatchStatus: Error validating batch status", e); + } + return status; + } + + private static void validateUpdateBatchEndDate(Request request) { + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String startDate = (String) request.getRequest().get(JsonKey.START_DATE); + String endDate = (String) request.getRequest().get(JsonKey.END_DATE); + format.setLenient(false); + if (StringUtils.isNotBlank(endDate) && StringUtils.isNotBlank(startDate)) { + Date batchStartDate = null; + Date batchEndDate = null; + try { + batchStartDate = format.parse(startDate); + batchEndDate = format.parse(endDate); + Calendar cal1 = Calendar.getInstance(); + Calendar cal2 = Calendar.getInstance(); + cal1.setTime(batchStartDate); + cal2.setTime(batchEndDate); + } catch (Exception e) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ERROR_CODE); + } + if (batchEndDate.before(batchStartDate)) { + throw new ProjectCommonException( + ResponseCode.invalidBatchEndDateError.getErrorCode(), + ResponseCode.invalidBatchEndDateError.getErrorMessage(), + ERROR_CODE); + } + } + } + + private static boolean validateDateWithTodayDate(String date) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + format.setLenient(false); + try { + if (StringUtils.isNotEmpty(date)) { + Date reqDate = format.parse(date); + Date todayDate = format.parse(format.format(new Date())); + Calendar cal1 = Calendar.getInstance(); + Calendar cal2 = Calendar.getInstance(); + cal1.setTime(reqDate); + cal2.setTime(todayDate); + if (reqDate.before(todayDate)) { + return false; + } + } + } catch (Exception e) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ERROR_CODE); + } + return true; + } + + /** + * Validates the enrollment type. + * + * @param enrolmentType The enrollment type string. + * @throws ProjectCommonException If validation fails. + */ + public static void validateEnrolmentType(String enrolmentType) { + if (StringUtils.isBlank(enrolmentType)) { + throw new ProjectCommonException( + ResponseCode.enrolmentTypeRequired.getErrorCode(), + ResponseCode.enrolmentTypeRequired.getErrorMessage(), + ERROR_CODE); + } + if (!(ProjectUtil.EnrolmentType.open.getVal().equalsIgnoreCase(enrolmentType) + || ProjectUtil.EnrolmentType.inviteOnly.getVal().equalsIgnoreCase(enrolmentType))) { + throw new ProjectCommonException( + ResponseCode.enrolmentIncorrectValue.getErrorCode(), + ResponseCode.enrolmentIncorrectValue.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the start date. + * + * @param startDate The start date string in yyyy-MM-dd format. + * @throws ProjectCommonException If validation fails. + */ + private static void validateStartDate(String startDate) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + format.setLenient(false); + if (StringUtils.isBlank(startDate)) { + throw new ProjectCommonException( + ResponseCode.courseBatchStartDateRequired.getErrorCode(), + ResponseCode.courseBatchStartDateRequired.getErrorMessage(), + ERROR_CODE); + } + try { + Date batchStartDate = format.parse(startDate); + Date todayDate = format.parse(format.format(new Date())); + Calendar cal1 = Calendar.getInstance(); + Calendar cal2 = Calendar.getInstance(); + cal1.setTime(batchStartDate); + cal2.setTime(todayDate); + if (batchStartDate.before(todayDate)) { + throw new ProjectCommonException( + ResponseCode.courseBatchStartDateError.getErrorCode(), + ResponseCode.courseBatchStartDateError.getErrorMessage(), + ERROR_CODE); + } + } catch (ProjectCommonException e) { + throw e; + } catch (Exception e) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ERROR_CODE); + } + } + + private static void validateEndDate(String startDate, String endDate) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + format.setLenient(false); + Date batchEndDate = null; + Date batchStartDate = null; + try { + if (StringUtils.isNotEmpty(endDate)) { + batchEndDate = format.parse(endDate); + batchStartDate = format.parse(startDate); + } + } catch (Exception e) { + throw new ProjectCommonException( + ResponseCode.dateFormatError.getErrorCode(), + ResponseCode.dateFormatError.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isNotEmpty(endDate) && batchStartDate.getTime() >= batchEndDate.getTime()) { + throw new ProjectCommonException( + ResponseCode.endDateError.getErrorCode(), + ResponseCode.endDateError.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for sync operations. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateSyncRequest(Request request) { + String operation = (String) request.getRequest().get(JsonKey.OPERATION_FOR); + if ((null != operation) && (!operation.equalsIgnoreCase("keycloak"))) { + if (request.getRequest().get(JsonKey.OBJECT_TYPE) == null) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + ResponseCode.dataTypeError.getErrorMessage(), + ERROR_CODE); + } + List list = + new ArrayList<>( + Arrays.asList( + new String[] { + JsonKey.USER, JsonKey.ORGANISATION, JsonKey.BATCH, JsonKey.USER_COURSE + })); + if (!list.contains(request.getRequest().get(JsonKey.OBJECT_TYPE))) { + throw new ProjectCommonException( + ResponseCode.invalidObjectType.getErrorCode(), + ResponseCode.invalidObjectType.getErrorMessage(), + ERROR_CODE); + } + } + } + + /** + * Validates the request data for updating system settings. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUpdateSystemSettingsRequest(Request request) { + List list = + new ArrayList<>( + Arrays.asList( + PropertiesCache.getInstance() + .getProperty("system_settings_properties") + .split(","))); + for (String str : request.getRequest().keySet()) { + if (!list.contains(str)) { + throw new ProjectCommonException( + ResponseCode.invalidPropertyError.getErrorCode(), + MessageFormat.format(ResponseCode.invalidPropertyError.getErrorMessage(), str), + ERROR_CODE); + } + } + } + + /** + * Validates the request data for sending an email. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + @SuppressWarnings("unchecked") + public static void validateSendMail(Request request) { + if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.SUBJECT))) { + throw new ProjectCommonException( + ResponseCode.emailSubjectError.getErrorCode(), + ResponseCode.emailSubjectError.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.BODY))) { + throw new ProjectCommonException( + ResponseCode.emailBodyError.getErrorCode(), + ResponseCode.emailBodyError.getErrorMessage(), + ERROR_CODE); + } + if (CollectionUtils.isEmpty((List) (request.getRequest().get(JsonKey.RECIPIENT_EMAILS))) + && CollectionUtils.isEmpty( + (List) (request.getRequest().get(JsonKey.RECIPIENT_USERIDS))) + && MapUtils.isEmpty( + (Map) (request.getRequest().get(JsonKey.RECIPIENT_SEARCH_QUERY))) + && CollectionUtils.isEmpty( + (List) (request.getRequest().get(JsonKey.RECIPIENT_PHONES)))) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing.getErrorCode(), + MessageFormat.format( + ResponseCode.mandatoryParamsMissing.getErrorMessage(), + StringFormatter.joinByOr( + StringFormatter.joinByComma( + JsonKey.RECIPIENT_EMAILS, + JsonKey.RECIPIENT_USERIDS, + JsonKey.RECIPIENT_PHONES), + JsonKey.RECIPIENT_SEARCH_QUERY)), + ERROR_CODE); + } + } + + /** + * Validates the request data for file upload. + * + * @param reqObj The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateFileUpload(Request reqObj) { + + if (StringUtils.isBlank((String) reqObj.get(JsonKey.CONTAINER))) { + throw new ProjectCommonException( + ResponseCode.storageContainerNameMandatory.getErrorCode(), + ResponseCode.storageContainerNameMandatory.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the request data for creating an organisation type. + * + * @param reqObj The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateCreateOrgType(Request reqObj) { + if (StringUtils.isBlank((String) reqObj.getRequest().get(JsonKey.NAME))) { + throw createExceptionInstance(ResponseCode.orgTypeMandatory.getErrorCode()); + } + } + + /** + * Validates the request data for updating an organisation type. + * + * @param reqObj The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUpdateOrgType(Request reqObj) { + if (StringUtils.isBlank((String) reqObj.getRequest().get(JsonKey.NAME))) { + throw createExceptionInstance(ResponseCode.orgTypeMandatory.getErrorCode()); + } + if (StringUtils.isBlank((String) reqObj.getRequest().get(JsonKey.ID))) { + throw createExceptionInstance(ResponseCode.orgTypeIdRequired.getErrorCode()); + } + } + + /** + * Validates the request data for a note. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + @SuppressWarnings("rawtypes") + public static void validateNote(Request request) { + if (StringUtils.isBlank((String) request.get(JsonKey.USER_ID))) { + throw new ProjectCommonException( + ResponseCode.userIdRequired.getErrorCode(), + ResponseCode.userIdRequired.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank((String) request.get(JsonKey.TITLE))) { + throw new ProjectCommonException( + ResponseCode.titleRequired.getErrorCode(), + ResponseCode.titleRequired.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank((String) request.get(JsonKey.NOTE))) { + throw new ProjectCommonException( + ResponseCode.noteRequired.getErrorCode(), + ResponseCode.noteRequired.getErrorMessage(), + ERROR_CODE); + } + if (StringUtils.isBlank((String) request.get(JsonKey.CONTENT_ID)) + && StringUtils.isBlank((String) request.get(JsonKey.COURSE_ID))) { + throw new ProjectCommonException( + ResponseCode.contentIdError.getErrorCode(), + ResponseCode.contentIdError.getErrorMessage(), + ERROR_CODE); + } + if (request.getRequest().containsKey(JsonKey.TAGS) + && ((request.getRequest().get(JsonKey.TAGS) instanceof List) + && ((List) request.getRequest().get(JsonKey.TAGS)).isEmpty())) { + throw new ProjectCommonException( + ResponseCode.invalidTags.getErrorCode(), + ResponseCode.invalidTags.getErrorMessage(), + ERROR_CODE); + } else if (request.getRequest().get(JsonKey.TAGS) instanceof String) { + throw new ProjectCommonException( + ResponseCode.invalidTags.getErrorCode(), + ResponseCode.invalidTags.getErrorMessage(), + ERROR_CODE); + } + } + + /** + * Validates the note ID. + * + * @param noteId The note ID string. + * @throws ProjectCommonException If validation fails. + */ + public static void validateNoteId(String noteId) { + if (StringUtils.isBlank(noteId)) { + throw createExceptionInstance(ResponseCode.invalidNoteId.getErrorCode()); + } + } + + /** + * Validates the request data for registering a client. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateRegisterClient(Request request) { + + if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.CLIENT_NAME))) { + throw createExceptionInstance(ResponseCode.invalidClientName.getErrorCode()); + } + } + + /** + * Validates the request data for updating the client key. + * + * @param clientId The client ID. + * @param masterAccessToken The master access token. + * @throws ProjectCommonException If validation fails. + */ + public static void validateUpdateClientKey(String clientId, String masterAccessToken) { + validateClientId(clientId); + if (StringUtils.isBlank(masterAccessToken)) { + throw createExceptionInstance(ResponseCode.invalidRequestData.getErrorCode()); + } + } + + /** + * Validates the request data for getting the client key. + * + * @param id The client ID. + * @param type The client type. + * @throws ProjectCommonException If validation fails. + */ + public static void validateGetClientKey(String id, String type) { + validateClientId(id); + if (StringUtils.isBlank(type)) { + throw createExceptionInstance(ResponseCode.invalidRequestData.getErrorCode()); + } + } + + /** + * Validates the client ID. + * + * @param clientId The client ID string. + * @throws ProjectCommonException If validation fails. + */ + public static void validateClientId(String clientId) { + if (StringUtils.isBlank(clientId)) { + throw createExceptionInstance(ResponseCode.invalidClientId.getErrorCode()); + } + } + + /** + * Validates the request data for sending notifications. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + @SuppressWarnings("unchecked") + public static void validateSendNotification(Request request) { + if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.TO))) { + throw createExceptionInstance(ResponseCode.invalidTopic.getErrorCode()); + } + if (request.getRequest().get(JsonKey.DATA) == null + || !(request.getRequest().get(JsonKey.DATA) instanceof Map) + || ((Map) request.getRequest().get(JsonKey.DATA)).size() == 0) { + throw createExceptionInstance(ResponseCode.invalidTopicData.getErrorCode()); + } + + if (StringUtils.isBlank((String) request.getRequest().get(JsonKey.TYPE))) { + throw createExceptionInstance(ResponseCode.invalidNotificationType.getErrorCode()); + } + if (!(JsonKey.FCM.equalsIgnoreCase((String) request.getRequest().get(JsonKey.TYPE)))) { + throw createExceptionInstance(ResponseCode.notificationTypeSupport.getErrorCode()); + } + } + + /** + * Validates the request data for getting user count. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + @SuppressWarnings("rawtypes") + public static void validateGetUserCount(Request request) { + if (!validateListType(request, JsonKey.LOCATION_IDS)) { + throw createDataTypeException( + ResponseCode.dataTypeError.getErrorCode(), JsonKey.LOCATION_IDS, JsonKey.LIST); + } + if (null == request.getRequest().get(JsonKey.LOCATION_IDS) + && ((List) request.getRequest().get(JsonKey.LOCATION_IDS)).isEmpty()) { + throw createExceptionInstance(ResponseCode.locationIdRequired.getErrorCode()); + } + + if (!validateBooleanType(request, JsonKey.USER_LIST_REQ)) { + throw createDataTypeException( + ResponseCode.dataTypeError.getErrorCode(), JsonKey.USER_LIST_REQ, "Boolean"); + } + + if (null != request.getRequest().get(JsonKey.USER_LIST_REQ) + && (Boolean) request.getRequest().get(JsonKey.USER_LIST_REQ)) { + throw createExceptionInstance(ResponseCode.functionalityMissing.getErrorCode()); + } + + if (!validateBooleanType(request, JsonKey.ESTIMATED_COUNT_REQ)) { + throw createDataTypeException( + ResponseCode.dataTypeError.getErrorCode(), JsonKey.ESTIMATED_COUNT_REQ, "Boolean"); + } + + if (null != request.getRequest().get(JsonKey.ESTIMATED_COUNT_REQ) + && (Boolean) request.getRequest().get(JsonKey.ESTIMATED_COUNT_REQ)) { + throw createExceptionInstance(ResponseCode.functionalityMissing.getErrorCode()); + } + } + + /** + * Validates if the request contains the key and the value is a list. + * + * @param request The request object. + * @param key The key to check. + * @return True if valid, false otherwise. + */ + private static boolean validateListType(Request request, String key) { + return !(request.getRequest().containsKey(key) + && null != request.getRequest().get(key) + && !(request.getRequest().get(key) instanceof List)); + } + + /** + * Validates if the request contains the key and the value is a boolean. + * + * @param request The request object. + * @param key The key to check. + * @return True if valid, false otherwise. + */ + private static boolean validateBooleanType(Request request, String key) { + return !(request.getRequest().containsKey(key) + && null != request.getRequest().get(key) + && !(request.getRequest().get(key) instanceof Boolean)); + } + + private static ProjectCommonException createDataTypeException( + String errorCode, String key1, String key2) { + return new ProjectCommonException( + ResponseCode.getResponse(errorCode).getErrorCode(), + ProjectUtil.formatMessage( + ResponseCode.getResponse(errorCode).getErrorMessage(), key1, key2), + ERROR_CODE); + } + + private static ProjectCommonException createExceptionInstance(String errorCode) { + return new ProjectCommonException( + ResponseCode.getResponse(errorCode).getErrorCode(), + ResponseCode.getResponse(errorCode).getErrorMessage(), + ERROR_CODE); + } + + /** + * Validates the request data for group activity aggregates. + * + * @param request The request object. + * @throws ProjectCommonException If validation fails. + */ + public static void validateGroupActivityAggregatesRequest(Request request) { + try { + String message = ""; + if (null == request || MapUtils.isEmpty(request.getRequest())) { + message += "Error due to missing request body"; + ProjectCommonException.throwClientErrorException( + ResponseCode.invalidRequestData, + MessageFormat.format(ResponseCode.invalidRequestData.getErrorMessage(), message)); + } + if (StringUtils.isBlank((String) request.get(JsonKey.GROUPID))) { + message += "Error due to missing groupId"; + ProjectCommonException.throwClientErrorException( + ResponseCode.groupIdMismatch, + MessageFormat.format(ResponseCode.groupIdMismatch.getErrorMessage(), message)); + } + if (StringUtils.isBlank((String) request.get(JsonKey.ACTIVITYID))) { + message += "Error due to missing activityId"; + ProjectCommonException.throwClientErrorException( + ResponseCode.activityIdMismatch, + MessageFormat.format(ResponseCode.activityIdMismatch.getErrorMessage(), message)); + } + if (StringUtils.isBlank((String) request.get(JsonKey.ACTIVITYTYPE))) { + message += "Error due to missing activity type"; + ProjectCommonException.throwClientErrorException( + ResponseCode.activityTypeMismatch, + MessageFormat.format(ResponseCode.activityTypeMismatch.getErrorMessage(), message)); + } + } catch (Exception ex) { + throw ex; + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/UserFreeUpRequestValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/UserFreeUpRequestValidator.java new file mode 100644 index 0000000000..a45a736573 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/UserFreeUpRequestValidator.java @@ -0,0 +1,106 @@ +package org.sunbird.validators; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.sunbird.common.ProjectUtil; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.logging.LoggerUtil; +import org.sunbird.request.Request; + +/** + * Validator class for User Free Up requests. + * Validates the presence of mandatory ID and ensure the identifier list contains valid types (EMAIL, PHONE). + */ +public class UserFreeUpRequestValidator extends BaseRequestValidator { + + private static final LoggerUtil logger = new LoggerUtil(UserFreeUpRequestValidator.class); + private final Request request; + private static final List identifiers = new ArrayList<>(); + + static { + identifiers.add(JsonKey.EMAIL); + identifiers.add(JsonKey.PHONE); + } + + private static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); + + /** + * Factory method to get an instance of UserFreeUpRequestValidator. + * + * @param request The request object to validate. + * @return A new instance of UserFreeUpRequestValidator. + */ + public static UserFreeUpRequestValidator getInstance(Request request) { + return new UserFreeUpRequestValidator(request); + } + + private UserFreeUpRequestValidator(Request request) { + this.request = request; + } + + /** + * Validates the User Free Up request. + * Performs checks for ID presence and identifier list validity. + */ + public void validate() { + logger.debug(null, "UserFreeUpRequestValidator:validate: Starting validation"); + validateIdPresence(); + validateIdentifier(); + logger.debug(null, "UserFreeUpRequestValidator:validate: Validation successful"); + } + + private void validateIdPresence() { + validateParam( + (String) request.getRequest().get(JsonKey.ID), + ResponseCode.mandatoryParamsMissing, + JsonKey.ID); + } + + private void validateIdentifier() { + validatePresence(); + validateObject(); + validateSubset(); + } + + private void validatePresence() { + if (!request.getRequest().containsKey(JsonKey.IDENTIFIER)) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing.getErrorCode(), + MessageFormat.format( + ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.IDENTIFIER), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + private void validateObject() { + Object identifierType = request.getRequest().get(JsonKey.IDENTIFIER); + if (!(identifierType instanceof List)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + ProjectUtil.formatMessage( + ResponseCode.dataTypeError.getErrorMessage(), JsonKey.IDENTIFIER, JsonKey.LIST), + ERROR_CODE); + } + } + + private void validateSubset() { + @SuppressWarnings("unchecked") + List identifierVal = (List) request.getRequest().get(JsonKey.IDENTIFIER); + if (!identifiers.containsAll(identifierVal)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError.getErrorCode(), + ProjectUtil.formatMessage( + String.format( + "%s %s", + ResponseCode.invalidIdentifier.getErrorMessage(), + Arrays.toString(identifiers.toArray())), + JsonKey.IDENTIFIER, + JsonKey.DATA), + ERROR_CODE); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/BaseOrgRequestValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/BaseOrgRequestValidator.java new file mode 100644 index 0000000000..08005b9ba1 --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/BaseOrgRequestValidator.java @@ -0,0 +1,35 @@ +package org.sunbird.validators.orgvalidator; + +import java.text.MessageFormat; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.request.Request; +import org.sunbird.validators.BaseRequestValidator; + +public class BaseOrgRequestValidator extends BaseRequestValidator { + + public static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); + + public void validateOrgReference(Request request) { + validateParam( + (String) request.getRequest().get(JsonKey.ORGANISATION_ID), + ResponseCode.mandatoryParamsMissing, + JsonKey.ORGANISATION_ID); + } + + public void validateTenantOrgChannel(Request request) { + if ((null != request.getRequest().get(JsonKey.IS_TENANT) + && (Boolean) request.getRequest().get(JsonKey.IS_TENANT)) + && StringUtils.isEmpty((String) request.getRequest().get(JsonKey.CHANNEL))) { + throw new ProjectCommonException( + ResponseCode.dependentParameterMissing, + MessageFormat.format( + ResponseCode.dependentParameterMissing.getErrorMessage(), + JsonKey.CHANNEL, + JsonKey.IS_TENANT), + ERROR_CODE); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/KeyManagementValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/KeyManagementValidator.java new file mode 100644 index 0000000000..465d6d129d --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/KeyManagementValidator.java @@ -0,0 +1,88 @@ +package org.sunbird.validators.orgvalidator; + +import java.text.MessageFormat; +import java.util.List; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.request.Request; +import org.sunbird.validators.BaseRequestValidator; + +/** + * this class is used to validate the request of the OrgAssignKeys Controller + * + * @author anmolgupta + */ +public class KeyManagementValidator extends BaseRequestValidator { + + private Request request; + + private KeyManagementValidator(Request request) { + this.request = request; + } + + /** + * this method should be used to get the instance of the class + * + * @param request + * @return + */ + public static KeyManagementValidator getInstance(Request request) { + return new KeyManagementValidator(request); + } + + /** this method should be used to validate the OrgAssignKeysController request. */ + public void validate() { + id(); + signKeys(); + encKeys(); + } + + private void id() { + validateParam( + (String) request.getRequest().get(JsonKey.ID), + ResponseCode.mandatoryParamsMissing, + JsonKey.ID); + } + + private void signKeys() { + validateKeyPresence(JsonKey.SIGN_KEYS); + validateListTypeObject(JsonKey.SIGN_KEYS); + validateSize(JsonKey.SIGN_KEYS); + } + + private void encKeys() { + validateKeyPresence(JsonKey.ENC_KEYS); + validateListTypeObject(JsonKey.ENC_KEYS); + validateSize(JsonKey.ENC_KEYS); + } + + private void validateListTypeObject(String key) { + if (!(request.get(key) instanceof List)) { + throw new ProjectCommonException( + ResponseCode.dataTypeError, + MessageFormat.format(ResponseCode.dataTypeError.getErrorMessage(), key, "List"), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + + private void validateKeyPresence(String key) { + if (!request.getRequest().containsKey(key)) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing, + ResponseCode.mandatoryParamsMissing.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode(), + key); + } + } + + private void validateSize(String key) { + if (((List) request.get(key)).size() == 0) { + throw new ProjectCommonException( + ResponseCode.errorMandatoryParamsEmpty, + ResponseCode.errorMandatoryParamsEmpty.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode(), + key); + } + } +} diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/OrgRequestValidator.java b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/OrgRequestValidator.java new file mode 100644 index 0000000000..11a26a706e --- /dev/null +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/validators/orgvalidator/OrgRequestValidator.java @@ -0,0 +1,208 @@ +package org.sunbird.validators.orgvalidator; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyFactory; +import java.security.spec.X509EncodedKeySpec; +import java.text.MessageFormat; +import java.util.Base64; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.keys.JsonKey; +import org.sunbird.operations.userorg.ActorOperations; +import org.sunbird.request.Request; +import org.sunbird.common.ProjectUtil; +import play.libs.Files; +import play.mvc.Http.MultipartFormData; +import play.mvc.Http.MultipartFormData.FilePart; + +public class OrgRequestValidator extends BaseOrgRequestValidator { + + private static final int ERROR_CODE = ResponseCode.CLIENT_ERROR.getResponseCode(); + + public void validateCreateOrgRequest(Request orgRequest) { + validateParam( + (String) orgRequest.getRequest().get(JsonKey.ORG_TYPE), + ResponseCode.mandatoryParamsMissing, + JsonKey.ORG_TYPE); + validateParam( + (String) orgRequest.getRequest().get(JsonKey.ORG_NAME), + ResponseCode.mandatoryParamsMissing, + JsonKey.ORG_NAME); + if (!(orgRequest.getRequest().containsKey(JsonKey.IS_TENANT)) + || (orgRequest.getRequest().containsKey(JsonKey.IS_TENANT) + && null == orgRequest.getRequest().get(JsonKey.IS_TENANT))) { + throw new ProjectCommonException( + ResponseCode.mandatoryParamsMissing, + MessageFormat.format( + ResponseCode.mandatoryParamsMissing.getErrorMessage(), JsonKey.IS_TENANT), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + validateTenantOrgChannel(orgRequest); + validateLicense(orgRequest); + validateLocationIdOrCode(orgRequest); + } + + private void validateLicense(Request orgRequest) { + if (orgRequest.getRequest().containsKey(JsonKey.IS_TENANT) + && (boolean) orgRequest.getRequest().get(JsonKey.IS_TENANT) + && orgRequest.getRequest().containsKey(JsonKey.LICENSE) + && StringUtils.isBlank((String) orgRequest.getRequest().get(JsonKey.LICENSE))) { + throw new ProjectCommonException( + ResponseCode.invalidParameterValue, + MessageFormat.format( + ResponseCode.invalidParameterValue.getErrorMessage(), + orgRequest.getRequest().get(JsonKey.LICENSE), + JsonKey.LICENSE), + ERROR_CODE); + } + } + + public void validateUpdateOrgRequest(Request request) { + validateOrgReference(request); + if (request.getRequest().containsKey(JsonKey.ROOT_ORG_ID) + && StringUtils.isEmpty((String) request.getRequest().get(JsonKey.ROOT_ORG_ID))) { + throw new ProjectCommonException( + ResponseCode.invalidParameterValue, + String.format(ResponseCode.invalidParameterValue.getErrorMessage(), JsonKey.ROOT_ORG_ID), + ERROR_CODE); + } + if (request.getRequest().get(JsonKey.STATUS) != null) { + throw new ProjectCommonException( + ResponseCode.invalidRequestParameter, + ProjectUtil.formatMessage( + ResponseCode.invalidRequestParameter.getErrorMessage(), JsonKey.STATUS), + ERROR_CODE); + } + + validateTenantOrgChannel(request); + validateLocationIdOrCode(request); + } + + public void validateUpdateOrgStatusRequest(Request request) { + validateOrgReference(request); + + if (!request.getRequest().containsKey(JsonKey.STATUS)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData, + ResponseCode.invalidRequestData.getErrorMessage(), + ERROR_CODE); + } + + if (!(request.getRequest().get(JsonKey.STATUS) instanceof Integer)) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData, + ResponseCode.invalidRequestData.getErrorMessage(), + ERROR_CODE); + } + } + + private void validateLocationIdOrCode(Request orgRequest) { + validateListParam(orgRequest.getRequest(), JsonKey.LOCATION_IDS, JsonKey.LOCATION_CODE); + if (orgRequest.getRequest().get(JsonKey.LOCATION_IDS) != null + && orgRequest.getRequest().get(JsonKey.LOCATION_CODE) != null) { + ProjectCommonException.throwClientErrorException( + ResponseCode.errorAttributeConflict, + MessageFormat.format( + ResponseCode.errorAttributeConflict.getErrorMessage(), + JsonKey.LOCATION_CODE, + JsonKey.LOCATION_IDS)); + } + } + + public void validateEncryptionKeyRequest(Request reqObj, MultipartFormData body) { + Map map = new HashMap<>(); + byte[] byteArray = null; + InputStream is = null; + try { + if (body != null) { + Map data = body.asFormUrlEncoded(); + for (Map.Entry entry : data.entrySet()) { + map.put(entry.getKey(), entry.getValue()[0]); + } + List> filePart = body.getFiles(); + File f = filePart.get(0).getRef().path().toFile(); + + is = new FileInputStream(f); + byteArray = is.readAllBytes(); + + String fileName = filePart.get(0).getFilename(); + + validateFileExtension(fileName); + validatePublicKey(byteArray); + + reqObj.getRequest().putAll(map); + map.put(JsonKey.FILE_NAME, fileName); + is.close(); + } else { + throw new ProjectCommonException( + ResponseCode.invalidRequestData, + ResponseCode.invalidRequestData.getErrorMessage(), + ERROR_CODE); + } + map.put(JsonKey.FILE, byteArray); + HashMap innerMap = new HashMap<>(); + innerMap.put(JsonKey.DATA, map); + reqObj.setRequest(innerMap); + } catch (Exception e) { + throw new ProjectCommonException( + (ProjectCommonException) e, + ActorOperations.getOperationCodeByActorOperation(reqObj.getOperation())); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException ignored) { + } + } + } + } + + private void validatePublicKey(byte[] publicKeyBytes) { + try { + KeyFactory publicKeyFactory = KeyFactory.getInstance("RSA"); + String publicKeyContent = new String(publicKeyBytes); + publicKeyContent = + publicKeyContent + .replaceAll("\\n", "") + .replace("-----BEGIN PUBLIC KEY-----", "") + .replace("-----END PUBLIC KEY-----", ""); + X509EncodedKeySpec keySpecX509 = + new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyContent)); + publicKeyFactory.generatePublic(keySpecX509); + } catch (Exception se) { + throw new ProjectCommonException( + ResponseCode.invalidRequestData, + ResponseCode.invalidRequestData.getErrorMessage(), + ERROR_CODE); + } + } + + private void validateFileExtension(String fileName) { + String fileExtension = ""; + + if (!StringUtils.isBlank(fileName)) { + String[] split = fileName.split("\\."); + if (split.length > 1) { + fileExtension = split[split.length - 1]; + } + if (StringUtils.isBlank(fileExtension) || !fileExtension.equalsIgnoreCase("pem")) { + throw new ProjectCommonException( + ResponseCode.invalidFileExtension, + MessageFormat.format(ResponseCode.invalidFileExtension.getErrorMessage(), "pem"), + ERROR_CODE); + } + } else { + throw new ProjectCommonException( + ResponseCode.invalidFileExtension, + MessageFormat.format(ResponseCode.invalidFileExtension.getErrorMessage(), "pem"), + ERROR_CODE); + } + } +} diff --git a/core/sunbird-platform-common/src/main/resources/OTPSMSTemplate.vm b/core/sunbird-platform-common/src/main/resources/OTPSMSTemplate.vm new file mode 100644 index 0000000000..3273ff3663 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/OTPSMSTemplate.vm @@ -0,0 +1 @@ +One time password to verify your phone number on $installationName is $otp. This is valid for $otpExpiryInMinutes minutes only. \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/acceptFlagMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/acceptFlagMailTemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/acceptFlagMailTemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/application.conf b/core/sunbird-platform-common/src/main/resources/application.conf new file mode 100644 index 0000000000..b0548ee27a --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/application.conf @@ -0,0 +1,3 @@ +# This is the main configuration file for the application. +#optional config for making authentication optional +AuthenticationEnabled=true \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/cassandra.config.properties b/core/sunbird-platform-common/src/main/resources/cassandra.config.properties new file mode 100644 index 0000000000..ae79d2e246 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/cassandra.config.properties @@ -0,0 +1,9 @@ +coreConnectionsPerHostForLocal=4 +coreConnectionsPerHostForRemote=2 +maxConnectionsPerHostForLocal=10 +maxConnectionsPerHostForRemote=4 +maxRequestsPerConnection=32768 +heartbeatIntervalSeconds=60 +poolTimeoutMillis=0 +queryLoggerConstantThreshold=300 +isMultiDCEnabled=true \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/cassandratablecolumn.properties b/core/sunbird-platform-common/src/main/resources/cassandratablecolumn.properties new file mode 100644 index 0000000000..656099d756 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/cassandratablecolumn.properties @@ -0,0 +1,264 @@ +id=id +courseid=courseId +coursename=courseName +userid=userId +description=description +tocurl=tocUrl +status=status +active=active +delta=delta +courseversion=courseVersion +grade=grade +progress=progress +lastreadcontentid=lastReadContentId +lastreadcontentstatus=lastReadContentStatus +lastreadcontentversion=lastReadContentVersion +lastcontentaccesstime=lastContentAccessTime +datetime=dateTime +contentid=contentId +viewposition=viewPosition +viewcount=viewCount +completedcount=completedCount +position=position +result=result +score= score +contentversion=contentVersion +facultyid=facultyId +facultyname=facultyName +organisationid=organisationId +organisationname=organisationName +enrollementstartdate=enrollementStartDate +courseduration=courseDuration +addedbyid=addedById +addedbyname=addedByName +publishedbyid=publishedById +publishedbyname=publishedByName +publisheddate=publishedDate +updatedbyid=updatedById +updatedbyname=updatedByName +createdfor=createdFor +tutor=tutor +email=email +phone=phone +aadhaarno=aadhaarNo +updatedby=updatedBy +lastlogintime=lastLoginTime +firstname=firstName +lastname=lastName +password=password +avatar=avatar +gender=gender +language=language +state=state +city=city +zipcode=zipcode +username=userName +pagename=pageName +pagesectionname=pageSectionName +sectionorder=sectionOrder +description=description +imgurl=imgUrl +searchquery=searchQuery +searchurl=searchUrl +applicablefor=applicableFor +createdby=createdBy +courselogourl=courseLogoUrl +name=name +portalmap=portalMap +appmap=appMap +sectiondatatype=sectionDataType +addedby=addedBy +updatedby=updatedBy +usercount=userCount +timetaken=timeTaken +assessmentitemid=assessmentItemId +maxscore=maxScore +attemptid=attemptId +assessmenttype=assessmentType +attempteddate=attemptedDate +evaluationstatus=evaluationStatus +processingstatus=processingStatus +attemptedcount=attemptedCount +rootorgid=rootOrgId +regorgid=regOrgId +addtype=addType +addressline1=addressLine1 +addressline2=addressLine2 +yearofpassing=yearOfPassing +boardoruniversity=boardOrUniversity +jobname=jobName +joiningdate=joiningDate +orgid=orgId +orgname=orgName +boardname=boardName +addressid=addressId +isrejected=isRejected +isverified=isVerified +verifiedby=verifiedBy +verifieddate=verifiedDate +externalidvalue=externalIdValue +externalid=externalId +loginid=loginId +parentorgid=parentOrgId +isrootorg=isRootOrg +orgidone=orgIdOne +orgidtwo=orgIdTwo +parentof=parentOf +orgtype=orgType +childof=childOf +rootorg=rootOrg +approveddate=approvedDate +approvedbyname=approvedByName +iscurrentjob=isCurrentJob +noofmembers=noOfMembers +homeurl=homeUrl +isapproved=isApproved +orgcode=orgCode +approvedby=approvedBy +preferredlanguage=preferredLanguage +communityid=communityId +isdeleted=isDeleted +profilesummary=profileSummary +orgleftdate=orgLeftDate +isdefault=isDefault +leafnodescount=leafNodesCount +processstarttime=processStartTime +successresult=successResult +failureresult=failureResult +objecttype=objectType +uploadedby=uploadedBy +uploadeddate=uploadedDate +processendtime=processEndTime +enrollmenttype=enrollmentType +participant=participant +enrolmenttype=enrolmentType +lastupdatedon=lastUpdatedOn +createdfor=createdFor +coursecreator=courseCreator +courseadditionalinfo=courseAdditionalInfo +submitdate=submitDate +objectids=objectIds +countincrementstatus=countIncrementStatus +countincrementdate=countIncrementDate +countdecrementstatus=countDecrementStatus +countdecrementdate=countDecrementDate +contactdetail=contactDetail +hashtagid=hashTagId +theme =theme +batchid=batchId +isactive=isActive +receiveddate=receivedDate +receiverid=receiverId +providerid=providerId +providername=providerName +provideremail=providerEmail +providerphone=providerPhone +validitydate=validityDate +expirydate=expiryDate +isverified=isVerified +isexpired=isExpired +isrevoked=isRevoked +revocationreason=revocationReason +revocationdate=revocationDate +revokedby=revokedBy +verifiedby=verifiedBy +verifieddate=verifiedDate +fileurl=fileUrl +trycount=tryCount +resourceid=resourceId +missingfields=missingFields +webpages=webPages +temppassword=tempPassword +currentlogintime=currentLoginTime +skillname=skillName +skillnametolowercase=skillNameToLowercase +addedby=addedBy +addedat=addedAt +endorsementcount=endorsementCount +endorsers=endorsers +profilevisibility=profileVisibility +orgtypeid=orgTypeId +retrycount=retryCount +tcstatus=tcStatus +tcupdatedat=tcUpdatedAt +tcupdateddate=tcUpdatedDate +clientname=clientName +masterkey=masterKey +locationid=locationId +countrycode=countryCode +endorserslist=endorsersList +emailverified=emailVerified +locationids=locationIds +userlistreq=userListReq +estimatedcountreq=estimatedCountReq +usercountttl=userCountTTL +issuerid=issuerId +resourcename=resourceName +badgeclassimage=badgeClassImage +assertionid=assertionId +badgeclassname=badgeClassName +parentid=parentId +taskcount=taskCount +sequenceid=sequenceId +iterationid=iterationId +processid=processId +createdon=createdOn +registryid=registryId +lastupdatedby=lastUpdatedBy +idtype=idType +originalexternalid=originalExternalId +originalprovider=originalProvider +originalidtype=originalIdType +rolegroupid=roleGroupId +url_action_ids=url_Action_Ids +usertype=userType +storagedetails=storageDetails +completedon=completedOn +tncacceptedon=tncAcceptedOn +tncacceptedversion=tncAcceptedVersion +phoneverified=phoneVerified +datasource=dataSource +maskedemail=maskedEmail +maskedphone=maskedPhone +prevusedemail=prevUsedEmail +prevusedphone=prevUsedPhone +otherlink=otherLink +recoveryemail=recoveryEmail +recoveryphone=recoveryPhone +userextid=userExtId +orgextid=orgExtId +userstatus=userStatus +claimstatus=claimStatus +claimedon=claimedOn +updatedon=updatedOn +flagsvalue=flagsValue +userids=userIds +telemetrycontext=telemetryContext +isssoenabled=isSSOEnabled +dynamicfilters=dynamicFilters +contentstatus=contentStatus +completionpercentage=completionPercentage +issued_certificates=issuedCertificates +attempt_id=attemptId +last_attempted_on=lastAttemptedOn +total_max_score=totalMaxScore +total_score=totalScore +createddate=oldCreatedDate +startdate=oldStartDate +enddate=oldEndDate +enrollmentenddate=oldEnrollmentEndDate +updateddate=oldUpdatedDate +enrolleddate=oldEnrolledDate +lastupdatedtime=oldLastUpdatedTime +lastaccesstime=oldLastAccessTime +lastcompletedtime=oldLastCompletedTime +created_date=createdDate +start_date=startDate +end_date=endDate +enrollment_enddate=enrollmentEndDate +updated_date=updatedDate +enrolled_date=enrolledDate +last_access_time=lastAccessTime +last_completed_time=lastCompletedTime +last_updated_time=lastUpdatedTime +cert_templates=certTemplates \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/contentFlaggedMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/contentFlaggedMailTemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/contentFlaggedMailTemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/contentReviewMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/contentReviewMailTemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/contentReviewMailTemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/dbconfig.properties b/core/sunbird-platform-common/src/main/resources/dbconfig.properties new file mode 100644 index 0000000000..564bec9208 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/dbconfig.properties @@ -0,0 +1,6 @@ +db.ip=127.0.0.1 +db.port=9042 +db.username= +db.password= +db.keyspace=sunbird + diff --git a/core/sunbird-platform-common/src/main/resources/elasticsearch.config.properties b/core/sunbird-platform-common/src/main/resources/elasticsearch.config.properties new file mode 100644 index 0000000000..564aaedcb2 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/elasticsearch.config.properties @@ -0,0 +1,3 @@ +es.cluster.name= +es.host.name=localhost +es.host.port=9300 \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/emailtemplate.vm b/core/sunbird-platform-common/src/main/resources/emailtemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/emailtemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/externalresource.properties b/core/sunbird-platform-common/src/main/resources/externalresource.properties new file mode 100644 index 0000000000..4b4ccebe87 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/externalresource.properties @@ -0,0 +1,179 @@ +ekstep_content_search_url=/v3/search +ekstep_authorization= +ekstep.tag.api.url=/tag/register +ekstep.content.update.url=/content/v4/system/update/ +sunbird_installation=sunbird +sunbird_analytics_api_base_url=https://dev.ekstep.in/api/data/v3 +sunbird_search_service_api_base_url=https://dev.sunbirded.org/action +content_service_base_url=https://dev.sunbirded.org/action +sunbird_user_org_api_base_url=https://dev.sunbirded.org/api +sunbird_search_organisation_api=/v1/org/search +sunbird_read_user_api=/private/user/v1/read +sunbird_search_user_api=/v1/user/search +sunbird_send_email_notifictaion_api=/v1/notification/email +sunbird_mail_server_host= +sunbird_mail_server_port= +sunbird_mail_server_username= +sunbird_mail_server_password= +sunbird_mail_server_from_email=support@open-sunbird.org +sunbird_account_name= +sunbird_account_key= +download_link_expiry_timeout=300 +sunbird_encryption_key=SunBird +sunbird_encryption=ON +sunbird_allowed_login=You can use your cellphone number to login +#size of bulk upload data is 1001 including header in csv file +bulk_upload_batch_data_size=200 +sunbird_web_url=https://dev.sunbirded.org +# background actor modes {local,remote} +background_actor_provider=remote +# actor modes {local,remote} +api_actor_provider=local +# cassandra modes {standalone,embedded} +sunbird_cassandra_mode=standalone +#file to load cassandra DB into memory. +fcm.url=https://fcm.googleapis.com/fcm/send +sunbird_default_country_code=+91 +#put the default evn logo url here or System Env variable with +#same key. code will first search from EVN then here. +sunbird_env_logo_url=http://via.placeholder.com/100x50 +es_search_url=http://localhost:9200 +es_metrics_port=9200 +system_settings_properties=phoneUnique,emailUnique +sunbird_url_shortner_base_url=https://api-ssl.bitly.com/v3/shorten?access_token= +sunbird_url_shortner_access_token= +#Telemetry producer related info +telemetry_pdata_id=local.sunbird.learning.service +telemetry_pdata_pid=learning-service +telemetry_pdata_ver=5.4.0 +#elastic search top n result count for telemetry +searchTopN=5 +# Sunbird lms telemetry url +# Sunbird Installation mail +# Bulk upload file max size in MB +file_upload_max_size=10 +sunbird_default_channel= +# Batch size for cassandra batch operation +cassandra_write_batch_size=100 +sunbird_cs_search_path=/composite/v1/search +# Sunbird OpenSaber Integration +sunbird_sso_client_id= +sunbird_sso_username= +sunbird_sso_password= +sunbird_sso_url= +sunbird_sso_realm= +sunbird_keycloak_user_federation_provider_id= +sunbird_keycloak_required_action_link_expiration_seconds=155520000 +sunbird_url_shortner_enable=false +sunbird_api_request_lower_case_fields=source,externalId,userName,provider,loginId,email,prevUsedEmail +# Add proper cloud service provider (azure,aws,gcloud) +# Provide corresponding service provider container(azure,aws,gcloud) +sunbird_content_cloud_storage_container=sunbird-content-dev +sunbird_cloud_content_folder=content +sunbird_time_zone=Asia/Kolkata +sunbird_health_check_enable=true +sunbird_sync_read_wait_time=1500 +sunbird_gzip_size_threshold=262144 +sunbird_redis_port=6379 +sunbird_redis_host=localhost +sunbird_redis_scan_interval=2000 +sunbird_redis_connection_pool_size=250 +#kafka_topics_instruction=local.coursebatch.job.request +kafka_urls=localhost:9092 +sunbird_state_img_url=https://sunbirddev.blob.core.windows.net/orgemailtemplate/img/File-0128212938260643843.png +sunbird_diksha_img_url=https://sunbirddev.blob.core.windows.net/orgemailtemplate/img/File-0128212989820190722.png +sunbird_cert_completion_img_url=https://sunbirddev.blob.core.windows.net/orgemailtemplate/img/File-0128212919987568641.png +sunbird_subdomain_keycloak_base_url=https://merge.dev.sunbirded.org/auth/ +kafka_topics_certificate_instruction=local.issue.certificate.request +kafka_linger_ms=5 +sunbird_cert_service_base_url= +#{0} instancename , {1} toaccountemail or phone in mask , {2} from account email/phone in mask +#kafka_assessment_topic=local.telemetry.assess +sunbird_pass_regex=(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!\"#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~])(?=\\S+$).{8,} +sunbird_cert_template_url=/asset/v4/read +sunbird_user_qrcode_courses_limit=5000 +learning.content.props.to.add=mimeType,contentType,name,code,description,keywords,framework,copyright,topic +druid_proxy_api_host=localhost +druid_proxy_api_port=8082 +druid_proxy_api_endpoint=/druid/v2/ +#cert v1 template read url +sunbird_cert_template_read_url=/cert/v1/template/read +kafka_assessment_topic= +sunbird_api_mgr_base_url=https://dev.sunbirded.org/api +enrollment_list_size=1000 +cloud_storage_base_url=https://sunbirddev.blob.core.windows.net +cloud_store_base_path_placeholder=CLOUD_BASE_PATH +#Release-5.3.0 - LR-556 +content_service_mock_enabled=false + +#Release-5.2.0 - LR-325 +sunbird_dial_service_base_url=http://dial-service.learn.svc.cluster.local:9000 +sunbird_dial_service_search_url=/dialcode/v3/search + +#Release-5.3.0 - LR-539 +exhaust_api_base_url=https://dev.lern.sunbird.org +exhaust_api_submit_endpoint=/api/dataset/v1/request/submit +exhaust_api_list_endpoint=/api/dataset/v1/request/list + +#Release-5.4.0 - LR-511 +sunbird_userorg_keyspace=sunbird +sunbird_course_keyspace=sunbird_courses +dialcode_keyspace=dialcodes +redis.dbIndex=0 +es_course_index=cbatch +es_course_batch_index=course-batch +es_user_index=user_alias +es_organisation_index=org_alias +es_user_courses_index=user-courses +sigterm_stop_delay=40 +learner_in_memory_cache_ttl=14400 +sunbird_otp_allowed_attempt=2 +sunbird_otp_expiration=1800 +sunbird_otp_length=6 +sunbird_otp_hour_rate_limit=5 +sunbird_otp_day_rate_limit=20 +sunbird_rate_limit_enabled=true +sunbird_fuzzy_search_threshold=0.5 +sunbird_reset_pass_msg=Your have requested to reset password. Click on the link to set a password: {0} +sunbird_reset_pass_mail_subject=Reset Password +sunbird_user_upload_error_visualization_threshold=20001 +migrate_user_template=You can now access your {0} state teacher account using {1}. Please log out and login once again to see updated details. +sunbird_account_merge_subject=Account merged successfully +sunbird_pass_regex=(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!\"#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~])(?=\\S+$).{8,} +sunbird_user_create_sync_type=ES +sunbird_user_create_sync_topic=local.user.events +limit_managed_user_creation=true +managed_user_limit=30 +adminutil_base_url = http://adminutil:4000/ +adminutil_sign_endpoint = v1/sign/payload +self_declared_mandatory_fields = Diksha UUID,Status,State provided ext. ID,Channel,Persona +self_declared_optional_fields = School Name,School UDISE ID,Email ID,Phone number,Error Type +enable_captcha=true +consent_expiry_in_days=100 +feed_limit=30 +user_index_alias=user_alias +org_index_alias=org_alias +es_user_notes_index=usernotes +es_location_index=location +es_user_feed_index=userfeed +defaultMonthDate = -12-31 +nic_sms_gateway_provider_base_url=https://smsgw.sms.gov.in/failsafe/HttpLink +sms_gateway_provider=91SMS +stacktrace_char_length=2500 +notification_service_base_url= +notification_service_v2_send_url=/private/v2/notification/send +notification_service_v1_update_url=/private/v1/notification/feed/update +notification_service_v1_read_url=/private/v1/notification/feed/read +notification_service_v1_delete_url=/private/v1/notification/feed/delete +channel_registration_disabled=false +sunbird_password_reset_login_page_url=/resources +isFormValidationRequired=true +userProfileConfigMap={\"type\":\"profileconfig\",\"subtype\":\"28\",\"action\":\"get\",\"component\":\"*\",\"framework\":\"*\",\"data\":{\"templateName\":\"profileConfig_v2\",\"action\":\"get\",\"fields\":[{\"code\":\"persona\",\"children\":{\"administrator\":[{\"code\":\"district\"},{\"code\":\"state\"},{\"code\":\"subPersona\",\"type\":\"select\",\"default\":null,\"templateOptions\":{\"options\":[{\"label\":\"Headmaster\",\"value\":\"hm\"},{\"label\":\"Cluster Resource Person\",\"value\":\"crp\"}]}},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"teacher\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"student\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"parent\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}],\"other\":[{\"code\":\"state\"},{\"code\":\"district\"},{\"code\":\"subPersona\",\"templateOptions\":{\"options\":[{\"value\":\"Doctor (Allopathy)\",\"label\":\"Doctor (Allopathy)\"},{\"value\":\"AYUSH Professional\",\"label\":\"AYUSH Professional\"}]}},{\"code\":\"block\"},{\"code\":\"cluster\"},{\"code\":\"school\"}]}}]},\"created_on\":\"2022-02-10T14:16:51.852Z\",\"last_modified_on\":\"2022-11-14T05:45:02.685Z\",\"rootOrgId\":\"*\"} +user-ownership-transfer-topic={{env_name}}.user.ownership.transfer +user-deletion-roles=public +user-deletion-broadcast-topic={{env_name}}.delete.user +sunbird_valid_location_types=state,district,block,cluster,school; +sunbird_username_num_digits=4 +sunbird_user_bulk_upload_size=1001 +bulk_upload_org_data_size=300 +sunbird_framework_read_api=/v1/framework/read \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/forgotPasswordWithOTP.vm b/core/sunbird-platform-common/src/main/resources/forgotPasswordWithOTP.vm new file mode 100644 index 0000000000..66325cf607 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/forgotPasswordWithOTP.vm @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + +
  +
+ + + + + + + + + + +
+ + + + + + +
+ + + + + + + + + + +
+

Someone just requested to change your $realmName account's credentials. If this was you, use below OTP to reset your credentials. +

+
+

OTP : $otp

+
+

This OTP will expire within $ttl Minute.

+ +
+

If you don't want to reset your credentials, just ignore this message and nothing will be changed.

+
+
+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/forgotpassword.vm b/core/sunbird-platform-common/src/main/resources/forgotpassword.vm new file mode 100644 index 0000000000..d772a3a526 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/forgotpassword.vm @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + +
  +
+ + + + + + + + + + +
+ + + + + + +
+

Hi $name,

+ + + + + + + + + +
+

Please find the temporary password below, do the password change after first login: +

+ +

Password : $tempPassword

+ +
+

+ + + + + + + +
+

+ #if ($webUrl) + Web acccess URL : Click here + #end +

+

+ #if ($appUrl) + Download App : Click here + #end +

+ +
+
+

Thank You,

+

Team $orgName

+

#if ($note) + $note $fromEmail. + #end +

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/mailTemplates.properties b/core/sunbird-platform-common/src/main/resources/mailTemplates.properties new file mode 100644 index 0000000000..0a2f67f88b --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/mailTemplates.properties @@ -0,0 +1,5 @@ +orgName=Diksha +onboarding_mail_subject=Welcome to {0} +onboarding_welcome_message=Welcome to {0} +onboarding_welcome_mail_body=Please ensure that you change your password according to instructions when you log in for the first time. +mail_note=Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to diff --git a/core/sunbird-platform-common/src/main/resources/profilecompleteness.properties b/core/sunbird-platform-common/src/main/resources/profilecompleteness.properties new file mode 100644 index 0000000000..4eb3f3ae21 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/profilecompleteness.properties @@ -0,0 +1,6 @@ +user.profile.attribute=firstName,lastName,dob,avatar,gender,grade,language,location,profileSummary,subject,userName,address,education,jobProfile +#if u want equal weighted then don't provide any values here.By default all the key will be equally divided by 100%. +#you can provide your weighted in same attribute order. if you are providing values make sure sum of all values is 100 and either +#provide for all attribute or none. value should be either int or float +#6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25,6.25 +user.profile.weighted= \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/publishContentMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/publishContentMailTemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/publishContentMailTemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/rejectContentMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/rejectContentMailTemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/rejectContentMailTemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/rejectFlagMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/rejectFlagMailTemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/rejectFlagMailTemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/sso.properties b/core/sunbird-platform-common/src/main/resources/sso.properties new file mode 100644 index 0000000000..ce3a6507ae --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/sso.properties @@ -0,0 +1,4 @@ +sso.url= +sso.realm=sunbird +sso.connection.pool.size=20 +sso.enabled=true diff --git a/core/sunbird-platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm new file mode 100644 index 0000000000..50ff99ca9f --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/unlistedPublishContentMailTemplate.vm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + +
  +
+ + + + + + + + +
+ + + + + + + +
+ + #if ($orgImageUrl) +

logo

+ #end +
+ #if ($name) +

Hi $name,

+ #end +

$body

+ + + + + + +
+ + + #if ($actionUrl) + + + + #end + +
#if ($actionName) $actionName #end
+
+

Regards,

+

Team + #if ($orgName) + $orgName + #end +

+

Note: This is an automatic alert email. Replies to this mail box will not be monitored. If you are not the intended recipient of this message, or need to communicate with the team, write to $fromEmail.

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/userencryption.properties b/core/sunbird-platform-common/src/main/resources/userencryption.properties new file mode 100644 index 0000000000..794ad22dec --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/userencryption.properties @@ -0,0 +1,6 @@ +userkey.encryption=email,phone,userName,location,loginId,prevUsedEmail,prevUsedPhone,recoveryEmail,recoveryPhone +addresskey.encryption=addressLine1,addressLine2,city,state,country,zipcode,userId,updatedBy,createdBy +userkey.decryption=encEmail,encPhone,userName,location,loginId,email,phone,prevUsedEmail,prevUsedPhone,recoveryEmail,recoveryPhone +userkey.masked=email,phone,recoveryEmail,recoveryPhone,prevUsedPhone,recoveryEmail,prevUsedEmail +userkey.phonetypeattributes=phone,recoveryPhone,prevUsedPhone +userkey.emailtypeattributes=email,recoveryEmail,prevUsedEmail \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/welcomeMailTemplate.vm b/core/sunbird-platform-common/src/main/resources/welcomeMailTemplate.vm new file mode 100644 index 0000000000..0e7ae77969 --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/welcomeMailTemplate.vm @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + +
  +
+ + + + + + + + + + +
+ + + + + + +
+

$welcomeMessage,

+ + + + + + + + + +
+

Your user account has now been created. Click on the link below to #if ($setPasswordLink) set a password #else verify your email ID #end and start using your account: +

+

+ + #if ($setPasswordLink) + Set Password + #else + Verify Email + #end + +

+
+
+

Regards,

+

Team $orgName

+

#if ($note) + $note $fromEmail. + #end +

+
+
+ +
+
 
+ + \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/resources/welcomeSmsTemplate.vm b/core/sunbird-platform-common/src/main/resources/welcomeSmsTemplate.vm new file mode 100644 index 0000000000..e66670b65d --- /dev/null +++ b/core/sunbird-platform-common/src/main/resources/welcomeSmsTemplate.vm @@ -0,0 +1,2 @@ +Welcome to $instanceName. Your user account has now been created. Click on the link below to #if ($setPasswordLink) set a password #else verify your email ID #end and start using your account:$newline +$link \ No newline at end of file From a437c2ec6627b5dcc9ef9203b520bac5159fcaf1 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 13:25:40 +0530 Subject: [PATCH 12/17] build: update project structure for sunbird-platform-common integration - Added sunbird-platform-common module to core/pom.xml. - Removed legacy platform-common and sunbird-event-utils modules. - Synchronized dependency versions (Guava, Pekko, Kafka, Keycloak) across all POM files. - Consolidated build plugins and properties in the core and root pom.xml files. --- controller/pom.xml | 2 +- core/actor-core/pom.xml | 4 +- core/pom.xml | 94 ++++++++++++++++++++++++++-- core/sunbird-cassandra-utils/pom.xml | 16 ++++- pom.xml | 1 + reports/pom.xml | 2 +- service/pom.xml | 23 ++++++- 7 files changed, 130 insertions(+), 12 deletions(-) diff --git a/controller/pom.xml b/controller/pom.xml index 66dddb63bf..0434ffcf99 100644 --- a/controller/pom.xml +++ b/controller/pom.xml @@ -73,7 +73,7 @@ org.sunbird - platform-common + sunbird-platform-common 1.0-SNAPSHOT diff --git a/core/actor-core/pom.xml b/core/actor-core/pom.xml index d87750d65a..fe7983ec46 100644 --- a/core/actor-core/pom.xml +++ b/core/actor-core/pom.xml @@ -31,7 +31,7 @@ org.sunbird - platform-common + sunbird-platform-common 1.0-SNAPSHOT @@ -80,7 +80,7 @@ com.google.guava guava - 18.0 + ${guava.version} 11 11 @@ -29,39 +29,123 @@ 4.5.14 4.4.16 4.1.5 + 4.5.14 2.13.5 + + 1.0.3 + + + 3.7.1 + 1.2.3 - 6.6 + 7.3 3.2.2 + 4.4 3.12.0 + 1.7 + + + 2.0 + + + 21.1.2 + 3.0.12.Final + 4.7.9.Final + 4.7.9.Final + + + 8.10.2 + + + 1.4.8.1 + + + 1.4.9 + + + 3.0.5 + 2.13 4.13.1 2.0.9 + 3.4.6 3.8.1 3.0.0 - 0.8.7 + 0.8.8 1.1.1 core pom - platform-common actor-core sunbird-cassandra-utils sunbird-es-utils notification-utils - sunbird-event-utils + sunbird-platform-common + + ${basedir}/src/main/java + ${basedir}/src/test/java + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 11 + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + --illegal-access=warn + + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-maven-plugin.version} + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + package + + report + + + + + + \ No newline at end of file diff --git a/core/sunbird-cassandra-utils/pom.xml b/core/sunbird-cassandra-utils/pom.xml index 405f026be0..9517e23554 100644 --- a/core/sunbird-cassandra-utils/pom.xml +++ b/core/sunbird-cassandra-utils/pom.xml @@ -66,8 +66,22 @@ org.sunbird - platform-common + sunbird-platform-common 1.0-SNAPSHOT + + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + diff --git a/pom.xml b/pom.xml index 0472f4c0d9..9185931d29 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ 11 UTF-8 UTF-8 + 32.1.2-jre diff --git a/reports/pom.xml b/reports/pom.xml index 82d99b03bc..177aad5e61 100644 --- a/reports/pom.xml +++ b/reports/pom.xml @@ -25,7 +25,7 @@ org.sunbird - platform-common + sunbird-platform-common 1.0-SNAPSHOT diff --git a/service/pom.xml b/service/pom.xml index 126c7842d2..60121939ac 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -23,6 +23,7 @@ 1.1.1 2.0.9 1.4.14 + 2.0.9 @@ -32,7 +33,7 @@ org.sunbird - platform-common + sunbird-platform-common 1.0-SNAPSHOT @@ -77,7 +78,7 @@ com.google.guava guava - 18.0 + ${guava.version} @@ -157,6 +158,24 @@ ${logback.version} test + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + junit + junit + + + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + ${basedir}/src/main/java From 451bc7e63dbd3955fb39ddfde8011d52c714dd8f Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 13:30:55 +0530 Subject: [PATCH 13/17] refactor(controller): update controllers and tests for unified sunbird-platform-common - Updated imports and request/response handling across all controllers. - Updated request validators to use the consolidated validation logic from the unified library. - Refactored controller unit tests to reflect changes in utility classes and error handling. - Verified and updated telemetry generation and logging within the controller layer. --- .../app/controllers/BaseController.java | 21 +++++++++++-------- .../BaseBulkUploadController.java | 4 ++-- .../BulkUploadController.java | 4 ++-- .../app/controllers/feed/FeedController.java | 2 +- .../feed/validator/FeedRequestValidator.java | 4 ++-- .../healthmanager/HealthController.java | 6 +++--- .../location/LocationController.java | 2 +- .../notesmanagement/NotesController.java | 2 +- .../validator/NoteRequestValidator.java | 4 ++-- .../EmailServiceController.java | 4 ++-- .../KeyManagementController.java | 4 ++-- .../organisationmanagement/OrgController.java | 8 +++---- .../app/controllers/otp/OtpController.java | 2 +- .../otp/validator/OtpRequestValidator.java | 10 ++++----- .../storage/FileStorageController.java | 4 ++-- .../app/controllers/sync/SyncController.java | 4 ++-- .../SystemSettingsController.java | 2 +- .../controllers/tac/UserTnCController.java | 2 +- .../validator/UserTnCRequestValidator.java | 6 +++--- .../TenantMigrationController.java | 2 +- .../TenantPreferenceController.java | 2 +- .../TenantPreferenceValidator.java | 4 ++-- .../IdentifierFreeUpController.java | 4 ++-- .../ResetPasswordController.java | 2 +- .../usermanagement/UserConsentController.java | 2 +- .../usermanagement/UserController.java | 6 +++--- .../usermanagement/UserLoginController.java | 2 +- .../usermanagement/UserMergeController.java | 2 +- .../usermanagement/UserRoleController.java | 4 ++-- .../usermanagement/UserStatusController.java | 2 +- .../usermanagement/UserTypeController.java | 2 +- .../ResetPasswordRequestValidator.java | 4 ++-- .../UserConsentRequestValidator.java | 4 ++-- .../UserDataEncryptionRequestValidator.java | 4 ++-- .../validator/UserGetRequestValidator.java | 8 +++---- .../validator/UserRoleRequestValidator.java | 8 +++---- .../validator/UserStatusRequestValidator.java | 4 ++-- controller/app/filters/CustomGzipFilter.java | 2 +- controller/app/mapper/RequestMapper.java | 4 ++-- controller/app/modules/ApplicationStart.java | 2 +- controller/app/modules/ErrorHandler.java | 2 +- controller/app/modules/OnRequestHandler.java | 4 ++-- controller/app/modules/SignalHandler.java | 2 +- .../SystemSettingsRequestValidator.java | 4 ++-- controller/app/util/CaptchaHelper.java | 2 +- controller/app/util/Common.java | 2 +- controller/app/util/PrintEntryExitLog.java | 10 ++++----- .../test/controllers/ApplicationTest.java | 2 +- .../test/controllers/RequestMapperTest.java | 2 +- .../controllers/feed/FeedControllerTest.java | 2 +- .../validator/FeedRequestValidatorTest.java | 2 +- .../OrganisationControllerTest.java | 2 +- .../controllers/otp/OtpControllerTest.java | 2 +- .../controllers/tac/TnCControllerTest.java | 2 +- .../TenantMigrationControllerTest.java | 2 +- .../TenantPreferenceControllerTest.java | 2 +- .../IdentifierFreeUpControllerTest.java | 2 +- .../UserConsentControllerTest.java | 2 +- .../usermanagement/UserControllerTest.java | 4 ++-- .../usermanagement/UserControllerTest2.java | 4 ++-- .../UserRoleControllerTest.java | 2 +- .../UserStatusControllerTest.java | 2 +- .../UserTypeControllerTest.java | 2 +- controller/test/util/CaptchaHelperTest.java | 2 +- .../test/util/PrintEntryExitLogTest.java | 2 +- 65 files changed, 119 insertions(+), 116 deletions(-) diff --git a/controller/app/controllers/BaseController.java b/controller/app/controllers/BaseController.java index 8a78d4f7af..0c8a15850d 100644 --- a/controller/app/controllers/BaseController.java +++ b/controller/app/controllers/BaseController.java @@ -32,17 +32,17 @@ import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHeaders; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.HeaderParam; import org.sunbird.request.RequestContext; import org.sunbird.response.ClientErrorResponse; import org.sunbird.response.Response; import org.sunbird.telemetry.util.TelemetryEvents; import org.sunbird.telemetry.util.TelemetryWriter; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.libs.Json; import play.mvc.Controller; import play.mvc.Http; @@ -449,6 +449,9 @@ public static Response createResponseOnException( response.setTs(ProjectUtil.getFormattedDate()); response.setResponseCode(ResponseCode.getResponseCodeByCode(exception.getErrorResponseCode())); ResponseCode code = exception.getResponseCode(); + if (code == null) { + code = ResponseCode.getResponseCodeByCode(exception.getErrorResponseCode()); + } if (code == null) { code = ResponseCode.SERVER_ERROR; } @@ -470,7 +473,7 @@ private static void handleBackwardCompatibility( Request request, ProjectCommonException exception, Response response) { // This code is for backwards compatibility if (request.path() != null && request.path().startsWith("/v1/otp/generate")) { - if ("errorRateLimitExceeded".equalsIgnoreCase(exception.getResponseCode().name())) { + if (exception.getResponseCode() != null && "errorRateLimitExceeded".equalsIgnoreCase(exception.getResponseCode().name())) { response.getParams().setErr("ERROR_RATE_LIMIT_EXCEEDED"); response.getParams().setStatus("ERROR_RATE_LIMIT_EXCEEDED"); } @@ -478,7 +481,7 @@ private static void handleBackwardCompatibility( if (request.path() != null && request.path().startsWith("/v1/otp/verify") - && ("otpVerificationFailed".equalsIgnoreCase(exception.getResponseCode().name()))) { + && (exception.getResponseCode() != null && "otpVerificationFailed".equalsIgnoreCase(exception.getResponseCode().name()))) { response.getParams().setErr("OTP_VERIFICATION_FAILED"); response.getParams().setStatus("OTP_VERIFICATION_FAILED"); } @@ -486,20 +489,20 @@ private static void handleBackwardCompatibility( if (request.path() != null && (request.path().startsWith("/v1/manageduser/create") || request.path().startsWith("/v4/user/create")) - && ("managedUserLimitExceeded".equalsIgnoreCase(exception.getResponseCode().name()))) { + && (exception.getResponseCode() != null && "managedUserLimitExceeded".equalsIgnoreCase(exception.getResponseCode().name()))) { response.getParams().setErr("MANAGED_USER_LIMIT_EXCEEDED"); response.getParams().setStatus("MANAGED_USER_LIMIT_EXCEEDED"); } if (request.path() != null && (request.path().startsWith("/v1/user/consent/read")) - && ("resourceNotFound".equalsIgnoreCase(exception.getResponseCode().name()))) { + && (exception.getResponseCode() != null && "resourceNotFound".equalsIgnoreCase(exception.getResponseCode().name()))) { response.getParams().setErr("USER_CONSENT_NOT_FOUND"); response.getParams().setStatus("USER_CONSENT_NOT_FOUND"); } if (request.path() != null && (request.path().startsWith("/v1/user/get/")) - && ("resourceNotFound".equalsIgnoreCase(exception.getResponseCode().name()))) { + && (exception.getResponseCode() != null && "resourceNotFound".equalsIgnoreCase(exception.getResponseCode().name()))) { response.getParams().setErr("USER_NOT_FOUND"); response.getParams().setStatus("USER_NOT_FOUND"); } @@ -517,7 +520,7 @@ public static Response createResponseOnException( response.setVer(getApiVersion(path)); response.setId(getApiResponseId(path, method)); response.setTs(ProjectUtil.getFormattedDate()); - response.setResponseCode(exception.getResponseCode()); + response.setResponseCode(exception.getResponseCode() != null ? exception.getResponseCode() : ResponseCode.getResponseCodeByCode(exception.getErrorResponseCode())); ResponseCode code = exception.getResponseCode(); response.setParams(createResponseParamObj(code, exception.getMessage(), null)); return response; diff --git a/controller/app/controllers/bulkapimanagement/BaseBulkUploadController.java b/controller/app/controllers/bulkapimanagement/BaseBulkUploadController.java index 1bbbdd3543..d2b83b780d 100644 --- a/controller/app/controllers/bulkapimanagement/BaseBulkUploadController.java +++ b/controller/app/controllers/bulkapimanagement/BaseBulkUploadController.java @@ -14,9 +14,9 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.libs.Files; import play.mvc.Http; import play.mvc.Http.MultipartFormData; diff --git a/controller/app/controllers/bulkapimanagement/BulkUploadController.java b/controller/app/controllers/bulkapimanagement/BulkUploadController.java index 65886bde10..df5a761f7d 100644 --- a/controller/app/controllers/bulkapimanagement/BulkUploadController.java +++ b/controller/app/controllers/bulkapimanagement/BulkUploadController.java @@ -8,9 +8,9 @@ import javax.inject.Named; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/feed/FeedController.java b/controller/app/controllers/feed/FeedController.java index faff6de5e3..ba30abaf48 100644 --- a/controller/app/controllers/feed/FeedController.java +++ b/controller/app/controllers/feed/FeedController.java @@ -7,7 +7,7 @@ import javax.inject.Inject; import javax.inject.Named; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/feed/validator/FeedRequestValidator.java b/controller/app/controllers/feed/validator/FeedRequestValidator.java index 803fecead1..cd63f17c8c 100644 --- a/controller/app/controllers/feed/validator/FeedRequestValidator.java +++ b/controller/app/controllers/feed/validator/FeedRequestValidator.java @@ -5,10 +5,10 @@ import com.typesafe.config.ConfigFactory; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; /** This call will validate the Feed API request */ public class FeedRequestValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/healthmanager/HealthController.java b/controller/app/controllers/healthmanager/HealthController.java index 4b6f8fac77..46e79da9b3 100644 --- a/controller/app/controllers/healthmanager/HealthController.java +++ b/controller/app/controllers/healthmanager/HealthController.java @@ -13,12 +13,12 @@ import javax.inject.Named; import modules.SignalHandler; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.mvc.Http; import play.mvc.Result; import util.Attrs; diff --git a/controller/app/controllers/location/LocationController.java b/controller/app/controllers/location/LocationController.java index 16707667fc..3a37534a7d 100644 --- a/controller/app/controllers/location/LocationController.java +++ b/controller/app/controllers/location/LocationController.java @@ -11,7 +11,7 @@ import org.sunbird.actor.location.validator.BaseLocationRequestValidator; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/notesmanagement/NotesController.java b/controller/app/controllers/notesmanagement/NotesController.java index 05e9adf97a..25ae3129ff 100644 --- a/controller/app/controllers/notesmanagement/NotesController.java +++ b/controller/app/controllers/notesmanagement/NotesController.java @@ -8,7 +8,7 @@ import javax.inject.Inject; import javax.inject.Named; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/notesmanagement/validator/NoteRequestValidator.java b/controller/app/controllers/notesmanagement/validator/NoteRequestValidator.java index d1fde72dde..1f5b13e02e 100644 --- a/controller/app/controllers/notesmanagement/validator/NoteRequestValidator.java +++ b/controller/app/controllers/notesmanagement/validator/NoteRequestValidator.java @@ -4,10 +4,10 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; public class NoteRequestValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/notificationservice/EmailServiceController.java b/controller/app/controllers/notificationservice/EmailServiceController.java index ba5221384c..1077fb3fa0 100644 --- a/controller/app/controllers/notificationservice/EmailServiceController.java +++ b/controller/app/controllers/notificationservice/EmailServiceController.java @@ -11,9 +11,9 @@ import javax.inject.Named; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.validator.RequestValidator; +import org.sunbird.validators.RequestValidator; import play.mvc.Http; import play.mvc.Result; import util.Attrs; diff --git a/controller/app/controllers/organisationmanagement/KeyManagementController.java b/controller/app/controllers/organisationmanagement/KeyManagementController.java index 3986cae577..dcffa8c50e 100644 --- a/controller/app/controllers/organisationmanagement/KeyManagementController.java +++ b/controller/app/controllers/organisationmanagement/KeyManagementController.java @@ -5,9 +5,9 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.validator.orgvalidator.KeyManagementValidator; +import org.sunbird.validators.orgvalidator.KeyManagementValidator; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/organisationmanagement/OrgController.java b/controller/app/controllers/organisationmanagement/OrgController.java index e4b3a22c17..5f86751a01 100644 --- a/controller/app/controllers/organisationmanagement/OrgController.java +++ b/controller/app/controllers/organisationmanagement/OrgController.java @@ -5,11 +5,11 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.validator.BaseRequestValidator; -import org.sunbird.validator.orgvalidator.OrgRequestValidator; +import org.sunbird.common.ProjectUtil; +import org.sunbird.validators.BaseRequestValidator; +import org.sunbird.validators.orgvalidator.OrgRequestValidator; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/otp/OtpController.java b/controller/app/controllers/otp/OtpController.java index ea58e27d58..a75a823b1a 100644 --- a/controller/app/controllers/otp/OtpController.java +++ b/controller/app/controllers/otp/OtpController.java @@ -6,7 +6,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/otp/validator/OtpRequestValidator.java b/controller/app/controllers/otp/validator/OtpRequestValidator.java index 33637a5962..48b69a3df9 100644 --- a/controller/app/controllers/otp/validator/OtpRequestValidator.java +++ b/controller/app/controllers/otp/validator/OtpRequestValidator.java @@ -2,13 +2,13 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.StringFormatter; +import org.sunbird.validators.BaseRequestValidator; import java.util.ArrayList; import java.util.Arrays; diff --git a/controller/app/controllers/storage/FileStorageController.java b/controller/app/controllers/storage/FileStorageController.java index f34a9f3ce2..ebe95b28bb 100644 --- a/controller/app/controllers/storage/FileStorageController.java +++ b/controller/app/controllers/storage/FileStorageController.java @@ -18,9 +18,9 @@ import javax.inject.Named; import org.apache.commons.io.IOUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.libs.Files; import play.mvc.Http; diff --git a/controller/app/controllers/sync/SyncController.java b/controller/app/controllers/sync/SyncController.java index 726e14c7d9..e153dab2b1 100644 --- a/controller/app/controllers/sync/SyncController.java +++ b/controller/app/controllers/sync/SyncController.java @@ -11,9 +11,9 @@ import javax.inject.Named; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.validator.RequestValidator; +import org.sunbird.validators.RequestValidator; import play.mvc.Http; import play.mvc.Result; import util.Attrs; diff --git a/controller/app/controllers/systemsettings/SystemSettingsController.java b/controller/app/controllers/systemsettings/SystemSettingsController.java index 6e3acb3cdf..41aa4a6cdb 100644 --- a/controller/app/controllers/systemsettings/SystemSettingsController.java +++ b/controller/app/controllers/systemsettings/SystemSettingsController.java @@ -8,7 +8,7 @@ import javax.inject.Named; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.validator.systemsettings.SystemSettingsRequestValidator; import play.mvc.Http; diff --git a/controller/app/controllers/tac/UserTnCController.java b/controller/app/controllers/tac/UserTnCController.java index c3bcacc28f..7cf9e750a3 100644 --- a/controller/app/controllers/tac/UserTnCController.java +++ b/controller/app/controllers/tac/UserTnCController.java @@ -6,7 +6,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/tac/validator/UserTnCRequestValidator.java b/controller/app/controllers/tac/validator/UserTnCRequestValidator.java index 22ef4d03d5..3b5ae8ee8a 100644 --- a/controller/app/controllers/tac/validator/UserTnCRequestValidator.java +++ b/controller/app/controllers/tac/validator/UserTnCRequestValidator.java @@ -3,11 +3,11 @@ import java.text.MessageFormat; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.common.ProjectUtil; +import org.sunbird.validators.BaseRequestValidator; public class UserTnCRequestValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/tenantmigration/TenantMigrationController.java b/controller/app/controllers/tenantmigration/TenantMigrationController.java index 03c7158b82..751b5cee42 100644 --- a/controller/app/controllers/tenantmigration/TenantMigrationController.java +++ b/controller/app/controllers/tenantmigration/TenantMigrationController.java @@ -5,7 +5,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/tenantpreference/TenantPreferenceController.java b/controller/app/controllers/tenantpreference/TenantPreferenceController.java index d9f1bcf72c..0126cd5ec6 100644 --- a/controller/app/controllers/tenantpreference/TenantPreferenceController.java +++ b/controller/app/controllers/tenantpreference/TenantPreferenceController.java @@ -5,7 +5,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/tenantpreference/TenantPreferenceValidator.java b/controller/app/controllers/tenantpreference/TenantPreferenceValidator.java index 1c2120afe0..b74983e347 100644 --- a/controller/app/controllers/tenantpreference/TenantPreferenceValidator.java +++ b/controller/app/controllers/tenantpreference/TenantPreferenceValidator.java @@ -7,10 +7,10 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; public class TenantPreferenceValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/usermanagement/IdentifierFreeUpController.java b/controller/app/controllers/usermanagement/IdentifierFreeUpController.java index ac64fcbf20..91acb5f7cd 100644 --- a/controller/app/controllers/usermanagement/IdentifierFreeUpController.java +++ b/controller/app/controllers/usermanagement/IdentifierFreeUpController.java @@ -5,9 +5,9 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.validator.UserFreeUpRequestValidator; +import org.sunbird.validators.UserFreeUpRequestValidator; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/usermanagement/ResetPasswordController.java b/controller/app/controllers/usermanagement/ResetPasswordController.java index ff1e4986d6..078f248a6c 100644 --- a/controller/app/controllers/usermanagement/ResetPasswordController.java +++ b/controller/app/controllers/usermanagement/ResetPasswordController.java @@ -6,7 +6,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/usermanagement/UserConsentController.java b/controller/app/controllers/usermanagement/UserConsentController.java index 6b12b089d0..35a6b22a22 100644 --- a/controller/app/controllers/usermanagement/UserConsentController.java +++ b/controller/app/controllers/usermanagement/UserConsentController.java @@ -6,7 +6,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/usermanagement/UserController.java b/controller/app/controllers/usermanagement/UserController.java index 98f11c285a..49f62586cd 100644 --- a/controller/app/controllers/usermanagement/UserController.java +++ b/controller/app/controllers/usermanagement/UserController.java @@ -9,10 +9,10 @@ import javax.inject.Named; import org.sunbird.actor.user.validator.UserRequestValidator; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.common.ProjectUtil; +import org.sunbird.validators.BaseRequestValidator; import play.mvc.Http; import play.mvc.Result; import util.Attrs; diff --git a/controller/app/controllers/usermanagement/UserLoginController.java b/controller/app/controllers/usermanagement/UserLoginController.java index f8d1a4fddc..53f50ac6c3 100644 --- a/controller/app/controllers/usermanagement/UserLoginController.java +++ b/controller/app/controllers/usermanagement/UserLoginController.java @@ -5,7 +5,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/usermanagement/UserMergeController.java b/controller/app/controllers/usermanagement/UserMergeController.java index 6aedfd0d88..fb013892cc 100644 --- a/controller/app/controllers/usermanagement/UserMergeController.java +++ b/controller/app/controllers/usermanagement/UserMergeController.java @@ -8,7 +8,7 @@ import javax.inject.Named; import org.sunbird.actor.user.validator.UserRequestValidator; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/usermanagement/UserRoleController.java b/controller/app/controllers/usermanagement/UserRoleController.java index f6d1b29e96..07b7a6d9ce 100644 --- a/controller/app/controllers/usermanagement/UserRoleController.java +++ b/controller/app/controllers/usermanagement/UserRoleController.java @@ -7,9 +7,9 @@ import javax.inject.Inject; import javax.inject.Named; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.mvc.Http; import play.mvc.Result; import util.Attrs; diff --git a/controller/app/controllers/usermanagement/UserStatusController.java b/controller/app/controllers/usermanagement/UserStatusController.java index e895de5cf8..8559c52b18 100644 --- a/controller/app/controllers/usermanagement/UserStatusController.java +++ b/controller/app/controllers/usermanagement/UserStatusController.java @@ -6,7 +6,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/usermanagement/UserTypeController.java b/controller/app/controllers/usermanagement/UserTypeController.java index 5c01a13486..7c56f39d2c 100644 --- a/controller/app/controllers/usermanagement/UserTypeController.java +++ b/controller/app/controllers/usermanagement/UserTypeController.java @@ -5,7 +5,7 @@ import java.util.concurrent.CompletionStage; import javax.inject.Inject; import javax.inject.Named; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/app/controllers/usermanagement/validator/ResetPasswordRequestValidator.java b/controller/app/controllers/usermanagement/validator/ResetPasswordRequestValidator.java index 0cf3614aed..3192dd4cdf 100644 --- a/controller/app/controllers/usermanagement/validator/ResetPasswordRequestValidator.java +++ b/controller/app/controllers/usermanagement/validator/ResetPasswordRequestValidator.java @@ -1,9 +1,9 @@ package controllers.usermanagement.validator; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; /** This class will validate the reset password request */ public class ResetPasswordRequestValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/usermanagement/validator/UserConsentRequestValidator.java b/controller/app/controllers/usermanagement/validator/UserConsentRequestValidator.java index b79cd7b54f..937d35a0c6 100644 --- a/controller/app/controllers/usermanagement/validator/UserConsentRequestValidator.java +++ b/controller/app/controllers/usermanagement/validator/UserConsentRequestValidator.java @@ -3,10 +3,10 @@ import java.util.HashMap; import java.util.Map; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; public class UserConsentRequestValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/usermanagement/validator/UserDataEncryptionRequestValidator.java b/controller/app/controllers/usermanagement/validator/UserDataEncryptionRequestValidator.java index 1cea92a426..397f62c6c6 100644 --- a/controller/app/controllers/usermanagement/validator/UserDataEncryptionRequestValidator.java +++ b/controller/app/controllers/usermanagement/validator/UserDataEncryptionRequestValidator.java @@ -1,9 +1,9 @@ package controllers.usermanagement.validator; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; public class UserDataEncryptionRequestValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/usermanagement/validator/UserGetRequestValidator.java b/controller/app/controllers/usermanagement/validator/UserGetRequestValidator.java index 4020e2700e..3d27afb522 100644 --- a/controller/app/controllers/usermanagement/validator/UserGetRequestValidator.java +++ b/controller/app/controllers/usermanagement/validator/UserGetRequestValidator.java @@ -1,13 +1,13 @@ package controllers.usermanagement.validator; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.StringFormatter; +import org.sunbird.validators.BaseRequestValidator; import play.mvc.Http; import util.CaptchaHelper; diff --git a/controller/app/controllers/usermanagement/validator/UserRoleRequestValidator.java b/controller/app/controllers/usermanagement/validator/UserRoleRequestValidator.java index c12b22ed2a..ccc46db10e 100644 --- a/controller/app/controllers/usermanagement/validator/UserRoleRequestValidator.java +++ b/controller/app/controllers/usermanagement/validator/UserRoleRequestValidator.java @@ -6,12 +6,12 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.StringFormatter; +import org.sunbird.validators.BaseRequestValidator; public class UserRoleRequestValidator extends BaseRequestValidator { diff --git a/controller/app/controllers/usermanagement/validator/UserStatusRequestValidator.java b/controller/app/controllers/usermanagement/validator/UserStatusRequestValidator.java index a65d3a2a2b..a0ccf7f4a2 100644 --- a/controller/app/controllers/usermanagement/validator/UserStatusRequestValidator.java +++ b/controller/app/controllers/usermanagement/validator/UserStatusRequestValidator.java @@ -1,9 +1,9 @@ package controllers.usermanagement.validator; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; public class UserStatusRequestValidator extends BaseRequestValidator { diff --git a/controller/app/filters/CustomGzipFilter.java b/controller/app/filters/CustomGzipFilter.java index 20592785ff..85db35f37d 100644 --- a/controller/app/filters/CustomGzipFilter.java +++ b/controller/app/filters/CustomGzipFilter.java @@ -7,7 +7,7 @@ import org.apache.http.HttpHeaders; import org.sunbird.keys.JsonKey; import org.sunbird.request.HeaderParam; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.mvc.EssentialAction; import play.mvc.EssentialFilter; import play.mvc.Http; diff --git a/controller/app/mapper/RequestMapper.java b/controller/app/mapper/RequestMapper.java index e1f782f3d3..9cad0ae7db 100644 --- a/controller/app/mapper/RequestMapper.java +++ b/controller/app/mapper/RequestMapper.java @@ -3,9 +3,9 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.text.MessageFormat; diff --git a/controller/app/modules/ApplicationStart.java b/controller/app/modules/ApplicationStart.java index 7a34248ae6..4db010070e 100644 --- a/controller/app/modules/ApplicationStart.java +++ b/controller/app/modules/ApplicationStart.java @@ -9,7 +9,7 @@ import org.sunbird.helper.CassandraConnectionMngrFactory; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.user.SchedulerManager; import play.api.Environment; import play.api.inject.ApplicationLifecycle; diff --git a/controller/app/modules/ErrorHandler.java b/controller/app/modules/ErrorHandler.java index f0cafaa0b4..7777a822ec 100644 --- a/controller/app/modules/ErrorHandler.java +++ b/controller/app/modules/ErrorHandler.java @@ -8,7 +8,7 @@ import javax.inject.Provider; import javax.inject.Singleton; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.logging.LoggerUtil; import org.sunbird.response.Response; import play.Environment; diff --git a/controller/app/modules/OnRequestHandler.java b/controller/app/modules/OnRequestHandler.java index 188d2830d3..6876ddc1e6 100644 --- a/controller/app/modules/OnRequestHandler.java +++ b/controller/app/modules/OnRequestHandler.java @@ -15,13 +15,13 @@ import java.util.concurrent.CompletionStage; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.HeaderParam; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.http.ActionCreator; import play.libs.Json; import play.mvc.Action; diff --git a/controller/app/modules/SignalHandler.java b/controller/app/modules/SignalHandler.java index 3ba3efec65..fcfbcf427a 100644 --- a/controller/app/modules/SignalHandler.java +++ b/controller/app/modules/SignalHandler.java @@ -6,7 +6,7 @@ import javax.inject.Provider; import javax.inject.Singleton; import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.api.Application; import play.api.Play; import scala.concurrent.duration.Duration; diff --git a/controller/app/org/sunbird/validator/systemsettings/SystemSettingsRequestValidator.java b/controller/app/org/sunbird/validator/systemsettings/SystemSettingsRequestValidator.java index dc5bc5f3dc..8fc048949a 100644 --- a/controller/app/org/sunbird/validator/systemsettings/SystemSettingsRequestValidator.java +++ b/controller/app/org/sunbird/validator/systemsettings/SystemSettingsRequestValidator.java @@ -1,9 +1,9 @@ package org.sunbird.validator.systemsettings; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; public class SystemSettingsRequestValidator extends BaseRequestValidator { public void validateSetSystemSetting(Request request) { diff --git a/controller/app/util/CaptchaHelper.java b/controller/app/util/CaptchaHelper.java index 59123af27c..caac439b59 100644 --- a/controller/app/util/CaptchaHelper.java +++ b/controller/app/util/CaptchaHelper.java @@ -7,7 +7,7 @@ import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import javax.ws.rs.core.MediaType; import java.util.Arrays; diff --git a/controller/app/util/Common.java b/controller/app/util/Common.java index abc551e038..2e9f099a3e 100644 --- a/controller/app/util/Common.java +++ b/controller/app/util/Common.java @@ -1,7 +1,7 @@ package util; import org.apache.commons.lang3.StringUtils; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.response.ResponseParams; import play.libs.typedmap.TypedKey; diff --git a/controller/app/util/PrintEntryExitLog.java b/controller/app/util/PrintEntryExitLog.java index e002313036..5b35c3ca7f 100644 --- a/controller/app/util/PrintEntryExitLog.java +++ b/controller/app/util/PrintEntryExitLog.java @@ -17,15 +17,15 @@ import org.sunbird.datasecurity.impl.DefaultDataMaskServiceImpl; import org.sunbird.datasecurity.impl.LogMaskServiceImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.response.ResponseParams; -import org.sunbird.util.EntryExitLogEvent; -import org.sunbird.util.ProjectUtil; +import org.sunbird.logging.EntryExitLogEvent; +import org.sunbird.common.ProjectUtil; public class PrintEntryExitLog { @@ -108,7 +108,7 @@ public static void printExitLogOnFailure( ResponseCode.SERVER_ERROR.getResponseCode()); } - ResponseCode code = exception.getResponseCode(); + ResponseCode code = exception.getResponseCodeEnum(); if (code == null) { code = ResponseCode.SERVER_ERROR; } diff --git a/controller/test/controllers/ApplicationTest.java b/controller/test/controllers/ApplicationTest.java index 70bdc72815..10a737f159 100644 --- a/controller/test/controllers/ApplicationTest.java +++ b/controller/test/controllers/ApplicationTest.java @@ -6,7 +6,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import play.mvc.Result; /** diff --git a/controller/test/controllers/RequestMapperTest.java b/controller/test/controllers/RequestMapperTest.java index 310a3bae44..be8d04b83e 100644 --- a/controller/test/controllers/RequestMapperTest.java +++ b/controller/test/controllers/RequestMapperTest.java @@ -9,7 +9,7 @@ import org.junit.Assert; import org.junit.Test; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; diff --git a/controller/test/controllers/feed/FeedControllerTest.java b/controller/test/controllers/feed/FeedControllerTest.java index f411a18107..8428329125 100644 --- a/controller/test/controllers/feed/FeedControllerTest.java +++ b/controller/test/controllers/feed/FeedControllerTest.java @@ -19,7 +19,7 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/test/controllers/feed/validator/FeedRequestValidatorTest.java b/controller/test/controllers/feed/validator/FeedRequestValidatorTest.java index c9260bc973..b10b49e688 100644 --- a/controller/test/controllers/feed/validator/FeedRequestValidatorTest.java +++ b/controller/test/controllers/feed/validator/FeedRequestValidatorTest.java @@ -6,7 +6,7 @@ import org.junit.Test; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; public class FeedRequestValidatorTest { diff --git a/controller/test/controllers/organisationmanagement/OrganisationControllerTest.java b/controller/test/controllers/organisationmanagement/OrganisationControllerTest.java index 8262eb3974..46f82cd2a3 100644 --- a/controller/test/controllers/organisationmanagement/OrganisationControllerTest.java +++ b/controller/test/controllers/organisationmanagement/OrganisationControllerTest.java @@ -13,7 +13,7 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/test/controllers/otp/OtpControllerTest.java b/controller/test/controllers/otp/OtpControllerTest.java index 43c59a74a6..0bc26cb6c8 100644 --- a/controller/test/controllers/otp/OtpControllerTest.java +++ b/controller/test/controllers/otp/OtpControllerTest.java @@ -18,7 +18,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.response.Response; import org.sunbird.response.ResponseParams; diff --git a/controller/test/controllers/tac/TnCControllerTest.java b/controller/test/controllers/tac/TnCControllerTest.java index ad518e3f55..cb6317e2d3 100644 --- a/controller/test/controllers/tac/TnCControllerTest.java +++ b/controller/test/controllers/tac/TnCControllerTest.java @@ -17,7 +17,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.response.Response; import org.sunbird.response.ResponseParams; diff --git a/controller/test/controllers/tenantmigration/TenantMigrationControllerTest.java b/controller/test/controllers/tenantmigration/TenantMigrationControllerTest.java index 42a6c7971d..5f943dfa6e 100644 --- a/controller/test/controllers/tenantmigration/TenantMigrationControllerTest.java +++ b/controller/test/controllers/tenantmigration/TenantMigrationControllerTest.java @@ -16,7 +16,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.HeaderParam; import play.mvc.Result; diff --git a/controller/test/controllers/tenantpreference/TenantPreferenceControllerTest.java b/controller/test/controllers/tenantpreference/TenantPreferenceControllerTest.java index a5580184c3..262c62267e 100644 --- a/controller/test/controllers/tenantpreference/TenantPreferenceControllerTest.java +++ b/controller/test/controllers/tenantpreference/TenantPreferenceControllerTest.java @@ -18,7 +18,7 @@ import org.junit.Ignore; import org.junit.Test; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.HeaderParam; import play.libs.Json; diff --git a/controller/test/controllers/usermanagement/IdentifierFreeUpControllerTest.java b/controller/test/controllers/usermanagement/IdentifierFreeUpControllerTest.java index f1a35a952a..59e2cf1f10 100644 --- a/controller/test/controllers/usermanagement/IdentifierFreeUpControllerTest.java +++ b/controller/test/controllers/usermanagement/IdentifierFreeUpControllerTest.java @@ -13,7 +13,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.HeaderParam; import play.mvc.Result; diff --git a/controller/test/controllers/usermanagement/UserConsentControllerTest.java b/controller/test/controllers/usermanagement/UserConsentControllerTest.java index d67e85538d..9749e4049e 100644 --- a/controller/test/controllers/usermanagement/UserConsentControllerTest.java +++ b/controller/test/controllers/usermanagement/UserConsentControllerTest.java @@ -22,7 +22,7 @@ import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.request.HeaderParam; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.libs.Json; import play.mvc.Http; import play.mvc.Result; diff --git a/controller/test/controllers/usermanagement/UserControllerTest.java b/controller/test/controllers/usermanagement/UserControllerTest.java index 1cb3bb7f79..0a84097144 100644 --- a/controller/test/controllers/usermanagement/UserControllerTest.java +++ b/controller/test/controllers/usermanagement/UserControllerTest.java @@ -21,13 +21,13 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.request.HeaderParam; import org.sunbird.response.Response; import org.sunbird.response.ResponseParams; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.libs.Json; import play.mvc.Http; import play.mvc.Http.RequestBuilder; diff --git a/controller/test/controllers/usermanagement/UserControllerTest2.java b/controller/test/controllers/usermanagement/UserControllerTest2.java index f4ff35d1ab..690002756e 100644 --- a/controller/test/controllers/usermanagement/UserControllerTest2.java +++ b/controller/test/controllers/usermanagement/UserControllerTest2.java @@ -17,13 +17,13 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.UserDeclareEntity; import org.sunbird.request.HeaderParam; import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import play.mvc.Result; import util.ACTORS; import util.CaptchaHelper; diff --git a/controller/test/controllers/usermanagement/UserRoleControllerTest.java b/controller/test/controllers/usermanagement/UserRoleControllerTest.java index 475a16bac2..8192a9fd17 100644 --- a/controller/test/controllers/usermanagement/UserRoleControllerTest.java +++ b/controller/test/controllers/usermanagement/UserRoleControllerTest.java @@ -16,7 +16,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.response.Response; import org.sunbird.response.ResponseParams; diff --git a/controller/test/controllers/usermanagement/UserStatusControllerTest.java b/controller/test/controllers/usermanagement/UserStatusControllerTest.java index b9ab44ec2d..1e08230657 100644 --- a/controller/test/controllers/usermanagement/UserStatusControllerTest.java +++ b/controller/test/controllers/usermanagement/UserStatusControllerTest.java @@ -17,7 +17,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.response.Response; import org.sunbird.response.ResponseParams; diff --git a/controller/test/controllers/usermanagement/UserTypeControllerTest.java b/controller/test/controllers/usermanagement/UserTypeControllerTest.java index 5c4e0f3ca2..acae7f545f 100644 --- a/controller/test/controllers/usermanagement/UserTypeControllerTest.java +++ b/controller/test/controllers/usermanagement/UserTypeControllerTest.java @@ -16,7 +16,7 @@ import org.junit.Test; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.response.Response; import org.sunbird.response.ResponseParams; import play.libs.Json; diff --git a/controller/test/util/CaptchaHelperTest.java b/controller/test/util/CaptchaHelperTest.java index 1aaf12330c..9f6653169f 100644 --- a/controller/test/util/CaptchaHelperTest.java +++ b/controller/test/util/CaptchaHelperTest.java @@ -11,7 +11,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.http.HttpClientUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.util.HashMap; import java.util.Map; diff --git a/controller/test/util/PrintEntryExitLogTest.java b/controller/test/util/PrintEntryExitLogTest.java index 9c6d6e44ce..60ffc80680 100644 --- a/controller/test/util/PrintEntryExitLogTest.java +++ b/controller/test/util/PrintEntryExitLogTest.java @@ -9,7 +9,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; From 8d9bfb27fb9bdb2c7250c8584ff3fbf52a02ceb3 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 14:39:23 +0530 Subject: [PATCH 14/17] refactor(core): update actor-core and notification-utils for sunbird-platform-common --- .../src/main/java/org/sunbird/actor/core/BaseActor.java | 4 ++-- .../main/java/org/sunbird/notification/utils/SMSFactory.java | 2 +- .../java/org/sunbird/notification/utils/SmsTemplateUtil.java | 2 +- .../notification/sms/providerimpl/BaseMessageTest.java | 2 +- .../sms/providerimpl/NICGatewaySmsProviderTest.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/actor-core/src/main/java/org/sunbird/actor/core/BaseActor.java b/core/actor-core/src/main/java/org/sunbird/actor/core/BaseActor.java index 7f8d7e2a42..264baf7142 100644 --- a/core/actor-core/src/main/java/org/sunbird/actor/core/BaseActor.java +++ b/core/actor-core/src/main/java/org/sunbird/actor/core/BaseActor.java @@ -2,9 +2,9 @@ import org.apache.pekko.actor.UntypedAbstractActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.logging.LoggerUtil; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; public abstract class BaseActor extends UntypedAbstractActor { diff --git a/core/notification-utils/src/main/java/org/sunbird/notification/utils/SMSFactory.java b/core/notification-utils/src/main/java/org/sunbird/notification/utils/SMSFactory.java index 77e171081d..414a6164d5 100644 --- a/core/notification-utils/src/main/java/org/sunbird/notification/utils/SMSFactory.java +++ b/core/notification-utils/src/main/java/org/sunbird/notification/utils/SMSFactory.java @@ -5,7 +5,7 @@ import org.sunbird.notification.sms.provider.ISmsProviderFactory; import org.sunbird.notification.sms.providerimpl.Msg91SmsProviderFactory; import org.sunbird.notification.sms.providerimpl.NICGatewaySmsProviderFactory; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; /** * This class will provide object of factory. diff --git a/core/notification-utils/src/main/java/org/sunbird/notification/utils/SmsTemplateUtil.java b/core/notification-utils/src/main/java/org/sunbird/notification/utils/SmsTemplateUtil.java index 39b1680fac..4f76c9142d 100644 --- a/core/notification-utils/src/main/java/org/sunbird/notification/utils/SmsTemplateUtil.java +++ b/core/notification-utils/src/main/java/org/sunbird/notification/utils/SmsTemplateUtil.java @@ -10,7 +10,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class SmsTemplateUtil { private static final LoggerUtil logger = new LoggerUtil(SmsTemplateUtil.class); diff --git a/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/BaseMessageTest.java b/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/BaseMessageTest.java index e16da0a7cb..5835cadc6a 100644 --- a/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/BaseMessageTest.java +++ b/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/BaseMessageTest.java @@ -21,7 +21,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.notification.utils.PropertiesCache; import org.sunbird.notification.utils.SmsTemplateUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @PowerMockIgnore({"javax.management.*", "javax.net.ssl.*", "javax.security.*"}) diff --git a/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/NICGatewaySmsProviderTest.java b/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/NICGatewaySmsProviderTest.java index 1b20a3f887..cf538165cc 100644 --- a/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/NICGatewaySmsProviderTest.java +++ b/core/notification-utils/src/test/java/org/sunbird/notification/sms/providerimpl/NICGatewaySmsProviderTest.java @@ -29,7 +29,7 @@ import org.sunbird.notification.utils.SMSFactory; import org.sunbird.notification.utils.SmsTemplateUtil; import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @PowerMockIgnore({"javax.management.*", "javax.net.ssl.*", "javax.security.*"}) From 6ed20cfd37f91bad170d14273d0ed66efefefc97 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 14:40:43 +0530 Subject: [PATCH 15/17] refactor(service): update service layer for sunbird-platform-common integration - Refactored the core service layer and associated unit tests to use the new unified sunbird-platform-common library structure. - Updated imports and package references across all service implementation classes. --- .../sunbird/actor/BackgroundJobManager.java | 4 +- .../actor/bulkupload/BaseBulkUploadActor.java | 4 +- .../BaseBulkUploadBackgroundJobActor.java | 4 +- .../bulkupload/BulkUploadManagementActor.java | 8 +-- .../bulkupload/LocationBulkUploadActor.java | 2 +- .../LocationBulkUploadBackGroundJobActor.java | 6 +-- .../actor/bulkupload/OrgBulkUploadActor.java | 6 +-- .../OrgBulkUploadBackgroundJobActor.java | 6 +-- .../actor/bulkupload/UserBulkUploadActor.java | 2 +- .../UserBulkUploadBackgroundJobActor.java | 6 +-- .../FileUploadServiceActor.java | 8 +-- .../org/sunbird/actor/health/HealthActor.java | 4 +- .../actor/location/BaseLocationActor.java | 2 +- .../sunbird/actor/location/LocationActor.java | 4 +- .../location/LocationBackgroundActor.java | 2 +- .../BaseLocationRequestValidator.java | 4 +- .../validator/LocationRequestValidator.java | 4 +- .../actor/notes/NotesManagementActor.java | 2 +- .../BackGroundNotificationActor.java | 2 +- .../actor/notification/EmailServiceActor.java | 4 +- .../notification/SendNotificationActor.java | 2 +- .../OrganisationBackgroundActor.java | 6 +-- .../OrganisationManagementActor.java | 12 ++--- .../validator/OrgTypeValidator.java | 2 +- .../OrganisationRequestValidator.java | 6 +-- .../java/org/sunbird/actor/otp/OTPActor.java | 16 ++++-- .../org/sunbird/actor/otp/SendOTPActor.java | 2 +- .../org/sunbird/actor/role/UserRoleActor.java | 6 +-- .../actor/role/UserRoleBackgroundActor.java | 2 +- .../actor/search/SearchHandlerActor.java | 10 ++-- .../org/sunbird/actor/sync/EsSyncActor.java | 4 +- .../actor/sync/EsSyncBackgroundActor.java | 4 +- .../TenantPreferenceManagementActor.java | 2 +- .../actor/user/IdentifierFreeUpActor.java | 4 +- .../sunbird/actor/user/ManagedUserActor.java | 1 + .../actor/user/ResetPasswordActor.java | 4 +- .../actor/user/SSOUserCreateActor.java | 4 +- .../actor/user/SSUUserCreateActor.java | 6 +-- .../actor/user/TenantMigrationActor.java | 6 +-- .../actor/user/UserBackgroundJobActor.java | 2 +- .../org/sunbird/actor/user/UserBaseActor.java | 4 +- .../user/UserDeletionBackgroundJobActor.java | 2 +- .../user/UserExternalIdManagementActor.java | 8 +-- .../sunbird/actor/user/UserLookupActor.java | 1 + .../sunbird/actor/user/UserMergeActor.java | 14 ++--- .../user/UserOnboardingNotificationActor.java | 10 ++-- .../user/UserOwnershipTransferActor.java | 8 +-- .../actor/user/UserProfileReadActor.java | 4 +- .../actor/user/UserProfileUpdateActor.java | 2 +- .../UserSelfDeclarationManagementActor.java | 2 +- .../sunbird/actor/user/UserStatusActor.java | 4 +- .../org/sunbird/actor/user/UserTnCActor.java | 6 +-- .../sunbird/actor/user/UserUpdateActor.java | 6 ++- .../validator/UserCreateRequestValidator.java | 6 +-- .../user/validator/UserRequestValidator.java | 12 ++--- .../actor/userconsent/UserConsentActor.java | 2 +- .../client/NotificationServiceClient.java | 6 +-- .../impl/BulkUploadProcessDaoImpl.java | 2 +- .../impl/BulkUploadProcessTaskDaoImpl.java | 2 +- .../dao/location/impl/LocationDaoImpl.java | 2 +- .../sunbird/dao/notes/impl/NotesDaoImpl.java | 2 +- .../impl/EmailTemplateDaoImpl.java | 2 +- .../dao/organisation/impl/OrgDaoImpl.java | 4 +- .../organisation/impl/OrgExternalDaoImpl.java | 2 +- .../org/sunbird/dao/otp/impl/OTPDaoImpl.java | 4 +- .../dao/ratelimit/RateLimitDaoImpl.java | 2 +- .../sunbird/dao/role/impl/RoleDaoImpl.java | 2 +- .../dao/role/impl/RoleGroupDaoImpl.java | 2 +- .../impl/SystemSettingDaoImpl.java | 2 +- .../impl/TenantPreferenceDaoImpl.java | 2 +- .../dao/urlaction/impl/UrlActionDaoImpl.java | 2 +- .../sunbird/dao/user/impl/UserDaoImpl.java | 4 +- .../impl/UserExternalIdentityDaoImpl.java | 2 +- .../sunbird/dao/user/impl/UserOrgDaoImpl.java | 2 +- .../dao/user/impl/UserRoleDaoImpl.java | 2 +- .../user/impl/UserSelfDeclarationDaoImpl.java | 2 +- .../userconsent/impl/UserConsentDaoImpl.java | 2 +- .../bulkupload/BulkUploadProcessTask.java | 2 +- .../service/feed/impl/FeedServiceImpl.java | 2 +- .../service/location/LocationServiceImpl.java | 10 ++-- .../sunbird/service/notes/NotesService.java | 4 +- .../notification/NotificationService.java | 4 +- .../organisation/impl/OrgServiceImpl.java | 6 +-- .../ratelimit/RateLimitServiceImpl.java | 4 +- .../org/sunbird/service/role/RoleService.java | 2 +- .../systemsettings/SystemSettingsService.java | 2 +- .../TenantPreferenceService.java | 6 +-- .../service/user/ResetPasswordService.java | 4 +- .../user/ShadowUserMigrationService.java | 2 +- .../service/user/UserDeletionService.java | 4 +- .../service/user/UserProfileReadService.java | 7 +-- .../service/user/UserStatusService.java | 10 ++-- .../sunbird/service/user/UserTncService.java | 2 +- .../impl/ExtendedUserProfileServiceImpl.java | 2 +- .../service/user/impl/SSOUserServiceImpl.java | 8 +-- .../user/impl/TenantMigrationServiceImpl.java | 10 ++-- .../user/impl/UserLookUpServiceImpl.java | 6 +-- .../service/user/impl/UserOrgServiceImpl.java | 2 +- .../user/impl/UserRoleServiceImpl.java | 4 +- .../impl/UserSelfDeclarationServiceImpl.java | 2 +- .../service/user/impl/UserServiceImpl.java | 6 ++- .../impl/UserConsentServiceImpl.java | 4 +- .../org/sunbird/util/AdminUtilHandler.java | 3 +- .../org/sunbird/util/DataCacheHandler.java | 1 + .../java/org/sunbird/util/FormApiUtil.java | 1 + .../org/sunbird/util/FormApiUtilHandler.java | 1 + .../org/sunbird/util/SMSTemplateProvider.java | 1 + .../java/org/sunbird/util/UserUtility.java | 1 + .../src/main/java/org/sunbird/util/Util.java | 1 + .../util/contentstore/ContentStoreUtil.java | 4 +- .../java/org/sunbird/util/otp/OTPUtil.java | 4 +- .../util/ratelimit/OtpRateLimiter.java | 2 +- .../org/sunbird/util/ratelimit/RateLimit.java | 15 ++++-- .../org/sunbird/util/search/FuzzyMatcher.java | 2 +- .../util/search/FuzzySearchManager.java | 2 +- .../util/search/SearchTelemetryGenerator.java | 2 +- .../sunbird/util/user/SchedulerManager.java | 2 +- .../UserExtendedProfileSchemaValidator.java | 2 +- .../org/sunbird/util/user/UserTncUtil.java | 2 +- .../java/org/sunbird/util/user/UserUtil.java | 12 ++--- .../actor/BackgroundJobManagerTest.java | 4 +- .../BulkUploadManagementActorTest.java | 6 +-- .../LocationBulkUploadActorTest.java | 2 +- .../UserBulkUploadBackgroundJobActorTest.java | 6 +-- .../sunbird/actor/health/HealthActorTest.java | 2 +- .../actor/location/LocationActorTest.java | 4 +- .../LocationRequestValidatorTest.java | 4 +- .../actor/notes/NotesManagementActorTest.java | 6 +-- .../BackgroundNotificationActorTest.java | 2 +- .../notification/EmailServiceActorTest.java | 4 +- .../SendNotificationActorTest.java | 6 +-- .../organisation/OrgManagementActorTest.java | 10 ++-- .../organisation/OrgTypeValidatorTest.java | 2 +- .../OrganisationBackgroundActorTest.java | 4 +- .../OrganisationRequestValidatorTest.java | 2 +- .../org/sunbird/actor/otp/OTPActorTest.java | 4 +- .../sunbird/actor/otp/SendOTPActorTest.java | 4 +- .../sunbird/actor/role/UserRoleActorTest.java | 4 +- .../actor/role/UserRoleActorTestV2.java | 8 +-- .../role/UserRoleBackgroundActorTest.java | 2 +- .../actor/search/SearchHandlerActorTest.java | 2 +- .../sunbird/actor/sync/ESSyncActorTest.java | 2 +- .../actor/sync/EsSyncBackgroundActorTest.java | 4 +- .../SystemSettingsActorTest.java | 6 +-- .../TenantPreferenceManagementActorTest.java | 4 +- .../actor/user/CheckUserExistActorTest.java | 2 +- .../actor/user/IdentifierFreeUpActorTest.java | 10 ++-- .../actor/user/ManagedUserActorTest.java | 2 +- .../actor/user/ResetPasswordActorTest.java | 12 ++--- .../actor/user/SSOUserCreateActorTest.java | 4 +- .../actor/user/SSUUserCreateActorTest.java | 2 +- .../actor/user/TenantMigrationActorTest.java | 8 +-- .../actor/user/UserAssignRoleTest.java | 2 +- .../actor/user/UserConsentActorTest.java | 4 +- .../UserDeletionBackgroundJobActorTest.java | 2 +- .../UserExternalIdManagementActorTest.java | 4 +- .../sunbird/actor/user/UserFeedActorTest.java | 4 +- .../sunbird/actor/user/UserFrameworkTest.java | 2 +- .../actor/user/UserLoginActorTest.java | 4 +- .../actor/user/UserLookupActorTest.java | 2 +- .../user/UserManagementActorTestBase.java | 6 +-- .../actor/user/UserMergeActorTest.java | 10 ++-- .../UserOnBoardingNotificationActorTest.java | 8 +-- .../user/UserOrgManagementActorTest.java | 2 +- .../user/UserOwnershipTransferActorTest.java | 4 +- .../actor/user/UserProfileReadActorTest.java | 10 ++-- ...serSelfDeclarationManagementActorTest.java | 4 +- .../actor/user/UserStatusActorTest.java | 12 ++--- .../sunbird/actor/user/UserTnCActorTest.java | 6 +-- .../sunbird/actor/user/UserTypeActorTest.java | 6 +-- .../actor/user/UserUpdateActorTest.java | 4 +- .../UserCreateRequestValidatorTest.java | 2 +- .../validator/UserRequestValidatorTest.java | 8 +-- .../client/NotificationServiceClientTest.java | 2 +- .../BulkUploadProcessDaoImplTest.java | 2 +- .../EmailTemplateDaoImplTest.java | 2 +- .../dao/ratelimit/RateLimitDaoTest.java | 2 +- .../org/sunbird/dao/role/RoleDaoImplTest.java | 2 +- .../dao/role/RoleGroupDaoImplTest.java | 2 +- .../dao/user/impl/UserRoleDaoImplTest.java | 2 +- .../feed/impl/FeedServiceImplTest.java | 2 +- .../notification/NotificationServiceTest.java | 2 +- .../organisation/OrgServiceImplTest.java | 2 +- .../ratelimit/RateLimitServiceTest.java | 2 +- .../TenantPreferenceServiceTest.java | 2 +- .../user/ResetPasswordServiceTest.java | 2 +- .../service/user/UserDeletionServiceTest.java | 8 +-- .../user/UserExtendedProfileReadTest.java | 2 +- .../user/UserProfileReadServiceTest.java | 4 +- .../service/user/UserProfileReadTest.java | 2 +- .../service/user/UserTncServiceTest.java | 2 +- .../impl/TenantMigrationServiceImplTest.java | 2 +- .../org/sunbird/util/otp/OTPUtilTest.java | 2 +- .../sunbird/util/ratelimit/RateLimitTest.java | 51 +++++++++++++++++++ .../util/user/GetUserOrgDetailsTest.java | 2 +- .../util/user/SetUserDefaultValueTest.java | 2 +- .../user/ShadowUserMigrationServiceTest.java | 2 +- ...serExtendedProfileSchemaValidatorTest.java | 2 +- .../org/sunbird/util/user/UserLookupTest.java | 2 +- .../org/sunbird/util/user/UserUtilTest.java | 4 +- 200 files changed, 473 insertions(+), 391 deletions(-) create mode 100644 service/src/test/java/org/sunbird/util/ratelimit/RateLimitTest.java diff --git a/service/src/main/java/org/sunbird/actor/BackgroundJobManager.java b/service/src/main/java/org/sunbird/actor/BackgroundJobManager.java index e9e81b2d44..4c275f1946 100644 --- a/service/src/main/java/org/sunbird/actor/BackgroundJobManager.java +++ b/service/src/main/java/org/sunbird/actor/BackgroundJobManager.java @@ -7,12 +7,12 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Future; import java.util.ArrayList; diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadActor.java index 7c9904f6fe..55a1bc6425 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadActor.java @@ -13,7 +13,7 @@ import org.sunbird.dao.bulkupload.impl.BulkUploadProcessDaoImpl; import org.sunbird.dao.bulkupload.impl.BulkUploadProcessTaskDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; import org.sunbird.model.bulkupload.BulkUploadProcessTask; @@ -22,7 +22,7 @@ import org.sunbird.response.Response; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadBackgroundJobActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadBackgroundJobActor.java index 477f3c77b6..b2dd5cb429 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadBackgroundJobActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/BaseBulkUploadBackgroundJobActor.java @@ -18,7 +18,7 @@ import org.sunbird.dao.bulkupload.impl.BulkUploadProcessDaoImpl; import org.sunbird.dao.bulkupload.impl.BulkUploadProcessTaskDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.BulkUploadJsonKey; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; @@ -26,7 +26,7 @@ import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Await; import scala.concurrent.Future; import scala.concurrent.duration.Duration; diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/BulkUploadManagementActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/BulkUploadManagementActor.java index 9329a6f30c..6600ad0250 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/BulkUploadManagementActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/BulkUploadManagementActor.java @@ -18,12 +18,12 @@ import org.sunbird.datasecurity.DecryptionService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.BulkUploadJsonKey; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcessTask; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -31,8 +31,8 @@ import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.UserUtility; import org.sunbird.util.Util; import scala.concurrent.Future; diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadActor.java index 62d3fe5a68..e6615cbdf8 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadActor.java @@ -8,7 +8,7 @@ import javax.inject.Named; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.telemetry.dto.TelemetryEnvKey; diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadBackGroundJobActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadBackGroundJobActor.java index 61384a0dc7..246c714296 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadBackGroundJobActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/LocationBulkUploadBackGroundJobActor.java @@ -13,19 +13,19 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; import org.sunbird.model.bulkupload.BulkUploadProcessTask; import org.sunbird.model.location.Location; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.location.LocationService; import org.sunbird.service.location.LocationServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; public class LocationBulkUploadBackGroundJobActor extends BaseBulkUploadBackgroundJobActor { diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadActor.java index 29d3ec39e4..d216c4d5d5 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadActor.java @@ -13,10 +13,10 @@ import org.sunbird.dao.bulkupload.BulkUploadProcessDao; import org.sunbird.dao.bulkupload.impl.BulkUploadProcessDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.organisation.OrgService; @@ -24,7 +24,7 @@ import org.sunbird.service.systemsettings.SystemSettingsService; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; public class OrgBulkUploadActor extends BaseBulkUploadActor { diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadBackgroundJobActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadBackgroundJobActor.java index d7a4147613..34816c5b23 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadBackgroundJobActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/OrgBulkUploadBackgroundJobActor.java @@ -16,13 +16,13 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.organisation.validator.OrgTypeValidator; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; import org.sunbird.model.bulkupload.BulkUploadProcessTask; import org.sunbird.model.location.Location; import org.sunbird.model.organisation.Organisation; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -30,7 +30,7 @@ import org.sunbird.service.location.LocationServiceImpl; import org.sunbird.service.systemsettings.SystemSettingsService; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; public class OrgBulkUploadBackgroundJobActor extends BaseBulkUploadBackgroundJobActor { diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadActor.java index 56803b90d9..dcace2becf 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadActor.java @@ -12,7 +12,7 @@ import javax.inject.Named; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.systemsettings.SystemSettingsService; diff --git a/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActor.java b/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActor.java index 31387eccf3..cb9db11f7f 100644 --- a/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActor.java +++ b/service/src/main/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActor.java @@ -13,12 +13,12 @@ import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.user.validator.UserRequestValidator; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; import org.sunbird.model.bulkupload.BulkUploadProcessTask; import org.sunbird.model.organisation.Organisation; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -27,7 +27,7 @@ import org.sunbird.service.role.RoleService; import org.sunbird.service.systemsettings.SystemSettingsService; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.UserUtility; import org.sunbird.util.Util; diff --git a/service/src/main/java/org/sunbird/actor/fileuploadservice/FileUploadServiceActor.java b/service/src/main/java/org/sunbird/actor/fileuploadservice/FileUploadServiceActor.java index 6e0662d98d..cdb848e048 100644 --- a/service/src/main/java/org/sunbird/actor/fileuploadservice/FileUploadServiceActor.java +++ b/service/src/main/java/org/sunbird/actor/fileuploadservice/FileUploadServiceActor.java @@ -7,14 +7,14 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.CloudStorageUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.utils.CloudStorageUtil; +import org.sunbird.common.ProjectUtil; public class FileUploadServiceActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/health/HealthActor.java b/service/src/main/java/org/sunbird/actor/health/HealthActor.java index aaeb39688a..3035b96ba8 100644 --- a/service/src/main/java/org/sunbird/actor/health/HealthActor.java +++ b/service/src/main/java/org/sunbird/actor/health/HealthActor.java @@ -12,11 +12,11 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; import scala.concurrent.Future; diff --git a/service/src/main/java/org/sunbird/actor/location/BaseLocationActor.java b/service/src/main/java/org/sunbird/actor/location/BaseLocationActor.java index 2912bdf5da..134ae8ca66 100644 --- a/service/src/main/java/org/sunbird/actor/location/BaseLocationActor.java +++ b/service/src/main/java/org/sunbird/actor/location/BaseLocationActor.java @@ -13,7 +13,7 @@ import org.sunbird.request.Request; import org.sunbird.telemetry.util.TelemetryUtil; import org.sunbird.telemetry.util.TelemetryWriter; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; /** @author Amit Kumar */ public abstract class BaseLocationActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/location/LocationActor.java b/service/src/main/java/org/sunbird/actor/location/LocationActor.java index a0d6d70c7a..f1656c82ed 100644 --- a/service/src/main/java/org/sunbird/actor/location/LocationActor.java +++ b/service/src/main/java/org/sunbird/actor/location/LocationActor.java @@ -12,14 +12,14 @@ import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; import org.sunbird.model.location.UpsertLocationRequest; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.location.LocationService; import org.sunbird.service.location.LocationServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; public class LocationActor extends BaseLocationActor { diff --git a/service/src/main/java/org/sunbird/actor/location/LocationBackgroundActor.java b/service/src/main/java/org/sunbird/actor/location/LocationBackgroundActor.java index ae3ff3d638..d5f9ce03c1 100644 --- a/service/src/main/java/org/sunbird/actor/location/LocationBackgroundActor.java +++ b/service/src/main/java/org/sunbird/actor/location/LocationBackgroundActor.java @@ -5,7 +5,7 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class LocationBackgroundActor extends BaseLocationActor { diff --git a/service/src/main/java/org/sunbird/actor/location/validator/BaseLocationRequestValidator.java b/service/src/main/java/org/sunbird/actor/location/validator/BaseLocationRequestValidator.java index e1b1dccff9..04358e1905 100644 --- a/service/src/main/java/org/sunbird/actor/location/validator/BaseLocationRequestValidator.java +++ b/service/src/main/java/org/sunbird/actor/location/validator/BaseLocationRequestValidator.java @@ -5,10 +5,10 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.validators.BaseRequestValidator; /** Created by arvind on 25/4/18. */ public class BaseLocationRequestValidator extends BaseRequestValidator { diff --git a/service/src/main/java/org/sunbird/actor/location/validator/LocationRequestValidator.java b/service/src/main/java/org/sunbird/actor/location/validator/LocationRequestValidator.java index 4b18154436..d004e4cbef 100644 --- a/service/src/main/java/org/sunbird/actor/location/validator/LocationRequestValidator.java +++ b/service/src/main/java/org/sunbird/actor/location/validator/LocationRequestValidator.java @@ -11,7 +11,7 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.GeoLocationJsonKey; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; @@ -19,7 +19,7 @@ import org.sunbird.request.RequestContext; import org.sunbird.service.location.LocationService; import org.sunbird.service.location.LocationServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Future; /** @author Amit Kumar */ diff --git a/service/src/main/java/org/sunbird/actor/notes/NotesManagementActor.java b/service/src/main/java/org/sunbird/actor/notes/NotesManagementActor.java index cde97bd86e..21eefa499c 100644 --- a/service/src/main/java/org/sunbird/actor/notes/NotesManagementActor.java +++ b/service/src/main/java/org/sunbird/actor/notes/NotesManagementActor.java @@ -10,7 +10,7 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; diff --git a/service/src/main/java/org/sunbird/actor/notification/BackGroundNotificationActor.java b/service/src/main/java/org/sunbird/actor/notification/BackGroundNotificationActor.java index d0c14f7b98..45fa02c81e 100644 --- a/service/src/main/java/org/sunbird/actor/notification/BackGroundNotificationActor.java +++ b/service/src/main/java/org/sunbird/actor/notification/BackGroundNotificationActor.java @@ -7,7 +7,7 @@ import org.sunbird.actor.core.BaseActor; import org.sunbird.http.HttpClientUtil; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class BackGroundNotificationActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/notification/EmailServiceActor.java b/service/src/main/java/org/sunbird/actor/notification/EmailServiceActor.java index 3100b4ff87..4b0360382b 100644 --- a/service/src/main/java/org/sunbird/actor/notification/EmailServiceActor.java +++ b/service/src/main/java/org/sunbird/actor/notification/EmailServiceActor.java @@ -8,12 +8,12 @@ import org.sunbird.keys.JsonKey; import org.sunbird.mail.SendEmail; import org.sunbird.mail.SendgridConnection; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.notification.NotificationService; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.io.StringWriter; import java.util.ArrayList; diff --git a/service/src/main/java/org/sunbird/actor/notification/SendNotificationActor.java b/service/src/main/java/org/sunbird/actor/notification/SendNotificationActor.java index a3056b738a..787a480328 100644 --- a/service/src/main/java/org/sunbird/actor/notification/SendNotificationActor.java +++ b/service/src/main/java/org/sunbird/actor/notification/SendNotificationActor.java @@ -4,7 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/main/java/org/sunbird/actor/organisation/OrganisationBackgroundActor.java b/service/src/main/java/org/sunbird/actor/organisation/OrganisationBackgroundActor.java index 34ddad500e..fe7709aad3 100644 --- a/service/src/main/java/org/sunbird/actor/organisation/OrganisationBackgroundActor.java +++ b/service/src/main/java/org/sunbird/actor/organisation/OrganisationBackgroundActor.java @@ -9,11 +9,11 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import javax.ws.rs.core.MediaType; import java.util.ArrayList; diff --git a/service/src/main/java/org/sunbird/actor/organisation/OrganisationManagementActor.java b/service/src/main/java/org/sunbird/actor/organisation/OrganisationManagementActor.java index 0a00a33ced..c607bb8209 100644 --- a/service/src/main/java/org/sunbird/actor/organisation/OrganisationManagementActor.java +++ b/service/src/main/java/org/sunbird/actor/organisation/OrganisationManagementActor.java @@ -19,10 +19,10 @@ import org.sunbird.actor.organisation.validator.OrgTypeValidator; import org.sunbird.actor.organisation.validator.OrganisationRequestValidator; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.organisation.Organisation; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -30,11 +30,11 @@ import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.telemetry.util.TelemetryUtil; -import org.sunbird.util.CloudStorageUtil; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.Slug; +import org.sunbird.utils.CloudStorageUtil; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.Slug; import org.sunbird.util.Util; -import org.sunbird.validator.EmailValidator; +import org.sunbird.validators.EmailValidator; public class OrganisationManagementActor extends BaseActor { private final OrgService orgService = OrgServiceImpl.getInstance(); diff --git a/service/src/main/java/org/sunbird/actor/organisation/validator/OrgTypeValidator.java b/service/src/main/java/org/sunbird/actor/organisation/validator/OrgTypeValidator.java index 480f625aab..242ac6f987 100644 --- a/service/src/main/java/org/sunbird/actor/organisation/validator/OrgTypeValidator.java +++ b/service/src/main/java/org/sunbird/actor/organisation/validator/OrgTypeValidator.java @@ -5,7 +5,7 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.organisation.OrganisationType; diff --git a/service/src/main/java/org/sunbird/actor/organisation/validator/OrganisationRequestValidator.java b/service/src/main/java/org/sunbird/actor/organisation/validator/OrganisationRequestValidator.java index ed0de94f86..20aed1d36f 100644 --- a/service/src/main/java/org/sunbird/actor/organisation/validator/OrganisationRequestValidator.java +++ b/service/src/main/java/org/sunbird/actor/organisation/validator/OrganisationRequestValidator.java @@ -10,7 +10,7 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.location.validator.LocationRequestValidator; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.location.Location; @@ -20,8 +20,8 @@ import org.sunbird.service.organisation.OrgService; import org.sunbird.service.organisation.impl.OrgExternalServiceImpl; import org.sunbird.service.organisation.impl.OrgServiceImpl; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.Slug; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.Slug; public class OrganisationRequestValidator { diff --git a/service/src/main/java/org/sunbird/actor/otp/OTPActor.java b/service/src/main/java/org/sunbird/actor/otp/OTPActor.java index e59f9bb8b8..c587802d2d 100644 --- a/service/src/main/java/org/sunbird/actor/otp/OTPActor.java +++ b/service/src/main/java/org/sunbird/actor/otp/OTPActor.java @@ -9,9 +9,9 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.ClientErrorResponse; @@ -20,7 +20,7 @@ import org.sunbird.service.ratelimit.RateLimitService; import org.sunbird.service.ratelimit.RateLimitServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; import org.sunbird.util.otp.OTPUtil; import org.sunbird.util.ratelimit.OtpRateLimiter; @@ -173,7 +173,10 @@ private void handleMismatchOtp( + OTPUtil.maskId(key, type) + ",remaining attempt is " + remainingCount); - int attemptedCount = (int) otpDetails.get(JsonKey.ATTEMPTED_COUNT); + int attemptedCount = 0; + if (otpDetails.get(JsonKey.ATTEMPTED_COUNT) instanceof Number) { + attemptedCount = ((Number) otpDetails.get(JsonKey.ATTEMPTED_COUNT)).intValue(); + } if (remainingCount <= 0) { otpService.deleteOtp(type, key, context); } else { @@ -202,7 +205,10 @@ private void handleMismatchOtp( private int getRemainingAttemptedCount(Map otpDetails) { int allowedAttempt = Integer.parseInt(ProjectUtil.getConfigValue(SUNBIRD_OTP_ALLOWED_ATTEMPT)); - int attemptedCount = (int) otpDetails.get(JsonKey.ATTEMPTED_COUNT); + int attemptedCount = 0; + if (otpDetails.get(JsonKey.ATTEMPTED_COUNT) instanceof Number) { + attemptedCount = ((Number) otpDetails.get(JsonKey.ATTEMPTED_COUNT)).intValue(); + } return (allowedAttempt - (attemptedCount + 1)); } diff --git a/service/src/main/java/org/sunbird/actor/otp/SendOTPActor.java b/service/src/main/java/org/sunbird/actor/otp/SendOTPActor.java index 3ae7827624..093411db78 100644 --- a/service/src/main/java/org/sunbird/actor/otp/SendOTPActor.java +++ b/service/src/main/java/org/sunbird/actor/otp/SendOTPActor.java @@ -8,7 +8,7 @@ import org.sunbird.actor.core.BaseActor; import org.sunbird.datasecurity.impl.LogMaskServiceImpl; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/main/java/org/sunbird/actor/role/UserRoleActor.java b/service/src/main/java/org/sunbird/actor/role/UserRoleActor.java index 214d7567fc..ef3bd751b3 100644 --- a/service/src/main/java/org/sunbird/actor/role/UserRoleActor.java +++ b/service/src/main/java/org/sunbird/actor/role/UserRoleActor.java @@ -13,9 +13,9 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.user.UserBaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -24,7 +24,7 @@ import org.sunbird.service.user.impl.UserRoleServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.Util; public class UserRoleActor extends UserBaseActor { diff --git a/service/src/main/java/org/sunbird/actor/role/UserRoleBackgroundActor.java b/service/src/main/java/org/sunbird/actor/role/UserRoleBackgroundActor.java index 73ec22b6e2..31ea7ba17e 100644 --- a/service/src/main/java/org/sunbird/actor/role/UserRoleBackgroundActor.java +++ b/service/src/main/java/org/sunbird/actor/role/UserRoleBackgroundActor.java @@ -5,7 +5,7 @@ import java.util.Map; import org.sunbird.actor.core.BaseActor; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.service.user.UserRoleService; import org.sunbird.service.user.impl.UserRoleServiceImpl; diff --git a/service/src/main/java/org/sunbird/actor/search/SearchHandlerActor.java b/service/src/main/java/org/sunbird/actor/search/SearchHandlerActor.java index cbeb3a9bd3..ef05efbe10 100644 --- a/service/src/main/java/org/sunbird/actor/search/SearchHandlerActor.java +++ b/service/src/main/java/org/sunbird/actor/search/SearchHandlerActor.java @@ -16,10 +16,10 @@ import org.sunbird.common.ElasticSearchHelper; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -29,8 +29,8 @@ import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.telemetry.util.TelemetryWriter; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.UserUtility; import org.sunbird.util.Util; import org.sunbird.util.search.FuzzySearchManager; diff --git a/service/src/main/java/org/sunbird/actor/sync/EsSyncActor.java b/service/src/main/java/org/sunbird/actor/sync/EsSyncActor.java index bd1b05b80a..fb50ea00d8 100644 --- a/service/src/main/java/org/sunbird/actor/sync/EsSyncActor.java +++ b/service/src/main/java/org/sunbird/actor/sync/EsSyncActor.java @@ -10,9 +10,9 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import scala.concurrent.Await; diff --git a/service/src/main/java/org/sunbird/actor/sync/EsSyncBackgroundActor.java b/service/src/main/java/org/sunbird/actor/sync/EsSyncBackgroundActor.java index 7ba06171e7..d400072714 100644 --- a/service/src/main/java/org/sunbird/actor/sync/EsSyncBackgroundActor.java +++ b/service/src/main/java/org/sunbird/actor/sync/EsSyncBackgroundActor.java @@ -8,7 +8,7 @@ import org.sunbird.actor.core.BaseActor; import org.sunbird.actor.organisation.validator.OrgTypeValidator; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -18,7 +18,7 @@ import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class EsSyncBackgroundActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActor.java b/service/src/main/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActor.java index ceae6698b7..f07f1a444d 100644 --- a/service/src/main/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActor.java +++ b/service/src/main/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActor.java @@ -3,7 +3,7 @@ import java.util.Map; import org.sunbird.actor.core.BaseActor; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/main/java/org/sunbird/actor/user/IdentifierFreeUpActor.java b/service/src/main/java/org/sunbird/actor/user/IdentifierFreeUpActor.java index 542ee34313..1424fbb80d 100644 --- a/service/src/main/java/org/sunbird/actor/user/IdentifierFreeUpActor.java +++ b/service/src/main/java/org/sunbird/actor/user/IdentifierFreeUpActor.java @@ -15,8 +15,8 @@ import org.sunbird.response.Response; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ProjectUtil; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.user.UserUtil; /** diff --git a/service/src/main/java/org/sunbird/actor/user/ManagedUserActor.java b/service/src/main/java/org/sunbird/actor/user/ManagedUserActor.java index 4d07395c43..1f36ad8b7a 100644 --- a/service/src/main/java/org/sunbird/actor/user/ManagedUserActor.java +++ b/service/src/main/java/org/sunbird/actor/user/ManagedUserActor.java @@ -21,6 +21,7 @@ import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.util.*; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.user.UserUtil; import java.util.ArrayList; diff --git a/service/src/main/java/org/sunbird/actor/user/ResetPasswordActor.java b/service/src/main/java/org/sunbird/actor/user/ResetPasswordActor.java index 517117bc6b..48daad5b66 100644 --- a/service/src/main/java/org/sunbird/actor/user/ResetPasswordActor.java +++ b/service/src/main/java/org/sunbird/actor/user/ResetPasswordActor.java @@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; import org.sunbird.request.Request; @@ -15,7 +15,7 @@ import org.sunbird.service.user.ResetPasswordService; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.KeycloakBruteForceAttackUtil; +import org.sunbird.keycloak.KeycloakBruteForceAttackUtil; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.telemetry.util.TelemetryUtil; import org.sunbird.util.UserUtility; diff --git a/service/src/main/java/org/sunbird/actor/user/SSOUserCreateActor.java b/service/src/main/java/org/sunbird/actor/user/SSOUserCreateActor.java index a3ff5f5112..cc185abba9 100644 --- a/service/src/main/java/org/sunbird/actor/user/SSOUserCreateActor.java +++ b/service/src/main/java/org/sunbird/actor/user/SSOUserCreateActor.java @@ -13,7 +13,7 @@ import org.sunbird.actor.user.validator.UserRequestValidator; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -26,7 +26,7 @@ import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.UserFlagUtil; import org.sunbird.util.Util; import org.sunbird.util.user.UserUtil; diff --git a/service/src/main/java/org/sunbird/actor/user/SSUUserCreateActor.java b/service/src/main/java/org/sunbird/actor/user/SSUUserCreateActor.java index 6700930fe1..4d4c4a8e02 100644 --- a/service/src/main/java/org/sunbird/actor/user/SSUUserCreateActor.java +++ b/service/src/main/java/org/sunbird/actor/user/SSUUserCreateActor.java @@ -5,9 +5,9 @@ import org.apache.pekko.pattern.Patterns; import java.util.HashMap; import java.util.Map; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -20,7 +20,7 @@ import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.UserFlagUtil; import org.sunbird.util.UserUtility; import org.sunbird.util.Util; diff --git a/service/src/main/java/org/sunbird/actor/user/TenantMigrationActor.java b/service/src/main/java/org/sunbird/actor/user/TenantMigrationActor.java index 25f0bfe6bd..e6ea020b2c 100644 --- a/service/src/main/java/org/sunbird/actor/user/TenantMigrationActor.java +++ b/service/src/main/java/org/sunbird/actor/user/TenantMigrationActor.java @@ -15,10 +15,10 @@ import org.sunbird.datasecurity.DataMaskingService; import org.sunbird.datasecurity.DecryptionService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -33,7 +33,7 @@ import org.sunbird.service.userconsent.impl.UserConsentServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; import org.sunbird.telemetry.util.TelemetryUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.SMSTemplateProvider; import org.sunbird.util.UserFlagEnum; import org.sunbird.util.Util; diff --git a/service/src/main/java/org/sunbird/actor/user/UserBackgroundJobActor.java b/service/src/main/java/org/sunbird/actor/user/UserBackgroundJobActor.java index 0e83938f5a..f3f2cd0d25 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserBackgroundJobActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserBackgroundJobActor.java @@ -11,7 +11,7 @@ import org.sunbird.model.user.User; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.user.UserUtil; import scala.concurrent.Future; diff --git a/service/src/main/java/org/sunbird/actor/user/UserBaseActor.java b/service/src/main/java/org/sunbird/actor/user/UserBaseActor.java index 6ffb37bf47..23b2580f65 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserBaseActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserBaseActor.java @@ -16,7 +16,7 @@ import org.sunbird.actor.core.BaseActor; import org.sunbird.actor.user.validator.UserCreateRequestValidator; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.kafka.KafkaClient; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; @@ -30,7 +30,7 @@ import org.sunbird.telemetry.util.TelemetryUtil; import org.sunbird.util.DataCacheHandler; import org.sunbird.util.FormApiUtil; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; public abstract class UserBaseActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/user/UserDeletionBackgroundJobActor.java b/service/src/main/java/org/sunbird/actor/user/UserDeletionBackgroundJobActor.java index 664e061e1f..21bf7d515a 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserDeletionBackgroundJobActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserDeletionBackgroundJobActor.java @@ -14,7 +14,7 @@ import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.user.UserUtil; public class UserDeletionBackgroundJobActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/user/UserExternalIdManagementActor.java b/service/src/main/java/org/sunbird/actor/user/UserExternalIdManagementActor.java index bf8eb71947..ba6ad07a45 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserExternalIdManagementActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserExternalIdManagementActor.java @@ -13,15 +13,15 @@ import org.sunbird.actor.core.BaseActor; import org.sunbird.cassandra.CassandraOperation; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UserExternalIdManagementActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/user/UserLookupActor.java b/service/src/main/java/org/sunbird/actor/user/UserLookupActor.java index e92e85f379..f64ef35ad6 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserLookupActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserLookupActor.java @@ -16,6 +16,7 @@ public void onReceive(Request request) throws Throwable { searchUser(request); } + @SuppressWarnings("unchecked") private void searchUser(Request request) { UserService userService = UserServiceImpl.getInstance(); Map reqMap = request.getRequest(); diff --git a/service/src/main/java/org/sunbird/actor/user/UserMergeActor.java b/service/src/main/java/org/sunbird/actor/user/UserMergeActor.java index d89349c9c1..be14baa2da 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserMergeActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserMergeActor.java @@ -20,13 +20,13 @@ import org.sunbird.dao.user.impl.UserDaoImpl; import org.sunbird.datasecurity.OneWayHashing; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.kafka.KafkaClient; import org.sunbird.keys.JsonKey; import org.sunbird.model.systemsettings.SystemSetting; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -34,16 +34,16 @@ import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserMergeServiceImpl; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; import org.sunbird.telemetry.dto.Actor; import org.sunbird.telemetry.dto.Context; import org.sunbird.telemetry.dto.Target; import org.sunbird.telemetry.dto.Telemetry; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ConfigUtil; +import org.sunbird.utils.ConfigUtil; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; import org.sunbird.util.user.KafkaConfigConstants; import org.sunbird.util.user.UserUtil; diff --git a/service/src/main/java/org/sunbird/actor/user/UserOnboardingNotificationActor.java b/service/src/main/java/org/sunbird/actor/user/UserOnboardingNotificationActor.java index 6304bed738..5214b66de7 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserOnboardingNotificationActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserOnboardingNotificationActor.java @@ -12,15 +12,15 @@ import org.sunbird.keys.JsonKey; import org.sunbird.notification.sms.provider.ISmsProvider; import org.sunbird.notification.utils.SMSFactory; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.service.user.ResetPasswordService; -import org.sunbird.sso.KeycloakRequiredActionLinkUtil; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ProjectUtil; +import org.sunbird.keycloak.KeycloakRequiredActionLinkUtil; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.SMSTemplateProvider; import org.sunbird.util.UserUtility; diff --git a/service/src/main/java/org/sunbird/actor/user/UserOwnershipTransferActor.java b/service/src/main/java/org/sunbird/actor/user/UserOwnershipTransferActor.java index 8de8923fc1..7f049d3962 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserOwnershipTransferActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserOwnershipTransferActor.java @@ -4,7 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.kafka.InstructionEventGenerator; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; @@ -19,14 +19,14 @@ import org.sunbird.service.user.impl.UserRoleServiceImpl; import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.user.UserUtil; import java.util.*; import java.util.concurrent.CompletableFuture; -import static org.sunbird.validator.orgvalidator.BaseOrgRequestValidator.ERROR_CODE; +import static org.sunbird.validators.orgvalidator.BaseOrgRequestValidator.ERROR_CODE; public class UserOwnershipTransferActor extends BaseActor { diff --git a/service/src/main/java/org/sunbird/actor/user/UserProfileReadActor.java b/service/src/main/java/org/sunbird/actor/user/UserProfileReadActor.java index e07a5b9a7c..28b5b64e44 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserProfileReadActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserProfileReadActor.java @@ -10,9 +10,9 @@ import org.sunbird.datasecurity.EncryptionService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.service.user.UserProfileReadService; diff --git a/service/src/main/java/org/sunbird/actor/user/UserProfileUpdateActor.java b/service/src/main/java/org/sunbird/actor/user/UserProfileUpdateActor.java index 7e68149bd0..6cbbac103f 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserProfileUpdateActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserProfileUpdateActor.java @@ -18,7 +18,7 @@ import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.UserDeclareEntity; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/main/java/org/sunbird/actor/user/UserSelfDeclarationManagementActor.java b/service/src/main/java/org/sunbird/actor/user/UserSelfDeclarationManagementActor.java index 14e7c6415a..b00b73a352 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserSelfDeclarationManagementActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserSelfDeclarationManagementActor.java @@ -12,7 +12,7 @@ import org.sunbird.dao.user.UserOrgDao; import org.sunbird.dao.user.impl.UserOrgDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.UserDeclareEntity; import org.sunbird.request.Request; diff --git a/service/src/main/java/org/sunbird/actor/user/UserStatusActor.java b/service/src/main/java/org/sunbird/actor/user/UserStatusActor.java index 1968340501..ddc66e3618 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserStatusActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserStatusActor.java @@ -7,7 +7,7 @@ import javax.inject.Named; import org.apache.commons.collections4.CollectionUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; import org.sunbird.response.Response; @@ -17,7 +17,7 @@ import org.sunbird.service.user.impl.UserRoleServiceImpl; import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.telemetry.dto.TelemetryEnvKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; public class UserStatusActor extends UserBaseActor { diff --git a/service/src/main/java/org/sunbird/actor/user/UserTnCActor.java b/service/src/main/java/org/sunbird/actor/user/UserTnCActor.java index 522731ad89..dd9009d137 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserTnCActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserTnCActor.java @@ -9,14 +9,14 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.UserTncService; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; import org.sunbird.util.user.UserTncUtil; diff --git a/service/src/main/java/org/sunbird/actor/user/UserUpdateActor.java b/service/src/main/java/org/sunbird/actor/user/UserUpdateActor.java index 96da0e79d8..c255cf003a 100644 --- a/service/src/main/java/org/sunbird/actor/user/UserUpdateActor.java +++ b/service/src/main/java/org/sunbird/actor/user/UserUpdateActor.java @@ -14,6 +14,8 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.Matcher; import org.sunbird.actor.user.validator.UserCreateRequestValidator; import org.sunbird.actor.user.validator.UserRequestValidator; import org.sunbird.dao.user.UserOrgDao; @@ -21,13 +23,13 @@ import org.sunbird.dao.user.impl.UserOrgDaoImpl; import org.sunbird.dao.user.impl.UserSelfDeclarationDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; import org.sunbird.model.user.User; import org.sunbird.model.user.UserDeclareEntity; import org.sunbird.model.user.UserOrg; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/main/java/org/sunbird/actor/user/validator/UserCreateRequestValidator.java b/service/src/main/java/org/sunbird/actor/user/validator/UserCreateRequestValidator.java index 6bf3ae9c32..d69ccd2f5e 100644 --- a/service/src/main/java/org/sunbird/actor/user/validator/UserCreateRequestValidator.java +++ b/service/src/main/java/org/sunbird/actor/user/validator/UserCreateRequestValidator.java @@ -6,11 +6,11 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; -import org.sunbird.util.Matcher; -import org.sunbird.util.ProjectUtil; +import org.sunbird.utils.Matcher; +import org.sunbird.common.ProjectUtil; public class UserCreateRequestValidator { diff --git a/service/src/main/java/org/sunbird/actor/user/validator/UserRequestValidator.java b/service/src/main/java/org/sunbird/actor/user/validator/UserRequestValidator.java index 02c7f8de32..8de3827d7e 100644 --- a/service/src/main/java/org/sunbird/actor/user/validator/UserRequestValidator.java +++ b/service/src/main/java/org/sunbird/actor/user/validator/UserRequestValidator.java @@ -11,18 +11,18 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.util.DataCacheHandler; import org.sunbird.util.FormApiUtil; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; -import org.sunbird.validator.BaseRequestValidator; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.StringFormatter; +import org.sunbird.validators.BaseRequestValidator; public class UserRequestValidator extends BaseRequestValidator { diff --git a/service/src/main/java/org/sunbird/actor/userconsent/UserConsentActor.java b/service/src/main/java/org/sunbird/actor/userconsent/UserConsentActor.java index 4b5120685e..217c0cd88b 100644 --- a/service/src/main/java/org/sunbird/actor/userconsent/UserConsentActor.java +++ b/service/src/main/java/org/sunbird/actor/userconsent/UserConsentActor.java @@ -9,7 +9,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.sunbird.actor.core.BaseActor; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; diff --git a/service/src/main/java/org/sunbird/client/NotificationServiceClient.java b/service/src/main/java/org/sunbird/client/NotificationServiceClient.java index 6eb73b8627..4e164d6229 100644 --- a/service/src/main/java/org/sunbird/client/NotificationServiceClient.java +++ b/service/src/main/java/org/sunbird/client/NotificationServiceClient.java @@ -4,15 +4,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHeaders; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import javax.ws.rs.core.MediaType; import java.nio.charset.StandardCharsets; diff --git a/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessDaoImpl.java b/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessDaoImpl.java index 89fee01de2..308f2738a5 100644 --- a/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessDaoImpl.java @@ -15,7 +15,7 @@ import org.sunbird.model.bulkupload.BulkUploadProcess; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; /** Created by arvind on 24/4/18. */ public class BulkUploadProcessDaoImpl implements BulkUploadProcessDao { diff --git a/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessTaskDaoImpl.java b/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessTaskDaoImpl.java index f5065c2bc5..2b73990fe8 100644 --- a/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessTaskDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/bulkupload/impl/BulkUploadProcessTaskDaoImpl.java @@ -16,7 +16,7 @@ import org.sunbird.model.bulkupload.BulkUploadProcessTask; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; /** * Data access implementation for BulkUploadProcessTask entity. diff --git a/service/src/main/java/org/sunbird/dao/location/impl/LocationDaoImpl.java b/service/src/main/java/org/sunbird/dao/location/impl/LocationDaoImpl.java index 9bc23b077e..5a2a1eca27 100644 --- a/service/src/main/java/org/sunbird/dao/location/impl/LocationDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/location/impl/LocationDaoImpl.java @@ -17,7 +17,7 @@ import org.sunbird.model.location.Location; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Future; /** @author Amit Kumar */ diff --git a/service/src/main/java/org/sunbird/dao/notes/impl/NotesDaoImpl.java b/service/src/main/java/org/sunbird/dao/notes/impl/NotesDaoImpl.java index 9766cab19c..80d4e3ec84 100644 --- a/service/src/main/java/org/sunbird/dao/notes/impl/NotesDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/notes/impl/NotesDaoImpl.java @@ -13,7 +13,7 @@ import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Future; public class NotesDaoImpl implements NotesDao { diff --git a/service/src/main/java/org/sunbird/dao/notification/impl/EmailTemplateDaoImpl.java b/service/src/main/java/org/sunbird/dao/notification/impl/EmailTemplateDaoImpl.java index b87ffc152e..f3fd211aaf 100644 --- a/service/src/main/java/org/sunbird/dao/notification/impl/EmailTemplateDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/notification/impl/EmailTemplateDaoImpl.java @@ -8,7 +8,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.util.ArrayList; import java.util.Collections; diff --git a/service/src/main/java/org/sunbird/dao/organisation/impl/OrgDaoImpl.java b/service/src/main/java/org/sunbird/dao/organisation/impl/OrgDaoImpl.java index 8393b11ed9..60e52e8d85 100644 --- a/service/src/main/java/org/sunbird/dao/organisation/impl/OrgDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/organisation/impl/OrgDaoImpl.java @@ -15,13 +15,13 @@ import org.sunbird.dao.organisation.OrgDao; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; import scala.concurrent.Future; diff --git a/service/src/main/java/org/sunbird/dao/organisation/impl/OrgExternalDaoImpl.java b/service/src/main/java/org/sunbird/dao/organisation/impl/OrgExternalDaoImpl.java index 8346bae787..0a9101d3b4 100644 --- a/service/src/main/java/org/sunbird/dao/organisation/impl/OrgExternalDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/organisation/impl/OrgExternalDaoImpl.java @@ -11,7 +11,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class OrgExternalDaoImpl implements OrgExternalDao { diff --git a/service/src/main/java/org/sunbird/dao/otp/impl/OTPDaoImpl.java b/service/src/main/java/org/sunbird/dao/otp/impl/OTPDaoImpl.java index 1896eb8cfa..a93c95d313 100644 --- a/service/src/main/java/org/sunbird/dao/otp/impl/OTPDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/otp/impl/OTPDaoImpl.java @@ -10,8 +10,8 @@ import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; public class OTPDaoImpl implements OTPDao { private final LoggerUtil logger = new LoggerUtil(OTPDaoImpl.class); diff --git a/service/src/main/java/org/sunbird/dao/ratelimit/RateLimitDaoImpl.java b/service/src/main/java/org/sunbird/dao/ratelimit/RateLimitDaoImpl.java index 1a16b21912..9b15711509 100644 --- a/service/src/main/java/org/sunbird/dao/ratelimit/RateLimitDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/ratelimit/RateLimitDaoImpl.java @@ -11,7 +11,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.ratelimit.RateLimit; public class RateLimitDaoImpl implements RateLimitDao { diff --git a/service/src/main/java/org/sunbird/dao/role/impl/RoleDaoImpl.java b/service/src/main/java/org/sunbird/dao/role/impl/RoleDaoImpl.java index aedde00a1a..8c4ac9cf90 100644 --- a/service/src/main/java/org/sunbird/dao/role/impl/RoleDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/role/impl/RoleDaoImpl.java @@ -11,7 +11,7 @@ import org.sunbird.model.role.Role; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class RoleDaoImpl implements RoleDao { diff --git a/service/src/main/java/org/sunbird/dao/role/impl/RoleGroupDaoImpl.java b/service/src/main/java/org/sunbird/dao/role/impl/RoleGroupDaoImpl.java index 0828d5af4b..9fe66e758f 100644 --- a/service/src/main/java/org/sunbird/dao/role/impl/RoleGroupDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/role/impl/RoleGroupDaoImpl.java @@ -11,7 +11,7 @@ import org.sunbird.model.role.RoleGroup; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class RoleGroupDaoImpl implements RoleGroupDao { diff --git a/service/src/main/java/org/sunbird/dao/systemsettings/impl/SystemSettingDaoImpl.java b/service/src/main/java/org/sunbird/dao/systemsettings/impl/SystemSettingDaoImpl.java index 4c00f1579b..c3bc205123 100644 --- a/service/src/main/java/org/sunbird/dao/systemsettings/impl/SystemSettingDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/systemsettings/impl/SystemSettingDaoImpl.java @@ -12,7 +12,7 @@ import org.sunbird.model.systemsettings.SystemSetting; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class SystemSettingDaoImpl implements SystemSettingDao { diff --git a/service/src/main/java/org/sunbird/dao/tenantpreference/impl/TenantPreferenceDaoImpl.java b/service/src/main/java/org/sunbird/dao/tenantpreference/impl/TenantPreferenceDaoImpl.java index f70b7bb768..677666e93c 100644 --- a/service/src/main/java/org/sunbird/dao/tenantpreference/impl/TenantPreferenceDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/tenantpreference/impl/TenantPreferenceDaoImpl.java @@ -9,7 +9,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class TenantPreferenceDaoImpl implements TenantPreferenceDao { diff --git a/service/src/main/java/org/sunbird/dao/urlaction/impl/UrlActionDaoImpl.java b/service/src/main/java/org/sunbird/dao/urlaction/impl/UrlActionDaoImpl.java index f005588779..3bd1254893 100644 --- a/service/src/main/java/org/sunbird/dao/urlaction/impl/UrlActionDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/urlaction/impl/UrlActionDaoImpl.java @@ -10,7 +10,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.model.urlaction.UrlAction; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UrlActionDaoImpl implements UrlActionDao { diff --git a/service/src/main/java/org/sunbird/dao/user/impl/UserDaoImpl.java b/service/src/main/java/org/sunbird/dao/user/impl/UserDaoImpl.java index e1aad8ec86..c4480e9a31 100644 --- a/service/src/main/java/org/sunbird/dao/user/impl/UserDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/user/impl/UserDaoImpl.java @@ -13,14 +13,14 @@ import org.sunbird.dao.user.UserDao; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.User; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Future; /** diff --git a/service/src/main/java/org/sunbird/dao/user/impl/UserExternalIdentityDaoImpl.java b/service/src/main/java/org/sunbird/dao/user/impl/UserExternalIdentityDaoImpl.java index 106eb0f117..125f32f1e5 100644 --- a/service/src/main/java/org/sunbird/dao/user/impl/UserExternalIdentityDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/user/impl/UserExternalIdentityDaoImpl.java @@ -14,7 +14,7 @@ import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UserExternalIdentityDaoImpl implements UserExternalIdentityDao { diff --git a/service/src/main/java/org/sunbird/dao/user/impl/UserOrgDaoImpl.java b/service/src/main/java/org/sunbird/dao/user/impl/UserOrgDaoImpl.java index e5c106ac35..84a33c86c1 100644 --- a/service/src/main/java/org/sunbird/dao/user/impl/UserOrgDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/user/impl/UserOrgDaoImpl.java @@ -12,7 +12,7 @@ import org.sunbird.model.user.UserOrg; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public final class UserOrgDaoImpl implements UserOrgDao { diff --git a/service/src/main/java/org/sunbird/dao/user/impl/UserRoleDaoImpl.java b/service/src/main/java/org/sunbird/dao/user/impl/UserRoleDaoImpl.java index babc0982d5..71253f3a88 100644 --- a/service/src/main/java/org/sunbird/dao/user/impl/UserRoleDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/user/impl/UserRoleDaoImpl.java @@ -12,7 +12,7 @@ import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Future; public final class UserRoleDaoImpl implements UserRoleDao { diff --git a/service/src/main/java/org/sunbird/dao/user/impl/UserSelfDeclarationDaoImpl.java b/service/src/main/java/org/sunbird/dao/user/impl/UserSelfDeclarationDaoImpl.java index b929ec1ef6..4eb1ef5fea 100644 --- a/service/src/main/java/org/sunbird/dao/user/impl/UserSelfDeclarationDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/user/impl/UserSelfDeclarationDaoImpl.java @@ -14,7 +14,7 @@ import org.sunbird.model.user.UserDeclareEntity; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UserSelfDeclarationDaoImpl implements UserSelfDeclarationDao { private final CassandraOperation cassandraOperation = ServiceFactory.getInstance(); diff --git a/service/src/main/java/org/sunbird/dao/userconsent/impl/UserConsentDaoImpl.java b/service/src/main/java/org/sunbird/dao/userconsent/impl/UserConsentDaoImpl.java index ffaa3d66fb..2727a20bd4 100644 --- a/service/src/main/java/org/sunbird/dao/userconsent/impl/UserConsentDaoImpl.java +++ b/service/src/main/java/org/sunbird/dao/userconsent/impl/UserConsentDaoImpl.java @@ -8,7 +8,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UserConsentDaoImpl implements UserConsentDao { private final String TABLE_NAME = "user_consent"; diff --git a/service/src/main/java/org/sunbird/model/bulkupload/BulkUploadProcessTask.java b/service/src/main/java/org/sunbird/model/bulkupload/BulkUploadProcessTask.java index 1456cbab3a..f9e0008a47 100644 --- a/service/src/main/java/org/sunbird/model/bulkupload/BulkUploadProcessTask.java +++ b/service/src/main/java/org/sunbird/model/bulkupload/BulkUploadProcessTask.java @@ -27,7 +27,7 @@ public class BulkUploadProcessTask implements Serializable { private String successResult; private Timestamp createdOn; private Timestamp lastUpdatedOn; - private Integer iterationId = new Integer(0); + private Integer iterationId = 0; private Integer status; public String getData() { diff --git a/service/src/main/java/org/sunbird/service/feed/impl/FeedServiceImpl.java b/service/src/main/java/org/sunbird/service/feed/impl/FeedServiceImpl.java index 128435227a..fd5de48c06 100644 --- a/service/src/main/java/org/sunbird/service/feed/impl/FeedServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/feed/impl/FeedServiceImpl.java @@ -6,7 +6,7 @@ import org.sunbird.client.NotificationServiceClient; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.Feed; diff --git a/service/src/main/java/org/sunbird/service/location/LocationServiceImpl.java b/service/src/main/java/org/sunbird/service/location/LocationServiceImpl.java index 3cbcf8df5b..36c62acea4 100644 --- a/service/src/main/java/org/sunbird/service/location/LocationServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/location/LocationServiceImpl.java @@ -8,13 +8,13 @@ import org.sunbird.dao.location.LocationDao; import org.sunbird.dao.location.impl.LocationDaoFactory; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class LocationServiceImpl implements LocationService { public static LocationService locationService = null; @@ -46,6 +46,7 @@ public Response searchLocation(Map searchQueryMap, RequestContex } @Override + @SuppressWarnings("unchecked") public List> getValidatedRelatedLocationIdAndType( List codeList, RequestContext context) { List locationIdTypeList = locationSearch(JsonKey.CODE, codeList, context); @@ -65,7 +66,7 @@ public List> getValidatedRelatedLocationIdAndType( .entrySet() .forEach( m -> { - Map locationIdTypeMap = new HashMap(); + Map locationIdTypeMap = new HashMap<>(); locationIdTypeMap.put(JsonKey.ID, m.getValue().getId()); locationIdTypeMap.put(JsonKey.TYPE, m.getValue().getType()); locationIdType.add(locationIdTypeMap); @@ -102,6 +103,7 @@ public List getValidatedRelatedLocationIds( return locationIdList; } + @SuppressWarnings("unchecked") public List locationSearch(String param, Object value, RequestContext context) { Map filter = new HashMap<>(); Map searchRequestMap = new HashMap<>(); @@ -182,6 +184,7 @@ private void throwInvalidParameterValueException(List codeList) { ResponseCode.CLIENT_ERROR.getResponseCode()); } + @SuppressWarnings("unchecked") public Location getLocationById(String locationId, RequestContext context) { Response response = locationDao.read(locationId, context); List> responseList = @@ -194,6 +197,7 @@ public Location getLocationById(String locationId, RequestContext context) { } @Override + @SuppressWarnings("unchecked") public List> getLocationsByIds( List locationIds, List locationFields, RequestContext context) { Response response = locationDao.getLocationsByIds(locationIds, locationFields, context); diff --git a/service/src/main/java/org/sunbird/service/notes/NotesService.java b/service/src/main/java/org/sunbird/service/notes/NotesService.java index e926f30478..ed283b20d9 100644 --- a/service/src/main/java/org/sunbird/service/notes/NotesService.java +++ b/service/src/main/java/org/sunbird/service/notes/NotesService.java @@ -7,14 +7,14 @@ import org.sunbird.dao.notes.NotesDao; import org.sunbird.dao.notes.impl.NotesDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class NotesService { diff --git a/service/src/main/java/org/sunbird/service/notification/NotificationService.java b/service/src/main/java/org/sunbird/service/notification/NotificationService.java index 2a9b6629a5..b37fcec581 100644 --- a/service/src/main/java/org/sunbird/service/notification/NotificationService.java +++ b/service/src/main/java/org/sunbird/service/notification/NotificationService.java @@ -7,7 +7,7 @@ import org.sunbird.dao.notification.EmailTemplateDao; import org.sunbird.dao.notification.impl.EmailTemplateDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.User; @@ -18,7 +18,7 @@ import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.text.MessageFormat; import java.util.*; diff --git a/service/src/main/java/org/sunbird/service/organisation/impl/OrgServiceImpl.java b/service/src/main/java/org/sunbird/service/organisation/impl/OrgServiceImpl.java index c6d18d0f87..7db4a42798 100644 --- a/service/src/main/java/org/sunbird/service/organisation/impl/OrgServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/organisation/impl/OrgServiceImpl.java @@ -11,7 +11,7 @@ import org.sunbird.dao.organisation.impl.OrgDaoImpl; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; @@ -20,8 +20,8 @@ import org.sunbird.response.Response; import org.sunbird.service.organisation.OrgExternalService; import org.sunbird.service.organisation.OrgService; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import scala.concurrent.Future; import javax.ws.rs.core.MediaType; diff --git a/service/src/main/java/org/sunbird/service/ratelimit/RateLimitServiceImpl.java b/service/src/main/java/org/sunbird/service/ratelimit/RateLimitServiceImpl.java index 6bcf0524db..a3665e9d5b 100644 --- a/service/src/main/java/org/sunbird/service/ratelimit/RateLimitServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/ratelimit/RateLimitServiceImpl.java @@ -10,11 +10,11 @@ import org.sunbird.dao.ratelimit.RateLimitDao; import org.sunbird.dao.ratelimit.RateLimitDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.otp.OTPUtil; import org.sunbird.util.ratelimit.RateLimit; import org.sunbird.util.ratelimit.RateLimiter; diff --git a/service/src/main/java/org/sunbird/service/role/RoleService.java b/service/src/main/java/org/sunbird/service/role/RoleService.java index 1099186934..5bc1bbe647 100644 --- a/service/src/main/java/org/sunbird/service/role/RoleService.java +++ b/service/src/main/java/org/sunbird/service/role/RoleService.java @@ -10,7 +10,7 @@ import org.sunbird.dao.role.RoleDao; import org.sunbird.dao.role.impl.RoleDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.role.Role; import org.sunbird.request.RequestContext; diff --git a/service/src/main/java/org/sunbird/service/systemsettings/SystemSettingsService.java b/service/src/main/java/org/sunbird/service/systemsettings/SystemSettingsService.java index 31572969d5..b5d99fc971 100644 --- a/service/src/main/java/org/sunbird/service/systemsettings/SystemSettingsService.java +++ b/service/src/main/java/org/sunbird/service/systemsettings/SystemSettingsService.java @@ -8,7 +8,7 @@ import org.apache.commons.collections.MapUtils; import org.sunbird.dao.systemsettings.impl.SystemSettingDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.systemsettings.SystemSetting; import org.sunbird.request.RequestContext; diff --git a/service/src/main/java/org/sunbird/service/tenantpreference/TenantPreferenceService.java b/service/src/main/java/org/sunbird/service/tenantpreference/TenantPreferenceService.java index fc2347eca2..646b550cc6 100644 --- a/service/src/main/java/org/sunbird/service/tenantpreference/TenantPreferenceService.java +++ b/service/src/main/java/org/sunbird/service/tenantpreference/TenantPreferenceService.java @@ -12,14 +12,14 @@ import org.sunbird.dao.tenantpreference.TenantPreferenceDao; import org.sunbird.dao.tenantpreference.impl.TenantPreferenceDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.util.DataSecurityLevelsEnum; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class TenantPreferenceService { diff --git a/service/src/main/java/org/sunbird/service/user/ResetPasswordService.java b/service/src/main/java/org/sunbird/service/user/ResetPasswordService.java index 823f20ffd1..5ce3c95d72 100644 --- a/service/src/main/java/org/sunbird/service/user/ResetPasswordService.java +++ b/service/src/main/java/org/sunbird/service/user/ResetPasswordService.java @@ -5,10 +5,10 @@ import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; -import org.sunbird.sso.KeycloakRequiredActionLinkUtil; +import org.sunbird.keycloak.KeycloakRequiredActionLinkUtil; import org.sunbird.url.URLShortner; import org.sunbird.url.URLShortnerImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class ResetPasswordService { diff --git a/service/src/main/java/org/sunbird/service/user/ShadowUserMigrationService.java b/service/src/main/java/org/sunbird/service/user/ShadowUserMigrationService.java index 7a72f00799..0c47fe0b10 100644 --- a/service/src/main/java/org/sunbird/service/user/ShadowUserMigrationService.java +++ b/service/src/main/java/org/sunbird/service/user/ShadowUserMigrationService.java @@ -11,7 +11,7 @@ import org.sunbird.model.ShadowUser; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class ShadowUserMigrationService { private static final LoggerUtil logger = new LoggerUtil(ShadowUserMigrationService.class); diff --git a/service/src/main/java/org/sunbird/service/user/UserDeletionService.java b/service/src/main/java/org/sunbird/service/user/UserDeletionService.java index 6acd8d0b0b..fd0f63330e 100644 --- a/service/src/main/java/org/sunbird/service/user/UserDeletionService.java +++ b/service/src/main/java/org/sunbird/service/user/UserDeletionService.java @@ -10,14 +10,14 @@ import org.sunbird.dao.user.UserDao; import org.sunbird.dao.user.impl.UserDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.User; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.impl.UserExternalIdentityServiceImpl; -import org.sunbird.sso.SSOManager; +import org.sunbird.keycloak.SSOManager; import org.sunbird.telemetry.util.TelemetryUtil; import org.sunbird.util.user.UserUtil; diff --git a/service/src/main/java/org/sunbird/service/user/UserProfileReadService.java b/service/src/main/java/org/sunbird/service/user/UserProfileReadService.java index f9624103cc..daf16a73fd 100644 --- a/service/src/main/java/org/sunbird/service/user/UserProfileReadService.java +++ b/service/src/main/java/org/sunbird/service/user/UserProfileReadService.java @@ -13,11 +13,11 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.organisation.validator.OrgTypeValidator; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -27,6 +27,7 @@ import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.service.user.impl.*; import org.sunbird.util.*; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.user.UserTncUtil; import org.sunbird.util.user.UserUtil; diff --git a/service/src/main/java/org/sunbird/service/user/UserStatusService.java b/service/src/main/java/org/sunbird/service/user/UserStatusService.java index 85b6109947..fdd4901cd7 100644 --- a/service/src/main/java/org/sunbird/service/user/UserStatusService.java +++ b/service/src/main/java/org/sunbird/service/user/UserStatusService.java @@ -8,17 +8,17 @@ import org.sunbird.dao.user.UserDao; import org.sunbird.dao.user.impl.UserDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ProjectUtil; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.common.ProjectUtil; public class UserStatusService { diff --git a/service/src/main/java/org/sunbird/service/user/UserTncService.java b/service/src/main/java/org/sunbird/service/user/UserTncService.java index 7ff75ad5b4..c2ff20f7f8 100644 --- a/service/src/main/java/org/sunbird/service/user/UserTncService.java +++ b/service/src/main/java/org/sunbird/service/user/UserTncService.java @@ -14,7 +14,7 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.Request; diff --git a/service/src/main/java/org/sunbird/service/user/impl/ExtendedUserProfileServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/ExtendedUserProfileServiceImpl.java index 0e8289396e..ea70948bc6 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/ExtendedUserProfileServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/ExtendedUserProfileServiceImpl.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.json.JSONObject; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.Request; diff --git a/service/src/main/java/org/sunbird/service/user/impl/SSOUserServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/SSOUserServiceImpl.java index 5a7659b216..df2ba42e66 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/SSOUserServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/SSOUserServiceImpl.java @@ -10,8 +10,8 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.user.validator.UserCreateRequestValidator; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.organisation.Organisation; @@ -26,8 +26,8 @@ import org.sunbird.service.user.UserLookupService; import org.sunbird.service.user.UserService; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.StringFormatter; import org.sunbird.util.user.UserUtil; public class SSOUserServiceImpl implements SSOUserService { diff --git a/service/src/main/java/org/sunbird/service/user/impl/TenantMigrationServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/TenantMigrationServiceImpl.java index 9deed8c346..415cda6b6a 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/TenantMigrationServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/TenantMigrationServiceImpl.java @@ -10,7 +10,7 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.Request; @@ -23,11 +23,11 @@ import org.sunbird.service.user.TenantMigrationService; import org.sunbird.service.user.UserOrgService; import org.sunbird.service.user.UserService; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.StringFormatter; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.StringFormatter; public class TenantMigrationServiceImpl implements TenantMigrationService { diff --git a/service/src/main/java/org/sunbird/service/user/impl/UserLookUpServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/UserLookUpServiceImpl.java index 19050b876f..fdcf5331c6 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/UserLookUpServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/UserLookUpServiceImpl.java @@ -11,15 +11,15 @@ import org.sunbird.dao.user.UserLookupDao; import org.sunbird.dao.user.impl.UserLookupDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.User; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.UserLookupService; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UserLookUpServiceImpl implements UserLookupService { diff --git a/service/src/main/java/org/sunbird/service/user/impl/UserOrgServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/UserOrgServiceImpl.java index 4122024d6b..b4e348f455 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/UserOrgServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/UserOrgServiceImpl.java @@ -13,7 +13,7 @@ import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.UserOrgService; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UserOrgServiceImpl implements UserOrgService { private static UserOrgServiceImpl userOrgService = null; diff --git a/service/src/main/java/org/sunbird/service/user/impl/UserRoleServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/UserRoleServiceImpl.java index 3daa32a379..5ed123ae4e 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/UserRoleServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/UserRoleServiceImpl.java @@ -15,12 +15,12 @@ import org.sunbird.dao.user.UserRoleDao; import org.sunbird.dao.user.impl.UserRoleDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; import org.sunbird.service.user.UserRoleService; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public class UserRoleServiceImpl implements UserRoleService { private final LoggerUtil logger = new LoggerUtil(UserRoleServiceImpl.class); diff --git a/service/src/main/java/org/sunbird/service/user/impl/UserSelfDeclarationServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/UserSelfDeclarationServiceImpl.java index 81e44baea9..c38d93901f 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/UserSelfDeclarationServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/UserSelfDeclarationServiceImpl.java @@ -9,7 +9,7 @@ import org.sunbird.dao.user.UserSelfDeclarationDao; import org.sunbird.dao.user.impl.UserSelfDeclarationDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.UserDeclareEntity; diff --git a/service/src/main/java/org/sunbird/service/user/impl/UserServiceImpl.java b/service/src/main/java/org/sunbird/service/user/impl/UserServiceImpl.java index a9424f4e5b..aab1278bb4 100644 --- a/service/src/main/java/org/sunbird/service/user/impl/UserServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/user/impl/UserServiceImpl.java @@ -15,6 +15,8 @@ import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.sunbird.common.ElasticSearchHelper; +import org.sunbird.common.ProjectUtil; +import org.sunbird.utils.Slug; import org.sunbird.dao.user.UserDao; import org.sunbird.dao.user.UserLookupDao; import org.sunbird.dao.user.impl.UserDaoImpl; @@ -23,12 +25,12 @@ import org.sunbird.datasecurity.EncryptionService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.adminutil.AdminUtilRequestData; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/main/java/org/sunbird/service/userconsent/impl/UserConsentServiceImpl.java b/service/src/main/java/org/sunbird/service/userconsent/impl/UserConsentServiceImpl.java index a54116d1b8..2c21d17e3f 100644 --- a/service/src/main/java/org/sunbird/service/userconsent/impl/UserConsentServiceImpl.java +++ b/service/src/main/java/org/sunbird/service/userconsent/impl/UserConsentServiceImpl.java @@ -13,7 +13,7 @@ import org.sunbird.dao.userconsent.UserConsentDao; import org.sunbird.dao.userconsent.impl.UserConsentDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.Request; @@ -21,7 +21,7 @@ import org.sunbird.response.Response; import org.sunbird.service.userconsent.UserConsentService; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.user.DateUtil; public class UserConsentServiceImpl implements UserConsentService { diff --git a/service/src/main/java/org/sunbird/util/AdminUtilHandler.java b/service/src/main/java/org/sunbird/util/AdminUtilHandler.java index d44d9ab9a4..cfc8f17c90 100644 --- a/service/src/main/java/org/sunbird/util/AdminUtilHandler.java +++ b/service/src/main/java/org/sunbird/util/AdminUtilHandler.java @@ -8,10 +8,11 @@ import java.util.Map; import org.apache.commons.collections4.MapUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.model.adminutil.AdminUtilRequest; import org.sunbird.model.adminutil.AdminUtilRequestData; import org.sunbird.model.adminutil.AdminUtilRequestPayload; diff --git a/service/src/main/java/org/sunbird/util/DataCacheHandler.java b/service/src/main/java/org/sunbird/util/DataCacheHandler.java index c70e0ca18f..13b453b22b 100644 --- a/service/src/main/java/org/sunbird/util/DataCacheHandler.java +++ b/service/src/main/java/org/sunbird/util/DataCacheHandler.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.sunbird.actor.organisation.validator.OrgTypeValidator; import org.sunbird.cassandra.CassandraOperation; +import org.sunbird.common.ProjectUtil; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; diff --git a/service/src/main/java/org/sunbird/util/FormApiUtil.java b/service/src/main/java/org/sunbird/util/FormApiUtil.java index 30e3ca3794..43b0d8e014 100644 --- a/service/src/main/java/org/sunbird/util/FormApiUtil.java +++ b/service/src/main/java/org/sunbird/util/FormApiUtil.java @@ -6,6 +6,7 @@ import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; +import org.sunbird.common.ProjectUtil; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; diff --git a/service/src/main/java/org/sunbird/util/FormApiUtilHandler.java b/service/src/main/java/org/sunbird/util/FormApiUtilHandler.java index 5b242a25a5..0d56bfd175 100644 --- a/service/src/main/java/org/sunbird/util/FormApiUtilHandler.java +++ b/service/src/main/java/org/sunbird/util/FormApiUtilHandler.java @@ -7,6 +7,7 @@ import java.util.Map; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.sunbird.common.ProjectUtil; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; diff --git a/service/src/main/java/org/sunbird/util/SMSTemplateProvider.java b/service/src/main/java/org/sunbird/util/SMSTemplateProvider.java index 77c3d0ee3e..5a90efc75d 100644 --- a/service/src/main/java/org/sunbird/util/SMSTemplateProvider.java +++ b/service/src/main/java/org/sunbird/util/SMSTemplateProvider.java @@ -13,6 +13,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; +import org.sunbird.common.ProjectUtil; public class SMSTemplateProvider { private static final LoggerUtil logger = new LoggerUtil(SMSTemplateProvider.class); diff --git a/service/src/main/java/org/sunbird/util/UserUtility.java b/service/src/main/java/org/sunbird/util/UserUtility.java index e552781072..ba639fb247 100644 --- a/service/src/main/java/org/sunbird/util/UserUtility.java +++ b/service/src/main/java/org/sunbird/util/UserUtility.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; +import org.sunbird.common.PropertiesCache; import org.sunbird.datasecurity.DataMaskingService; import org.sunbird.datasecurity.DecryptionService; import org.sunbird.datasecurity.EncryptionService; diff --git a/service/src/main/java/org/sunbird/util/Util.java b/service/src/main/java/org/sunbird/util/Util.java index d28498b934..b8125c8105 100644 --- a/service/src/main/java/org/sunbird/util/Util.java +++ b/service/src/main/java/org/sunbird/util/Util.java @@ -8,6 +8,7 @@ import org.sunbird.datasecurity.DecryptionService; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; +import org.sunbird.common.ProjectUtil; import org.sunbird.request.Request; import org.sunbird.response.Response; diff --git a/service/src/main/java/org/sunbird/util/contentstore/ContentStoreUtil.java b/service/src/main/java/org/sunbird/util/contentstore/ContentStoreUtil.java index 02d8598e87..b8b3823c1f 100644 --- a/service/src/main/java/org/sunbird/util/contentstore/ContentStoreUtil.java +++ b/service/src/main/java/org/sunbird/util/contentstore/ContentStoreUtil.java @@ -8,8 +8,8 @@ import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; public class ContentStoreUtil { private static final LoggerUtil logger = new LoggerUtil(ContentStoreUtil.class); diff --git a/service/src/main/java/org/sunbird/util/otp/OTPUtil.java b/service/src/main/java/org/sunbird/util/otp/OTPUtil.java index fc1c87c6ad..321c73592a 100644 --- a/service/src/main/java/org/sunbird/util/otp/OTPUtil.java +++ b/service/src/main/java/org/sunbird/util/otp/OTPUtil.java @@ -14,11 +14,11 @@ import org.sunbird.logging.LoggerUtil; import org.sunbird.notification.sms.provider.ISmsProvider; import org.sunbird.notification.utils.SMSFactory; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.otp.OTPService; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; public final class OTPUtil { private static final LoggerUtil logger = new LoggerUtil(OTPUtil.class); diff --git a/service/src/main/java/org/sunbird/util/ratelimit/OtpRateLimiter.java b/service/src/main/java/org/sunbird/util/ratelimit/OtpRateLimiter.java index 9ec0f5877c..c2223cd802 100644 --- a/service/src/main/java/org/sunbird/util/ratelimit/OtpRateLimiter.java +++ b/service/src/main/java/org/sunbird/util/ratelimit/OtpRateLimiter.java @@ -1,7 +1,7 @@ package org.sunbird.util.ratelimit; import org.apache.commons.lang3.StringUtils; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; /** Defines various rate limits for OTP functionality with rate and corresponding TTL. */ public enum OtpRateLimiter implements RateLimiter { diff --git a/service/src/main/java/org/sunbird/util/ratelimit/RateLimit.java b/service/src/main/java/org/sunbird/util/ratelimit/RateLimit.java index caf3d5af96..ed7befe68f 100644 --- a/service/src/main/java/org/sunbird/util/ratelimit/RateLimit.java +++ b/service/src/main/java/org/sunbird/util/ratelimit/RateLimit.java @@ -4,7 +4,7 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; @@ -20,9 +20,16 @@ public class RateLimit { public RateLimit(String key, Map rateLimitMap) { this.key = key; this.unit = (String) rateLimitMap.get(JsonKey.RATE_LIMIT_UNIT); - this.limit = (int) rateLimitMap.get(JsonKey.RATE); - this.count = (int) rateLimitMap.get(JsonKey.COUNT); - this.ttl = (int) rateLimitMap.get(JsonKey.TTL); + this.limit = getIntValue(rateLimitMap.get(JsonKey.RATE)); + this.count = getIntValue(rateLimitMap.get(JsonKey.COUNT)); + this.ttl = getIntValue(rateLimitMap.get(JsonKey.TTL)); + } + + private int getIntValue(Object obj) { + if (obj instanceof Number) { + return ((Number) obj).intValue(); + } + return 0; } public RateLimit(String key, String unit, Integer limit, int ttl) { diff --git a/service/src/main/java/org/sunbird/util/search/FuzzyMatcher.java b/service/src/main/java/org/sunbird/util/search/FuzzyMatcher.java index f5678fa72c..07cdcbe069 100644 --- a/service/src/main/java/org/sunbird/util/search/FuzzyMatcher.java +++ b/service/src/main/java/org/sunbird/util/search/FuzzyMatcher.java @@ -13,7 +13,7 @@ import java.util.Map; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; public class FuzzyMatcher { private static final LoggerUtil logger = new LoggerUtil(FuzzyMatcher.class); diff --git a/service/src/main/java/org/sunbird/util/search/FuzzySearchManager.java b/service/src/main/java/org/sunbird/util/search/FuzzySearchManager.java index dbcb179cb6..e6041d7b14 100644 --- a/service/src/main/java/org/sunbird/util/search/FuzzySearchManager.java +++ b/service/src/main/java/org/sunbird/util/search/FuzzySearchManager.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Map; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; diff --git a/service/src/main/java/org/sunbird/util/search/SearchTelemetryGenerator.java b/service/src/main/java/org/sunbird/util/search/SearchTelemetryGenerator.java index 072912caae..346f1b68b4 100644 --- a/service/src/main/java/org/sunbird/util/search/SearchTelemetryGenerator.java +++ b/service/src/main/java/org/sunbird/util/search/SearchTelemetryGenerator.java @@ -14,7 +14,7 @@ import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.telemetry.util.TelemetryWriter; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; import scala.concurrent.Await; import scala.concurrent.Future; diff --git a/service/src/main/java/org/sunbird/util/user/SchedulerManager.java b/service/src/main/java/org/sunbird/util/user/SchedulerManager.java index feb498f11b..0153ed64f2 100644 --- a/service/src/main/java/org/sunbird/util/user/SchedulerManager.java +++ b/service/src/main/java/org/sunbird/util/user/SchedulerManager.java @@ -5,7 +5,7 @@ import org.sunbird.logging.LoggerUtil; import org.sunbird.util.DataCacheHandler; import org.sunbird.util.ExecutorManager; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; /** @author Manzarul All the scheduler job will be handle by this class. */ public class SchedulerManager { diff --git a/service/src/main/java/org/sunbird/util/user/UserExtendedProfileSchemaValidator.java b/service/src/main/java/org/sunbird/util/user/UserExtendedProfileSchemaValidator.java index dbf8012bf0..29108af776 100644 --- a/service/src/main/java/org/sunbird/util/user/UserExtendedProfileSchemaValidator.java +++ b/service/src/main/java/org/sunbird/util/user/UserExtendedProfileSchemaValidator.java @@ -7,7 +7,7 @@ import org.everit.json.schema.loader.SchemaLoader; import org.json.JSONObject; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.util.DataCacheHandler; diff --git a/service/src/main/java/org/sunbird/util/user/UserTncUtil.java b/service/src/main/java/org/sunbird/util/user/UserTncUtil.java index 5615a2790c..de57f27624 100644 --- a/service/src/main/java/org/sunbird/util/user/UserTncUtil.java +++ b/service/src/main/java/org/sunbird/util/user/UserTncUtil.java @@ -5,7 +5,7 @@ import java.util.HashMap; import java.util.Map; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.logging.LoggerUtil; public class UserTncUtil { diff --git a/service/src/main/java/org/sunbird/util/user/UserUtil.java b/service/src/main/java/org/sunbird/util/user/UserUtil.java index 39fa0784f7..199e1974f8 100644 --- a/service/src/main/java/org/sunbird/util/user/UserUtil.java +++ b/service/src/main/java/org/sunbird/util/user/UserUtil.java @@ -23,8 +23,8 @@ import org.sunbird.datasecurity.EncryptionService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.model.user.User; @@ -40,11 +40,11 @@ import org.sunbird.service.user.impl.UserLookUpServiceImpl; import org.sunbird.service.user.impl.UserOrgServiceImpl; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.UserUtility; import org.sunbird.util.contentstore.ContentStoreUtil; import scala.concurrent.Future; diff --git a/service/src/test/java/org/sunbird/actor/BackgroundJobManagerTest.java b/service/src/test/java/org/sunbird/actor/BackgroundJobManagerTest.java index 70ce90fe0c..5910b9f0bc 100644 --- a/service/src/test/java/org/sunbird/actor/BackgroundJobManagerTest.java +++ b/service/src/test/java/org/sunbird/actor/BackgroundJobManagerTest.java @@ -30,10 +30,10 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; import scala.concurrent.Promise; diff --git a/service/src/test/java/org/sunbird/actor/bulkupload/BulkUploadManagementActorTest.java b/service/src/test/java/org/sunbird/actor/bulkupload/BulkUploadManagementActorTest.java index c34dbe775d..0cc54bb7fc 100644 --- a/service/src/test/java/org/sunbird/actor/bulkupload/BulkUploadManagementActorTest.java +++ b/service/src/test/java/org/sunbird/actor/bulkupload/BulkUploadManagementActorTest.java @@ -30,13 +30,13 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; /** @author arvind. Junit test cases for bulk upload - user, org */ diff --git a/service/src/test/java/org/sunbird/actor/bulkupload/LocationBulkUploadActorTest.java b/service/src/test/java/org/sunbird/actor/bulkupload/LocationBulkUploadActorTest.java index 64da09a18f..4ae9b9dc72 100644 --- a/service/src/test/java/org/sunbird/actor/bulkupload/LocationBulkUploadActorTest.java +++ b/service/src/test/java/org/sunbird/actor/bulkupload/LocationBulkUploadActorTest.java @@ -32,7 +32,7 @@ import org.sunbird.exception.ProjectCommonException; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.Util; diff --git a/service/src/test/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActorTest.java b/service/src/test/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActorTest.java index cc0d59ff4e..5b1bd91dcc 100644 --- a/service/src/test/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActorTest.java +++ b/service/src/test/java/org/sunbird/actor/bulkupload/UserBulkUploadBackgroundJobActorTest.java @@ -27,17 +27,17 @@ import org.sunbird.dao.bulkupload.impl.BulkUploadProcessDaoImpl; import org.sunbird.dao.bulkupload.impl.BulkUploadProcessTaskDaoImpl; import org.sunbird.datasecurity.EncryptionService; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.bulkupload.BulkUploadProcess; import org.sunbird.model.bulkupload.BulkUploadProcessTask; import org.sunbird.model.organisation.Organisation; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.telemetry.util.TelemetryWriter; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @PrepareForTest({ ServiceFactory.class, diff --git a/service/src/test/java/org/sunbird/actor/health/HealthActorTest.java b/service/src/test/java/org/sunbird/actor/health/HealthActorTest.java index b4999aa7ca..22d3c78831 100644 --- a/service/src/test/java/org/sunbird/actor/health/HealthActorTest.java +++ b/service/src/test/java/org/sunbird/actor/health/HealthActorTest.java @@ -26,7 +26,7 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.Util; diff --git a/service/src/test/java/org/sunbird/actor/location/LocationActorTest.java b/service/src/test/java/org/sunbird/actor/location/LocationActorTest.java index c8aee7cd41..1d2b2238a8 100644 --- a/service/src/test/java/org/sunbird/actor/location/LocationActorTest.java +++ b/service/src/test/java/org/sunbird/actor/location/LocationActorTest.java @@ -29,10 +29,10 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import scala.concurrent.Promise; diff --git a/service/src/test/java/org/sunbird/actor/location/validator/LocationRequestValidatorTest.java b/service/src/test/java/org/sunbird/actor/location/validator/LocationRequestValidatorTest.java index 7c8fa0df9d..006f9a1ad5 100644 --- a/service/src/test/java/org/sunbird/actor/location/validator/LocationRequestValidatorTest.java +++ b/service/src/test/java/org/sunbird/actor/location/validator/LocationRequestValidatorTest.java @@ -25,14 +25,14 @@ import org.sunbird.dao.location.impl.LocationDaoFactory; import org.sunbird.dao.location.impl.LocationDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; import org.sunbird.model.location.UpsertLocationRequest; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Promise; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/notes/NotesManagementActorTest.java b/service/src/test/java/org/sunbird/actor/notes/NotesManagementActorTest.java index bc79779968..b3542685ec 100644 --- a/service/src/test/java/org/sunbird/actor/notes/NotesManagementActorTest.java +++ b/service/src/test/java/org/sunbird/actor/notes/NotesManagementActorTest.java @@ -30,10 +30,10 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import scala.concurrent.Promise; @@ -209,7 +209,7 @@ private boolean testScenario(Request reqObj, ResponseCode errorCode) { } else { ProjectCommonException res = probe.expectMsgClass(Duration.ofSeconds(100), ProjectCommonException.class); - return res.getResponseCode().name().equals(errorCode.name()) + return res.getResponseCodeEnum().name().equals(errorCode.name()) || res.getErrorResponseCode() == errorCode.getResponseCode(); } } diff --git a/service/src/test/java/org/sunbird/actor/notification/BackgroundNotificationActorTest.java b/service/src/test/java/org/sunbird/actor/notification/BackgroundNotificationActorTest.java index 9fbc4a1495..a7cd0cbf86 100644 --- a/service/src/test/java/org/sunbird/actor/notification/BackgroundNotificationActorTest.java +++ b/service/src/test/java/org/sunbird/actor/notification/BackgroundNotificationActorTest.java @@ -14,7 +14,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.http.HttpClientUtil; import org.sunbird.request.Request; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @PrepareForTest({HttpClientUtil.class, ProjectUtil.class}) diff --git a/service/src/test/java/org/sunbird/actor/notification/EmailServiceActorTest.java b/service/src/test/java/org/sunbird/actor/notification/EmailServiceActorTest.java index 3d5b8ae595..1e56332a79 100644 --- a/service/src/test/java/org/sunbird/actor/notification/EmailServiceActorTest.java +++ b/service/src/test/java/org/sunbird/actor/notification/EmailServiceActorTest.java @@ -28,11 +28,11 @@ import org.sunbird.exception.ProjectCommonException; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/notification/SendNotificationActorTest.java b/service/src/test/java/org/sunbird/actor/notification/SendNotificationActorTest.java index 29f8ddcd08..fc2ed46897 100644 --- a/service/src/test/java/org/sunbird/actor/notification/SendNotificationActorTest.java +++ b/service/src/test/java/org/sunbird/actor/notification/SendNotificationActorTest.java @@ -27,15 +27,15 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/organisation/OrgManagementActorTest.java b/service/src/test/java/org/sunbird/actor/organisation/OrgManagementActorTest.java index 6bbe994c2b..9f83104162 100644 --- a/service/src/test/java/org/sunbird/actor/organisation/OrgManagementActorTest.java +++ b/service/src/test/java/org/sunbird/actor/organisation/OrgManagementActorTest.java @@ -38,12 +38,12 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -51,8 +51,8 @@ import org.sunbird.service.organisation.OrgService; import org.sunbird.service.organisation.impl.OrgExternalServiceImpl; import org.sunbird.service.organisation.impl.OrgServiceImpl; -import org.sunbird.util.CloudStorageUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.utils.CloudStorageUtil; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.Util; import scala.Option; import scala.concurrent.Promise; @@ -525,7 +525,7 @@ private boolean testScenario(Request request, ResponseCode errorCode) { return null != res && res.getResponseCode() == ResponseCode.OK; } else { ProjectCommonException res = probe.expectMsgClass(ProjectCommonException.class); - return res.getResponseCode().name().equals(errorCode.name()) + return res.getResponseCodeEnum().name().equals(errorCode.name()) || res.getErrorResponseCode() == errorCode.getResponseCode(); } } diff --git a/service/src/test/java/org/sunbird/actor/organisation/OrgTypeValidatorTest.java b/service/src/test/java/org/sunbird/actor/organisation/OrgTypeValidatorTest.java index 2199997d60..a309a5cc48 100644 --- a/service/src/test/java/org/sunbird/actor/organisation/OrgTypeValidatorTest.java +++ b/service/src/test/java/org/sunbird/actor/organisation/OrgTypeValidatorTest.java @@ -6,7 +6,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.actor.organisation.validator.OrgTypeValidator; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.organisation.OrganisationType; diff --git a/service/src/test/java/org/sunbird/actor/organisation/OrganisationBackgroundActorTest.java b/service/src/test/java/org/sunbird/actor/organisation/OrganisationBackgroundActorTest.java index 82f402a51b..1e7b42dbac 100644 --- a/service/src/test/java/org/sunbird/actor/organisation/OrganisationBackgroundActorTest.java +++ b/service/src/test/java/org/sunbird/actor/organisation/OrganisationBackgroundActorTest.java @@ -25,10 +25,10 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Promise; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/organisation/OrganisationRequestValidatorTest.java b/service/src/test/java/org/sunbird/actor/organisation/OrganisationRequestValidatorTest.java index 4b02f54a64..ef32fc17f1 100644 --- a/service/src/test/java/org/sunbird/actor/organisation/OrganisationRequestValidatorTest.java +++ b/service/src/test/java/org/sunbird/actor/organisation/OrganisationRequestValidatorTest.java @@ -23,7 +23,7 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; diff --git a/service/src/test/java/org/sunbird/actor/otp/OTPActorTest.java b/service/src/test/java/org/sunbird/actor/otp/OTPActorTest.java index 470985fcd0..584ac2237e 100644 --- a/service/src/test/java/org/sunbird/actor/otp/OTPActorTest.java +++ b/service/src/test/java/org/sunbird/actor/otp/OTPActorTest.java @@ -27,10 +27,10 @@ import org.sunbird.dao.ratelimit.RateLimitDao; import org.sunbird.dao.ratelimit.RateLimitDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.ClientErrorResponse; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/otp/SendOTPActorTest.java b/service/src/test/java/org/sunbird/actor/otp/SendOTPActorTest.java index b6d0b7cd76..ae685ee8ca 100644 --- a/service/src/test/java/org/sunbird/actor/otp/SendOTPActorTest.java +++ b/service/src/test/java/org/sunbird/actor/otp/SendOTPActorTest.java @@ -28,13 +28,13 @@ import org.sunbird.datasecurity.impl.DefaultDecryptionServiceImpl; import org.sunbird.datasecurity.impl.DefaultEncryptionServiceImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.notification.sms.provider.ISmsProvider; import org.sunbird.notification.sms.providerimpl.Msg91SmsProviderFactory; import org.sunbird.notification.utils.SMSFactory; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/role/UserRoleActorTest.java b/service/src/test/java/org/sunbird/actor/role/UserRoleActorTest.java index 2d926e7a01..6d50441940 100644 --- a/service/src/test/java/org/sunbird/actor/role/UserRoleActorTest.java +++ b/service/src/test/java/org/sunbird/actor/role/UserRoleActorTest.java @@ -35,10 +35,10 @@ import org.sunbird.datasecurity.DecryptionService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.service.organisation.OrgService; diff --git a/service/src/test/java/org/sunbird/actor/role/UserRoleActorTestV2.java b/service/src/test/java/org/sunbird/actor/role/UserRoleActorTestV2.java index 2cba0b5b97..71fef64154 100644 --- a/service/src/test/java/org/sunbird/actor/role/UserRoleActorTestV2.java +++ b/service/src/test/java/org/sunbird/actor/role/UserRoleActorTestV2.java @@ -24,17 +24,17 @@ import org.sunbird.dao.user.impl.UserOrgDaoImpl; import org.sunbird.datasecurity.DecryptionService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.service.organisation.OrgService; import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.service.role.RoleService; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; import org.sunbird.util.Util; import java.util.*; @@ -143,7 +143,7 @@ private boolean testScenario(Request request, ResponseCode errorCode) { } else { ProjectCommonException res = probe.expectMsgClass(Duration.ofSeconds(100), ProjectCommonException.class); - return res.getResponseCode().name().equals(errorCode.name()) + return res.getResponseCodeEnum().name().equals(errorCode.name()) || res.getErrorResponseCode() == errorCode.getResponseCode(); } } diff --git a/service/src/test/java/org/sunbird/actor/role/UserRoleBackgroundActorTest.java b/service/src/test/java/org/sunbird/actor/role/UserRoleBackgroundActorTest.java index 73eb8a5712..d744c6cc41 100644 --- a/service/src/test/java/org/sunbird/actor/role/UserRoleBackgroundActorTest.java +++ b/service/src/test/java/org/sunbird/actor/role/UserRoleBackgroundActorTest.java @@ -22,7 +22,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.user.UserRoleService; diff --git a/service/src/test/java/org/sunbird/actor/search/SearchHandlerActorTest.java b/service/src/test/java/org/sunbird/actor/search/SearchHandlerActorTest.java index 731885564c..a8e8e495de 100644 --- a/service/src/test/java/org/sunbird/actor/search/SearchHandlerActorTest.java +++ b/service/src/test/java/org/sunbird/actor/search/SearchHandlerActorTest.java @@ -29,7 +29,7 @@ import org.sunbird.exception.ProjectCommonException; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import scala.concurrent.Promise; diff --git a/service/src/test/java/org/sunbird/actor/sync/ESSyncActorTest.java b/service/src/test/java/org/sunbird/actor/sync/ESSyncActorTest.java index 0f24218049..71fd4de10f 100644 --- a/service/src/test/java/org/sunbird/actor/sync/ESSyncActorTest.java +++ b/service/src/test/java/org/sunbird/actor/sync/ESSyncActorTest.java @@ -20,7 +20,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/sync/EsSyncBackgroundActorTest.java b/service/src/test/java/org/sunbird/actor/sync/EsSyncBackgroundActorTest.java index a7a9d5d425..19f2bbce8b 100644 --- a/service/src/test/java/org/sunbird/actor/sync/EsSyncBackgroundActorTest.java +++ b/service/src/test/java/org/sunbird/actor/sync/EsSyncBackgroundActorTest.java @@ -27,10 +27,10 @@ import org.sunbird.common.ElasticSearchRestHighImpl; import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/systemsettings/SystemSettingsActorTest.java b/service/src/test/java/org/sunbird/actor/systemsettings/SystemSettingsActorTest.java index 69bedd28e6..ccdc114d3a 100644 --- a/service/src/test/java/org/sunbird/actor/systemsettings/SystemSettingsActorTest.java +++ b/service/src/test/java/org/sunbird/actor/systemsettings/SystemSettingsActorTest.java @@ -26,13 +26,13 @@ import org.sunbird.common.ElasticSearchRestHighImpl; import org.sunbird.common.factory.EsClientFactory; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.duration.FiniteDuration; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActorTest.java b/service/src/test/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActorTest.java index b0c5e21cba..72064e1408 100644 --- a/service/src/test/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActorTest.java +++ b/service/src/test/java/org/sunbird/actor/tenantpreference/TenantPreferenceManagementActorTest.java @@ -27,10 +27,10 @@ import org.sunbird.common.ElasticSearchHelper; import org.sunbird.datasecurity.DecryptionService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; diff --git a/service/src/test/java/org/sunbird/actor/user/CheckUserExistActorTest.java b/service/src/test/java/org/sunbird/actor/user/CheckUserExistActorTest.java index 9e42516803..6ea43f3221 100644 --- a/service/src/test/java/org/sunbird/actor/user/CheckUserExistActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/CheckUserExistActorTest.java @@ -30,7 +30,7 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; diff --git a/service/src/test/java/org/sunbird/actor/user/IdentifierFreeUpActorTest.java b/service/src/test/java/org/sunbird/actor/user/IdentifierFreeUpActorTest.java index 7675b54621..e939506a60 100644 --- a/service/src/test/java/org/sunbird/actor/user/IdentifierFreeUpActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/IdentifierFreeUpActorTest.java @@ -38,16 +38,16 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.KeyCloakConnectionProvider; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; +import org.sunbird.keycloak.KeyCloakConnectionProvider; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; import scala.concurrent.Promise; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/user/ManagedUserActorTest.java b/service/src/test/java/org/sunbird/actor/user/ManagedUserActorTest.java index 6faed7bcd5..f456d2f311 100644 --- a/service/src/test/java/org/sunbird/actor/user/ManagedUserActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/ManagedUserActorTest.java @@ -27,7 +27,7 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/user/ResetPasswordActorTest.java b/service/src/test/java/org/sunbird/actor/user/ResetPasswordActorTest.java index 4bb83c0da6..6ae07d89c0 100644 --- a/service/src/test/java/org/sunbird/actor/user/ResetPasswordActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/ResetPasswordActorTest.java @@ -25,18 +25,18 @@ import org.sunbird.cassandra.CassandraOperation; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.sso.KeycloakBruteForceAttackUtil; -import org.sunbird.sso.KeycloakUtil; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ProjectUtil; +import org.sunbird.keycloak.KeycloakBruteForceAttackUtil; +import org.sunbird.keycloak.KeycloakUtil; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.UserUtility; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/user/SSOUserCreateActorTest.java b/service/src/test/java/org/sunbird/actor/user/SSOUserCreateActorTest.java index e785950bbe..37916fbd6d 100644 --- a/service/src/test/java/org/sunbird/actor/user/SSOUserCreateActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/SSOUserCreateActorTest.java @@ -19,10 +19,10 @@ import org.junit.Test; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.organisation.Organisation; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; diff --git a/service/src/test/java/org/sunbird/actor/user/SSUUserCreateActorTest.java b/service/src/test/java/org/sunbird/actor/user/SSUUserCreateActorTest.java index 58ad87f462..351de542fa 100644 --- a/service/src/test/java/org/sunbird/actor/user/SSUUserCreateActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/SSUUserCreateActorTest.java @@ -11,7 +11,7 @@ import org.junit.Test; import org.mockito.Mockito; import org.sunbird.model.organisation.Organisation; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; public class SSUUserCreateActorTest extends UserManagementActorTestBase { diff --git a/service/src/test/java/org/sunbird/actor/user/TenantMigrationActorTest.java b/service/src/test/java/org/sunbird/actor/user/TenantMigrationActorTest.java index b0cfb0a785..f507505c7f 100644 --- a/service/src/test/java/org/sunbird/actor/user/TenantMigrationActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/TenantMigrationActorTest.java @@ -26,15 +26,15 @@ import org.sunbird.dao.user.impl.UserLookupDaoImpl; import org.sunbird.dao.user.impl.UserOrgDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Promise; import java.util.*; @@ -221,7 +221,7 @@ public boolean testScenario(Request reqObj, ResponseCode errorCode, Props props) return null != res && res.getResponseCode() == ResponseCode.OK; } else { ProjectCommonException res = probe.expectMsgClass(ProjectCommonException.class); - return res.getResponseCode().name().equals(errorCode.name()) + return res.getResponseCodeEnum().name().equals(errorCode.name()) || res.getErrorResponseCode() == errorCode.getResponseCode(); } } diff --git a/service/src/test/java/org/sunbird/actor/user/UserAssignRoleTest.java b/service/src/test/java/org/sunbird/actor/user/UserAssignRoleTest.java index d6fc5ef0f7..3e673a7683 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserAssignRoleTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserAssignRoleTest.java @@ -36,7 +36,7 @@ import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.util.DataCacheHandler; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import scala.concurrent.Promise; diff --git a/service/src/test/java/org/sunbird/actor/user/UserConsentActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserConsentActorTest.java index 93aed7c829..9c1a36cdf6 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserConsentActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserConsentActorTest.java @@ -17,10 +17,10 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.actor.userconsent.UserConsentActor; import org.sunbird.cassandraimpl.CassandraOperationImpl; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.service.user.UserService; diff --git a/service/src/test/java/org/sunbird/actor/user/UserDeletionBackgroundJobActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserDeletionBackgroundJobActorTest.java index 3f93c2e080..9f0f6a472e 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserDeletionBackgroundJobActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserDeletionBackgroundJobActorTest.java @@ -21,7 +21,7 @@ import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserRoleServiceImpl; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; @RunWith(PowerMockRunner.class) @PrepareForTest({ diff --git a/service/src/test/java/org/sunbird/actor/user/UserExternalIdManagementActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserExternalIdManagementActorTest.java index fb9610d0ee..d34fb8bd07 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserExternalIdManagementActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserExternalIdManagementActorTest.java @@ -26,10 +26,10 @@ import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.common.factory.EsClientFactory; import org.sunbird.dao.notification.impl.EmailTemplateDaoImpl; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/user/UserFeedActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserFeedActorTest.java index 60cf8927d2..533c470e48 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserFeedActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserFeedActorTest.java @@ -24,11 +24,11 @@ import org.sunbird.actor.feed.UserFeedActor; import org.sunbird.common.Constants; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/user/UserFrameworkTest.java b/service/src/test/java/org/sunbird/actor/user/UserFrameworkTest.java index 14249748ff..2f7764a604 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserFrameworkTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserFrameworkTest.java @@ -15,7 +15,7 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.util.DataCacheHandler; diff --git a/service/src/test/java/org/sunbird/actor/user/UserLoginActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserLoginActorTest.java index 5eb835ffac..9e9a2bfa56 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserLoginActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserLoginActorTest.java @@ -9,9 +9,9 @@ import org.apache.pekko.testkit.javadsl.TestKit; import org.junit.Assert; import org.junit.Test; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/user/UserLookupActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserLookupActorTest.java index 6c6bb046a0..5a4b088d16 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserLookupActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserLookupActorTest.java @@ -23,7 +23,7 @@ import org.sunbird.dao.user.impl.UserDaoImpl; import org.sunbird.dao.user.impl.UserLookupDaoImpl; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/user/UserManagementActorTestBase.java b/service/src/test/java/org/sunbird/actor/user/UserManagementActorTestBase.java index 74394f9dbe..c5cac2a806 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserManagementActorTestBase.java +++ b/service/src/test/java/org/sunbird/actor/user/UserManagementActorTestBase.java @@ -32,13 +32,13 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; import org.sunbird.model.organisation.Organisation; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -537,7 +537,7 @@ public boolean testScenario(Request reqObj, ResponseCode errorCode) { } else { ProjectCommonException res = probe.expectMsgClass(Duration.ofSeconds(1000), ProjectCommonException.class); - return res.getResponseCode().name().equals(errorCode.name()) + return res.getResponseCodeEnum().name().equals(errorCode.name()) || res.getErrorResponseCode() == errorCode.getResponseCode(); } } diff --git a/service/src/test/java/org/sunbird/actor/user/UserMergeActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserMergeActorTest.java index 507de0e6aa..7c1f877e5e 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserMergeActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserMergeActorTest.java @@ -20,18 +20,18 @@ import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.dao.user.impl.UserDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.kafka.KafkaClient; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ConfigUtil; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.utils.ConfigUtil; import org.sunbird.util.DataCacheHandler; import org.sunbird.util.user.KafkaConfigConstants; @@ -194,7 +194,7 @@ public boolean testScenario(Request reqObj, ResponseCode errorCode) { } else { ProjectCommonException res = probe.expectMsgClass(Duration.ofSeconds(10), ProjectCommonException.class); - return res.getResponseCode().name().equals(errorCode.name()) + return res.getResponseCodeEnum().name().equals(errorCode.name()) || res.getErrorResponseCode() == errorCode.getResponseCode(); } } diff --git a/service/src/test/java/org/sunbird/actor/user/UserOnBoardingNotificationActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserOnBoardingNotificationActorTest.java index e483f9b2eb..5f7c9d0d59 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserOnBoardingNotificationActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserOnBoardingNotificationActorTest.java @@ -19,14 +19,14 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.organisation.OrgService; import org.sunbird.service.organisation.impl.OrgServiceImpl; -import org.sunbird.sso.KeycloakRequiredActionLinkUtil; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; +import org.sunbird.keycloak.KeycloakRequiredActionLinkUtil; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; import org.sunbird.util.UserUtility; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/user/UserOrgManagementActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserOrgManagementActorTest.java index df593699cb..18996a9208 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserOrgManagementActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserOrgManagementActorTest.java @@ -25,7 +25,7 @@ import org.sunbird.cassandra.CassandraOperation; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; diff --git a/service/src/test/java/org/sunbird/actor/user/UserOwnershipTransferActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserOwnershipTransferActorTest.java index 2459490d6a..53f6ca4c2b 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserOwnershipTransferActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserOwnershipTransferActorTest.java @@ -16,11 +16,11 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/user/UserProfileReadActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserProfileReadActorTest.java index e421027705..b6063aa153 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserProfileReadActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserProfileReadActorTest.java @@ -34,11 +34,11 @@ import org.sunbird.datasecurity.impl.DefaultEncryptionServiceImpl; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -47,10 +47,10 @@ import org.sunbird.service.user.UserProfileReadService; import org.sunbird.service.user.impl.UserExternalIdentityServiceImpl; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.sso.impl.KeyCloakServiceImpl; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.keycloak.impl.KeyCloakServiceImpl; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.UserUtility; import org.sunbird.util.Util; import org.sunbird.util.user.UserUtil; diff --git a/service/src/test/java/org/sunbird/actor/user/UserSelfDeclarationManagementActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserSelfDeclarationManagementActorTest.java index 594d630b71..0c30d19758 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserSelfDeclarationManagementActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserSelfDeclarationManagementActorTest.java @@ -35,11 +35,11 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.dao.notification.impl.EmailTemplateDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.UserDeclareEntity; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/actor/user/UserStatusActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserStatusActorTest.java index 0345ab4209..48bc92798a 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserStatusActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserStatusActorTest.java @@ -32,11 +32,11 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; @@ -44,10 +44,10 @@ import org.sunbird.service.user.UserRoleService; import org.sunbird.service.user.impl.UserExternalIdentityServiceImpl; import org.sunbird.service.user.impl.UserRoleServiceImpl; -import org.sunbird.sso.KeyCloakConnectionProvider; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ProjectUtil; +import org.sunbird.keycloak.KeyCloakConnectionProvider; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Promise; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/user/UserTnCActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserTnCActorTest.java index 6ed5e5bc8a..aec927995e 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserTnCActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserTnCActorTest.java @@ -33,15 +33,15 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.service.user.UserTncService; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Promise; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/actor/user/UserTypeActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserTypeActorTest.java index 543ef20717..d66bf9db32 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserTypeActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserTypeActorTest.java @@ -22,13 +22,13 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.util.FormApiUtilHandler; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; -import org.sunbird.sso.KeyCloakConnectionProvider; +import org.sunbird.keycloak.KeyCloakConnectionProvider; @RunWith(PowerMockRunner.class) @PrepareForTest({KeyCloakConnectionProvider.class, FormApiUtilHandler.class}) diff --git a/service/src/test/java/org/sunbird/actor/user/UserUpdateActorTest.java b/service/src/test/java/org/sunbird/actor/user/UserUpdateActorTest.java index fc4b1a1ac5..88c8050c4b 100644 --- a/service/src/test/java/org/sunbird/actor/user/UserUpdateActorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/UserUpdateActorTest.java @@ -22,11 +22,11 @@ import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; import org.sunbird.model.organisation.Organisation; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.service.user.ExtendedUserProfileService; import org.sunbird.service.user.impl.ExtendedUserProfileServiceImpl; diff --git a/service/src/test/java/org/sunbird/actor/user/validator/UserCreateRequestValidatorTest.java b/service/src/test/java/org/sunbird/actor/user/validator/UserCreateRequestValidatorTest.java index 000ca903af..a944bbe2fb 100644 --- a/service/src/test/java/org/sunbird/actor/user/validator/UserCreateRequestValidatorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/validator/UserCreateRequestValidatorTest.java @@ -8,7 +8,7 @@ import java.util.Map; import org.junit.Test; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.model.location.Location; diff --git a/service/src/test/java/org/sunbird/actor/user/validator/UserRequestValidatorTest.java b/service/src/test/java/org/sunbird/actor/user/validator/UserRequestValidatorTest.java index 058b6de7d3..9d691b9047 100644 --- a/service/src/test/java/org/sunbird/actor/user/validator/UserRequestValidatorTest.java +++ b/service/src/test/java/org/sunbird/actor/user/validator/UserRequestValidatorTest.java @@ -9,13 +9,13 @@ import org.junit.Ignore; import org.junit.Test; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseCode; +import org.sunbird.response.ResponseMessage; import org.sunbird.keys.JsonKey; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.request.RequestContext; -import org.sunbird.validator.RequestValidator; +import org.sunbird.validators.RequestValidator; public class UserRequestValidatorTest { diff --git a/service/src/test/java/org/sunbird/client/NotificationServiceClientTest.java b/service/src/test/java/org/sunbird/client/NotificationServiceClientTest.java index df15817611..78f38682fb 100644 --- a/service/src/test/java/org/sunbird/client/NotificationServiceClientTest.java +++ b/service/src/test/java/org/sunbird/client/NotificationServiceClientTest.java @@ -16,7 +16,7 @@ import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; @RunWith(PowerMockRunner.class) @PrepareForTest({PropertiesCache.class, HttpClientUtil.class}) diff --git a/service/src/test/java/org/sunbird/dao/bulkupload/BulkUploadProcessDaoImplTest.java b/service/src/test/java/org/sunbird/dao/bulkupload/BulkUploadProcessDaoImplTest.java index db355f64d7..0eba2d4dc4 100644 --- a/service/src/test/java/org/sunbird/dao/bulkupload/BulkUploadProcessDaoImplTest.java +++ b/service/src/test/java/org/sunbird/dao/bulkupload/BulkUploadProcessDaoImplTest.java @@ -21,7 +21,7 @@ import org.sunbird.model.bulkupload.BulkUploadProcess; import org.sunbird.request.RequestContext; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @PrepareForTest({ServiceFactory.class, CassandraOperationImpl.class}) @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/dao/notification/EmailTemplateDaoImplTest.java b/service/src/test/java/org/sunbird/dao/notification/EmailTemplateDaoImplTest.java index f2116fe917..2bf60386b9 100644 --- a/service/src/test/java/org/sunbird/dao/notification/EmailTemplateDaoImplTest.java +++ b/service/src/test/java/org/sunbird/dao/notification/EmailTemplateDaoImplTest.java @@ -16,7 +16,7 @@ import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.util.ArrayList; import java.util.HashMap; diff --git a/service/src/test/java/org/sunbird/dao/ratelimit/RateLimitDaoTest.java b/service/src/test/java/org/sunbird/dao/ratelimit/RateLimitDaoTest.java index d9b8aa2a73..e6c93cca3f 100644 --- a/service/src/test/java/org/sunbird/dao/ratelimit/RateLimitDaoTest.java +++ b/service/src/test/java/org/sunbird/dao/ratelimit/RateLimitDaoTest.java @@ -25,7 +25,7 @@ import org.sunbird.cassandra.CassandraOperation; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/dao/role/RoleDaoImplTest.java b/service/src/test/java/org/sunbird/dao/role/RoleDaoImplTest.java index e2dde6186c..53e5204744 100644 --- a/service/src/test/java/org/sunbird/dao/role/RoleDaoImplTest.java +++ b/service/src/test/java/org/sunbird/dao/role/RoleDaoImplTest.java @@ -22,7 +22,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.model.role.Role; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @PrepareForTest({ diff --git a/service/src/test/java/org/sunbird/dao/role/RoleGroupDaoImplTest.java b/service/src/test/java/org/sunbird/dao/role/RoleGroupDaoImplTest.java index cdfb9ff12b..a9c925ecd7 100644 --- a/service/src/test/java/org/sunbird/dao/role/RoleGroupDaoImplTest.java +++ b/service/src/test/java/org/sunbird/dao/role/RoleGroupDaoImplTest.java @@ -22,7 +22,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.model.role.RoleGroup; import org.sunbird.response.Response; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @PrepareForTest({ diff --git a/service/src/test/java/org/sunbird/dao/user/impl/UserRoleDaoImplTest.java b/service/src/test/java/org/sunbird/dao/user/impl/UserRoleDaoImplTest.java index 8e3a5aafbc..f4cc50cd09 100644 --- a/service/src/test/java/org/sunbird/dao/user/impl/UserRoleDaoImplTest.java +++ b/service/src/test/java/org/sunbird/dao/user/impl/UserRoleDaoImplTest.java @@ -22,7 +22,7 @@ import org.sunbird.common.factory.EsClientFactory; import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.dao.user.UserRoleDao; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; diff --git a/service/src/test/java/org/sunbird/service/feed/impl/FeedServiceImplTest.java b/service/src/test/java/org/sunbird/service/feed/impl/FeedServiceImplTest.java index 39631431c5..a26aa2a854 100644 --- a/service/src/test/java/org/sunbird/service/feed/impl/FeedServiceImplTest.java +++ b/service/src/test/java/org/sunbird/service/feed/impl/FeedServiceImplTest.java @@ -23,7 +23,7 @@ import org.sunbird.response.Response; import org.sunbird.service.feed.FeedFactory; import org.sunbird.service.feed.IFeedService; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.PropertiesCache; @RunWith(PowerMockRunner.class) @PrepareForTest({ServiceFactory.class, HttpClientUtil.class, System.class}) diff --git a/service/src/test/java/org/sunbird/service/notification/NotificationServiceTest.java b/service/src/test/java/org/sunbird/service/notification/NotificationServiceTest.java index 683ca7bc59..9843c4ea51 100644 --- a/service/src/test/java/org/sunbird/service/notification/NotificationServiceTest.java +++ b/service/src/test/java/org/sunbird/service/notification/NotificationServiceTest.java @@ -24,7 +24,7 @@ import org.sunbird.service.organisation.impl.OrgServiceImpl; import org.sunbird.service.user.UserService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import java.util.ArrayList; import java.util.HashMap; diff --git a/service/src/test/java/org/sunbird/service/organisation/OrgServiceImplTest.java b/service/src/test/java/org/sunbird/service/organisation/OrgServiceImplTest.java index 6f209542d3..9342660ec8 100644 --- a/service/src/test/java/org/sunbird/service/organisation/OrgServiceImplTest.java +++ b/service/src/test/java/org/sunbird/service/organisation/OrgServiceImplTest.java @@ -28,7 +28,7 @@ import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.organisation.impl.OrgServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Promise; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/service/ratelimit/RateLimitServiceTest.java b/service/src/test/java/org/sunbird/service/ratelimit/RateLimitServiceTest.java index bc1ecb774a..ec77f5d642 100644 --- a/service/src/test/java/org/sunbird/service/ratelimit/RateLimitServiceTest.java +++ b/service/src/test/java/org/sunbird/service/ratelimit/RateLimitServiceTest.java @@ -20,7 +20,7 @@ import org.sunbird.cassandra.CassandraOperation; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; diff --git a/service/src/test/java/org/sunbird/service/tenantpreference/TenantPreferenceServiceTest.java b/service/src/test/java/org/sunbird/service/tenantpreference/TenantPreferenceServiceTest.java index 098a264383..85132d43b5 100644 --- a/service/src/test/java/org/sunbird/service/tenantpreference/TenantPreferenceServiceTest.java +++ b/service/src/test/java/org/sunbird/service/tenantpreference/TenantPreferenceServiceTest.java @@ -25,7 +25,7 @@ import org.sunbird.dao.tenantpreference.TenantPreferenceDao; import org.sunbird.dao.tenantpreference.impl.TenantPreferenceDaoImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseMessage; +import org.sunbird.response.ResponseMessage; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; diff --git a/service/src/test/java/org/sunbird/service/user/ResetPasswordServiceTest.java b/service/src/test/java/org/sunbird/service/user/ResetPasswordServiceTest.java index ae53f06649..c9fd6fce73 100644 --- a/service/src/test/java/org/sunbird/service/user/ResetPasswordServiceTest.java +++ b/service/src/test/java/org/sunbird/service/user/ResetPasswordServiceTest.java @@ -11,7 +11,7 @@ import org.sunbird.http.HttpClientUtil; import org.sunbird.keys.JsonKey; import org.sunbird.request.RequestContext; -import org.sunbird.sso.KeycloakUtil; +import org.sunbird.keycloak.KeycloakUtil; import java.util.HashMap; import java.util.Map; diff --git a/service/src/test/java/org/sunbird/service/user/UserDeletionServiceTest.java b/service/src/test/java/org/sunbird/service/user/UserDeletionServiceTest.java index 05ee28860c..7c430772a0 100644 --- a/service/src/test/java/org/sunbird/service/user/UserDeletionServiceTest.java +++ b/service/src/test/java/org/sunbird/service/user/UserDeletionServiceTest.java @@ -30,10 +30,10 @@ import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.service.user.impl.UserExternalIdentityServiceImpl; -import org.sunbird.sso.KeyCloakConnectionProvider; -import org.sunbird.sso.SSOManager; -import org.sunbird.sso.SSOServiceFactory; -import org.sunbird.util.ProjectUtil; +import org.sunbird.keycloak.KeyCloakConnectionProvider; +import org.sunbird.keycloak.SSOManager; +import org.sunbird.keycloak.SSOServiceFactory; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @PrepareForTest({ diff --git a/service/src/test/java/org/sunbird/service/user/UserExtendedProfileReadTest.java b/service/src/test/java/org/sunbird/service/user/UserExtendedProfileReadTest.java index 963593f19a..1545d74fe1 100644 --- a/service/src/test/java/org/sunbird/service/user/UserExtendedProfileReadTest.java +++ b/service/src/test/java/org/sunbird/service/user/UserExtendedProfileReadTest.java @@ -26,7 +26,7 @@ import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; diff --git a/service/src/test/java/org/sunbird/service/user/UserProfileReadServiceTest.java b/service/src/test/java/org/sunbird/service/user/UserProfileReadServiceTest.java index eb28219788..48f20486f5 100644 --- a/service/src/test/java/org/sunbird/service/user/UserProfileReadServiceTest.java +++ b/service/src/test/java/org/sunbird/service/user/UserProfileReadServiceTest.java @@ -37,11 +37,11 @@ import org.sunbird.dao.user.impl.UserRoleDaoImpl; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.service.user.impl.UserExternalIdentityServiceImpl; diff --git a/service/src/test/java/org/sunbird/service/user/UserProfileReadTest.java b/service/src/test/java/org/sunbird/service/user/UserProfileReadTest.java index 80a6921bc7..765f1d0aa3 100644 --- a/service/src/test/java/org/sunbird/service/user/UserProfileReadTest.java +++ b/service/src/test/java/org/sunbird/service/user/UserProfileReadTest.java @@ -36,7 +36,7 @@ import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; -import org.sunbird.operations.ActorOperations; +import org.sunbird.operations.userorg.ActorOperations; import org.sunbird.request.Request; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; diff --git a/service/src/test/java/org/sunbird/service/user/UserTncServiceTest.java b/service/src/test/java/org/sunbird/service/user/UserTncServiceTest.java index 85e02e436a..1d31a9c7d2 100644 --- a/service/src/test/java/org/sunbird/service/user/UserTncServiceTest.java +++ b/service/src/test/java/org/sunbird/service/user/UserTncServiceTest.java @@ -22,7 +22,7 @@ import org.sunbird.common.ElasticSearchRestHighImpl; import org.sunbird.common.factory.EsClientFactory; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; diff --git a/service/src/test/java/org/sunbird/service/user/impl/TenantMigrationServiceImplTest.java b/service/src/test/java/org/sunbird/service/user/impl/TenantMigrationServiceImplTest.java index c45c873c14..fe5b03d3c6 100644 --- a/service/src/test/java/org/sunbird/service/user/impl/TenantMigrationServiceImplTest.java +++ b/service/src/test/java/org/sunbird/service/user/impl/TenantMigrationServiceImplTest.java @@ -19,7 +19,7 @@ import org.sunbird.cassandra.CassandraOperation; import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.request.Request; diff --git a/service/src/test/java/org/sunbird/util/otp/OTPUtilTest.java b/service/src/test/java/org/sunbird/util/otp/OTPUtilTest.java index 2c87189824..3555171f35 100644 --- a/service/src/test/java/org/sunbird/util/otp/OTPUtilTest.java +++ b/service/src/test/java/org/sunbird/util/otp/OTPUtilTest.java @@ -20,7 +20,7 @@ import org.sunbird.request.Request; import org.sunbird.request.RequestContext; import org.sunbird.service.otp.OTPService; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @PrepareForTest({ diff --git a/service/src/test/java/org/sunbird/util/ratelimit/RateLimitTest.java b/service/src/test/java/org/sunbird/util/ratelimit/RateLimitTest.java new file mode 100644 index 0000000000..ec6f3b5106 --- /dev/null +++ b/service/src/test/java/org/sunbird/util/ratelimit/RateLimitTest.java @@ -0,0 +1,51 @@ +package org.sunbird.util.ratelimit; + +import static org.junit.Assert.assertEquals; +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import org.sunbird.keys.JsonKey; + +public class RateLimitTest { + + @Test + public void testConstructorWithIntegerValues() { + Map map = new HashMap<>(); + map.put(JsonKey.RATE_LIMIT_UNIT, "HOUR"); + map.put(JsonKey.RATE, 10); + map.put(JsonKey.COUNT, 5); + map.put(JsonKey.TTL, 3600); + + RateLimit rateLimit = new RateLimit("testKey", map); + assertEquals(Integer.valueOf(10), rateLimit.getLimit()); + assertEquals(Integer.valueOf(5), rateLimit.getCount()); + assertEquals(Integer.valueOf(3600), rateLimit.getTTL()); + } + + @Test + public void testConstructorWithLongValues() { + Map map = new HashMap<>(); + map.put(JsonKey.RATE_LIMIT_UNIT, "DAY"); + map.put(JsonKey.RATE, 100L); + map.put(JsonKey.COUNT, 50L); + map.put(JsonKey.TTL, 86400L); + + // This would have thrown ClassCastException before the fix + RateLimit rateLimit = new RateLimit("testKey", map); + assertEquals(Integer.valueOf(100), rateLimit.getLimit()); + assertEquals(Integer.valueOf(50), rateLimit.getCount()); + assertEquals(Integer.valueOf(86400), rateLimit.getTTL()); + } + + @Test + public void testConstructorWithNullValues() { + Map map = new HashMap<>(); + map.put(JsonKey.RATE_LIMIT_UNIT, "MINUTE"); + // missing other keys + + RateLimit rateLimit = new RateLimit("testKey", map); + assertEquals(Integer.valueOf(0), rateLimit.getLimit()); + assertEquals(Integer.valueOf(0), rateLimit.getCount()); + assertEquals(Integer.valueOf(0), rateLimit.getTTL()); + } +} diff --git a/service/src/test/java/org/sunbird/util/user/GetUserOrgDetailsTest.java b/service/src/test/java/org/sunbird/util/user/GetUserOrgDetailsTest.java index 9f98a090f5..3b7ee29262 100644 --- a/service/src/test/java/org/sunbird/util/user/GetUserOrgDetailsTest.java +++ b/service/src/test/java/org/sunbird/util/user/GetUserOrgDetailsTest.java @@ -17,7 +17,7 @@ import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; import org.sunbird.response.Response; diff --git a/service/src/test/java/org/sunbird/util/user/SetUserDefaultValueTest.java b/service/src/test/java/org/sunbird/util/user/SetUserDefaultValueTest.java index 175f2a9dd6..dda89103b0 100644 --- a/service/src/test/java/org/sunbird/util/user/SetUserDefaultValueTest.java +++ b/service/src/test/java/org/sunbird/util/user/SetUserDefaultValueTest.java @@ -28,7 +28,7 @@ import org.sunbird.service.user.impl.UserLookUpServiceImpl; import org.sunbird.service.user.impl.UserServiceImpl; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.util.Util; @RunWith(PowerMockRunner.class) diff --git a/service/src/test/java/org/sunbird/util/user/ShadowUserMigrationServiceTest.java b/service/src/test/java/org/sunbird/util/user/ShadowUserMigrationServiceTest.java index 67d2ae250d..25ced36ad4 100644 --- a/service/src/test/java/org/sunbird/util/user/ShadowUserMigrationServiceTest.java +++ b/service/src/test/java/org/sunbird/util/user/ShadowUserMigrationServiceTest.java @@ -25,7 +25,7 @@ import org.sunbird.response.Response; import org.sunbird.service.user.ShadowUserMigrationService; import org.sunbird.service.user.impl.UserServiceImpl; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; @RunWith(PowerMockRunner.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) diff --git a/service/src/test/java/org/sunbird/util/user/UserExtendedProfileSchemaValidatorTest.java b/service/src/test/java/org/sunbird/util/user/UserExtendedProfileSchemaValidatorTest.java index 250d093879..61464c0a8d 100644 --- a/service/src/test/java/org/sunbird/util/user/UserExtendedProfileSchemaValidatorTest.java +++ b/service/src/test/java/org/sunbird/util/user/UserExtendedProfileSchemaValidatorTest.java @@ -14,7 +14,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.keys.JsonKey; import org.sunbird.util.DataCacheHandler; diff --git a/service/src/test/java/org/sunbird/util/user/UserLookupTest.java b/service/src/test/java/org/sunbird/util/user/UserLookupTest.java index 58ae8d172c..a911e1611f 100644 --- a/service/src/test/java/org/sunbird/util/user/UserLookupTest.java +++ b/service/src/test/java/org/sunbird/util/user/UserLookupTest.java @@ -21,7 +21,7 @@ import org.sunbird.cassandraimpl.CassandraOperationImpl; import org.sunbird.datasecurity.EncryptionService; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; diff --git a/service/src/test/java/org/sunbird/util/user/UserUtilTest.java b/service/src/test/java/org/sunbird/util/user/UserUtilTest.java index 43b2414862..6eeafaa9d7 100644 --- a/service/src/test/java/org/sunbird/util/user/UserUtilTest.java +++ b/service/src/test/java/org/sunbird/util/user/UserUtilTest.java @@ -29,7 +29,7 @@ import org.sunbird.datasecurity.impl.DefaultEncryptionServiceImpl; import org.sunbird.dto.SearchDTO; import org.sunbird.exception.ProjectCommonException; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.ServiceFactory; import org.sunbird.keys.JsonKey; import org.sunbird.model.user.User; @@ -37,7 +37,7 @@ import org.sunbird.request.RequestContext; import org.sunbird.response.Response; import org.sunbird.util.DataCacheHandler; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import scala.concurrent.Promise; @RunWith(PowerMockRunner.class) From fa2476867719a1d63e8c87160c8fa3895c57da99 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 14:41:22 +0530 Subject: [PATCH 16/17] refactor(cassandra): update cassandra-utils and add unit tests --- .../cassandraimpl/CassandraDACImpl.java | 2 +- .../cassandraimpl/CassandraOperationImpl.java | 2 +- .../org/sunbird/common/CassandraUtil.java | 2 +- .../CassandraConnectionManagerImpl.java | 4 +- .../CassandraOperationImplTest.java | 460 ++++++++++++++++++ .../org/sunbird/common/CassandraUtilTest.java | 95 ++++ .../resources/cassandra.config.properties | 2 + 7 files changed, 562 insertions(+), 5 deletions(-) create mode 100644 core/sunbird-cassandra-utils/src/test/java/org/sunbird/cassandraimpl/CassandraOperationImplTest.java create mode 100644 core/sunbird-cassandra-utils/src/test/java/org/sunbird/common/CassandraUtilTest.java create mode 100644 core/sunbird-cassandra-utils/src/test/resources/cassandra.config.properties diff --git a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraDACImpl.java b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraDACImpl.java index f326da923b..596d65203c 100644 --- a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraDACImpl.java +++ b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraDACImpl.java @@ -18,7 +18,7 @@ import org.sunbird.exception.ProjectCommonException; import org.sunbird.response.Response; import org.sunbird.request.RequestContext; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; /** * Extended Cassandra Data Access Component (DAC) implementation. diff --git a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraOperationImpl.java b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraOperationImpl.java index 741c3fd0ba..64bee72995 100644 --- a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraOperationImpl.java +++ b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/cassandraimpl/CassandraOperationImpl.java @@ -45,7 +45,7 @@ import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; import org.sunbird.request.RequestContext; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.helper.CassandraConnectionManager; import org.sunbird.helper.CassandraConnectionManagerImpl; import org.sunbird.helper.CassandraConnectionMngrFactory; diff --git a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/common/CassandraUtil.java b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/common/CassandraUtil.java index c3207683b9..9e685efd2c 100644 --- a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/common/CassandraUtil.java +++ b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/common/CassandraUtil.java @@ -30,7 +30,7 @@ import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; import org.sunbird.response.Response; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; /** * Utility class providing helper methods for Cassandra database operations. diff --git a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/helper/CassandraConnectionManagerImpl.java b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/helper/CassandraConnectionManagerImpl.java index b9a28cf242..7a1f619169 100644 --- a/core/sunbird-cassandra-utils/src/main/java/org/sunbird/helper/CassandraConnectionManagerImpl.java +++ b/core/sunbird-cassandra-utils/src/main/java/org/sunbird/helper/CassandraConnectionManagerImpl.java @@ -24,9 +24,9 @@ import org.sunbird.common.Constants; import org.sunbird.exception.ProjectCommonException; import org.sunbird.keys.JsonKey; -import org.sunbird.util.ProjectUtil; +import org.sunbird.common.ProjectUtil; import org.sunbird.common.CassandraPropertyReader; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; /** * Implementation of {@link CassandraConnectionManager} for managing Cassandra database connections. diff --git a/core/sunbird-cassandra-utils/src/test/java/org/sunbird/cassandraimpl/CassandraOperationImplTest.java b/core/sunbird-cassandra-utils/src/test/java/org/sunbird/cassandraimpl/CassandraOperationImplTest.java new file mode 100644 index 0000000000..c5f5fa79a6 --- /dev/null +++ b/core/sunbird-cassandra-utils/src/test/java/org/sunbird/cassandraimpl/CassandraOperationImplTest.java @@ -0,0 +1,460 @@ +package org.sunbird.cassandraimpl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.datastax.driver.core.BoundStatement; +import com.datastax.driver.core.ColumnDefinitions; +import com.datastax.driver.core.PreparedStatement; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.Session; +import com.datastax.driver.core.Statement; +import com.datastax.driver.core.CodecRegistry; +import com.datastax.driver.core.ProtocolVersion; +import com.datastax.driver.core.DataType; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.sunbird.common.CassandraPropertyReader; +import org.sunbird.common.Constants; +import org.sunbird.exception.ProjectCommonException; +import org.sunbird.response.ResponseCode; +import org.sunbird.helper.CassandraConnectionManager; +import org.sunbird.helper.CassandraConnectionMngrFactory; +import org.sunbird.keys.JsonKey; +import org.sunbird.request.RequestContext; +import org.sunbird.response.Response; + +/** + * Unit tests for {@link CassandraOperationImpl}. + * Uses Mockito and Reflection to mock dependencies like Cassandra Session and static Singletons. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({CassandraOperationImpl.class}) +public class CassandraOperationImplTest { + + private CassandraOperationImpl cassandraOperation; + + @Mock private CassandraConnectionManager connectionManager; + + @Mock private Session session; + + @Mock private PreparedStatement preparedStatement; + + @Mock private ColumnDefinitions columnDefinitions; + + @Mock private ResultSet resultSet; + + @Mock private RequestContext requestContext; + + @Mock private CassandraPropertyReader propertyReader; + + @Mock private BoundStatement boundStatement; + + @Before + public void setUp() throws Exception { + // Inject Mock ConnectionManager into Factory using Reflection + setSingletonInstance(CassandraConnectionMngrFactory.class, "instance", connectionManager); + + // Inject Mock PropertyReader into Factory using Reflection + setSingletonInstance(CassandraPropertyReader.class, "cassandraPropertyReader", propertyReader); + when(propertyReader.readProperty(anyString())).thenAnswer(i -> i.getArgument(0)); + when(propertyReader.readPropertyValue(anyString())).thenAnswer(i -> i.getArgument(0)); + + // Initialize concrete implementation + cassandraOperation = new CassandraOperationImplConcrete(); + // Inject connection manager into the operation instance + setField(cassandraOperation, "connectionManager", connectionManager); + + // Setup basic session behavior + when(connectionManager.getSession(anyString())).thenReturn(session); + when(session.prepare(anyString())).thenReturn(preparedStatement); + + // Setup PreparedStatement to allow BoundStatement creation (mocking real driver behavior) + when(preparedStatement.getVariables()).thenReturn(columnDefinitions); + when(columnDefinitions.size()).thenReturn(10); + + // Setup BoundStatement binding + when(preparedStatement.bind()).thenReturn(boundStatement); + when(preparedStatement.bind(any())).thenReturn(boundStatement); // Catch-all for varargs + when(boundStatement.bind(any())).thenReturn(boundStatement); + + // Mock execution + when(session.execute(any(BoundStatement.class))).thenReturn(resultSet); + when(session.execute(any(Statement.class))).thenReturn(resultSet); + + // Setup ResultSet to return success + when(resultSet.iterator()).thenReturn(Collections.emptyIterator()); + when(resultSet.getColumnDefinitions()).thenReturn(columnDefinitions); + when(columnDefinitions.asList()).thenReturn(Collections.emptyList()); + when(columnDefinitions.getType(anyInt())).thenReturn(DataType.text()); + + // Mock BoundStatement constructor to return our mock + PowerMockito.whenNew(BoundStatement.class).withAnyArguments().thenReturn(boundStatement); + } + + private void setSingletonInstance(Class clazz, String fieldName, Object instance) + throws Exception { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(null, instance); + } + + private void setField(Object target, String fieldName, Object value) throws Exception { + Field field = target.getClass().getSuperclass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(target, value); + } + + @Test + public void testInsertRecordSuccess() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map request = new HashMap<>(); + request.put("id", "123"); + request.put("name", "John"); + when(columnDefinitions.size()).thenReturn(request.size()); + + Response response = + cassandraOperation.insertRecord(keyspaceName, tableName, request, requestContext); + + assertEquals(Constants.SUCCESS, response.get(Constants.RESPONSE)); + verify(session, times(1)).execute(any(BoundStatement.class)); + } + + @Test + public void testUpdateRecordSuccess() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map request = new HashMap<>(); + request.put("id", "123"); + request.put("name", "John"); + + Response response = + cassandraOperation.updateRecord(keyspaceName, tableName, request, requestContext); + + assertEquals(Constants.SUCCESS, response.get(Constants.RESPONSE)); + verify(session, times(1)).execute(any(BoundStatement.class)); + } + + @Test + public void testDeleteRecordSuccess() { + String keyspaceName = "sunbird"; + String tableName = "user"; + String identifier = "123"; + + Response response = + cassandraOperation.deleteRecord(keyspaceName, tableName, identifier, requestContext); + + assertEquals(Constants.SUCCESS, response.get(Constants.RESPONSE)); + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testGetRecordById() { + String keyspaceName = "sunbird"; + String tableName = "user"; + String identifier = "123"; + + Response response = + cassandraOperation.getRecordById(keyspaceName, tableName, identifier, requestContext); + + assertNotNull(response); + List result = (List) response.get(Constants.RESPONSE); + assertEquals(0, result.size()); + } + + @Test + public void testGetRecordsByProperty() { + String keyspaceName = "sunbird"; + String tableName = "user"; + String propertyName = "name"; + String propertyValue = "John"; + + Response response = + cassandraOperation.getRecordsByProperty( + keyspaceName, tableName, propertyName, propertyValue, requestContext); + + assertNotNull(response); + List result = (List) response.get(Constants.RESPONSE); + assertEquals(0, result.size()); + } + + @Test + public void testBatchInsert() { + String keyspaceName = "sunbird"; + String tableName = "user"; + List> records = new ArrayList<>(); + Map record1 = new HashMap<>(); + record1.put("id", "1"); + records.add(record1); + + Response response = + cassandraOperation.batchInsert(keyspaceName, tableName, records, requestContext); + + assertEquals(Constants.SUCCESS, response.get(Constants.RESPONSE)); + // batchInsert uses session.execute(BatchStatement) which is a Statement + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testBatchUpdate() { + String keyspaceName = "sunbird"; + String tableName = "user"; + List>> list = new ArrayList<>(); + Map> record = new HashMap<>(); + Map pk = new HashMap<>(); + pk.put("id", "1"); + Map nonPk = new HashMap<>(); + nonPk.put("name", "updated"); + record.put(JsonKey.PRIMARY_KEY, pk); + record.put(JsonKey.NON_PRIMARY_KEY, nonPk); + list.add(record); + + Response response = + cassandraOperation.batchUpdate(keyspaceName, tableName, list, requestContext); + + assertEquals(Constants.SUCCESS, response.get(Constants.RESPONSE)); + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testUpsertRecord() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map request = new HashMap<>(); + request.put("id", "123"); + when(columnDefinitions.size()).thenReturn(request.size()); + + Response response = + cassandraOperation.upsertRecord(keyspaceName, tableName, request, requestContext); + + assertEquals(Constants.SUCCESS, response.get(Constants.RESPONSE)); + verify(session, times(1)).execute(any(BoundStatement.class)); + } + + @Test + public void testDeleteRecordsBulk() { + String keyspaceName = "sunbird"; + String tableName = "user"; + List ids = new ArrayList<>(); + ids.add("1"); + ids.add("2"); + + when(resultSet.wasApplied()).thenReturn(true); + + boolean result = + cassandraOperation.deleteRecords(keyspaceName, tableName, ids, requestContext); + + assertEquals(true, result); + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testGetRecordsByProperties() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map properties = new HashMap<>(); + properties.put("name", "John"); + + Response response = + cassandraOperation.getRecordsByProperties( + keyspaceName, tableName, properties, requestContext); + + assertNotNull(response); + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testInsertRecordWithTTL() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map request = new HashMap<>(); + request.put("id", "123"); + int ttl = 100; + + Response response = + cassandraOperation.insertRecordWithTTL( + keyspaceName, tableName, request, ttl, requestContext); + + // Expecting empty list because CassandraUtil.createResponse returns based on ResultSet rows (empty here) + // insertRecordWithTTL does NOT explicitly set SUCCESS like insertRecord does. + assertNotNull(response); + List result = (List) response.get(Constants.RESPONSE); + assertEquals(0, result.size()); + + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testUpdateRecordWithTTL() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map request = new HashMap<>(); + request.put("name", "John"); + Map compositeKey = new HashMap<>(); + compositeKey.put("id", "123"); + int ttl = 100; + + Response response = + cassandraOperation.updateRecordWithTTL( + keyspaceName, tableName, request, compositeKey, ttl, requestContext); + + // Expecting empty list, similar to insertRecordWithTTL + assertNotNull(response); + List result = (List) response.get(Constants.RESPONSE); + assertEquals(0, result.size()); + + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testBatchInsertLogged() { + String keyspaceName = "sunbird"; + String tableName = "user"; + List> records = new ArrayList<>(); + Map record = new HashMap<>(); + record.put("id", "1"); + records.add(record); + + Response response = + cassandraOperation.batchInsertLogged(keyspaceName, tableName, records, requestContext); + + assertEquals(Constants.SUCCESS, response.get(Constants.RESPONSE)); + verify(session, times(1)).execute(any(Statement.class)); // BatchStatement extends Statement + } + + @Test + public void testGetRecordsByCompositeKey() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map compositeKey = new HashMap<>(); + compositeKey.put("id", "123"); + compositeKey.put("type", "admin"); + + Response response = + cassandraOperation.getRecordsByCompositeKey( + keyspaceName, tableName, compositeKey, requestContext); + + assertNotNull(response); + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testGetRecordsByIdsWithSpecifiedColumns() { + String keyspaceName = "sunbird"; + String tableName = "user"; + List properties = new ArrayList<>(); + properties.add("name"); + List ids = new ArrayList<>(); + ids.add("1"); + + Response response = + cassandraOperation.getRecordsByIdsWithSpecifiedColumns( + keyspaceName, tableName, properties, ids, requestContext); + + assertNotNull(response); + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test + public void testSearchValueInList() { + String keyspaceName = "sunbird"; + String tableName = "user"; + String key = "roles"; + String value = "admin"; + + Response response = + cassandraOperation.searchValueInList(keyspaceName, tableName, key, value, requestContext); + + assertNotNull(response); + verify(session, times(1)).execute(any(Statement.class)); + } + + @Test(expected = ProjectCommonException.class) + public void testInsertRecordFailure() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map request = new HashMap<>(); + request.put("id", "123"); + + when(session.execute(any(BoundStatement.class))) + .thenThrow(new RuntimeException("DB Error")); + + cassandraOperation.insertRecord(keyspaceName, tableName, request, requestContext); + } + + @Test + public void testInsertRecordFailureUnknownIdentifier() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map request = new HashMap<>(); + request.put("id", "123"); + when(columnDefinitions.size()).thenReturn(request.size()); + + // Simulate "Unknown identifier" exception + when(session.execute(any(BoundStatement.class))) + .thenThrow(new RuntimeException("Unknown identifier column_x")); + + try { + cassandraOperation.insertRecord(keyspaceName, tableName, request, requestContext); + fail("Should throw ProjectCommonException"); + } catch (ProjectCommonException e) { + assertEquals(ResponseCode.invalidPropertyError.getErrorCode(), e.getErrorCode()); + } + } + + // Concrete implementation for testing abstract class + private static class CassandraOperationImplConcrete extends CassandraOperationImpl { + @Override + public Response getRecordsWithLimit( + String keyspace, + String table, + Map filters, + List fields, + Integer limit, + RequestContext requestContext) { + return null; + } + + @Override + public Response updateAddMapRecord( + String keySpace, + String table, + Map primaryKey, + String column, + String key, + Object value, + RequestContext requestContext) { + return null; + } + + @Override + public Response updateRemoveMapRecord( + String keySpace, + String table, + Map primaryKey, + String column, + String key, + RequestContext requestContext) { + return null; + } + } +} \ No newline at end of file diff --git a/core/sunbird-cassandra-utils/src/test/java/org/sunbird/common/CassandraUtilTest.java b/core/sunbird-cassandra-utils/src/test/java/org/sunbird/common/CassandraUtilTest.java new file mode 100644 index 0000000000..6ba6e49992 --- /dev/null +++ b/core/sunbird-cassandra-utils/src/test/java/org/sunbird/common/CassandraUtilTest.java @@ -0,0 +1,95 @@ +package org.sunbird.common; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.junit.Test; + +public class CassandraUtilTest { + + @Test + public void testGetPreparedStatement() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map map = new LinkedHashMap<>(); + map.put("id", "123"); + map.put("name", "John"); + map.put("email", "john@example.com"); + + String query = CassandraUtil.getPreparedStatement(keyspaceName, tableName, map); + + // Expected format: INSERT INTO sunbird.user(id,name,email) VALUES (?,?,?); + // Since map iteration order might vary if not LinkedHashMap, checking for containment is safer. + + assertTrue(query.startsWith("INSERT INTO sunbird.user(")); + assertTrue(query.contains("id")); + assertTrue(query.contains("name")); + assertTrue(query.contains("email")); + assertTrue(query.contains(") VALUES (?,?,?);")); + } + + @Test + public void testGetUpdateQueryStatement() { + String keyspaceName = "sunbird"; + String tableName = "user"; + Map map = new LinkedHashMap<>(); + map.put("id", "123"); + map.put("name", "John"); + map.put("email", "john@example.com"); + + String query = CassandraUtil.getUpdateQueryStatement(keyspaceName, tableName, map); + + // Expected format: UPDATE sunbird.user SET ... = ? ... where id = ? + + assertTrue(query.startsWith("UPDATE sunbird.user SET ")); + assertTrue(query.contains("name = ?")); + assertTrue(query.contains("email = ?")); + assertTrue(query.contains("where id = ?")); + } + + @Test + public void testGetSelectStatement() { + String keyspaceName = "sunbird"; + String tableName = "user"; + List properties = new ArrayList<>(); + properties.add("id"); + properties.add("name"); + + String query = CassandraUtil.getSelectStatement(keyspaceName, tableName, properties); + + // Using string concatenation in assertion might fail due to spaces, so be careful. + // The implementation: + // query.append(Constants.FROM + keyspaceName + Constants.DOT + tableName + Constants.WHERE + Constants.IDENTIFIER + Constants.EQUAL + " ?; "); + // Constants.FROM = " FROM " + // Constants.WHERE = " where " + // Constants.EQUAL = " = " + + String expected = "SELECT id,name FROM sunbird.user where id = ?; "; + assertEquals(expected, query); + } + + @Test + public void testGetSelectStatementVarArgs() { + String keyspaceName = "sunbird"; + String tableName = "user"; + + String query = CassandraUtil.getSelectStatement(keyspaceName, tableName, "id", "name"); + + String expected = "SELECT id,name FROM sunbird.user where id = ?; "; + assertEquals(expected, query); + } + + @Test + public void testProcessExceptionForUnknownIdentifier() { + String errorMsg = "Unknown identifier abc"; + Exception e = new Exception(errorMsg); + String processedMsg = CassandraUtil.processExceptionForUnknownIdentifier(e); + + assertNotNull(processedMsg); + } +} \ No newline at end of file diff --git a/core/sunbird-cassandra-utils/src/test/resources/cassandra.config.properties b/core/sunbird-cassandra-utils/src/test/resources/cassandra.config.properties new file mode 100644 index 0000000000..48cdac102a --- /dev/null +++ b/core/sunbird-cassandra-utils/src/test/resources/cassandra.config.properties @@ -0,0 +1,2 @@ +contactPoint=localhost +port=9042 \ No newline at end of file From e947af06be8b17136709e40df74fd30b4fd2d401 Mon Sep 17 00:00:00 2001 From: chethann007 Date: Thu, 5 Feb 2026 14:41:47 +0530 Subject: [PATCH 17/17] refactor(es-utils): update elasticsearch utilities and add unit tests --- core/sunbird-es-utils/pom.xml | 8 +- .../sunbird/common/ElasticSearchHelper.java | 2 +- .../common/ElasticSearchRestHighImpl.java | 6 +- .../common/ElasticSearchHelperTest.java | 254 ++++++++++++++++++ .../common/factory/EsClientFactoryTest.java | 30 +++ .../java/org/sunbird/dto/SearchDTOTest.java | 152 +++++++++++ .../sunbird/helper/ConnectionManagerTest.java | 58 ++++ .../main/java/org/sunbird/keys/JsonKey.java | 1 - 8 files changed, 505 insertions(+), 6 deletions(-) create mode 100644 core/sunbird-es-utils/src/test/java/org/sunbird/common/ElasticSearchHelperTest.java create mode 100644 core/sunbird-es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java create mode 100644 core/sunbird-es-utils/src/test/java/org/sunbird/dto/SearchDTOTest.java create mode 100644 core/sunbird-es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java diff --git a/core/sunbird-es-utils/pom.xml b/core/sunbird-es-utils/pom.xml index 7b03c0cb93..2cb25c2ea9 100644 --- a/core/sunbird-es-utils/pom.xml +++ b/core/sunbird-es-utils/pom.xml @@ -120,7 +120,7 @@ org.sunbird - platform-common + sunbird-platform-common 1.0-SNAPSHOT @@ -157,5 +157,11 @@ ${powermock.version} test + + org.mockito + mockito-inline + ${mockito.version} + test + diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java index 834960c359..61de6939cb 100644 --- a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchHelper.java @@ -1,6 +1,6 @@ package org.sunbird.common; -import static org.sunbird.util.ProjectUtil.isNotNull; +import static org.sunbird.common.ProjectUtil.isNotNull; import java.math.BigInteger; import java.util.ArrayList; diff --git a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java index 901e352512..3d71abcba2 100644 --- a/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java +++ b/core/sunbird-es-utils/src/main/java/org/sunbird/common/ElasticSearchRestHighImpl.java @@ -41,10 +41,10 @@ import org.sunbird.common.inf.ElasticSearchService; import org.sunbird.keys.JsonKey; import org.sunbird.logging.LoggerUtil; -import org.sunbird.util.ProjectUtil; -import org.sunbird.util.PropertiesCache; +import org.sunbird.common.ProjectUtil; +import org.sunbird.common.PropertiesCache; import org.sunbird.request.RequestContext; -import org.sunbird.exception.ResponseCode; +import org.sunbird.response.ResponseCode; import org.sunbird.dto.SearchDTO; import org.sunbird.helper.ConnectionManager; import scala.concurrent.Future; diff --git a/core/sunbird-es-utils/src/test/java/org/sunbird/common/ElasticSearchHelperTest.java b/core/sunbird-es-utils/src/test/java/org/sunbird/common/ElasticSearchHelperTest.java new file mode 100644 index 0000000000..ac258f631b --- /dev/null +++ b/core/sunbird-es-utils/src/test/java/org/sunbird/common/ElasticSearchHelperTest.java @@ -0,0 +1,254 @@ +package org.sunbird.common; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MatchQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.sort.SortOrder; +import org.junit.Test; +import org.sunbird.dto.SearchDTO; +import org.sunbird.keys.JsonKey; + +/** + * Unit tests for ElasticSearchHelper. + */ +public class ElasticSearchHelperTest { + + /** + * Test getSortOrder method. + * Verifies correct SortOrder enum is returned for valid strings and default is DESC. + */ + @Test + public void testGetSortOrder() { + assertEquals(SortOrder.ASC, ElasticSearchHelper.getSortOrder("ASC")); + assertEquals(SortOrder.ASC, ElasticSearchHelper.getSortOrder("asc")); + assertEquals(SortOrder.DESC, ElasticSearchHelper.getSortOrder("DESC")); + assertEquals(SortOrder.DESC, ElasticSearchHelper.getSortOrder("desc")); + assertEquals(SortOrder.DESC, ElasticSearchHelper.getSortOrder("invalid")); + } + + /** + * Test createMatchQuery method with boost. + */ + @Test + public void testCreateMatchQuery() { + MatchQueryBuilder query = ElasticSearchHelper.createMatchQuery("fieldName", "value", 1.5f); + assertNotNull(query); + assertEquals("fieldName", query.fieldName()); + assertEquals("value", query.value()); + } + + /** + * Test createMatchQuery method without boost. + */ + @Test + public void testCreateMatchQueryWithoutBoost() { + MatchQueryBuilder query = ElasticSearchHelper.createMatchQuery("fieldName", "value", null); + assertNotNull(query); + assertEquals("fieldName", query.fieldName()); + assertEquals("value", query.value()); + } + + /** + * Test getConstraints method with valid constraints. + */ + @Test + public void testGetConstraints() { + SearchDTO searchDTO = new SearchDTO(); + Map softConstraints = new HashMap<>(); + softConstraints.put("field1", 10); + softConstraints.put("field2", 5); + searchDTO.setSoftConstraints(softConstraints); + + Map constraints = ElasticSearchHelper.getConstraints(searchDTO); + assertNotNull(constraints); + assertEquals(2, constraints.size()); + assertEquals(10.0f, constraints.get("field1"), 0.001); + assertEquals(5.0f, constraints.get("field2"), 0.001); + } + + /** + * Test getConstraints method with empty constraints. + */ + @Test + public void testGetConstraintsEmpty() { + SearchDTO searchDTO = new SearchDTO(); + Map constraints = ElasticSearchHelper.getConstraints(searchDTO); + assertNotNull(constraints); + assertTrue(constraints.isEmpty()); + } + + /** + * Test calculateEndTime method. + */ + @Test + public void testCalculateEndTime() { + long startTime = System.currentTimeMillis(); + long endTime = ElasticSearchHelper.calculateEndTime(startTime); + assertTrue(endTime >= 0); + } + + /** + * Test createSearchDTO method with standard Integer limit/offset. + */ + @Test + public void testCreateSearchDTO() { + Map searchQueryMap = new HashMap<>(); + searchQueryMap.put(JsonKey.QUERY, "test query"); + searchQueryMap.put(JsonKey.LIMIT, 20); + searchQueryMap.put(JsonKey.OFFSET, 5); + + List fields = new ArrayList<>(); + fields.add("field1"); + searchQueryMap.put(JsonKey.FIELDS, fields); + + SearchDTO searchDTO = ElasticSearchHelper.createSearchDTO(searchQueryMap); + + assertNotNull(searchDTO); + assertEquals("test query", searchDTO.getQuery()); + assertEquals((Integer) 20, searchDTO.getLimit()); + assertEquals((Integer) 5, searchDTO.getOffset()); + assertEquals(fields, searchDTO.getFields()); + } + + /** + * Test createSearchDTO method with BigInteger limit/offset. + */ + @Test + public void testCreateSearchDTOWithBigInteger() { + Map searchQueryMap = new HashMap<>(); + searchQueryMap.put(JsonKey.LIMIT, BigInteger.valueOf(20)); + searchQueryMap.put(JsonKey.OFFSET, BigInteger.valueOf(5)); + + SearchDTO searchDTO = ElasticSearchHelper.createSearchDTO(searchQueryMap); + + assertNotNull(searchDTO); + assertEquals((Integer) 20, searchDTO.getLimit()); + assertEquals((Integer) 5, searchDTO.getOffset()); + } + + /** + * Test createLexicalQuery method for STARTS_WITH operation. + */ + @Test + public void testCreateLexicalQueryStartsWith() { + Map operation = new HashMap<>(); + operation.put(ElasticSearchHelper.STARTS_WITH, "prefix"); + QueryBuilder query = ElasticSearchHelper.createLexicalQuery("field", operation, null); + assertNotNull(query); + assertTrue(query.toString().contains("prefix")); + } + + /** + * Test createLexicalQuery method for ENDS_WITH operation. + */ + @Test + public void testCreateLexicalQueryEndsWith() { + Map operation = new HashMap<>(); + operation.put(ElasticSearchHelper.ENDS_WITH, "suffix"); + QueryBuilder query = ElasticSearchHelper.createLexicalQuery("field", operation, null); + assertNotNull(query); + assertTrue(query.toString().contains("~suffix")); + } + + /** + * Test addAdditionalProperties method for FILTERS. + */ + @Test + public void testAddAdditionalPropertiesFilters() { + BoolQueryBuilder query = QueryBuilders.boolQuery(); + Map entryValue = new HashMap<>(); + entryValue.put("status", "active"); + + Map.Entry entry = new java.util.AbstractMap.SimpleEntry<>(JsonKey.FILTERS, entryValue); + Map constraints = new HashMap<>(); + + ElasticSearchHelper.addAdditionalProperties(query, entry, constraints); + + String queryString = query.toString(); + assertTrue(queryString.contains("status.raw")); + assertTrue(queryString.contains("active")); + } + + /** + * Test addAdditionalProperties method for EXISTS. + */ + @Test + public void testAddAdditionalPropertiesExists() { + BoolQueryBuilder query = QueryBuilders.boolQuery(); + List fields = Arrays.asList("field1", "field2"); + + Map.Entry entry = new java.util.AbstractMap.SimpleEntry<>(JsonKey.EXISTS, fields); + Map constraints = new HashMap<>(); + + ElasticSearchHelper.addAdditionalProperties(query, entry, constraints); + + String queryString = query.toString(); + assertTrue(queryString.contains("exists")); + assertTrue(queryString.contains("field1")); + assertTrue(queryString.contains("field2")); + } + + /** + * Test addAdditionalProperties method for NOT_EXISTS. + */ + @Test + public void testAddAdditionalPropertiesNotExists() { + BoolQueryBuilder query = QueryBuilders.boolQuery(); + List fields = Arrays.asList("field1"); + + Map.Entry entry = new java.util.AbstractMap.SimpleEntry<>(JsonKey.NOT_EXISTS, fields); + Map constraints = new HashMap<>(); + + ElasticSearchHelper.addAdditionalProperties(query, entry, constraints); + + String queryString = query.toString(); + assertTrue(queryString.contains("must_not")); + assertTrue(queryString.contains("exists")); + assertTrue(queryString.contains("field1")); + } + + /** + * Test createFuzzyMatchQuery method. + */ + @Test + public void testCreateFuzzyMatchQuery() { + BoolQueryBuilder query = QueryBuilders.boolQuery(); + ElasticSearchHelper.createFuzzyMatchQuery(query, "name", "sunbird"); + + String queryString = query.toString(); + assertTrue(queryString.contains("fuzziness")); + assertTrue(queryString.contains("AUTO")); + } + + /** + * Test addAdditionalProperties method for NESTED_EXISTS. + */ + @Test + public void testAddAdditionalPropertiesNestedExists() { + BoolQueryBuilder query = QueryBuilders.boolQuery(); + Map nestedFields = new HashMap<>(); + nestedFields.put("nestedField", "nestedPath"); + + Map.Entry entry = new java.util.AbstractMap.SimpleEntry<>(JsonKey.NESTED_EXISTS, nestedFields); + Map constraints = new HashMap<>(); + + ElasticSearchHelper.addAdditionalProperties(query, entry, constraints); + + String queryString = query.toString(); + assertTrue(queryString.contains("nested")); + assertTrue(queryString.contains("nestedPath")); + assertTrue(queryString.contains("exists")); + assertTrue(queryString.contains("nestedField")); + } +} \ No newline at end of file diff --git a/core/sunbird-es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java b/core/sunbird-es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java new file mode 100644 index 0000000000..647d0c00bc --- /dev/null +++ b/core/sunbird-es-utils/src/test/java/org/sunbird/common/factory/EsClientFactoryTest.java @@ -0,0 +1,30 @@ +package org.sunbird.common.factory; + +import org.junit.Assert; +import org.junit.Test; +import org.sunbird.common.ElasticSearchRestHighImpl; +import org.sunbird.common.inf.ElasticSearchService; + +/** + * Unit tests for EsClientFactory. + */ +public class EsClientFactoryTest { + + /** + * Test getInstance method for "rest" client type. + */ + @Test + public void testGetRestClient() { + ElasticSearchService service = EsClientFactory.getInstance("rest"); + Assert.assertTrue(service instanceof ElasticSearchRestHighImpl); + } + + /** + * Test getInstance method for invalid client type. + */ + @Test + public void testInstanceNull() { + ElasticSearchService service = EsClientFactory.getInstance("test"); + Assert.assertNull(service); + } +} \ No newline at end of file diff --git a/core/sunbird-es-utils/src/test/java/org/sunbird/dto/SearchDTOTest.java b/core/sunbird-es-utils/src/test/java/org/sunbird/dto/SearchDTOTest.java new file mode 100644 index 0000000000..77cc83450d --- /dev/null +++ b/core/sunbird-es-utils/src/test/java/org/sunbird/dto/SearchDTOTest.java @@ -0,0 +1,152 @@ +package org.sunbird.dto; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Test; + +/** + * Unit tests for SearchDTO. + */ +public class SearchDTOTest { + + /** + * Test the default constructor of SearchDTO. + * Verifies that lists and maps are initialized and default values are set. + */ + @Test + public void testSearchDTODefaultConstructor() { + SearchDTO searchDTO = new SearchDTO(); + assertNotNull(searchDTO); + assertNotNull(searchDTO.getFacets()); + assertNotNull(searchDTO.getSortBy()); + assertNotNull(searchDTO.getAdditionalProperties()); + assertNotNull(searchDTO.getSoftConstraints()); + assertNotNull(searchDTO.getFuzzy()); + assertNotNull(searchDTO.getGroupQuery()); + assertNotNull(searchDTO.getMode()); + assertEquals((Integer) 1000, searchDTO.getLimit()); + assertEquals((Integer) 0, searchDTO.getOffset()); + } + + /** + * Test the parameterized constructor of SearchDTO. + * Verifies that properties, operation, and limit are set correctly. + */ + @Test + public void testSearchDTOParameterizedConstructor() { + List properties = new ArrayList<>(); + String operation = "AND"; + int limit = 50; + SearchDTO searchDTO = new SearchDTO(properties, operation, limit); + assertEquals(properties, searchDTO.getProperties()); + assertEquals(operation, searchDTO.getOperation()); + assertEquals((Integer) limit, searchDTO.getLimit()); + } + + /** + * Test all getters and setters of SearchDTO. + */ + @Test + public void testGettersAndSetters() { + SearchDTO searchDTO = new SearchDTO(); + + List properties = new ArrayList<>(); + searchDTO.setProperties(properties); + assertEquals(properties, searchDTO.getProperties()); + + List> facets = new ArrayList<>(); + searchDTO.setFacets(facets); + assertEquals(facets, searchDTO.getFacets()); + + List fields = new ArrayList<>(); + searchDTO.setFields(fields); + assertEquals(fields, searchDTO.getFields()); + + List excludedFields = new ArrayList<>(); + searchDTO.setExcludedFields(excludedFields); + assertEquals(excludedFields, searchDTO.getExcludedFields()); + + Map sortBy = new HashMap<>(); + searchDTO.setSortBy(sortBy); + assertEquals(sortBy, searchDTO.getSortBy()); + + String operation = "OR"; + searchDTO.setOperation(operation); + assertEquals(operation, searchDTO.getOperation()); + + String query = "test query"; + searchDTO.setQuery(query); + assertEquals(query, searchDTO.getQuery()); + + List queryFields = new ArrayList<>(); + searchDTO.setQueryFields(queryFields); + assertEquals(queryFields, searchDTO.getQueryFields()); + + Integer limit = 100; + searchDTO.setLimit(limit); + assertEquals(limit, searchDTO.getLimit()); + + Integer offset = 10; + searchDTO.setOffset(offset); + assertEquals(offset, searchDTO.getOffset()); + + boolean fuzzySearch = true; + searchDTO.setFuzzySearch(fuzzySearch); + assertTrue(searchDTO.isFuzzySearch()); + + Map additionalProperties = new HashMap<>(); + searchDTO.setAdditionalProperties(additionalProperties); + assertEquals(additionalProperties, searchDTO.getAdditionalProperties()); + + Map softConstraints = new HashMap<>(); + searchDTO.setSoftConstraints(softConstraints); + assertEquals(softConstraints, searchDTO.getSoftConstraints()); + + Map fuzzy = new HashMap<>(); + searchDTO.setFuzzy(fuzzy); + assertEquals(fuzzy, searchDTO.getFuzzy()); + + List> groupQuery = new ArrayList<>(); + searchDTO.setGroupQuery(groupQuery); + assertEquals(groupQuery, searchDTO.getGroupQuery()); + + List mode = new ArrayList<>(); + searchDTO.setMode(mode); + assertEquals(mode, searchDTO.getMode()); + } + + /** + * Test addAdditionalProperty and getAdditionalProperty methods. + */ + @Test + public void testAdditionalPropertyMethods() { + SearchDTO searchDTO = new SearchDTO(); + String key = "testKey"; + String value = "testValue"; + + searchDTO.addAdditionalProperty(key, value); + assertEquals(value, searchDTO.getAdditionalProperty(key)); + } + + /** + * Test setting and getting GroupQuery. + */ + @Test + public void testGroupQueryUsage() { + SearchDTO searchDTO = new SearchDTO(); + List> groupQuery = new ArrayList<>(); + Map query1 = new HashMap<>(); + query1.put("field", "value"); + groupQuery.add(query1); + + searchDTO.setGroupQuery(groupQuery); + assertEquals(1, searchDTO.getGroupQuery().size()); + assertEquals("value", searchDTO.getGroupQuery().get(0).get("field")); + } +} \ No newline at end of file diff --git a/core/sunbird-es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java b/core/sunbird-es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java new file mode 100644 index 0000000000..fe78695c1e --- /dev/null +++ b/core/sunbird-es-utils/src/test/java/org/sunbird/helper/ConnectionManagerTest.java @@ -0,0 +1,58 @@ +package org.sunbird.helper; + +import org.elasticsearch.action.bulk.BulkProcessor; +import org.elasticsearch.action.get.GetRequestBuilder; +import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.common.util.concurrent.FutureUtils; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.aggregations.Aggregations; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +/** + * Test class for ConnectionManager. + */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({ + "javax.management.*", + "javax.net.ssl.*", + "javax.security.*", + "jdk.internal.reflect.*", + "sun.security.ssl.*", + "javax.crypto.*" +}) +@PrepareForTest({ + ConnectionManager.class, + AcknowledgedResponse.class, + GetRequestBuilder.class, + BulkProcessor.class, + FutureUtils.class, + SearchHit.class, + SearchHits.class, + Aggregations.class +}) +public class ConnectionManagerTest { + + @Test + public void testGetRestClientNull() { + RestHighLevelClient client = ConnectionManager.getRestClient(); + try { + if (client == null) { + Assert.assertTrue(true); + } else { + Assert.assertNotNull(client); + } + } catch (Exception e) { + Assert.fail("Should not throw exception"); + } + } +} \ No newline at end of file diff --git a/core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java index 4f1211ea1c..abd81807e2 100644 --- a/core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java +++ b/core/sunbird-platform-common/src/main/java/org/sunbird/keys/JsonKey.java @@ -822,7 +822,6 @@ public final class JsonKey { public static final String IS_BLOCKED = "isBlocked"; public static final String OTP_EMAIL_RESET_PASSWORD_TEMPLATE = "otpEmailResetPasswordTemplate"; public static final String OTP_PHONE_RESET_PASSWORD_TEMPLATE = "otpPhoneResetPasswordTemplate"; - public static final String VERIFY_EMAIL_OTP_TEMPLATE = "verifyEmailOtpTemplate"; public static final String VERIFY_PHONE_OTP_TEMPLATE = "verifyPhoneOtpTemplate"; public static final String TERMS = "terms"; public static final String SUNBIRD_INSTALLATION_DISPLAY_NAME = "sunbird_installation_display_name_for_sms";