com.hp.avmon.config.service.AgentManageService.java Source code

Java tutorial

Introduction

Here is the source code for com.hp.avmon.config.service.AgentManageService.java

Source

package com.hp.avmon.config.service;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import com.hp.avmon.common.jackjson.JackJson;
import com.hp.avmon.config.bean.AmpPolicyBean;
import com.hp.avmon.deploy.service.DeployService;
import com.hp.avmon.equipmentCenter.service.EquipmentCenterService;
import com.hp.avmon.home.service.LicenseService;
import com.hp.avmon.utils.DBUtils;
import com.hp.avmon.utils.MyFunc;
import com.hp.avmon.utils.SqlManager;
import com.hp.avmon.utils.TreeObject;
import com.hp.avmonserver.api.AvmonServer;
import com.hp.avmonserver.entity.MO;

/**
 * Created with IntelliJ IDEA.
 * User: shiw
 * Date: 3/13/13
 * Time: 5:24 PM
 * To change this template use File | Settings | File Templates.
 */
@Service
public class AgentManageService {

    private static final Log logger = LogFactory.getLog(AgentManageService.class);

    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private LicenseService licenseService;
    @Autowired
    private AvmonServer avmonServer;
    @Autowired
    private DeployService deployService;
    @Autowired
    private EquipmentCenterService equipmentCenterService;

    private static final String NOT_EXISTS_DATE = "1 1 1 30 2 1";

    /**
     * ?Agent grid ?
     * @param request
     * @return
     * @throws Exception
     */
    public Map findAgentGridInfo(HttpServletRequest request) throws Exception {

        Map<String, Object> map = new HashMap<String, Object>();

        //??
        String agentId = request.getParameter("agentId") == null ? "" : request.getParameter("agentId");
        String ip = request.getParameter("ip") == null ? "" : request.getParameter("ip");
        // add by mark start
        String osArry = request.getParameter("os") == null ? "" : request.getParameter("os");
        if ("604674602".equals(osArry)) {
            osArry = "null";
        }
        //"666656"
        // add by mark start

        String limit = request.getParameter("limit");
        String start = request.getParameter("start");
        //        String page = request.getParameter("page");
        //        System.out.println("page is >>>>>>>>>>>>>>>>>>>>:"+page);
        String where = "where 1=1 ";
        if (agentId.length() > 0) {
            where = where + " and ag.AGENT_ID LIKE '%" + agentId + "%' ";
        }
        if (ip.length() > 0) {
            where = where + " and ag.ip LIKE '%" + ip + "%' ";
        }

        // add by mark start
        String businessType = null;
        String os = null;

        if (!"null".equals(osArry) && osArry.length() > 0) {
            if (osArry.indexOf("*") > 0) {
                os = osArry.split("\\*")[0];
                os = deployService.getMoCaptionById(os);
                if ("Solaris".equals(os)) {
                    os = "SunOS";
                }
                where = where + " and ag.os LIKE '%" + os + "%' ";

                if (null != osArry.split("\\*")[1] && !"666656".equals(osArry.split("\\*")[1])) {
                    businessType = osArry.split("\\*")[1];
                    //businessType = AgentTypes.BIZMAP.get(businessType);
                    businessType = equipmentCenterService.getBusinessNameById(businessType);
                    where = where + " and systemtb.value LIKE '%" + businessType + "%' ";
                } else if ("666656".equals(osArry.split("\\*")[1])) {
                    where += " and not exists (select mo_id from td_avmon_mo_info_attribute where name = 'businessSystem' and  mo_id = ag.mo_id) ";
                }

            } else if (!"666656".equals(osArry)) {
                //businessType = AgentTypes.BIZMAP.get(osArry);
                businessType = equipmentCenterService.getBusinessNameById(osArry);
                if (null != businessType) {
                    where = where + " and systemtb.value LIKE '%" + businessType + "%' ";
                }
            } else if ("666656".equals(osArry)) {
                where += " and not exists (select mo_id from td_avmon_mo_info_attribute where name = 'businessSystem' and  mo_id = ag.mo_id) ";
            }
        }

        // add by mark end
        String orderBy = "";
        String sortBy = request.getParameter("sort");
        if (sortBy != null) {
            JSONArray jsonArr = JSONArray.fromObject(sortBy);
            String sort = jsonArr.getJSONObject(0).get("property").toString();
            if ("ampCount".equalsIgnoreCase(sort) || "ampCount1".equalsIgnoreCase(sort)) {
                sort = "amp.\"ampCount\"";
            } else if ("hostName".endsWith(sort)) {
                sort = "host.value";
            } else if ("agentId".endsWith(sort)) {
                sort = "ag.AGENT_ID";
            } else if ("agentVersion".endsWith(sort)) {
                sort = "ag.agent_version";
            } else if ("agentStatus".endsWith(sort)) {
                sort = "round((sysdate - ag.last_heartbeat_time) * 24 * 60)";
                if (DBUtils.isPostgreSql())
                    sort = "round((EXTRACT(EPOCH from CURRENT_TIMESTAMP) - EXTRACT(EPOCH from ag.last_heartbeat_time)) / 60)";
            } else if ("updateStatus".endsWith(sort)) {
                sort = "round((sysdate - ag.last_update_time) * 24 * 60)";
                if (DBUtils.isPostgreSql())
                    sort = "round((EXTRACT(EPOCH from CURRENT_TIMESTAMP) - EXTRACT(EPOCH from ag.last_update_time)) / 60)";
            } else if ("lastHeartbeatTime".endsWith(sort)) {
                sort = "ag.last_heartbeat_time";
            } else if ("lastUpdateTime".endsWith(sort)) {
                sort = "ag.last_update_time";
            } else if ("osVersion".endsWith(sort)) {
                sort = "ag.os_version";
            } else if ("moId".endsWith(sort)) {
                sort = "ag.mo_id";
            } else if ("agentCollectFlag".endsWith(sort)) {
                sort = "ag.AGENT_COLLECT_FLAG";
            } else if ("status".endsWith(sort)) {
                sort = "ag.agentStatus";
            }

            orderBy = " order by " + sort + " " + jsonArr.getJSONObject(0).get("direction") + ", ag.AGENT_ID";
        }

        //String where = " WHERE ag.AGENT_ID LIKE '%"+agentId+"%' and ag.ip LIKE '%"+ip+"%'";
        String listSql = null;
        String countSql = null;
        if (!"666656".equals(businessType)) {
            listSql = SqlManager.getSql(AgentManageService.class, "getBizAgentGridInfo");
            countSql = SqlManager.getSql(AgentManageService.class, "getAgentGridInfoCount");
            if (null != businessType) {
                //businessType = AgentTypes.BIZMAP.get(businessType);
                businessType = equipmentCenterService.getBusinessNameById(businessType);
                listSql = String.format(listSql, businessType);
            }
        } else {
            listSql = SqlManager.getSql(AgentManageService.class, "getBizAgentGridInfo_other");
            countSql = SqlManager.getSql(AgentManageService.class, "getAgentGridInfoCount_other");
        }

        String finSql = generatPageSql(listSql + where + orderBy, limit, start);
        logger.debug(finSql);

        //String countSql = SqlManager.getSql(AgentManageService.class, "getAgentGridInfoCount")+where;

        //?
        //logger.debug(countSql);
        int rowCount = jdbcTemplate.queryForInt(countSql + where);

        //?
        //logger.debug(finSql);
        List<Map<String, Object>> list = jdbcTemplate.queryForList(finSql);

        map.put("activeTotal", rowCount);
        //map.put("page", start);
        map.put("root", list);
        return map;
    }

    /**
     *  Agentamp?
     * @param request
     * @return
     */
    public Map findAgentAmp(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();

        //??
        String agentId = request.getParameter("agentId");
        String limit = request.getParameter("limit");
        String start = request.getParameter("start");

        String where = String.format(" WHERE ag.AGENT_ID = '%s'", agentId);

        String listSql = SqlManager.getSql(AgentManageService.class, "findAgentAmpList");
        String finSql = generatPageSql(listSql + where, limit, start);

        String countSql = SqlManager.getSql(AgentManageService.class, "findAgentAmpListCount") + where;

        //?
        //logger.debug(countSql);
        int rowCount = jdbcTemplate.queryForInt(countSql);

        //?
        //logger.debug(finSql);
        List<Map<String, Object>> list = jdbcTemplate.queryForList(finSql);

        map.put("activeTotal", rowCount);
        map.put("root", list);
        return map;
    }

