/* * eGov suite of products aim to improve the internal efficiency,transparency, * accountability and the service delivery of the government organizations. * * Copyright (C) <2015> eGovernments Foundation * * The updated version of eGov suite of products as by eGovernments Foundation * is available at http://www.egovernments.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program 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 for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ or * http://www.gnu.org/licenses/gpl.html . * * In addition to the terms of the GPL license to be adhered to in using this * program, the following additional terms are to be complied with: * * 1) All versions of this program, verbatim or modified must carry this * Legal Notice. * * 2) Any misrepresentation of the origin of the material is prohibited. It * is required that all modified versions of this material be marked in * reasonable ways as different from the original version. * * 3) This license does not grant any rights to any user of the program * with regards to rights under trademark law for use of the trade names * or trademarks of eGovernments Foundation. * * In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org. */ package org.egov.infstr.utils; import org.egov.infra.exception.ApplicationRuntimeException; import org.egov.infra.config.core.ApplicationThreadLocals; import org.hibernate.Query; import org.hibernate.Session; import org.infinispan.manager.EmbeddedCacheManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PreDestroy; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import static org.apache.commons.lang.StringUtils.EMPTY; import static org.apache.commons.lang.StringUtils.isNotBlank; @Deprecated public class EgovMasterDataCaching { private static final Logger LOGGER = LoggerFactory.getLogger(EgovMasterDataCaching.class); private static final String SQL_QUERY_TYPE = "sql"; private static final String HQL_QUERY_TYPE = "hql"; private static final String PATH_DELIM = "/"; private static final String SQL_TAG_PREFIX = "sql."; private static final String CONFIG_FILE_SUFFIX = "_sqlconfig.xml"; private static EmbeddedCacheManager CACHE_MANAGER; @PersistenceContext private EntityManager entityManager; static { try { final Context context = new InitialContext(); CACHE_MANAGER = (EmbeddedCacheManager) context.lookup("java:jboss/infinispan/container/master-data"); } catch (final NamingException e) { throw new ApplicationRuntimeException("Error occurred while getting Cache Manager", e); } } /** * This method load the data for given sqlTagName and puts it in Cache. * @param sqlTagName the sql tag name * @return List * @throws ApplicationRuntimeException the eGOV runtime exception */ public List get(final String sqlTagName) throws ApplicationRuntimeException { final String temp[] = sqlTagName.split("-"); final String domainName = ApplicationThreadLocals.getDomainName(); final String applName = temp[0]; List<Object> dataList = null; HashMap<String, Object> cacheValuesHashMap = new HashMap<String, Object>(); try { cacheValuesHashMap = (HashMap<String, Object>) CACHE_MANAGER.getCache() .get(applName + PATH_DELIM + domainName + PATH_DELIM + sqlTagName); if (cacheValuesHashMap != null) dataList = (List<Object>) cacheValuesHashMap.get(sqlTagName); if (dataList == null || dataList.isEmpty()) { final String type = EGovConfig .getProperty(applName + CONFIG_FILE_SUFFIX, "type", EMPTY, SQL_TAG_PREFIX + sqlTagName).trim(); if (type.equalsIgnoreCase("java")) { final String className = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "class", EMPTY, SQL_TAG_PREFIX + sqlTagName); final String methodName = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "method", EMPTY, SQL_TAG_PREFIX + sqlTagName); final String parametertype = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "parametertype", EMPTY, SQL_TAG_PREFIX + sqlTagName); final String parametervalue = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "parametervalue", EMPTY, SQL_TAG_PREFIX + sqlTagName); if (isNotBlank(className) && isNotBlank(methodName)) dataList = loadJavaAPIMasterDataList(className, methodName, parametertype.split(","), parametervalue.split(",")); else throw new ApplicationRuntimeException("ClassName and MethodName should be mentioned for " + type + " in " + applName + CONFIG_FILE_SUFFIX); } else if (type.equalsIgnoreCase(HQL_QUERY_TYPE) || type.equalsIgnoreCase(SQL_QUERY_TYPE)) { final String query = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "query", EMPTY, SQL_TAG_PREFIX + sqlTagName); if (!query.equalsIgnoreCase(EMPTY)) dataList = loadQLMasterData(query, type); else throw new ApplicationRuntimeException( "Query should be mentioned for " + type + " in " + applName + CONFIG_FILE_SUFFIX); } else throw new ApplicationRuntimeException("This type (" + type + ") is not supported for " + sqlTagName); final HashMap<String, Object> hm = new HashMap<String, Object>(); hm.put(sqlTagName, dataList); CACHE_MANAGER.getCache().put(applName + PATH_DELIM + domainName + PATH_DELIM + sqlTagName, hm); } else LOGGER.info("EgovMasterDataCaching: Got directly from cache, not from db"); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching", e); } return dataList; } /** * This method load the data for given sqlTagName and puts it in Cache. * @param sqlTagName the sql tag name * @return Map * @throws ApplicationRuntimeException the eGOV runtime exception */ public Map getMap(final String sqlTagName) throws ApplicationRuntimeException { Map dataMap = new HashMap(); final String temp[] = sqlTagName.split("-"); final String applName = temp[0]; final String domainName = ApplicationThreadLocals.getDomainName(); final String type = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "type", EMPTY, SQL_TAG_PREFIX + sqlTagName) .trim(); try { if (type.trim().equalsIgnoreCase(SQL_QUERY_TYPE)) { final List dataList = get(sqlTagName); if (dataList != null) { final Iterator itr = dataList.iterator(); LabelValueBean obj = null; while (itr.hasNext()) { obj = (LabelValueBean) itr.next(); dataMap.put(Integer.toString(obj.getId()), obj.getName()); obj = null; } } } else if (type.equalsIgnoreCase(HQL_QUERY_TYPE)) throw new ApplicationRuntimeException("getMap() is not supported for HQL query"); else if (type.equalsIgnoreCase("java")) { final String className = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "class", EMPTY, SQL_TAG_PREFIX + sqlTagName); final String methodName = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "method", EMPTY, SQL_TAG_PREFIX + sqlTagName); final String parametertype = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "parametertype", EMPTY, SQL_TAG_PREFIX + sqlTagName); final String parametervalue = EGovConfig.getProperty(applName + CONFIG_FILE_SUFFIX, "parametervalue", EMPTY, SQL_TAG_PREFIX + sqlTagName); if (isNotBlank(className) && isNotBlank(methodName)) dataMap = loadJavaAPIMasterDataMap(className, methodName, parametertype.split(","), parametervalue.split(",")); else throw new ApplicationRuntimeException( "ClassName and MethodName should be mentioned for " + type + " in " + applName + CONFIG_FILE_SUFFIX); final HashMap<String, Object> hm = new HashMap<String, Object>(); hm.put(sqlTagName, dataMap); CACHE_MANAGER.getCache().put(applName + PATH_DELIM + domainName + PATH_DELIM + sqlTagName, hm); } else throw new ApplicationRuntimeException("This type (" + type + ") is not supported for " + sqlTagName); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching getMap", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching getMap", e); } return dataMap; } public static EmbeddedCacheManager getCACHE_MANAGER() { return CACHE_MANAGER; } /** * This method removes the data from cache for given sqlTagName. * @param sqlTagName the sql tag name * @return void * @throws ApplicationRuntimeException the eGOV runtime exception */ public static void removeFromCache(final String sqlTagName) throws ApplicationRuntimeException { try { final String temp[] = sqlTagName.split("-"); final String domainName = ApplicationThreadLocals.getDomainName(); final String applName = temp[0]; CACHE_MANAGER.getCache().remove(applName + PATH_DELIM + domainName + PATH_DELIM + sqlTagName); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching removeFromCache", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching removeFromCache", e); } } /** * This method loads the data for Hql and Sql queries. * @param query the query * @param queryType the query type * @return List * @throws ApplicationRuntimeException the eGOV runtime exception */ private List loadQLMasterData(final String query, final String queryType) throws ApplicationRuntimeException { List list = null; try { if (queryType.trim().equalsIgnoreCase(HQL_QUERY_TYPE)) list = queryByHibernate(query); else if (queryType.trim().equalsIgnoreCase(SQL_QUERY_TYPE)) list = queryByJdbc(query); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching loadQLMasterData", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching loadQLMasterData", e); } return list; } /** * This method loads the data for type Java API. * @param className the class name * @param methodName the method name * @param parametertype the parametertype * @param parametervalue the parametervalue * @return List * @throws ApplicationRuntimeException the eGOV runtime exception */ private List loadJavaAPIMasterDataList(final String className, final String methodName, final String parametertype[], final String parametervalue[]) throws ApplicationRuntimeException { List list = null; try { if (parametertype.length != parametervalue.length) throw new ApplicationRuntimeException("Number of parameter types and parameter values doesnt match"); final Class cls = Class.forName(className); final Method method = cls.getMethod(methodName, loadMethodParameter(parametertype)); list = (List) method.invoke(cls.newInstance(), loadMethodArguments(parametertype, parametervalue)); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching loadJavaAPIMasterDataList", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching loadJavaAPIMasterDataList", e); } return list; } /** * This method loads the data for type Java API. * @param className the class name * @param methodName the method name * @param parametertype the parametertype * @param parametervalue the parametervalue * @return Map * @throws ApplicationRuntimeException the eGOV runtime exception */ private Map loadJavaAPIMasterDataMap(final String className, final String methodName, final String parametertype[], final String parametervalue[]) throws ApplicationRuntimeException { Map dataMap = new HashMap(); try { if (parametertype.length != parametervalue.length) throw new ApplicationRuntimeException("Number of parameter types and parameter values doesnt match"); final Class cls = Class.forName(className); final Method method = cls.getMethod(methodName, loadMethodParameter(parametertype)); dataMap = (HashMap) method.invoke(cls.newInstance(), loadMethodArguments(parametertype, parametervalue)); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching loadJavaAPIMasterDataMap", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching loadJavaAPIMasterDataMap", e); } return dataMap; } /** * This method dynamically loads the parameters for a method i.e * <parametertype>java.lang.String\,java.lang.Integer\,java.lang.String</parametertype> * @param parametertype the parametertype * @return Class[] * @throws ApplicationRuntimeException the eGOV runtime exception */ private Class[] loadMethodParameter(final String parametertype[]) throws ApplicationRuntimeException { Class[] class_name = null; try { if (!parametertype[0].trim().equalsIgnoreCase(EMPTY)) { class_name = new Class[parametertype.length]; for (int i = 0; i < parametertype.length; i++) class_name[i] = Class.forName(parametertype[i]); } } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching loadMethodParameter", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching loadMethodParameter", e); } return class_name; } /** * This method dynamically loads the arguments for a method i.e <parametervalue>1\,10\,11</parametervalue> * @param parametertype the parametertype * @param parametervalue the parametervalue * @return Object[] * @throws ApplicationRuntimeException the eGOV runtime exception */ private Object[] loadMethodArguments(final String parametertype[], final String parametervalue[]) throws ApplicationRuntimeException { Object[] obj_name = null; try { if (!parametertype[0].trim().equalsIgnoreCase(EMPTY)) { obj_name = new Object[parametervalue.length]; for (int i = 0; i < parametertype.length; i++) if (parametertype[i].trim().equalsIgnoreCase("java.lang.Integer")) obj_name[i] = Integer.valueOf(parametervalue[i]); else if (parametertype[i].trim().equalsIgnoreCase("java.lang.Double")) obj_name[i] = Double.valueOf(parametervalue[i]); else if (parametertype[i].trim().equalsIgnoreCase("java.lang.String")) obj_name[i] = parametervalue[i]; else throw new ApplicationRuntimeException("This " + parametertype[i] + " datatype is not supported"); } } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching loadMethodArguments", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching loadMethodArguments", e); } return obj_name; } /** * This method executes a hibernate query. * @param query the query * @return List * @throws ApplicationRuntimeException the eGOV runtime exception */ private List queryByHibernate(final String query) throws ApplicationRuntimeException { List list = null; try { final Query qry = getCurrentSession().createQuery(query); list = qry.list(); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching queryByHibernate", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching queryByHibernate", e); } return list; } private Session getCurrentSession() { return entityManager.unwrap(Session.class); } /** * This method executes a sql query. * @param query the query * @return List * @throws ApplicationRuntimeException the eGOV runtime exception */ private List queryByJdbc(final String query) throws ApplicationRuntimeException { List resultlist = null; List returnList = null; try { resultlist = getCurrentSession().createSQLQuery(query).list(); if (resultlist != null) returnList = resultSetToArrayList(resultlist); } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching queryByJdbc", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching queryByJdbc", e); } return returnList; } /** * This method returns a list of LabelValueBean using the resultList object. * @param resultList the rs * @return List * @throws ApplicationRuntimeException the eGOV runtime exception */ private List resultSetToArrayList(final List<Object[]> resultList) throws ApplicationRuntimeException { final List list = new ArrayList(); LabelValueBean labelValueBean = null; BigDecimal id; try { for (final Object[] objArr : resultList) { labelValueBean = new LabelValueBean(); id = (BigDecimal) objArr[0]; labelValueBean.setId(id.intValue()); labelValueBean.setName((String) objArr[1]); list.add(labelValueBean); } } catch (final Exception e) { LOGGER.error("Error occurred in EgovMasterDataCaching resultSetToArrayList", e); throw new ApplicationRuntimeException("Error occurred in EgovMasterDataCaching resultSetToArrayList", e); } return list; } @PreDestroy public void destroy() { if (CACHE_MANAGER != null && CACHE_MANAGER.isDefaultRunning()) CACHE_MANAGER.stop(); } }