com.krawler.esp.hibernate.impl.reportMethods.java Source code

Java tutorial

Introduction

Here is the source code for com.krawler.esp.hibernate.impl.reportMethods.java

Source

/*
 * Copyright (C) 2012  Krawler Information Systems Pvt Ltd
 * All rights reserved.
 * 
 * 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 2
 * of the License, or (at your option) 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package com.krawler.esp.hibernate.impl;

import com.krawler.common.service.ServiceException;
import com.krawler.common.util.StringUtil;
import com.krawler.esp.utils.PropsValues;
import com.krawler.esp.database.ReportHandlers;
import com.krawler.formbuilder.servlet.ReportBuilderDao;
import com.krawler.portal.util.TextFormatter;
import com.krawler.spring.sessionHandler.sessionHandlerImpl;
import com.krawler.utils.json.base.JSONArray;
import com.krawler.utils.json.base.JSONObject;
import java.lang.reflect.Field;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.*;
import java.util.*;
import java.util.ArrayList;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.ForeignKey;
import org.hibernate.mapping.Table;
import org.springframework.orm.hibernate3.HibernateTemplate;

public class reportMethods extends ReportHandlers {
    private ReportBuilderDao reportDao;

    public reportMethods(ReportBuilderDao reportDao, sessionHandlerImpl sessionHandlerDao) {
        super();
        this.reportDao = reportDao;
        this.sessionHandlerDao = sessionHandlerDao;
    }

    public String loadData(HttpServletRequest request) throws ServiceException {
        String result = "{data:[],count : 0}";
        try {
            String reportid = request.getParameter("reportid");
            String query = null;
            Configuration cfg = getConfig();
            java.util.Iterator itr = cfg.getTableMappings();
            HashMap<String, Table> tableObj = new HashMap<String, Table>();
            while (itr.hasNext()) {
                Table table = (Table) itr.next();
                tableObj.put(PropsValues.PACKAGE_PATH + "." + table.getName(), table);
            }
            //Fetch all reference tables in report
            mb_reportlist report = (mb_reportlist) get(mb_reportlist.class, reportid);
            query = "Select distinct mb_gridconfig.reftable as tablename from " + PropsValues.PACKAGE_PATH
                    + ".mb_gridconfig as mb_gridconfig where mb_gridconfig.reportid = ? and mb_gridconfig.countflag = ? ";
            List ls = find(query, new Object[] { report, false });
            java.util.Iterator ite = ls.iterator();
            String str = "";
            ArrayList<String> refTableList1 = new ArrayList<String>();
            HashMap<String, String> shortTableNames = new HashMap<String, String>();
            while (ite.hasNext()) {
                String reftablename = (String) ite.next();
                if (!StringUtil.isNullOrEmpty(reftablename)) {
                    refTableList1.add(PropsValues.PACKAGE_PATH + "." + reftablename);
                    shortTableNames.put(PropsValues.PACKAGE_PATH + "." + reftablename, reftablename);
                }
            }
            //If new table created not present in arraylist then it is added forcefully
            String reportTName = reportDao.getReportTableName(reportid);
            if (!StringUtil.isNullOrEmpty(reportTName)
                    && !refTableList1.contains(PropsValues.PACKAGE_PATH + "." + reportTName)) {
                refTableList1.add(PropsValues.PACKAGE_PATH + "." + reportTName);
                shortTableNames.put(PropsValues.PACKAGE_PATH + "." + reportTName, reportTName);
            }

            ArrayList<String> refTableList = new ArrayList<String>();
            ArrayList<String> primaryTableList = new ArrayList<String>();
            HashMap<String, ArrayList<String>> parentTableObj = new HashMap<String, ArrayList<String>>();
            HashMap<String, ArrayList<String>> colNameObj = new HashMap<String, ArrayList<String>>();
            //Make list of reference tables which does not have any relationship with another ref. tables
            //Sort all reference tables in relationship order i.e. form child - parent
            for (int i = 0; i < refTableList1.size(); i++) {
                String reftablename = refTableList1.get(i);
                Table tb = tableObj.get(reftablename);
                Iterator FkIte = tb.getForeignKeyIterator();
                if (FkIte.hasNext()) {
                    boolean flg = false;
                    ArrayList<String> parentTName1 = new ArrayList<String>();
                    ArrayList<String> colName1 = new ArrayList<String>();
                    while (FkIte.hasNext()) { //Always keep foreign key name = parent tablename + primary column name
                        ForeignKey obj = (ForeignKey) FkIte.next();
                        String parentTName = obj.getReferencedEntityName();
                        Column col = (Column) obj.getColumns().iterator().next();
                        String colName = col.getName();
                        if (refTableList1.contains(parentTName)) {
                            if (primaryTableList.contains(parentTName)) {
                                primaryTableList.remove(parentTName);
                            }
                            if (refTableList.contains(parentTName)) {
                                refTableList.remove(parentTName);
                                if (!refTableList.contains(reftablename)) {
                                    refTableList.add(reftablename);
                                }
                                refTableList.add(parentTName);
                            } else if (!refTableList.contains(reftablename)) {
                                refTableList.add(reftablename);
                            }
                            parentTName1.add(parentTName);
                            colName1.add(colName);

                            flg = true;
                        } else {
                            if (!refTableList.contains(reftablename)) {
                                refTableList.add(reftablename);
                                flg = true;
                            }
                            continue;
                        }
                    }

                    parentTableObj.put(reftablename, parentTName1);
                    colNameObj.put(reftablename, colName1);

                    if (!flg) {
                        primaryTableList.add(reftablename);
                    }
                } else if (!FkIte.hasNext()) {
                    //Check whether reference table is already part of parentTableObj.
                    //If yes then not to add in primaryList
                    boolean flg = true;
                    Iterator temp = parentTableObj.keySet().iterator();
                    while (temp.hasNext()) {
                        ArrayList<String> ttemp = (ArrayList<String>) parentTableObj.get(temp.next());
                        for (int l = 0; l < ttemp.size(); l++) {
                            if (ttemp.contains(reftablename)) {
                                flg = false;
                                break;
                            }
                        }
                        if (!flg) {
                            break;
                        }
                    }
                    if (flg) {
                        primaryTableList.add(reftablename);
                    }
                }
            }
            String delQuery = "";
            for (int i = 0; i < refTableList.size(); i++) {
                String reftablename = refTableList.get(i);
                ArrayList<String> parentTName = parentTableObj.get(reftablename);
                ArrayList<String> colName = colNameObj.get(reftablename);

                for (int j = 0; j < parentTName.size(); j++) {
                    String shortRefTName = shortTableNames.get(reftablename);
                    String shortParentTName = shortTableNames.get(parentTName.get(j));
                    if (StringUtil.isNullOrEmpty(str)) {
                        str += reftablename + " as " + shortRefTName + " inner join " + shortRefTName + "."
                                + colName.get(j) + " as " + shortParentTName;
                        delQuery += shortRefTName + ".deleteflag = 0 and " + shortParentTName + ".deleteflag = 0 ";
                    } else if (str.contains(shortRefTName)) {
                        //if reference table is already part of query then use alias
                        str += " inner join " + shortRefTName + "." + colName.get(j) + " as " + shortParentTName;
                        if (!delQuery.contains(shortParentTName)) {
                            delQuery += " and " + shortParentTName + ".deleteflag = 0 ";
                        }
                    } else {
                        //otherwise use full path
                        str += " inner join " + reftablename + "." + colName.get(j) + " as " + shortParentTName;
                        if (!delQuery.contains(shortParentTName)) {
                            delQuery += " and " + shortParentTName + ".deleteflag = 0 ";
                        }
                    }
                }
            }

            String primaryTableQuery = "";
            for (int i = 0; i < primaryTableList.size(); i++) {
                String reftablename = primaryTableList.get(i);
                String shortRefTName = shortTableNames.get(reftablename);

                if (StringUtil.isNullOrEmpty(delQuery)) {
                    delQuery += shortRefTName + ".deleteflag = 0 ";
                } else if (!delQuery.contains(shortRefTName)) {
                    delQuery += " and " + shortRefTName + ".deleteflag = 0 ";
                }

                if (StringUtil.isNullOrEmpty(primaryTableQuery)) {
                    primaryTableQuery += " from " + reftablename + " as " + shortRefTName;
                } else {
                    primaryTableQuery += " , " + reftablename + " as " + shortRefTName;
                }
            }
            String finalQuery = "";
            if (!StringUtil.isNullOrEmpty(primaryTableQuery)) {
                finalQuery += primaryTableQuery;
            }
            if (!StringUtil.isNullOrEmpty(str)) {
                if (StringUtil.isNullOrEmpty(finalQuery)) {
                    finalQuery = " from " + str;
                } else {
                    finalQuery += ", " + str;
                }
            }

            //Fetch all display columns
            String SELECT_QUERY = "select mb_gridconfig.name, mb_gridconfig.xtype, mb_gridconfig.combogridconfig, mb_gridconfig.countflag, mb_gridconfig.reftable from com.krawler.esp.hibernate.impl.mb_gridconfig as mb_gridconfig"
                    + " where mb_gridconfig.reportid = ?";
            List list = find(SELECT_QUERY, new Object[] { report });
            ite = list.iterator();
            String fieldQuery = "";
            ArrayList<String> fieldNameArray = new ArrayList<String>();
            ArrayList<String> countFieldNameArray = new ArrayList<String>();
            while (ite.hasNext()) {
                Object[] row = (Object[]) ite.next();
                String fieldName = row[0].toString();
                String xtype = row[1].toString();
                String combogridconfig = "-1";
                if (row[2] != null) {
                    combogridconfig = row[2].toString();
                }
                //Check for count flag
                if (row[3] != null && Boolean.parseBoolean(row[3].toString())) {//countFlag
                    countFieldNameArray.add(row[4].toString());
                } else {
                    fieldNameArray.add(fieldName);
                    String className = "";
                    if (xtype.equals("Combobox") && combogridconfig.equals("-1")) {
                        className = fieldName.split(PropsValues.REPORT_HARDCODE_STR)[0];
                        fieldName = className + "." + getPrimaryColName(className);
                    } else {
                        fieldName = fieldName.replaceAll(PropsValues.REPORT_HARDCODE_STR, ".");
                    }
                    fieldQuery += fieldName + ",";
                }
            }

            if (StringUtil.isNullOrEmpty(fieldQuery)) {
                fieldQuery = "Select * ";
            } else {
                fieldQuery = "Select " + fieldQuery.substring(0, fieldQuery.length() - 1);
            }

            //Check for mapping filter
            String filterQry = "";
            if (Boolean.parseBoolean(request.getParameter("isFilter"))) {
                //                filterQry = " "+reportTName+"."+request.getParameter("filterfield").split(PropsValues.REPORT_HARDCODE_STR)[1]+" = '"+request.getParameter("filtervalue")+"'";
                filterQry = request.getParameter("filterfield").replaceAll(PropsValues.REPORT_HARDCODE_STR, ".")
                        + " = '" + request.getParameter("filtervalue") + "'";
            }

            if (!StringUtil.isNullOrEmpty(delQuery)) {
                if (!StringUtil.isNullOrEmpty(filterQry)) {
                    delQuery = " where " + filterQry + " and " + delQuery;
                } else {
                    delQuery = " where " + delQuery;
                }
            }

            //Check for comments
            SELECT_QUERY = "select mb_moduleConfigMap.configid.configid from com.krawler.esp.hibernate.impl.mb_moduleConfigMap "
                    + "as mb_moduleConfigMap where mb_moduleConfigMap.moduleid = ? ";
            List configlist = find(SELECT_QUERY, new Object[] { report });
            ite = configlist.iterator();
            boolean commentFlag = false;
            boolean docFlag = false;
            while (ite.hasNext()) {
                int configid = (Integer) ite.next();
                if (configid == 1) { // Comments
                    commentFlag = true;
                } else if (configid == 2) { // Documents
                    docFlag = true;
                }
            }

            JSONObject jobj = new JSONObject();
            int count = 0;

            String searchFilter = "";

            if (request.getParameter("filterJson") != null && !request.getParameter("filterJson").equals("")) {
                JSONArray filterJsonObj = new JSONArray(request.getParameter("filterJson"));
                JSONObject ObjJSONObject = null;
                String substr = "";
                String reportClassName = "";

                for (int i = 0; i < filterJsonObj.length(); i++) {
                    ObjJSONObject = (JSONObject) filterJsonObj.get(i);
                    reportClassName = ObjJSONObject.getString("column").split(PropsValues.REPORT_HARDCODE_STR)[0];
                    if (ObjJSONObject.getString("xtype").equals("Date")) {
                        String[] splitString = ObjJSONObject.getString("searchText").split(",");
                        String fromDate = splitString[0];
                        String toDate = splitString[1];
                        substr = " >= '" + fromDate + " 00:00:00" + "'" + " and " + reportClassName + "."
                                + ObjJSONObject.getString("column").split(PropsValues.REPORT_HARDCODE_STR)[1]
                                + " <= '" + toDate + " 00:00:00" + "'";
                    } else if (ObjJSONObject.getString("xtype").equals("Number(Integer)")
                            || ObjJSONObject.getString("xtype").equals("Number(Float)")) {
                        substr = " = " + ObjJSONObject.getString("searchText");

                    } else if (ObjJSONObject.getString("xtype").equals("radio")
                            || ObjJSONObject.getString("xtype").equalsIgnoreCase("checkbox")) {
                        substr = " = " + Boolean.parseBoolean(ObjJSONObject.getString("searchText"));
                    } else if (ObjJSONObject.getString("xtype").equals("Combobox")) {
                        substr = " = '" + ObjJSONObject.getString("searchText") + "'";

                        if (!ObjJSONObject.getString("combogridconfig").equals("-1")) {
                            searchFilter += " and " + reportClassName + "."
                                    + ObjJSONObject.getString("column").split(PropsValues.REPORT_HARDCODE_STR)[1]
                                    + substr;
                        } else {
                            if (reportTName.equals("")) {
                                searchFilter += " and " + reportClassName + ".id" + substr;
                            } else {
                                searchFilter += " and " + reportClassName + "id" + substr;
                            }
                        }

                    } else {
                        substr = " like '%" + ObjJSONObject.getString("searchText") + "%'";
                    }
                    if (!ObjJSONObject.getString("xtype").equals("Combobox")) {
                        searchFilter += " and " + reportClassName + "."
                                + ObjJSONObject.getString("column").split(PropsValues.REPORT_HARDCODE_STR)[1]
                                + substr;
                    }
                }
            }

            //Generate rules filter query for report grid
            String ruleFilterQuery = "";
            //            ArrayList permArray = AuthHandler.getRealRoleids(request);
            //            for(int i = 0; i < permArray.size(); i++) {
            //                int roleid = Integer.parseInt(permArray.get(i).toString());
            //                String res = ModuleBuilderController.checkFilterRulesQuery(session, report, roleid, 0, "");
            //                if(!StringUtil.isNullOrEmpty(res)) {
            //                    res = "("+res +")";
            //                    if(!StringUtil.isNullOrEmpty(ruleFilterQuery))
            //                        ruleFilterQuery = res + " or " + ruleFilterQuery;
            //                    else
            //                        ruleFilterQuery = res;
            //                }
            //            }
            if (!StringUtil.isNullOrEmpty(ruleFilterQuery))
                ruleFilterQuery = " and " + ruleFilterQuery;
            String sortQuery = "";
            if (request.getParameter("sort") != null && !request.getParameter("sort").equals("")) {
                String sortColumnName = request.getParameter("sort").replaceAll(PropsValues.REPORT_HARDCODE_STR,
                        ".");
                sortQuery = " Order by  " + sortColumnName + " " + request.getParameter("dir");
            }
            Object[] paramArray = null;
            if (!StringUtil.isNullOrEmpty(finalQuery)) {
                //Get implementation class object and call before dataLoad method.
                //Check for reportTName is null;
                String className = reportTName;
                if (StringUtil.isNullOrEmpty(className)) {
                    className = "rb_" + reportDao.toLZ(report.getReportkey(), 3) + "_"
                            + report.getReportname().replace(" ", "").toLowerCase();
                    ;
                }
                Class cl1 = Class.forName(PropsValues.PACKAGE_PATH + ".impl_" + className);
                java.lang.reflect.Constructor co1 = cl1.getConstructor();
                Object invoker1 = co1.newInstance();
                Class arguments1[] = new Class[] { HibernateTemplate.class, HttpServletRequest.class, String.class,
                        String.class, String.class, String.class, String.class, String.class, String.class,
                        ArrayList.class, ArrayList.class, Boolean.class, Boolean.class, JSONObject.class,
                        Boolean.class, Object[].class };

                java.lang.reflect.Method objMethod1 = cl1.getMethod("beforeGridLoadData", arguments1);
                Object[] obj1 = new Object[] { getHibernateTemplate(), request, finalQuery, fieldQuery, delQuery,
                        searchFilter, ruleFilterQuery, sortQuery, reportTName, fieldNameArray, countFieldNameArray,
                        commentFlag, docFlag, jobj, true, paramArray };
                Object result11 = objMethod1.invoke(invoker1, obj1);
            }
            if (jobj.has("data")) {
                jobj.put("count", count);
                result = jobj.toString();
            } else {
                result = "{data:[],count : 0}";
            }

        } catch (HibernateException e) {
            logger.warn(e.getMessage(), e);
            result = "{data:[],count : 0}";
            throw ServiceException.FAILURE("reportMethods.loadData", e);
        } catch (ServiceException e) {
            logger.warn(e.getMessage(), e);
            result = "{data:[],count : 0}";
            throw ServiceException.FAILURE("reportMethods.loadData", e);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = "{data:[],count : 0}";
            throw ServiceException.FAILURE("reportMethods.loadData", e);
        } finally {
            return result;
        }
    }

    public void getCountCommentDocuments(ArrayList<String> countFieldNameArray, String reportTName, Object invoker,
            boolean commentFlag, boolean docFlag, String idVal, JSONObject jtemp) throws ServiceException {
        try {
            //Create count query
            for (int i = 0; i < countFieldNameArray.size(); i++) {
                String hql = "Select count(id) as count from " + PropsValues.PACKAGE_PATH + "."
                        + countFieldNameArray.get(i) + " where " + reportTName + "id = ?";
                List ls1 = find(hql, new Object[] { invoker });
                Iterator ite1 = ls1.iterator();
                if (ite1.hasNext()) {
                    long count1 = Long.parseLong(ite1.next().toString());
                    jtemp.put(countFieldNameArray.get(i) + PropsValues.REPORT_HARDCODE_STR + "id", count1);
                }
            }
            if (commentFlag) { //Comments
                String commentQuery = "Select count(comments.id) from com.krawler.esp.hibernate.impl.comments as comments where comments.recordid = ? ";
                List ls1 = find(commentQuery, new Object[] { idVal });
                Iterator ite1 = ls1.iterator();
                if (ite1.hasNext()) {
                    long count1 = Long.parseLong(ite1.next().toString());
                    String comments = "<img src='images/comment.gif' class='showComments' alt='sorry cannot load image' style='cursor: pointer;vertical-align:bottom;' title='Click to see comments'>"
                            + " <span style='text-align: center !important; font-size:10px !' >(" + count1
                            + ")</span>";
                    jtemp.put("comments", comments);
                }
            }
            if (docFlag) { // Documents
                long docCount = getdocCount(idVal);
                String dwd = "<img src='images/document12.gif' class='showDocuments' style='cursor: pointer;vertical-align:bottom;' title='Click to download'>"
                        + " <span style='text-align: center !important; font-size:10px !' id = 'doccount_" + idVal
                        + "'>(" + docCount + ")</span>";
                jtemp.put("docs_id", dwd);
            }
        } catch (Exception ex) {
            logger.warn(ex.getMessage(), ex);
            throw ServiceException.FAILURE("reportMethods.getCountQueryData", ex);
        }
    }

    public static ArrayList<String> getSearchfield(HibernateTemplate hibernateTemplate, String moduleid,
            String repTableName) throws ServiceException {
        String result = "";
        String query = "from " + PropsValues.PACKAGE_PATH
                + ".mb_gridconfig as mb_gridconfig  where mb_gridconfig.reportid = ? and mb_gridconfig.hidden !=?";
        mb_reportlist obj = (mb_reportlist) hibernateTemplate.get(mb_reportlist.class, moduleid);
        List li = hibernateTemplate.find(query, new Object[] { obj, true });
        ArrayList<String> al = new ArrayList<String>();
        Iterator ite = li.iterator();
        while (ite.hasNext()) {
            mb_gridconfig gridConfigObj = (mb_gridconfig) ite.next();
            if (gridConfigObj.getXtype().equals("Combobox") && gridConfigObj.getReftable().equals("")) {
                al.add("mb_configmasterdata.masterdata");
            } else {
                String colName = gridConfigObj.getName().replaceAll(PropsValues.REPORT_HARDCODE_STR, ".");
                al.add(colName);
            }
        }
        return al;
    }

    public String insertRecord(HttpServletRequest request) {
        String result = "{'success':true, 'msg':'Record inserted successfully.'}";
        java.util.Iterator ite = null;
        try {
            String reportid = request.getParameter("reportid");
            String reportTName = reportDao.getReportTableName(reportid);
            HashMap<String, Object> invokerObj = new HashMap<String, Object>();
            HashMap<String, Class> clObj = new HashMap<String, Class>();

            String jsonstr = request.getParameter("jsondata");

            mb_reportlist report = (mb_reportlist) get(mb_reportlist.class, reportid);
            String SELECT_QUERY = "select mb_gridconfig.name, mb_gridconfig.reftable, mb_gridconfig.xtype, mb_gridconfig.combogridconfig from com.krawler.esp.hibernate.impl.mb_gridconfig as mb_gridconfig"
                    + " where mb_gridconfig.reportid = ? ";
            List list = find(SELECT_QUERY, new Object[] { report });

            JSONArray jsonArray = new JSONArray(jsonstr);
            JSONObject jobj = new JSONObject();
            if (!StringUtil.isNullOrEmpty(reportTName)) {
                for (int k = 0; k < jsonArray.length(); k++) {
                    jobj = jsonArray.getJSONObject(k);
                    ite = list.iterator();
                    while (ite.hasNext()) {
                        Object[] row = (Object[]) ite.next();

                        insertGridRecord(reportTName, jobj, sessionHandlerDao.getUserid(), list, row, invokerObj,
                                clObj);
                    }
                }

                Iterator temp = invokerObj.keySet().iterator();
                //Get implementation class object and call before insert method.
                Class cl1 = Class.forName(PropsValues.PACKAGE_PATH + ".impl_" + reportTName);
                java.lang.reflect.Constructor co1 = cl1.getConstructor();
                Object invoker1 = co1.newInstance();
                Class arguments1[] = new Class[] { HibernateTemplate.class, HttpServletRequest.class,
                        Object.class };

                java.lang.reflect.Method objMethod1 = cl1.getMethod("beforeInsert", arguments1);
                Object reportObj = invokerObj.get(reportTName);
                Object[] obj1 = new Object[] { getHibernateTemplate(), request, reportObj };
                Object result11 = objMethod1.invoke(invoker1, obj1);

                if (Boolean.parseBoolean(result11.toString())) {
                    while (temp.hasNext()) {
                        String refTName = (String) temp.next();
                        Object ttemp = (Object) invokerObj.get(refTName);

                        // set default values
                        Class cl = ttemp.getClass();
                        String[] namesArray = null;
                        Object[] namesValues = null;
                        java.util.Date timestamp1 = new java.util.Date();
                        if (refTName.equals(reportTName)) {//For grid/report table
                            namesArray = new String[4];
                            namesArray[0] = "createdby";
                            namesArray[1] = "createddate";
                            namesArray[2] = "modifieddate";
                            namesArray[3] = "deleteflag";
                            namesValues = new Object[4];
                            namesValues[0] = sessionHandlerDao.getUserid();
                            namesValues[1] = timestamp1;
                            namesValues[2] = timestamp1;
                            namesValues[3] = 0.0;
                        } else { //For other table
                            namesArray = new String[1];
                            namesArray[0] = "modifieddate";
                            namesValues = new Object[1];
                            namesValues[0] = timestamp1;
                        }
                        for (int defaultCnt = 0; defaultCnt < namesArray.length; defaultCnt++) {
                            Field field = ttemp.getClass().getDeclaredField(namesArray[defaultCnt].toString());
                            Class type = field.getType();
                            Class arguments[] = new Class[] { type };

                            java.lang.reflect.Method objMethod = cl.getMethod(
                                    "set" + TextFormatter.format(namesArray[defaultCnt], TextFormatter.G),
                                    arguments);
                            Object objVal = typeCastForValue(type.getName(), namesValues[defaultCnt]);
                            Object[] obj = new Object[] { objVal };
                            Object result1 = objMethod.invoke(ttemp, obj);
                        }

                        save(ttemp);
                    }
                    //                        String actionType = "Add Report Data";
                    //                        String reportName = AuditTrialHandler.getReportName(session, reportid);
                    //                        String details = "New record added in "+reportName;
                    //                        long actionId = AuditTrialHandler.getActionId(session, actionType);
                    //                        AuditTrialHandler.insertAuditLog(session, actionId, details, request);
                    //                         //Call after insert method
                    objMethod1 = cl1.getMethod("afterInsert", arguments1);
                    result11 = objMethod1.invoke(invoker1, obj1);
                    if (!Boolean.parseBoolean(result11.toString())) {
                        result = "{'success':false, 'msg':'Error occured at server.'}";
                    }
                } else { //beforeInsert false
                    result = "{'success':false, 'msg':'Error occured at server.'}";
                }
            }
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = "{'success':false, 'msg':'Error occured at server.'}";
            throw ServiceException.FAILURE("reportMethods.insertRecord", e);
        } finally {
            return result;
        }
    }

    public String editRecord(HttpServletRequest request) {
        String result = "{'success':true, 'msg':'Record edited successfully.'}";
        java.util.Iterator ite = null;
        try {
            String reportid = request.getParameter("reportid");
            String reportTName = reportDao.getReportTableName(reportid);
            HashMap<String, Object> invokerObj = new HashMap<String, Object>();
            HashMap<String, Class> clObj = new HashMap<String, Class>();

            String jsonstr = request.getParameter("jsondata");

            mb_reportlist report = (mb_reportlist) get(mb_reportlist.class, reportid);
            String SELECT_QUERY = "select mb_gridconfig.name, mb_gridconfig.reftable, mb_gridconfig.xtype, mb_gridconfig.combogridconfig from com.krawler.esp.hibernate.impl.mb_gridconfig as mb_gridconfig"
                    + " where mb_gridconfig.reportid = ? ";
            List list = find(SELECT_QUERY, new Object[] { report });

            JSONArray jsonArray = new JSONArray(jsonstr);
            JSONObject jobj = new JSONObject();
            for (int k = 0; k < jsonArray.length(); k++) {
                jobj = jsonArray.getJSONObject(k);
                ite = list.iterator();
                while (ite.hasNext()) {
                    Object[] row = (Object[]) ite.next();

                    editGridRecord(reportTName, jobj, sessionHandlerDao.getUserid(), list, row, invokerObj, clObj);
                }
            }

            Iterator temp = invokerObj.keySet().iterator();

            Object result11 = "false";
            Object invoker1 = null;
            Class cl1 = null;
            java.lang.reflect.Method objMethod1 = null;
            Object[] obj1 = null;
            //Check for reportTName is null;
            String className = reportTName;
            Object reportObj = null;
            if (StringUtil.isNullOrEmpty(className)) {
                className = "rb_" + reportDao.toLZ(report.getReportkey(), 3) + "_"
                        + report.getReportname().replace(" ", "").toLowerCase();
            } else {
                reportObj = invokerObj.get(reportTName);
            }
            //Get implementation class object and call before insert method.
            cl1 = Class.forName(PropsValues.PACKAGE_PATH + ".impl_" + className);
            java.lang.reflect.Constructor co1 = cl1.getConstructor();
            invoker1 = co1.newInstance();
            Class arguments1[] = new Class[] { HibernateTemplate.class, HttpServletRequest.class, Object.class };
            objMethod1 = cl1.getMethod("beforeEdit", arguments1);
            obj1 = new Object[] { getHibernateTemplate(), request, reportObj };
            result11 = objMethod1.invoke(invoker1, obj1);

            if (Boolean.parseBoolean(result11.toString())) {
                while (temp.hasNext()) {
                    String refTName = (String) temp.next();
                    Object ttemp = (Object) invokerObj.get(refTName);

                    //Update modified date
                    Class cl = ttemp.getClass();
                    Field field = ttemp.getClass().getDeclaredField("modifieddate");
                    Class type = field.getType();
                    Class arguments[] = new Class[] { type };
                    java.lang.reflect.Method objMethod = cl
                            .getMethod("set" + TextFormatter.format("modifieddate", TextFormatter.G), arguments);
                    Object objVal = typeCastForValue(type.getName(), new java.util.Date());
                    Object[] obj = new Object[] { objVal };
                    Object result1 = objMethod.invoke(ttemp, obj);

                    saveOrUpdate(ttemp);
                }
                //                    String actionType = "Edit Report Data";
                //                    String reportName = AuditTrialHandler.getReportName(session, reportid);
                //                    String details = "Record edited in "+reportName;
                //                    long actionId = AuditTrialHandler.getActionId(session, actionType);
                //                    AuditTrialHandler.insertAuditLog(session, actionId, details, request);

                //Call afterEdit method of report class.
                arguments1 = new Class[] { Session.class, HttpServletRequest.class, Object.class };
                objMethod1 = cl1.getMethod("afterEdit", arguments1);
                result11 = objMethod1.invoke(invoker1, obj1);
                if (!Boolean.parseBoolean(result11.toString())) {
                    result = "{'success':false, 'msg':'Error occured at server.'}";
                }
            } else { //beforeInsert false
                result = "{'success':false, 'msg':'Error occured at server.'}";
            }
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = "{'success':false, 'msg':'Error occured at server.'}";
            throw ServiceException.FAILURE("reportMethods.editRecord", e);
        } finally {
            return result;
        }
    }

    public String deleteRecord(HttpServletRequest request) {
        String result = "{'success':true, 'msg':'Record deleted successfully.'}";
        try {
            String reportid = request.getParameter("reportid");
            String reportTName = reportDao.getReportTableName(reportid);
            mb_reportlist report = (mb_reportlist) get(mb_reportlist.class, reportid);
            String id = request.getParameter("id");
            String tablename = PropsValues.PACKAGE_PATH + "." + reportTName;
            Class cl = Class.forName(tablename);
            Object invoker = get(cl, id);

            String classfieldName = "deleteflag";
            Field field = invoker.getClass().getDeclaredField(classfieldName);
            Class type = field.getType();
            Class arguments[] = new Class[] { type };

            java.lang.reflect.Method objMethod = cl
                    .getMethod("set" + TextFormatter.format(classfieldName, TextFormatter.G), arguments);
            Object objVal = typeCastForValue(type.getName(), "1");
            Object[] obj = new Object[] { objVal };
            Object result1 = objMethod.invoke(invoker, obj);

            Object result11 = "false";
            Object invoker1 = null;
            Class cl1 = null;
            java.lang.reflect.Method objMethod1 = null;
            Object[] obj1 = null;
            //Check for reportTName is null;
            String className = reportTName;
            if (StringUtil.isNullOrEmpty(className)) {
                className = "rb_" + reportDao.toLZ(report.getReportkey(), 3) + "_"
                        + report.getReportname().replace(" ", "").toLowerCase();
            }

            //Get implementation class object and call before insert method.
            cl1 = Class.forName(PropsValues.PACKAGE_PATH + ".impl_" + className);
            java.lang.reflect.Constructor co1 = cl1.getConstructor();
            invoker1 = co1.newInstance();
            Class arguments1[] = new Class[] { HibernateTemplate.class, HttpServletRequest.class, Object.class };

            objMethod1 = cl1.getMethod("beforeDelete", arguments1);
            obj1 = new Object[] { getHibernateTemplate(), request, invoker };
            result11 = objMethod1.invoke(invoker1, obj1);

            if (Boolean.parseBoolean(result11.toString())) {
                saveOrUpdate(invoker);

                //call after delete event
                arguments1 = new Class[] { Session.class, HttpServletRequest.class, Object.class };
                objMethod1 = cl1.getMethod("afterDelete", arguments1);
                result11 = objMethod1.invoke(invoker1, obj1);
                if (!Boolean.parseBoolean(result11.toString())) {
                    result = "{'success':false, 'msg':'Error occured at server.'}";
                }
            } else { //beforeInsert false
                result = "{'success':false, 'msg':'Error occured at server.'}";
            }

        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = "{'success':false, 'msg':'Error occured at server.'}";
            throw ServiceException.FAILURE("reportMethods.editRecord", e);
        } finally {
            return result;
        }
    }

    //Set/create new object/record
    public boolean setObject(String className, String jsondata, HttpServletRequest request)
            throws ServiceException {
        boolean result = false;
        try {
            Class cl1 = Class.forName(PropsValues.PACKAGE_PATH + className);
            java.lang.reflect.Constructor co1 = cl1.getConstructor();
            Object invoker1 = co1.newInstance();

            java.util.Date timestamp1 = new java.util.Date();
            String[] namesArray = new String[4];
            namesArray[0] = "createdby";
            namesArray[1] = "createddate";
            namesArray[2] = "modifieddate";
            namesArray[3] = "deleteflag";
            Object[] namesValues = new Object[4];
            namesValues[0] = sessionHandlerDao.getUserid();
            namesValues[1] = timestamp1;
            namesValues[2] = timestamp1;
            namesValues[3] = 0.0;

            for (int defaultCnt = 0; defaultCnt < namesArray.length; defaultCnt++) {
                Field field = cl1.getDeclaredField(namesArray[defaultCnt].toString());
                Class type = field.getType();
                Class arguments[] = new Class[] { type };

                java.lang.reflect.Method objMethod = cl1.getMethod(
                        "set" + TextFormatter.format(namesArray[defaultCnt], TextFormatter.G), arguments);
                Object objVal = typeCastForValue(type.getName(), namesValues[defaultCnt]);
                Object[] obj = new Object[] { objVal };
                Object result1 = objMethod.invoke(invoker1, obj);
            }

            JSONArray jobj = new JSONArray(jsondata);
            for (int i = 0; i < jobj.length(); i++) {
                String key = jobj.getJSONObject(i).get("key").toString();
                Object value = jobj.getJSONObject(i).get("value");

                Field field = cl1.getDeclaredField(key);
                Class type = field.getType();
                Class arguments[] = new Class[] { type };

                java.lang.reflect.Method objMethod = cl1
                        .getMethod("set" + TextFormatter.format(key, TextFormatter.G), arguments);
                Object objVal = typeCastForValue(type.getName(), value);
                Object[] obj = new Object[] { objVal };
                Object result1 = objMethod.invoke(invoker1, obj);
            }

            result = true;
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = false;
            throw ServiceException.FAILURE("reportMethods.setObj", e);
        }
        return result;
    }

    //Set/create new object/record
    public boolean updateObject(String className, String jsondata, String id, HttpServletRequest request)
            throws ServiceException {
        boolean result = false;
        try {
            Class cl1 = Class.forName(PropsValues.PACKAGE_PATH + className);
            Object invoker1 = get(cl1, id);

            java.util.Date timestamp1 = new java.util.Date();
            String[] namesArray = new String[1];
            namesArray[0] = "modifieddate";
            Object[] namesValues = new Object[1];
            namesValues[1] = timestamp1;

            for (int defaultCnt = 0; defaultCnt < namesArray.length; defaultCnt++) {
                Field field = cl1.getDeclaredField(namesArray[defaultCnt].toString());
                Class type = field.getType();
                Class arguments[] = new Class[] { type };

                java.lang.reflect.Method objMethod = cl1.getMethod(
                        "set" + TextFormatter.format(namesArray[defaultCnt], TextFormatter.G), arguments);
                Object objVal = typeCastForValue(type.getName(), namesValues[defaultCnt]);
                Object[] obj = new Object[] { objVal };
                Object result1 = objMethod.invoke(invoker1, obj);
            }

            JSONArray jobj = new JSONArray(jsondata);
            for (int i = 0; i < jobj.length(); i++) {
                String key = jobj.getJSONObject(i).get("key").toString();
                Object value = jobj.getJSONObject(i).get("value");

                Field field = cl1.getDeclaredField(key);
                Class type = field.getType();
                Class arguments[] = new Class[] { type };

                java.lang.reflect.Method objMethod = cl1
                        .getMethod("set" + TextFormatter.format(key, TextFormatter.G), arguments);
                Object objVal = typeCastForValue(type.getName(), value);
                Object[] obj = new Object[] { objVal };
                Object result1 = objMethod.invoke(invoker1, obj);
            }

            result = true;
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = false;
            throw ServiceException.FAILURE("reportMethods.setObj", e);
        }
        return result;
    }

    //Set/create new object/record
    public boolean deleteObject(String className, String id, HttpServletRequest request) throws ServiceException {
        boolean result = false;
        try {
            Class cl1 = Class.forName(PropsValues.PACKAGE_PATH + className);
            Object invoker1 = get(cl1, id);

            java.util.Date timestamp1 = new java.util.Date();
            String[] namesArray = new String[1];
            namesArray[0] = "modifieddate";
            Object[] namesValues = new Object[1];
            namesValues[1] = timestamp1;

            for (int defaultCnt = 0; defaultCnt < namesArray.length; defaultCnt++) {
                Field field = cl1.getDeclaredField(namesArray[defaultCnt].toString());
                Class type = field.getType();
                Class arguments[] = new Class[] { type };

                java.lang.reflect.Method objMethod = cl1.getMethod(
                        "set" + TextFormatter.format(namesArray[defaultCnt], TextFormatter.G), arguments);
                Object objVal = typeCastForValue(type.getName(), namesValues[defaultCnt]);
                Object[] obj = new Object[] { objVal };
                Object result1 = objMethod.invoke(invoker1, obj);
            }

            Field field = cl1.getDeclaredField("deleteflag");
            Class type = field.getType();
            Class arguments[] = new Class[] { type };

            java.lang.reflect.Method objMethod = cl1
                    .getMethod("set" + TextFormatter.format("deleteflag", TextFormatter.G), arguments);
            Object objVal = typeCastForValue(type.getName(), 1);
            Object[] obj = new Object[] { objVal };
            Object result1 = objMethod.invoke(invoker1, obj);

            result = true;
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = false;
            throw ServiceException.FAILURE("reportMethods.setObj", e);
        }
        return result;
    }

    public JSONObject getModuleData(HttpServletRequest request) {
        String result = "{data:[],count : 0}";
        JSONObject jobj = new JSONObject();
        try {
            String reportid = request.getParameter("moduleid");
            String query = null;
            Configuration cfg = getConfig();
            java.util.Iterator itr = cfg.getTableMappings();
            HashMap<String, Table> tableObj = new HashMap<String, Table>();
            while (itr.hasNext()) {
                Table table = (Table) itr.next();
                tableObj.put(PropsValues.PACKAGE_PATH + "." + table.getName(), table);
            }
            //Fetch all reference tables in report
            mb_reportlist report = (mb_reportlist) get(mb_reportlist.class, reportid);
            query = "Select distinct mb_gridconfig.reftable as tablename from " + PropsValues.PACKAGE_PATH
                    + ".mb_gridconfig as mb_gridconfig where mb_gridconfig.reportid = ? and mb_gridconfig.countflag = ? ";
            List ls = find(query, new Object[] { report, false });
            java.util.Iterator ite = ls.iterator();
            String str = "";
            ArrayList<String> refTableList1 = new ArrayList<String>();
            HashMap<String, String> shortTableNames = new HashMap<String, String>();
            while (ite.hasNext()) {
                String reftablename = (String) ite.next();
                if (!StringUtil.isNullOrEmpty(reftablename)) {
                    refTableList1.add(PropsValues.PACKAGE_PATH + "." + reftablename);
                    shortTableNames.put(PropsValues.PACKAGE_PATH + "." + reftablename, reftablename);
                }
            }
            //If new table created not present in arraylist then it is added forcefully
            String reportTName = reportDao.getReportTableName(reportid);
            if (!StringUtil.isNullOrEmpty(reportTName)
                    && !refTableList1.contains(PropsValues.PACKAGE_PATH + "." + reportTName)) {
                refTableList1.add(PropsValues.PACKAGE_PATH + "." + reportTName);
                shortTableNames.put(PropsValues.PACKAGE_PATH + "." + reportTName, reportTName);
            }

            ArrayList<String> refTableList = new ArrayList<String>();
            ArrayList<String> primaryTableList = new ArrayList<String>();
            HashMap<String, ArrayList<String>> parentTableObj = new HashMap<String, ArrayList<String>>();
            HashMap<String, ArrayList<String>> colNameObj = new HashMap<String, ArrayList<String>>();
            //Make list of reference tables which does not have any relationship with another ref. tables
            //Sort all reference tables in relationship order i.e. form child - parent
            for (int i = 0; i < refTableList1.size(); i++) {
                String reftablename = refTableList1.get(i);
                Table tb = tableObj.get(reftablename);
                Iterator FkIte = tb.getForeignKeyIterator();
                if (FkIte.hasNext()) {
                    boolean flg = false;
                    ArrayList<String> parentTName1 = new ArrayList<String>();
                    ArrayList<String> colName1 = new ArrayList<String>();
                    while (FkIte.hasNext()) { //Always keep foreign key name = parent tablename + primary column name
                        ForeignKey obj = (ForeignKey) FkIte.next();
                        String parentTName = obj.getReferencedEntityName();
                        Column col = (Column) obj.getColumns().iterator().next();
                        String colName = col.getName();
                        if (refTableList1.contains(parentTName)) {
                            if (primaryTableList.contains(parentTName)) {
                                primaryTableList.remove(parentTName);
                            }
                            if (refTableList.contains(parentTName)) {
                                refTableList.remove(parentTName);
                                if (!refTableList.contains(reftablename)) {
                                    refTableList.add(reftablename);
                                }
                                refTableList.add(parentTName);
                            } else if (!refTableList.contains(reftablename)) {
                                refTableList.add(reftablename);
                            }
                            parentTName1.add(parentTName);
                            colName1.add(colName);

                            flg = true;
                        } else {
                            if (!refTableList.contains(reftablename)) {
                                refTableList.add(reftablename);
                                flg = true;
                            }
                            continue;
                        }
                    }

                    parentTableObj.put(reftablename, parentTName1);
                    colNameObj.put(reftablename, colName1);

                    if (!flg) {
                        primaryTableList.add(reftablename);
                    }
                } else if (!FkIte.hasNext()) {
                    //Check whether reference table is already part of parentTableObj.
                    //If yes then not to add in primaryList
                    boolean flg = true;
                    Iterator temp = parentTableObj.keySet().iterator();
                    while (temp.hasNext()) {
                        ArrayList<String> ttemp = (ArrayList<String>) parentTableObj.get(temp.next());
                        for (int l = 0; l < ttemp.size(); l++) {
                            if (ttemp.contains(reftablename)) {
                                flg = false;
                                break;
                            }
                        }
                        if (!flg) {
                            break;
                        }
                    }
                    if (flg) {
                        primaryTableList.add(reftablename);
                    }
                }
            }
            String delQuery = "";
            for (int i = 0; i < refTableList.size(); i++) {
                String reftablename = refTableList.get(i);
                ArrayList<String> parentTName = parentTableObj.get(reftablename);
                ArrayList<String> colName = colNameObj.get(reftablename);

                for (int j = 0; j < parentTName.size(); j++) {
                    String shortRefTName = shortTableNames.get(reftablename);
                    String shortParentTName = shortTableNames.get(parentTName.get(j));
                    if (StringUtil.isNullOrEmpty(str)) {
                        str += reftablename + " as " + shortRefTName + " inner join " + shortRefTName + "."
                                + colName.get(j) + " as " + shortParentTName;
                        delQuery += shortRefTName + ".deleteflag = 0 and " + shortParentTName + ".deleteflag = 0 ";
                    } else if (str.contains(shortRefTName)) {
                        //if reference table is already part of query then use alias
                        str += " inner join " + shortRefTName + "." + colName.get(j) + " as " + shortParentTName;
                        if (!delQuery.contains(shortParentTName)) {
                            delQuery += " and " + shortParentTName + ".deleteflag = 0 ";
                        }
                    } else {
                        //otherwise use full path
                        str += " inner join " + reftablename + "." + colName.get(j) + " as " + shortParentTName;
                        if (!delQuery.contains(shortParentTName)) {
                            delQuery += " and " + shortParentTName + ".deleteflag = 0 ";
                        }
                    }
                }
            }

            String primaryTableQuery = "";
            for (int i = 0; i < primaryTableList.size(); i++) {
                String reftablename = primaryTableList.get(i);
                String shortRefTName = shortTableNames.get(reftablename);

                if (StringUtil.isNullOrEmpty(delQuery)) {
                    delQuery += shortRefTName + ".deleteflag = 0 ";
                } else if (!delQuery.contains(shortRefTName)) {
                    delQuery += " and " + shortRefTName + ".deleteflag = 0 ";
                }

                if (StringUtil.isNullOrEmpty(primaryTableQuery)) {
                    primaryTableQuery += " from " + reftablename + " as " + shortRefTName;
                } else {
                    primaryTableQuery += " , " + reftablename + " as " + shortRefTName;
                }
            }
            String finalQuery = "";
            if (!StringUtil.isNullOrEmpty(primaryTableQuery)) {
                finalQuery += primaryTableQuery;
            }
            if (!StringUtil.isNullOrEmpty(str)) {
                if (StringUtil.isNullOrEmpty(finalQuery)) {
                    finalQuery = " from " + str;
                } else {
                    finalQuery += ", " + str;
                }
            }

            //Fetch all display columns
            String SELECT_QUERY = "select mb_gridconfig.name, mb_gridconfig.xtype, mb_gridconfig.combogridconfig, mb_gridconfig.countflag, mb_gridconfig.reftable, mb_gridconfig.displayfield from com.krawler.esp.hibernate.impl.mb_gridconfig as mb_gridconfig"
                    + " where mb_gridconfig.reportid = ?";
            List list = find(SELECT_QUERY, new Object[] { report });
            ite = list.iterator();
            String fieldQuery = "";
            ArrayList<String> fieldNameArray = new ArrayList<String>();
            ArrayList<String> countFieldNameArray = new ArrayList<String>();
            ArrayList<String> displayFieldArray = new ArrayList<String>();
            while (ite.hasNext()) {
                Object[] row = (Object[]) ite.next();
                String fieldName = row[0].toString();
                String displayField = row[5].toString();
                String xtype = row[1].toString();
                String combogridconfig = "-1";
                if (row[2] != null) {
                    combogridconfig = row[2].toString();
                }
                //Check for count flag
                if (row[3] != null && Boolean.parseBoolean(row[3].toString())) {//countFlag
                    countFieldNameArray.add(row[4].toString());
                } else {
                    fieldNameArray.add(fieldName);
                    displayFieldArray.add(displayField);
                    String className = "";
                    if (xtype.equals("Combobox") && combogridconfig.equals("-1")) {
                        className = fieldName.split(PropsValues.REPORT_HARDCODE_STR)[0];
                        fieldName = className + "." + getPrimaryColName(className);
                    } else {
                        fieldName = fieldName.replaceAll(PropsValues.REPORT_HARDCODE_STR, ".");
                    }
                    fieldQuery += fieldName + ",";
                }
            }

            if (StringUtil.isNullOrEmpty(fieldQuery)) {
                fieldQuery = "Select * ";
            } else {
                fieldQuery = "Select " + fieldQuery.substring(0, fieldQuery.length() - 1);
            }

            //Check for mapping filter
            String filterQry = "";

            if (!StringUtil.isNullOrEmpty(delQuery)) {
                if (!StringUtil.isNullOrEmpty(filterQry)) {
                    delQuery = " where " + filterQry + " and " + delQuery;
                } else {
                    delQuery = " where " + delQuery;
                }
            }

            //Check for comments
            boolean commentFlag = false;
            boolean docFlag = false;
            String ruleFilterQuery = "";
            if (!StringUtil.isNullOrEmpty(ruleFilterQuery))
                ruleFilterQuery = " and " + ruleFilterQuery;

            if (!StringUtil.isNullOrEmpty(finalQuery)) {
                //Get implementation class object and call before dataLoad method.
                //Check for reportTName is null;
                String className = reportTName;
                if (StringUtil.isNullOrEmpty(className)) {
                    className = "rb_" + reportDao.toLZ(report.getReportkey(), 3) + "_"
                            + report.getReportname().replace(" ", "").toLowerCase();
                }
                Class cl1 = Class.forName(PropsValues.PACKAGE_PATH + ".impl_" + className);
                java.lang.reflect.Constructor co1 = cl1.getConstructor();
                Object invoker1 = co1.newInstance();
                Class arguments1[] = new Class[] { HibernateTemplate.class, HttpServletRequest.class, String.class,
                        String.class, String.class, String.class, String.class, ArrayList.class, ArrayList.class,
                        ArrayList.class, Boolean.class, Boolean.class, JSONObject.class };

                java.lang.reflect.Method objMethod1 = cl1.getMethod("beforeGridExportData", arguments1);
                Object[] obj1 = new Object[] { getHibernateTemplate(), request, finalQuery, fieldQuery, delQuery,
                        ruleFilterQuery, reportTName, displayFieldArray, fieldNameArray, countFieldNameArray,
                        commentFlag, docFlag, jobj };
                Object result11 = objMethod1.invoke(invoker1, obj1);
            }
        } catch (HibernateException e) {
            logger.warn(e.getMessage(), e);
            result = "{data:[],count : 0}";
            throw ServiceException.FAILURE("reportMethods.loadData", e);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            result = "{data:[],count : 0}";
            throw ServiceException.FAILURE("reportMethods.loadData", e);
        } finally {
            return jobj;
        }
    }

    public long getdocCount(String recid) throws ServiceException {
        int num = 0;
        String hql = "select count(*) as count from " + PropsValues.PACKAGE_PATH
                + ".mb_docsmap as mb_docsmap where mb_docsmap.recid = ?";
        List li = executeQuery(hql, recid);
        Iterator ite = li.iterator();
        long count = 0;
        if (ite.hasNext()) {
            count = Long.parseLong(ite.next().toString());
        }
        return count;
    }
}