    /**
     * ??AMP ?
     * @return
     */
    public Map getAMPTypeInfo() {
        Map<String, Object> map = new HashMap<String, Object>();
        String sql = "SELECT AMP_ID AS \"value\",CAPTION AS \"name\",TYPE AS \"type\" FROM TD_AVMON_AMP ";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        map.put("root", list);
        return map;
    }

    // add by mark start
    /**
     * ??AMP ?
     * @return
     */
    public Map<String, List<Map<String, String>>> getAMPTypeInfo(String targetOs) {
        Map<String, List<Map<String, String>>> map = new HashMap<String, List<Map<String, String>>>();
        String sql = null;

        if ("SunOS".equals(targetOs)) {
            targetOs = "SOLARIS";
        }

        if ("null".equals(targetOs)) {
            sql = "SELECT AMP_ID AS \"value\",CAPTION AS \"name\",TYPE AS \"type\" FROM TD_AVMON_AMP WHERE TARGET_OS IS NULL";

        } else {
            sql = "SELECT AMP_ID AS \"value\",CAPTION AS \"name\",TYPE AS \"type\" FROM TD_AVMON_AMP WHERE TARGET_OS LIKE '%"
                    + targetOs.toUpperCase() + "%'";
        }

        List<Map<String, String>> list = jdbcTemplate.queryForList(sql);
        map.put("root", list);
        return map;
    }
    // add by mark end

    /**
     * ?Agent
     * @param request00:success
      01:Agent?
      02:Agent
      03:?
      99:
     * @return
     * @throws Exception
     */
    public String startAgent(HttpServletRequest request) throws Exception {
        //Map<String, Object> map = new HashMap<String, Object>();
        String status = request.getParameter("status");
        String agentId = request.getParameter("agentId");
        int agentCollectFlag = 1;
        String json = "";
        String result = avmonServer.startAgent(agentId);
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);

        if (result.startsWith("00")) {
            agentCollectFlag = 0;
            this.updateAgentStatusByAgentId(status, agentId, agentCollectFlag);
            json = "{success:true,msg:'" + bundle.getString("agentStartSuccess") + "'}";
        } else {
            this.updateAgentStatusByAgentId(status, agentId, agentCollectFlag);
            json = "{success:false,msg:'" + result + "'}";
        }
        return json;
    }

    /**
     * ?Agent
     * @param request
     * @return
     * @throws Exception
     */
    public String stopAgent(HttpServletRequest request) throws Exception {
        String status = request.getParameter("status");
        String agentId = request.getParameter("agentId");

        String result = avmonServer.stopAgent(agentId);
        int agentCollectFlag = 0;
        String updateStatus = "";
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);

        if (result.startsWith("00")) {
            agentCollectFlag = 1;
            this.updateAgentStatusByAgentId(status, agentId, agentCollectFlag);
            updateStatus = "{success:true,msg:'" + bundle.getString("agentStopSuccess") + "'}";
        } else {
            this.updateAgentStatusByAgentId(status, agentId, agentCollectFlag);
            updateStatus = "{success:false,msg:'" + result + "'}";
        }

        return updateStatus;
    }

    /**
     * ?AMP?
     * @param request
     * @return
     * @throws Exception
     */
    public Map saveAgentAmp(HttpServletRequest request) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("success", true);

        String ampId = request.getParameter("ampId");
        String ampInstId = request.getParameter("ampInstId");
        String ampName = request.getParameter("ampName");
        String status = request.getParameter("status");
        String agentId = request.getParameter("agentId");

        String ampType = request.getParameter("ampType");

        List<String> sqlList = new ArrayList<String>();

        //?AMP?
        String insertSql = String.format(
                "insert into TD_AVMON_AMP_INST(AMP_ID,AMP_INST_ID,AMP_VERSION,ENABLE_FLAG,SCHEDULE,AGENT_ID,CAPTION,STATUS,LAST_ACTIVE_TIME)\n"
                        + "    values ('%s','%s',(select version from TD_AVMON_AMP where amp_id='%s' ),\n"
                        + "    '%d',(select default_schedule from TD_AVMON_AMP where amp_id='%s' ),'%s','%s','0',null)",
                ampId, ampInstId, ampId, Integer.parseInt(status), ampId, agentId, ampName);
        //jdbcTemplate.execute(insertSql);

        sqlList.add(insertSql);

        if (!"vm".equalsIgnoreCase(ampType) && !"ilo".equalsIgnoreCase(ampType)) {
            //?AMP?KPI?POLICY ?amp?copy?
            //?API?
            String apiSql = String.format(
                    "select AMP_ID as \"ampId\" ,KPI_CODE as \"kpiCode\",SCHEDULE as \"schedule\",KPI_GROUP as \"kpiGroup\"  from TD_AVMON_AMP_KPI where AMP_ID = '%s'",
                    ampId);
            List<Map<String, Object>> apiList = jdbcTemplate.queryForList(apiSql);

            for (Map<String, Object> kpi : apiList) {
                String insertApiPolicySql = "INSERT INTO TD_AVMON_AMP_POLICY(KPI_CODE,KPI_GROUP,SCHEDULE,AGENT_ID,AMP_INST_ID,NODE_KEY)"
                        + "VALUES('%s','%s','%s','%s','%s','NA')";
                insertApiPolicySql = String.format(insertApiPolicySql, kpi.get("kpiCode").toString(),
                        kpi.get("kpiGroup") != null ? kpi.get("kpiGroup").toString() : "",
                        kpi.get("schedule") != null ? kpi.get("schedule").toString() : "", agentId, ampInstId);
                sqlList.add(insertApiPolicySql);
            }
        }

        //?AMP?ATTR?INST_ATTR
        //?ATTR?
        String attrSql = String.format(
                "select name as \"name\" ,default_value as \"value\" from td_avmon_amp_attr where AMP_ID = '%s'",
                ampId);
        List<Map<String, Object>> attrList = jdbcTemplate.queryForList(attrSql);

        for (Map<String, Object> attr : attrList) {
            String insertInstAttrSql = "INSERT INTO td_avmon_amp_inst_attr(NAME,VALUE,AGENT_ID,AMP_INST_ID)"
                    + "VALUES('%s','%s','%s','%s')";
            insertInstAttrSql = String.format(insertInstAttrSql, attr.get("name").toString(),
                    attr.get("value") != null ? attr.get("value").toString() : "", agentId, ampInstId);
            sqlList.add(insertInstAttrSql);
        }

        String batchSql[] = sqlList.toArray(new String[sqlList.size()]);
        //        jdbcTemplate.batchUpdate(batchSql);
        try {
            //         String returnString = transfer1(batchSql);
            jdbcTemplate.batchUpdate(batchSql);
        } catch (Exception e) {
            logger.error(e);
            logger.error(this.getClass().getName() + " saveAgentAmp()", e);
            e.printStackTrace();
            map.put("success", false);
            if (e.toString().indexOf("ORA-00001: unique constraint") > -1) {
                throw new Exception(this.getClass().getName() + "saveAgentAmp ORA-00001 error!");
            } else {
                throw new Exception(this.getClass().getName() + "saveAgentAmp transfer error!");
            }
        }

        return map;
    }

    /**
     * ?AMP?
     * @param request
     * @return
     */
    public Map getNormalAmpAttrList(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String ampId = request.getParameter("ampId");
        String sql = String.format(SqlManager.getSql(AgentManageService.class, "getNormalAmpAttrList")
                + " where a1.AMP_ID = '%s' order by a1.ORDER_INDEX asc", ampId);
        logger.debug("sql: " + sql);
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);

        List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
        //
        Map<String, Object> propertyViewMap = new HashMap<String, Object>();
        //
        Map<String, Object> propertyNullMap = new HashMap<String, Object>();
        // name-value
        for (Map<String, Object> mapDetail : list) {
            propertyViewMap.put(mapDetail.get("name").toString(),
                    mapDetail.get("ampInstValue") == null ? "" : mapDetail.get("ampInstValue"));
            propertyNullMap.put(mapDetail.get("name").toString(),
                    mapDetail.get("nullAble") == null ? "" : mapDetail.get("nullAble"));
        }
        mapList.add(propertyViewMap);
        mapList.add(propertyNullMap);
        map.put("root", mapList);
        return map;
    }

    /**
     * ?amp?
     * @param request
     * @return
     */
    public Map saveNormalAmpAttr(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        final String agentId = request.getParameter("agentId");
        final String ampInstId = request.getParameter("ampInstId");
        String ampAttrJson = request.getParameter("ampAttr");
        Map<String, String> jsonMap = JackJson.fromJsonToObject(ampAttrJson, Map.class);
        List<String> nameList = new LinkedList<String>();
        List<String> valueLis = new LinkedList<String>();
        for (Map.Entry<String, String> tempMap : jsonMap.entrySet()) {
            nameList.add(tempMap.getKey());
            valueLis.add(tempMap.getValue().equals("") ? "" : tempMap.getValue());
        }
        //?
        String delSql = "DELETE FROM TD_AVMON_AMP_INST_ATTR WHERE AMP_INST_ID = ? AND AGENT_ID = ?";
        Object[] delParams = new Object[] { ampInstId, agentId };
        int delCout = jdbcTemplate.update(delSql, delParams);

        //??
        String newAttrSql = "INSERT INTO TD_AVMON_AMP_INST_ATTR(AMP_INST_ID,AGENT_ID,NAME,VALUE)VALUES(?,?,?,?)";
        final List<String> nameListF = nameList;
        final List<String> valueLisF = valueLis;
        BatchPreparedStatementSetter batchPreparedStatementSetter = new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
                preparedStatement.setString(1, ampInstId);
                preparedStatement.setString(2, agentId);
                preparedStatement.setString(3, nameListF.get(i));
                preparedStatement.setString(4, valueLisF.get(i));
            }

            @Override
            public int getBatchSize() {
                return nameListF.size(); //To change body of implemented methods use File | Settings | File Templates.
            }
        };
        int[] newCount = jdbcTemplate.batchUpdate(newAttrSql, batchPreparedStatementSetter);

        logger.debug("del count: " + delCout);
        logger.debug("insert count:" + newCount.length);
        map.put("success", true);
        return map;
    }

    /**
     * ?+????AMP???
     * // modify by mark start
    //???AMP?  --??
    // modify by mark end
     * @param request ?--muzh
     * @return
     */
    public Map pushAgentAmpScript(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //???AMPList
        final List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(
                request.getParameter("agentAmpInfo"));
        StringBuffer buff = new StringBuffer();
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);

        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            String agentId = ampMap.get("agentId");
            String ampId = ampMap.get("ampId");

            String result = avmonServer.deployAmpPackage(agentId, ampInstId);
            buff.append(ampInstId);
            if (result.startsWith("00")) {
                // modify by mark start
                //???AMP?  --??
                String updateAmpStatusSql = String.format(SqlManager.getSql(this, "updateAmpStatus"), ampInstId,
                        ampId, agentId);
                // modify by mark start
                jdbcTemplate.update(updateAmpStatusSql);
                buff.append(bundle.getString("scriptIssuedSuccess"));
            } else {
                buff.append(bundle.getString("scriptIssuedFail"));
                logger.debug(result);
            }
            buff.append("<br/>");
        }
        map.put("msg", buff.toString());
        //        if(pushFlag){
        //            flag  = updateNormalAMPStatus(ampListMapF,ConfigConstant.AMP_STATUS_DISABLED);
        //        }

        map.put("success", true);
        return map;
    }

    /**
     * ??
     * @param request
     * @return
     */
    public Map pushAgentAmpConfig(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String agentId = request.getParameter("agentId");
        List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(request.getParameter("agentAmpInfo"));
        boolean flag = false;
        if (null == ampListMapF.get(0)) {
            ampListMapF = (ArrayList) request.getAttribute("agentAmpInfo");
            logger.debug("===========ampListMapF====================" + ampListMapF);
        }
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        //TODO ???
        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            //String moId = ampMap.get("moId");
            //String kpiCode = ampMap.get("kpiCode");
            //String schedule = ampMap.get("schedule");
            String result = avmonServer.deployAmpConfig(agentId, ampInstId);
            //String result = avmonServer.deployAmpSchedule(agentId, ampInstId,moId,kpiCode,null,schedule);
            if (result.startsWith("00")) {
                map.put("success", true);
                map.put("msg", bundle.getString("configIssuedSuccess"));
                String sql = String.format(SqlManager.getSql(this, "pushAgentAmpConfig"), ampInstId, agentId);
                jdbcTemplate.execute(sql);
            } else {
                logger.error("?" + result);
                map.put("success", false);
                map.put("msg", result);
            }
        }

        return map;
    }

    /**
     * ?AMP
     * @param request
     * @return
     */
    public Map pauseNormalAmp(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //TODO ?AMP  ??AMP?

        final List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(
                request.getParameter("agentAmpInfo"));
        boolean flag = false;
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            String agentId = ampMap.get("agentId");
            String ampId = ampMap.get("ampId");

            String result = avmonServer.stopAmp(agentId, ampInstId);
            if (result.startsWith("00")) {
                String updateAmpStatusSql = String.format(
                        "UPDATE TD_AVMON_AMP_INST SET STATUS = 2 WHERE AMP_INST_ID ='%s' AND AMP_ID ='%s' AND AGENT_ID ='%s'",
                        ampInstId, ampId, agentId);
                jdbcTemplate.update(updateAmpStatusSql);
                flag = true;
                map.put("errorMsg", bundle.getString("stopNormalAMPSuccess"));
            } else {
                map.put("errorMsg", result);
            }
        }

        //updateNormalAMPStatus(ampListMapF,ConfigConstant.AMP_STATUS_DISABLED);
        if (flag) {
            map.put("success", true);
        } else {
            map.put("success", false);
        }
        return map;
    }

    /**
     * ?AMP
     * @param request
     * @return
     */
    public Map startNormalAmp(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //TODO ?AMP  ??AMP?
        final List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(
                request.getParameter("agentAmpInfo"));

        boolean flag = false;
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            String agentId = ampMap.get("agentId");
            String ampId = ampMap.get("ampId");

            String result = avmonServer.startAmp(agentId, ampInstId);
            if (result.startsWith("00")) {
                String updateAmpStatusSql = String.format(
                        "UPDATE TD_AVMON_AMP_INST SET STATUS = 1 WHERE AMP_INST_ID ='%s' AND AMP_ID ='%s' AND AGENT_ID ='%s'",
                        ampInstId, ampId, agentId);
                jdbcTemplate.update(updateAmpStatusSql);
                flag = true;
                map.put("errorMsg", bundle.getString("startNormalAMPSuccess"));
            } else {
                map.put("errorMsg", result);
            }
        }

        //boolean flag = updateNormalAMPStatus(ampListMapF, ConfigConstant.AMP_STATUS_ACTIVITY);
        if (flag) {
            map.put("success", true);
        } else {
            map.put("success", false);
        }
        return map;
    }

    /**
     * ?AMP
     * @param request
     * @return
     */
    public Map getNormalAmpSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String agentId = request.getParameter("agentId");
        String ampInstId = request.getParameter("ampInstId");
        //?KPI
        String sql = SqlManager.getSql(this, "updateNormalAmpSchedule");
        sql = sql.replaceAll("\\{AGENT_ID\\}", agentId);
        sql = sql.replaceAll("\\{AMP_INST_ID\\}", ampInstId);
        System.out.println(">>>" + sql);
        jdbcTemplate.execute(sql);
        //
        sql = SqlManager.getSql(AgentManageService.class, "getNormalAmpSchedule");
        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql, new Object[] { agentId, ampInstId });
        map.put("root", mapList);
        return map;
    }

    /**
     * ?
     * @param request
     * @return
     */
    public Map pushAmpSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String scheduleJsonAttr = request.getParameter("agentAmpInfo");
        String agentId = request.getParameter("agentId");
        List<Map<String, String>> mapList = getListMapByJsonArrayString(scheduleJsonAttr);

        /**
        agentId  Agent ID
        ampInstId  Amp Instance Id
        nodeKey - moId
        kpiCode  KPI Code
        instance  ?
        schedule  
        */
        boolean flag = false;
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        String selectedids = "";
        String ampInstId = "";
        ampInstId = mapList.get(0).get("ampInstId");
        for (Map<String, String> ampMap : mapList) {
            String kpiCode = ampMap.get("kpiCode");
            selectedids += kpiCode + "','";
        }

        selectedids = selectedids.substring(0, selectedids.length() - 3);
        //1.kpicode groupSCHEDULE
        //2.??group,?kpiCode?
        String allScheduleSql = "select distinct SCHEDULE as \"schedule\",KPI_GROUP as \"kpiGroup\" from td_avmon_amp_policy where agent_id = '"
                + agentId + "' and AMP_INST_ID = '" + ampInstId + "' and kpi_code in ('" + selectedids + "')";
        @SuppressWarnings("unchecked")
        final List<Map<String, String>> schedules = jdbcTemplate.queryForList(allScheduleSql);
        String kpiGroups = "";

        for (Map<String, String> map1 : schedules) {
            kpiGroups += map1.get("kpiGroup") + "','";
        }

        if (schedules.size() > 0) {
            kpiGroups = kpiGroups.substring(0, kpiGroups.length() - 3);
            boolean updateResult = this.changePolicySchedule(agentId, ampInstId, schedules, kpiGroups);

            if (updateResult) {
                String result = avmonServer.deployAmpSchedule(agentId, ampInstId);
                if (result.startsWith("00")) {
                    flag = true;
                    map.put("errorMsg", bundle.getString("dispatchIssuedSuccess"));
                    this.updatePolicyStatus(agentId, ampInstId, kpiGroups);
                } else {
                    map.put("errorMsg", bundle.getString("dispatchIssuedFail"));
                }
            }
        }

        map.put("success", flag);
        return map;
    }

    /**
     * ?
     * @param agentId
     * @param ampInstId
     * @param selectedids
     * @return
     */
    private boolean changePolicySchedule(String agentId, String ampInstId,
            final List<Map<String, String>> schedules, String kpiGroups) {
        boolean result = false;

        String updateSql = "update TD_AVMON_AMP_POLICY set SCHEDULE = ? where agent_id = '" + agentId
                + "' and AMP_INST_ID = '" + ampInstId + "' and KPI_GROUP = ?";
        String updateOtherSql = "update TD_AVMON_AMP_POLICY set SCHEDULE = '" + NOT_EXISTS_DATE
                + "' where agent_id = '" + agentId + "' and AMP_INST_ID = '" + ampInstId
                + "' and KPI_GROUP not in ('" + kpiGroups + "')";
        BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {
            @Override
            public int getBatchSize() {
                return schedules.size();
            }

            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                ps.setString(1, schedules.get(i).get("schedule"));
                ps.setString(2, schedules.get(i).get("kpiGroup"));
            }
        };
        int[] cnt = jdbcTemplate.batchUpdate(updateSql, setter);
        if (cnt.length > 0) {
            try {
                jdbcTemplate.execute(updateOtherSql);
                logger.debug("=================updateOtherSql===========" + updateOtherSql);
                jdbcTemplate.getDataSource().getConnection().commit();
                result = true;
            } catch (Exception e) {
                logger.error(e);
                logger.error("========updatePolicySchedule===========policy");
                return false;
            }
        }

        return result;
    }

    /**
      * ??1,0
      * @param selectedids
      */
    private boolean updatePolicyStatus(String agentId, String ampInstId, String kpiGroups) {
        boolean result = false;
        String updateSelectedSql = "update TD_AVMON_AMP_POLICY set STATUS = '1' where agent_id = '" + agentId
                + "' and amp_inst_id = '" + ampInstId + "' and schedule !='" + NOT_EXISTS_DATE
                + "' and kpi_group in ('";
        String updateNonSelectedSql = "update TD_AVMON_AMP_POLICY set STATUS = '0' where agent_id = '" + agentId
                + "' and amp_inst_id = '" + ampInstId + "' and kpi_group not in ('";
        if (!"'".equals(kpiGroups)) {
            updateSelectedSql += kpiGroups + "')";
            updateNonSelectedSql += kpiGroups + "')";
            try {
                jdbcTemplate.execute(updateSelectedSql);
                jdbcTemplate.execute(updateNonSelectedSql);
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(e);
                logger.error("===========updatePolicyStatus=======");
            }
        }
        return result;
    }

    /**
      * ?AMP AMP?
      * @param request
      * @return
      */
    public Map findIssuedAmpSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String scheduleJsonAttr = request.getParameter("agentAmpInfo");
        String agentId = request.getParameter("agentId");
        List<Map<String, String>> mapList = getListMapByJsonArrayString(scheduleJsonAttr);
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        //TODO ????
        map.put("success", false);
        map.put("errorMsg", bundle.getString("cannotBeIssuedPolicyInformation"));
        return map;
    }

    /**
     * ??
     * @param request
     * @return
     */
    public Map saveAgentSchedue(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String scheduleJsonAttr = request.getParameter("scheduleAttr");
        String agentId = request.getParameter("agentId");
        Map<String, String> jsonMap = JackJson.fromJsonToObject(scheduleJsonAttr, Map.class);
        //KPI Code?????KPI code 
        if (jsonMap.get("kpiGroup") == null || jsonMap.get("kpiGroup").equals("")) {
            String sql = "update TD_AVMON_AMP_POLICY set SCHEDULE = ? where KPI_CODE = ? and AGENT_ID = ? and AMP_INST_ID = ? and KPI_GROUP is null ";
            jdbcTemplate.update(sql, new Object[] { jsonMap.get("schedule"), jsonMap.get("kpiCode"),
                    jsonMap.get("agentId"), jsonMap.get("ampInstId") });
        } else {
            String sql = "update TD_AVMON_AMP_POLICY set SCHEDULE = ? where KPI_GROUP = ? and AGENT_ID = ? and AMP_INST_ID = ? ";
            jdbcTemplate.update(sql, new Object[] { jsonMap.get("schedule"), jsonMap.get("kpiGroup"),
                    jsonMap.get("agentId"), jsonMap.get("ampInstId") });
        }
        map.put("success", true);
        return map;
    }

    /**
     * ?AMP?
     * @param request
     * @return
     */
    public Map uinstallNormalAmp(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String ampListJson = request.getParameter("agentAmpInfoList");
        String agentId = request.getParameter("agentId");
        List<Map<String, String>> mapList = getListMapByJsonArrayString(ampListJson);
        //TODO ???AMP?
        map.put("success", true);
        return map;
    }

    /**
     * JSONListMap?
     * @param jsonString
     * @return
     */
    private List<Map<String, String>> getListMapByJsonArrayString(String jsonString) {
        List<Map<String, String>> ampListMap = new ArrayList<Map<String, String>>();
        JSONArray jsonArray = null;
        try {
            jsonArray = JSONArray.fromObject(jsonString);//new JSONArray(jsonString);
            for (int s = 0; s < jsonArray.size(); s++) {//.length();s++){
                Map<String, String> entityMap = JackJson.fromJsonToObject(jsonArray.get(s).toString(), Map.class);
                ampListMap.add(entityMap);
            }
        } catch (JSONException e) {
            e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
        }
        return ampListMap;
    }

    /**
     * ?AMP?
     * @param ampListMapF
     * @param status
     * @return
     */
    private boolean updateNormalAMPStatus(final List<Map<String, String>> ampListMapF, final int status) {
        String updateSql = "UPDATE TD_AVMON_AMP_INST SET STATUS = ? WHERE AMP_INST_ID = ? AND AMP_ID = ? AND AGENT_ID = ?";
        int[] updateCount = jdbcTemplate.batchUpdate(updateSql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
                Map<String, String> stringMap = ampListMapF.get(i);
                preparedStatement.setInt(1, status);
                preparedStatement.setString(2, stringMap.get("ampInstId"));
                preparedStatement.setString(3, stringMap.get("ampId"));
                preparedStatement.setString(4, stringMap.get("agentId"));
            }

            @Override
            public int getBatchSize() {
                return ampListMapF.size(); //To change body of implemented methods use File | Settings | File Templates.
            }
        });
        if (updateCount.length == ampListMapF.size())
            return true;
        return false;
    }

    /**
     * ?AgentIdagent?
     * @param status
     * @param agentId
     * @return
     */
    private String updateAgentStatusByAgentId(String status, String agentId, int agentCollectFlag) {
        // modify by mark start
        // agent??
        String updateSql = String.format(
                "update td_avmon_agent set agent_status = '%s',AGENT_COLLECT_FLAG = %s where AGENT_ID = '%s'",
                status, agentCollectFlag, agentId);
        // modify by mark end
        jdbcTemplate.execute(updateSql);
        return "success";
    }

    private String generatPageSql(String sql, String limit, String start) {
        Integer limitL = Integer.valueOf(limit);
        Integer startL = Integer.valueOf(start);//+1;

        //oracle??
        /*StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( ");
        paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( ");
        paginationSQL.append(sql);
        paginationSQL.append(" ) temp where ROWNUM <= " + (startL-1+limitL));//limitL*((startL-1)/10+1));//limitL*startL);
        paginationSQL.append(" ) WHERE num > " + (startL-1));
        return paginationSQL.toString();*/
        return DBUtils.pagination(sql, startL, limitL);
    }

    /**
     * ???
     * @param request
     * @return
     */
    public List<Map<String, Object>> findAmpInstAttrGridInfo(HttpServletRequest request) {

        String agentId = request.getParameter("agentId");
        String ampInstId = request.getParameter("ampInstId");

        String listSql = SqlManager.getSql(AgentManageService.class, "findAmpInstAttrList");
        listSql = String.format(listSql, ampInstId, agentId);

        List<Map<String, Object>> list = jdbcTemplate.queryForList(listSql);

        return list;
    }

    /**
     * ??
     * @param agentId
     * @param ampInstId
     * @param attrs
     * @return
     * @throws Exception
     */
    public Map saveAmpInstAttr(String agentId, String ampInstId, String attrs) throws Exception {

        List<String> sqlList = new ArrayList<String>();

        String[] attrss = attrs.split(",");
        for (String attr : attrss) {
            String[] tmp = attr.split("=");
            if (tmp.length == 2) {
                String attrName = tmp[0];
                String attrValue = tmp[1];
                String updateAmpInstAttrSql = "update td_avmon_amp_inst_attr set value='%s'"
                        + " where agent_id='%s' and amp_inst_id='%s' and name='%s'";
                updateAmpInstAttrSql = String.format(updateAmpInstAttrSql, attrValue, agentId, ampInstId, attrName);

                sqlList.add(updateAmpInstAttrSql);

                //jdbcTemplate.execute(updateAmpInstAttrSql);
            }
        }
        String[] sqlArray = sqlList.toArray(new String[sqlList.size()]);
        try {
            transfer(sqlArray);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.error(this.getClass().getName() + " saveAmpInstAttr()", e);
        }

        return null;
    }

    /**
     * ?
     * @param agentId
     * @param ampInstId
     * @param schedule
     */
    public Map saveVmSchedule(String agentId, String ampInstId, String schedule, String dispatchIssuedSuccess) {
        String updateAmpInstScheduleSql = "update td_avmon_amp_inst set schedule='%s'"
                + " where agent_id='%s' and amp_inst_id='%s'";
        updateAmpInstScheduleSql = String.format(updateAmpInstScheduleSql, schedule, agentId, ampInstId);
        jdbcTemplate.execute(updateAmpInstScheduleSql);
        //??
        Map<String, Object> map = new HashMap<String, Object>();
        boolean flag = false;

        String result = avmonServer.deployAmpSchedule(agentId, ampInstId);
        if (result.startsWith("00")) {
            flag = true;
            map.put("msg", dispatchIssuedSuccess);
        } else {
            map.put("msg", result);
        }

        map.put("success", flag);
        return map;
    }

    /**
     * ?
     * @param newObj
     * @param agentId
     * @param ampInstId
     */
    public void saveVmHost(TreeObject newObj, String agentId, String ampInstId) {
        //modify by mark start 2013-9-12
        String insertVmHostSql = "insert into td_avmon_amp_vm_host(ip,hostname,host_status,enable_flag,obj_id,obj_name,obj_parent,agent_id,amp_inst_id,obj_type) "
                + "values('%s','%s','%s',0,'%s','%s','%s','%s','%s','%s')";
        //modify by mark end 2013-9-12
        insertVmHostSql = String.format(insertVmHostSql, newObj.getHostIp(), newObj.getHostName(),
                newObj.getHostStatus(), newObj.getId(), newObj.getText(), newObj.getPid(), agentId, ampInstId,
                newObj.getObjType());

        jdbcTemplate.execute(insertVmHostSql);
    }

    /**
     * ?
     * @param agentId
     * @param ampInstId
     * @param flag
     * @param objIds
     * @throws Exception 
     */
    public void updateVmMonitorStatus(String agentId, String ampInstId, String flag, String objIds)
            throws Exception {
        String objIdArray[] = objIds.split(",");

        String addMoId = "";

        List<String> addSql = new ArrayList();

        if ("start".equalsIgnoreCase(flag)) {//??MO?
            for (String objId : objIdArray) {
                String moId = UUID.randomUUID().toString().replace("-", "");

                String selectVmInfoSql = String.format(
                        "select ip as \"ip\",hostname as \"hostName\" " + "from td_avmon_amp_vm_host "
                                + "where agent_id='%s' and amp_inst_id='%s' and obj_id='%s'",
                        agentId, ampInstId, objId);
                Map<String, String> vmMap = jdbcTemplate.queryForMap(selectVmInfoSql);
                Map<String, String> attrMap = new HashMap();
                // modify by mark start 2014-1-23
                if (null != vmMap) {
                    String ip = vmMap.get("ip");
                    if (!StringUtils.isEmpty(ip)) {
                        attrMap.put("ip", ip);
                        attrMap.put("realip", ip);
                    } else {
                        attrMap.put("ip", "NA");
                        attrMap.put("realip", "NA");
                    }
                }
                //            attrMap.put("ip", vmMap!=null?vmMap.get("ip"):null);
                // modify by mark end 2014-1-23
                // modify by mark start 2014-1-24 td_avmon_mo_info caption--->hostName
                String hostName = vmMap != null ? vmMap.get("hostName") : null;
                attrMap.put("hostName", hostName);
                //            logger.debug("--------------------------------hostName is "+hostName);
                String addReslult = this.addMo(moId, "VE_VMHOST", hostName, "VE", "AGENTLESS", objId, agentId,
                        attrMap);
                // modify by mark end 2014-1-24
                if (addReslult.startsWith("00")) {
                    addMoId = addMoId + "'" + moId + "',";
                    // modify by mark start 2013-9-26
                    String updateVmEnableFlagSql = "update td_avmon_amp_vm_host set enable_flag=%d ,mo_id='%s'"
                            + "where agent_id='%s' and amp_inst_id='%s' and obj_id = '%s'";
                    // modify by mark end 2013-9-26
                    updateVmEnableFlagSql = String.format(updateVmEnableFlagSql, 1, moId, agentId, ampInstId,
                            objId);
                    addSql.add(updateVmEnableFlagSql);
                } else if ("1".equalsIgnoreCase(addReslult)) {
                    throw new Exception("license count error!");
                } else {
                    throw new Exception(addReslult);
                }
            }
            if (addMoId.length() > 0) {
                addMoId = addMoId.substring(1, addMoId.length() - 2);
            }
        }

        if ("start".equalsIgnoreCase(flag)) {
            try {
                String[] sqlArray = addSql.toArray(new String[addSql.size()]);
                transfer(sqlArray);
            } catch (Exception e) {
                //??MO
                this.deleteMo(addMoId);
                e.printStackTrace();
                logger.error(this.getClass().getName() + " updateVmMonitorStatus", e);
            }
        } else {
            int enableFlag = 0;
            String updateObjIds = objIds.replace(",", "','");
            String updateVmEnableFlagSql = "update td_avmon_amp_vm_host set enable_flag=%d "
                    + "where agent_id='%s' and amp_inst_id='%s' and obj_id in ('%s')";
            updateVmEnableFlagSql = String.format(updateVmEnableFlagSql, enableFlag, agentId, ampInstId,
                    updateObjIds);
            try {
                jdbcTemplate.execute(updateVmEnableFlagSql);
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(this.getClass().getName() + " updateVmMonitorStatus", e);
            }
        }
    }

    /**
     * 
     * @param agentId
     * @param ampInstId
     * @param objIds
     * @throws Exception 
     */
    public void deleteVmHost(String agentId, String ampInstId, String objIds) throws Exception {

        //mo
        String deleteMoAttrSql = String.format(
                "delete from td_avmon_mo_info_attribute " + "where mo_id in ("
                        + "select mo_id from td_avmon_amp_vm_host "
                        + "where agent_id='%s' and amp_inst_id='%s' and obj_id in ('%s')" + ")",
                agentId, ampInstId, objIds.replace(",", "','"));
        String deleteMoSql = String.format(
                "delete from td_avmon_mo_info where mo_id in (" + "select mo_id from td_avmon_amp_vm_host "
                        + "where agent_id='%s' and amp_inst_id='%s' and obj_id in ('%s')" + ")",
                agentId, ampInstId, objIds.replace(",", "','"));

        String deleteVmHostSql = "delete from td_avmon_amp_vm_host "
                + "where agent_id='%s' and amp_inst_id='%s' and obj_id in ('%s')";
        deleteVmHostSql = String.format(deleteVmHostSql, agentId, ampInstId, objIds.replace(",", "','"));
        String[] deleteSql = { deleteMoAttrSql, deleteMoSql, deleteVmHostSql };
        try {
            String result = transfer1(deleteSql);
            if ("1".equals(result)) {
                throw new Exception(this.getClass().getName() + " deleteVmHost transfer error!");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.error(this.getClass().getName() + " deleteVmHost", e);
            throw e;
        }
    }

    /**
     * ?ilo?
     * @param request
     * @return
     */
    public Map findAmpInstPolicyGridInfo(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //??
        String agentId = request.getParameter("agentId");
        String ampInstId = request.getParameter("ampInstId");
        String flag = request.getParameter("flag");
        String nodeKey = request.getParameter("nodeKey");

        String listSql = "";
        if ("new".equalsIgnoreCase(flag)) {
            listSql = SqlManager.getSql(AgentManageService.class, "findAmpKpiList");
            listSql = String.format(listSql, agentId, ampInstId);
        } else {
            listSql = SqlManager.getSql(AgentManageService.class, "findAmpInstPolicyList");
            listSql = String.format(listSql, agentId, ampInstId, nodeKey);
        }
        List<Map<String, Object>> list = jdbcTemplate.queryForList(listSql);

        map.put("root", list);
        return map;
    }

    /**
     * ?ilo?
     * @param request
     * @return
     */
    public Map findIloHostGridInfo(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //??
        String agentId = request.getParameter("agentId");
        String ampInstId = request.getParameter("ampInstId");

        String listSql = SqlManager.getSql(AgentManageService.class, "findAmpIloHostList");
        listSql = String.format(listSql, agentId, ampInstId);

        List<Map<String, Object>> list = jdbcTemplate.queryForList(listSql);

        map.put("root", list);
        return map;
    }

    /**
     * ?ilo
     * @param request
     * @return
     * @throws Exception
     */
    public String saveIloHost(HttpServletRequest request) throws Exception {
        String agentId = request.getParameter("agentId");
        String ampInstId = request.getParameter("ampInstId");
        String ip = request.getParameter("ip");
        String oldIp = request.getParameter("oldIp");
        String hostName = request.getParameter("hostName");
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        String extParam1 = request.getParameter("extParam1");
        String extParam2 = request.getParameter("extParam2");
        String extParam3 = request.getParameter("extParam3");
        String policys = request.getParameter("policys");
        String flag = request.getParameter("flag");
        String moId = request.getParameter("moId");

        JSONArray json = JSONArray.fromObject(policys);
        List<AmpPolicyBean> policyList = (List<AmpPolicyBean>) JSONArray.toCollection(json, AmpPolicyBean.class);

        List<String> sqlList = new ArrayList<String>();
        String mo_id = UUID.randomUUID().toString().replace("-", "");
        String iloCountSql = "select count(1) from td_avmon_amp_ilo_host where agent_id='%s' and amp_inst_id='%s' and ip='%s'";
        iloCountSql = String.format(iloCountSql, agentId, ampInstId, ip);
        int iloHostCount = jdbcTemplate.queryForInt(iloCountSql);
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        if ("new".equalsIgnoreCase(flag)) {
            if (iloHostCount > 0) {
                return "{success:false,msg:'" + bundle.getString("ipExisted") + "'}";
            } else {
                //ilo??mo info?
                Map<String, String> attrMap = new HashMap();
                attrMap.put("ip", ip);
                attrMap.put("realip", ip);
                attrMap.put("hostname", hostName);
                String addResult = this.addMo(mo_id, "HARDWARE_HP", hostName, "HARDWARE", "AGENTLESS", ip, agentId,
                        attrMap);
                if ("1".equalsIgnoreCase(addResult)) {
                    return "{success:false,msg:'" + bundle.getString("monitoringObjectHasReachedTheMaximumLimit")
                            + "'}";
                } else if (!addResult.startsWith("00")) {
                    return "{success:false,msg:'" + addResult + "'}";
                }
                String insertIloHostSql = "insert into td_avmon_amp_ilo_host(agent_id,amp_inst_id,ip,hostname,username,password,ext_param1,ext_param2,ext_param3,mo_id) "
                        + "values('%s','%s','%s','%s','%s','%s','%s','%s','%s','" + mo_id + "')";
                insertIloHostSql = String.format(insertIloHostSql, agentId, ampInstId, ip, hostName, userName,
                        password, extParam1, extParam2, extParam3);
                sqlList.add(insertIloHostSql);

                for (AmpPolicyBean policy : policyList) {//ilocopykpi?
                    String insertPolicySql = "insert into td_avmon_amp_policy(agent_id,amp_inst_id,kpi_code,node_key,kpi_group,schedule) "
                            + "values('%s','%s','%s','%s','%s','%s')";

                    insertPolicySql = String.format(insertPolicySql, agentId, ampInstId, policy.getKpiCode(), ip,
                            policy.getKpiGroup() == null ? "" : policy.getKpiGroup(),
                            MyFunc.returnNull(policy.getSchedule()));
                    sqlList.add(insertPolicySql);
                }
            }
        } else if (!ip.equalsIgnoreCase(oldIp)) {//IP?IP??policy?,MO attr?
            if (iloHostCount > 0) {
                return "{success:false,msg:'" + bundle.getString("ipExisted") + "'}";
            } else {
                //1update td_avmon_amp_policy
                String updatePolicyNodeKey = "update td_avmon_amp_policy set node_key='%s' where node_key='%s'";
                updatePolicyNodeKey = String.format(updatePolicyNodeKey, ip, oldIp);
                sqlList.add(updatePolicyNodeKey);
                //2update mo_attr
                String updateMoAttrIp = "update td_avmon_mo_info_attribute set value='%s' where upper(name)=upper('%s') and mo_id='%s'";
                updateMoAttrIp = String.format(updateMoAttrIp, ip, "ip", moId);
                sqlList.add(updateMoAttrIp);
                //3update avmon_ilo_host
                String updateIloHostIp = "update td_avmon_amp_ilo_host set ip='%s' where ip='%'";
                updateIloHostIp = String.format(updateIloHostIp, ip, oldIp);
                sqlList.add(updateIloHostIp);
            }
        } else {
            String updateIloHostSql = "update td_avmon_amp_ilo_host set hostname='%s',username='%s',password='%s',"
                    + "ext_param1='%s',ext_param2='%s',ext_param3='%s' " + "where ip='%s'";
            updateIloHostSql = String.format(updateIloHostSql, hostName, userName, password, extParam1, extParam2,
                    extParam3, ip);
            sqlList.add(updateIloHostSql);
        }

        String[] sqlArray = sqlList.toArray(new String[sqlList.size()]);
        //jdbcTemplate.batchUpdate(sqlArray);
        try {
            transfer(sqlArray);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            //ilo?MO??MO
            if ("new".equalsIgnoreCase(flag)) {
                this.deleteMo(mo_id);
            }
            e.printStackTrace();
            logger.error(this.getClass().getName() + " saveIloHost()", e);
            return "{success:false,msg:'" + bundle.getString("saveFail") + "'}";
        }
        return "{success:true,msg:'" + bundle.getString("saveSuccess") + "'}";
    }

    @Autowired
    private TransactionTemplate transactionTemplate;

    //
    public void transfer(final String[] sqls) throws Exception {
        final String trasactionFlag = "0";
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    // JdbcTemplate batchUpdate?
                    jdbcTemplate.batchUpdate(sqls);
                } catch (Exception e) {
                    System.out.println("----------RuntimeException-----" + e);
                    status.setRollbackOnly(); // 
                }
            }
        });
    }

    //
    public String transfer1(final String[] sqls) throws Exception {
        String flag = transactionTemplate.execute(new TransactionCallback<String>() {
            public String doInTransaction(TransactionStatus status) {
                try {
                    // JdbcTemplate batchUpdate?
                    jdbcTemplate.batchUpdate(sqls);
                } catch (Exception e) {
                    System.out.println("----------RuntimeException-----" + e);
                    status.setRollbackOnly(); // 

                    if (e.toString().indexOf("ORA-00001: unique constraint") > -1) {
                        return "ORA-00001";
                    } else {
                        return "1";
                    }
                }
                return "0";
            }
        });
        return flag;
    }

    /**
     * ?ilo?
     * @param request
     * @return
     */
    public Map saveIloSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();

        String ampInstId = request.getParameter("ampInstId");
        String agentId = request.getParameter("agentId");
        String nodeKey = request.getParameter("nodeKey");
        String kpiCode = request.getParameter("kpiCode");
        String schedule = request.getParameter("schedule");
        String kpiGroup = request.getParameter("kpiGroup");

        try {
            //KPI Code?????KPI code 
            if (kpiGroup == null || "".equals(kpiGroup)) {
                String sql = "update TD_AVMON_AMP_POLICY set SCHEDULE = ? "
                        + "where KPI_CODE = ? and AGENT_ID = ? and AMP_INST_ID = ? and node_key=? and KPI_GROUP is null ";
                jdbcTemplate.update(sql, new Object[] { schedule, kpiCode, agentId, ampInstId, nodeKey });
            } else {
                String sql = "update TD_AVMON_AMP_POLICY set SCHEDULE = ? where KPI_GROUP = ? and AGENT_ID = ? and AMP_INST_ID = ? and node_key=?";
                jdbcTemplate.update(sql, new Object[] { schedule, kpiGroup, agentId, ampInstId, nodeKey });
            }
            map.put("success", true);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(this.getClass().getName() + " saveIloSchedule", e);
            map.put("success", false);
            return map;
        }

        return map;
    }

    /**
     * ?
     * @param moId
     * @param typeId
     * @param caption
     * @param parentId
     * @param desc
     * @param agentId
     * @param attrMap
     * 
     * private String moId;
     private String agentId;
     private String caption;
     private String type;
     private String description;
     private Map attr;
     * 
     * @return "0"?"1"MO?"2"?
     */
    public String addMo(String moId, String typeId, String caption, String parentId, String protocol, String desc,
            String agentId, Map<String, String> attrMap) {
        logger.debug(String.format("addMo %s type=%s", moId, typeId));
        int maxMoCount = licenseService.getMaxMoCount();
        String countMoSql = "select count(1) from td_avmon_mo_info";
        int moCount = jdbcTemplate.queryForInt(countMoSql);
        String result = "99";
        if (moCount >= maxMoCount) {
            return "1";
        } else {
            //yongqiang?MO_INFO
            MO mo = new MO();
            mo.setAgentId(agentId);
            mo.setCaption(caption);
            mo.setDescription(desc);
            mo.setParentId(parentId);
            mo.setMoId(moId);
            mo.setType(typeId);
            mo.setProtocalMethod(protocol);
            if (attrMap != null) {
                Set<String> key = attrMap.keySet();
                for (Iterator it = key.iterator(); it.hasNext();) {
                    String attrName = (String) it.next();
                    mo.setAttr(attrName, attrMap.get(attrName));
                }
            }
            result = avmonServer.createMo(mo);
            logger.debug("avmonServer.createMo(mo) return " + result);
        }

        return result;

    }

    /**
     * 
     * @param moId
     * @return
     */
    public String deleteMo(String moId) {
        String deleteMoAttrSql = String.format("delete from td_avmon_mo_info_attribute where mo_id in ('%s')",
                moId);
        String deleteMoSql = String.format("delete from td_avmon_mo_info where mo_id in ('%s')", moId);
        String[] deleteSql = { deleteMoAttrSql, deleteMoSql };
        try {
            transfer(deleteSql);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "1";
        }
        return "0";
    }

    public void deleteIloHostByIps(String agentId, String ampInstId, String ips) throws Exception {
        //mo
        String deleteMoAttrSql = String.format("delete from td_avmon_mo_info_attribute " + "where mo_id in ("
                + "select mo_id from td_avmon_amp_ilo_host "
                + "where agent_id='%s' and amp_inst_id='%s' and ip in (%s)" + ")", agentId, ampInstId, ips);
        String deleteMoSql = String
                .format("delete from td_avmon_mo_info where mo_id in (" + "select mo_id from td_avmon_amp_ilo_host "
                        + "where agent_id='%s' and amp_inst_id='%s' and ip in (%s)" + ")", agentId, ampInstId, ips);

        String deleteIloHostSql = "delete from td_avmon_amp_ilo_host "
                + "where agent_id='%s' and amp_inst_id='%s' and ip in (%s)";
        deleteIloHostSql = String.format(deleteIloHostSql, agentId, ampInstId, ips);
        String[] deleteSql = { deleteMoAttrSql, deleteMoSql, deleteIloHostSql };
        try {
            String result = transfer1(deleteSql);
            if ("1".equals(result)) {
                throw new Exception(this.getClass().getName() + " deleteIloHost transfer error!");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.error(this.getClass().getName() + " deleteIloHost", e);
            throw e;
        }
    }

    public Map pushAgentAmpSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //???AMPList
        final List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(
                request.getParameter("agentAmpInfo"));
        StringBuffer buff = new StringBuffer();
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);

        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            String agentId = ampMap.get("agentId");
            String ampId = ampMap.get("ampId");
            // add by mark start 2014-3-20
            //??????
            String scriptDeploySql = "SELECT status from td_avmon_amp_inst where agent_id = '" + agentId
                    + "' and amp_inst_id='" + ampInstId + "'";
            int status = jdbcTemplate.queryForInt(scriptDeploySql);
            if (status == 0) {
                buff.append(bundle.getString("deployAMPfirst"));
                continue;
            }
            // add by mark end 2014-3-20

            //TODO ??,??
            String result = avmonServer.deployAmpSchedule(agentId, ampInstId);
            buff.append(ampInstId);
            if (result.startsWith("00")) {
                String updateAmpStatusSql = String.format(SqlManager.getSql(this, "updateAMPInstallTime"),
                        ampInstId, ampId, agentId);
                jdbcTemplate.update(updateAmpStatusSql);
                // add by mark start 2014-6-17
                String updateScheduleStatusSql = "update TD_AVMON_AMP_POLICY set status = '1' where agent_id = '"
                        + agentId + "' and amp_inst_id = '" + ampInstId + "' and  schedule != '" + NOT_EXISTS_DATE
                        + "'";
                jdbcTemplate.update(updateScheduleStatusSql);
                // add by mark end 2014-6-17
                buff.append(bundle.getString("dispatchIssuedSuccess"));
            } else {
                buff.append(bundle.getString("dispatchIssuedFail"));
            }
            buff.append("<br/>");
        }
        map.put("msg", buff.toString());
        map.put("success", true);
        return map;
    }

    public Map batchPushAgentAmpSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        //???AMPList
        final List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(
                request.getParameter("agentAmpInfo"));
        boolean flag = false;
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            String agentId = ampMap.get("agentId");

            String result = avmonServer.deployAmpSchedule(agentId, ampInstId);
            if (result.startsWith("00")) {
                //String updateAmpStatusSql = String.format("UPDATE TD_AVMON_AMP_INST SET STATUS = 2 WHERE AMP_INST_ID ='%s' AND AMP_ID ='%s' AND AGENT_ID ='%s'",ampInstId,ampId,agentId);
                //jdbcTemplate.update(updateAmpStatusSql);
                flag = true;
                map.put("errorMsg", bundle.getString("dispatchIssuedSuccess"));
            } else {
                map.put("errorMsg", result);
            }
        }
        map.put("success", flag);
        return map;
    }

    public Map pushIloHostSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String agentId = request.getParameter("agentId");
        List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(request.getParameter("agentAmpInfo"));
        boolean flag = false;
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        //TODO ???
        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            String ip = ampMap.get("ip");

            String sql = String.format(
                    "select * from td_avmon_amp_policy where agent_id='%s' and amp_inst_id='%s' and node_key='%s'",
                    agentId, ampInstId, ip);

            List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);

            for (Map<String, Object> m : list) {
                String result = avmonServer.deployAmpSchedule(agentId, ampInstId, ampMap.get("moId"),
                        m.get("KPI_CODE").toString(), null, m.get("SCHEDULE").toString());
                //String result = avmonServer.deployAmpSchedule(agentId, ampInstId,moId,kpiCode,null,schedule);
                if (result.startsWith("00")) {
                    map.put("success", true);
                    map.put("errorMsg", bundle.getString("dispatchIssuedSuccess"));
                } else {
                    map.put("success", false);
                    map.put("errorMsg", result);
                    return map;
                }
            }
        }

        return map;
    }

    public Map pushSelectedIloHostSchedule(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        String moId = request.getParameter("moId");
        //        String nodeKey = null;
        // modify by mark start
        //        String sql = SqlManager.getSql(AgentManageService.class, "getIloNodeKey");
        //        sql = String.format(sql, moId);
        //        List<Map<String,String>>list = jdbcTemplate.queryForList(sql);
        //        if (list.size() > 0) {
        //         nodeKey = list.get(0).get("ip");
        //      }

        // modify by mark end
        List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(request.getParameter("agentAmpInfo"));
        //TODO ???
        for (Map<String, String> ampMap : ampListMapF) {
            String agentId = ampMap.get("agentId");
            String ampInstId = ampMap.get("ampInstId");
            String kpiCode = ampMap.get("kpiCode");
            //String nodeKey = moId;
            String schedule = ampMap.get("schedule");
            // modify by mark start 2013-9-12
            String result = avmonServer.deployAmpSchedule(agentId, ampInstId, moId, kpiCode, null, schedule);
            // modify by mark end 2013-9-12
            //String result = avmonServer.deployAmpSchedule(agentId, ampInstId,moId,kpiCode,null,schedule);
            Locale locale = request.getLocale();
            ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
            if (result.startsWith("00")) {
                map.put("success", true);
                map.put("errorMsg", bundle.getString("dispatchIssuedSuccess"));
            } else {
                map.put("success", false);
                map.put("errorMsg", result);
                return map;
            }
        }

        return map;
    }

    public void updateAgentMoId(String agentId, String moId) {
        String updateSql = String.format("update td_avmon_agent set mo_id='%s' where agent_id='%s'", moId, agentId);
        jdbcTemplate.execute(updateSql);
    }

    public String addAgentMo(String moId, String agentId) {
        String sql = String.format("select OS,OS_VERSION,IP from TD_AVMON_AGENT where AGENT_ID = '%s'", agentId);
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        if (list != null && list.size() > 0) {
            String os = (String) list.get(0).get("OS");
            String ip = (String) list.get(0).get("IP");
            String osVersion = (String) list.get(0).get("OS_VERSION");
            if (os != null) {
                os = os.toUpperCase();
                String type = "HOST_" + os;
                Map attr = new HashMap();
                attr.put("ip", ip);
                attr.put("realip", ip);
                attr.put("osVersion", osVersion);
                attr.put("os", os);
                return this.addMo(moId, type, ip, "HOST", "AGENT", "Auto created for agent.", agentId, attr);
            }
        }
        return "99";//99:
    }

    public String removeAgent(HttpServletRequest request) {
        String status = request.getParameter("status");
        String agentId = request.getParameter("agentId");
        String json = "";
        String sql = String.format("delete from TD_AVMON_AMP_INST_ATTR where agent_id='%s'", agentId);
        jdbcTemplate.execute(sql);
        //TD_AVMON_AMP_POLICY
        sql = String.format("delete from TD_AVMON_AMP_POLICY where agent_id='%s'", agentId);
        jdbcTemplate.execute(sql);
        sql = String.format("delete from TD_AVMON_AMP_INST where agent_id='%s'", agentId);
        jdbcTemplate.execute(sql);
        sql = String.format("delete from TD_AVMON_AGENT where agent_id='%s'", agentId);
        jdbcTemplate.execute(sql);
        //agentidmoid
        String moId = agentId;
        sql = String.format("delete from TD_AVMON_MO_INFO_ATTRIBUTE where mo_id='%s' ", moId);
        jdbcTemplate.execute(sql);
        sql = String.format("delete from TD_AVMON_MO_INFO where mo_id='%s' ", moId);
        jdbcTemplate.execute(sql);

        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        json = "{success:true,msg:'" + bundle.getString("agentDeleteSuccess") + "'}";

        return json;
    }

    public String upgradeAgent(HttpServletRequest request) {
        String status = request.getParameter("status");
        String agentId = request.getParameter("agentId");
        String json = "";
        String result = avmonServer.upgradeAgent(agentId);
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);

        if (result.startsWith("00")) {
            json = "{success:true,msg:'" + bundle.getString("agentNewProgramMsg") + "'}";
        } else {
            json = "{success:false,msg:'" + result + "'}";
        }
        return json;
    }

    public Map removeAmp(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();

        //TODO ?AMP  ??AMP?

        final List<Map<String, String>> ampListMapF = getListMapByJsonArrayString(
                request.getParameter("agentAmpInfo"));
        boolean flag = false;
        Locale locale = request.getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
        for (Map<String, String> ampMap : ampListMapF) {
            String ampInstId = ampMap.get("ampInstId");
            String agentId = ampMap.get("agentId");
            String ampId = ampMap.get("ampId");

            jdbcTemplate.execute(
                    String.format("delete from TD_AVMON_AMP_POLICY where agent_id='%s' and amp_inst_id='%s'",
                            agentId, ampInstId));
            jdbcTemplate.execute(
                    String.format("delete from TD_AVMON_AMP_VM_HOST where agent_id='%s' and amp_inst_id='%s'",
                            agentId, ampInstId));
            jdbcTemplate.execute(
                    String.format("delete from TD_AVMON_AMP_ILO_HOST where agent_id='%s' and amp_inst_id='%s'",
                            agentId, ampInstId));
            jdbcTemplate.execute(
                    String.format("delete from TD_AVMON_AMP_INST_ATTR where agent_id='%s' and amp_inst_id='%s'",
                            agentId, ampInstId));
            jdbcTemplate.execute(String.format(
                    "delete from TD_AVMON_AMP_INST where agent_id='%s' and amp_inst_id='%s'", agentId, ampInstId));

            map.put("errorMsg", bundle.getString("uninstallSuccess"));

        }
        flag = true;
        //updateNormalAMPStatus(ampListMapF,ConfigConstant.AMP_STATUS_DISABLED);
        if (flag) {
            map.put("success", true);
        } else {
            map.put("success", false);
        }
        return map;
    }

    // add by mark start
    /**
     * ??agent? 0 ?;1:?
     * @param agentId
     * @return
     */
    public int getAgentCollectFlag(String agentId) {
        int agentCollectFlag = 1;
        String sql = "select AGENT_COLLECT_FLAG from TD_AVMON_AGENT where AGENT_ID = '" + agentId + "'";
        agentCollectFlag = jdbcTemplate.queryForInt(sql);
        return agentCollectFlag;
    }
    // add by mark end
}