/**
* Copyright 2013 Sean Kavanagh - sean.p.kavanagh6@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ec2box.manage.db;
import com.ec2box.manage.model.HostSystem;
import com.ec2box.manage.model.SortedSet;
import com.ec2box.manage.util.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* DAO used to manage systems
*/
public class SystemDB {
public static final String DISPLAY_NM = "display_nm";
public static final String USER = "user";
public static final String HOST = "host";
public static final String PORT = "port";
public static final String INSTANCE_ID = "instance_id";
public static final String REGION = "region";
public static final String STATE = "state";
public static final String INSTANCE_STATUS = "instance_status";
public static final String SYSTEM_STATUS = "system_status";
public static final String SORT_BY_ALARMS= "alarms";
public static final String KEY_ID = "key_id";
public static final String M_ALARM = "m_alarm";
public static final String M_INSUFFICIENT_DATA = "m_insufficient_data";
public static final String M_OK = "m_ok";
public static final String ID = "id";
private SystemDB() {
}
/**
* method to do order by based on the sorted set object for systems. only selects instance IDs in provided list.
*
* @param sortedSet sorted set object
* @param instanceIdList instance ids to select
* @return sortedSet with list of host systems
*/
public static SortedSet getSystemSet(SortedSet sortedSet, List<String> instanceIdList) {
List<HostSystem> hostSystemList = new ArrayList<>();
if (!instanceIdList.isEmpty()) {
String orderBy = "";
if (sortedSet.getOrderByField() != null && !sortedSet.getOrderByField().trim().equals("")) {
orderBy = " order by " + sortedSet.getOrderByField() + " " + sortedSet.getOrderByDirection();
}
StringBuilder sqlBuilder = new StringBuilder("select *, CONCAT_WS('-',m_alarm,m_insufficient_data,m_ok) as alarms from system where instance_id in ( ");
for (int i = 0; i < instanceIdList.size(); i++) {
if (i == instanceIdList.size() - 1) sqlBuilder.append("'").append(instanceIdList.get(i)).append("') ");
else sqlBuilder.append("'").append(instanceIdList.get(i)).append("', ");
}
sqlBuilder.append(orderBy);
Connection con = null;
try {
con = DBUtils.getConn();
PreparedStatement stmt = con.prepareStatement(sqlBuilder.toString());
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
HostSystem hostSystem = new HostSystem();
hostSystem.setId(rs.getLong(ID));
hostSystem.setDisplayNm(rs.getString(DISPLAY_NM));
hostSystem.setInstance(rs.getString(INSTANCE_ID));
hostSystem.setUser(rs.getString(USER));
hostSystem.setHost(rs.getString(HOST));
hostSystem.setPort(rs.getInt(PORT));
hostSystem.setKeyId(rs.getLong(KEY_ID));
hostSystem.setEc2Region(rs.getString(REGION));
hostSystem.setState(rs.getString(STATE));
hostSystem.setInstanceStatus(rs.getString(INSTANCE_STATUS));
hostSystem.setSystemStatus(rs.getString(SYSTEM_STATUS));
hostSystem.setMonitorAlarm(rs.getInt(M_ALARM));
hostSystem.setMonitorInsufficientData(rs.getInt(M_INSUFFICIENT_DATA));
hostSystem.setMonitorOk(rs.getInt(M_OK));
hostSystemList.add(hostSystem);
}
DBUtils.closeRs(rs);
DBUtils.closeStmt(stmt);
} catch (Exception e) {
e.printStackTrace();
}
finally {
DBUtils.closeConn(con);
}
sortedSet.setItemList(hostSystemList);
}
return sortedSet;
}
/**
* returns system by id
*
* @param id system id
* @return system
*/
public static HostSystem getSystem(Long id) {
HostSystem hostSystem = null;
Connection con = null;
try {
con = DBUtils.getConn();
getSystem(con, id);
} catch (Exception e) {
e.printStackTrace();
}
finally {
DBUtils.closeConn(con);
}
return hostSystem;
}
/**
* returns system by id
*
* @param con DB connection
* @param id system id
* @return system
*/
public static HostSystem getSystem(Connection con, Long id) {
HostSystem hostSystem = null;
try {
PreparedStatement stmt = con.prepareStatement("select * from system where id=?");
stmt.setLong(1, id);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
hostSystem = new HostSystem();
hostSystem.setId(rs.getLong(ID));
hostSystem.setDisplayNm(rs.getString(DISPLAY_NM));
hostSystem.setInstance(rs.getString(INSTANCE_ID));
hostSystem.setUser(rs.getString(USER));
hostSystem.setHost(rs.getString(HOST));
hostSystem.setPort(rs.getInt(PORT));
hostSystem.setKeyId(rs.getLong(KEY_ID));
hostSystem.setEc2Region(rs.getString(REGION));
hostSystem.setState(rs.getString(STATE));
hostSystem.setMonitorAlarm(rs.getInt(M_ALARM));
hostSystem.setMonitorInsufficientData(rs.getInt(M_INSUFFICIENT_DATA));
hostSystem.setMonitorOk(rs.getInt(M_OK));
}
DBUtils.closeRs(rs);
DBUtils.closeStmt(stmt);
} catch (Exception e) {
e.printStackTrace();
}
return hostSystem;
}
/**
* returns system by system instance id
*
* @param instanceId system instance id
* @return system
*/
public static HostSystem getSystem(String instanceId) {
HostSystem hostSystem = null;
Connection con = null;
try {
con = DBUtils.getConn();
hostSystem = getSystem(con, instanceId);
} catch (Exception e) {
e.printStackTrace();
}
finally {
DBUtils.closeConn(con);
}
return hostSystem;
}
/**
* returns system by system instance id
*
* @param con DB connection
* @param instanceId system instance id
* @return system
*/
public static HostSystem getSystem(Connection con, String instanceId) {
HostSystem hostSystem = null;
try {
PreparedStatement stmt = con.prepareStatement("select * from system where instance_id like ?");
stmt.setString(1, instanceId);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
hostSystem = new HostSystem();
hostSystem.setId(rs.getLong(ID));
hostSystem.setDisplayNm(rs.getString(DISPLAY_NM));
hostSystem.setInstance(rs.getString(INSTANCE_ID));
hostSystem.setUser(rs.getString(USER));
hostSystem.setHost(rs.getString(HOST));
hostSystem.setPort(rs.getInt(PORT));
hostSystem.setKeyId(rs.getLong(KEY_ID));
hostSystem.setEc2Region(rs.getString(REGION));
hostSystem.setState(rs.getString(STATE));
hostSystem.setMonitorAlarm(rs.getInt(M_ALARM));
hostSystem.setMonitorInsufficientData(rs.getInt(M_INSUFFICIENT_DATA));
hostSystem.setMonitorOk(rs.getInt(M_OK));
}
DBUtils.closeRs(rs);
DBUtils.closeStmt(stmt);
} catch (Exception e) {
e.printStackTrace();
}
return hostSystem;
}
/**
* inserts host system into DB
*
* @param con DB connection object
* @param hostSystem host system object
*/
public static void insertSystem(Connection con, HostSystem hostSystem) {
try {
PreparedStatement stmt = con.prepareStatement("insert into system (display_nm, user, host, port, instance_id, key_id, region, state, instance_status, system_status, m_alarm, m_insufficient_data, m_ok) values (?,?,?,?,?,?,?,?,?,?,?,?,?)");
stmt.setString(1, hostSystem.getDisplayNm());
stmt.setString(2, hostSystem.getUser());
stmt.setString(3, hostSystem.getHost());
stmt.setInt(4, hostSystem.getPort());
stmt.setString(5, hostSystem.getInstance());
stmt.setLong(6, hostSystem.getKeyId());
stmt.setString(7, hostSystem.getEc2Region());
stmt.setString(8, hostSystem.getState());
stmt.setString(9, hostSystem.getInstanceStatus());
stmt.setString(10, hostSystem.getSystemStatus());
stmt.setInt(11, hostSystem.getMonitorAlarm());
stmt.setInt(12, hostSystem.getMonitorInsufficientData());
stmt.setInt(13, hostSystem.getMonitorOk());
stmt.execute();
DBUtils.closeStmt(stmt);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* updates host system record
*
* @param hostSystem host system object
*/
public static void updateSystem(HostSystem hostSystem) {
Connection con = null;
try {
con = DBUtils.getConn();
updateSystem(con, hostSystem);
} catch (Exception e) {
e.printStackTrace();
}
finally {
DBUtils.closeConn(con);
}
}
/**
* updates host system record
*
* @param con DB connection object
* @param hostSystem host system object
*/
public static void updateSystem(Connection con, HostSystem hostSystem) {
try {
PreparedStatement stmt = con.prepareStatement("update system set display_nm=?, user=?, host=?, port=?, instance_id=?, key_id=?, region=?, state=?, instance_status=?, system_status=?, m_alarm=?, m_insufficient_data=?, m_ok=? where id=?");
stmt.setString(1, hostSystem.getDisplayNm());
stmt.setString(2, hostSystem.getUser());
stmt.setString(3, hostSystem.getHost());
stmt.setInt(4, hostSystem.getPort());
stmt.setString(5, hostSystem.getInstance());
stmt.setLong(6, hostSystem.getKeyId());
stmt.setString(7, hostSystem.getEc2Region());
stmt.setString(8, hostSystem.getState());
stmt.setString(9, hostSystem.getInstanceStatus());
stmt.setString(10, hostSystem.getSystemStatus());
stmt.setInt(11, hostSystem.getMonitorAlarm());
stmt.setInt(12, hostSystem.getMonitorInsufficientData());
stmt.setInt(13, hostSystem.getMonitorOk());
stmt.setLong(14, hostSystem.getId());
stmt.execute();
DBUtils.closeStmt(stmt);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* set host systems for region based on list
*
* @param hostSystemList list of host system object
*/
public static void setSystems(Collection<HostSystem> hostSystemList) {
Connection con = null;
try {
con = DBUtils.getConn();
//insert new host systems
for (HostSystem hostSystem : hostSystemList) {
HostSystem hostSystemTmp = getSystem(con, hostSystem.getInstance());
if (hostSystemTmp == null) {
insertSystem(con, hostSystem);
} else {
hostSystem.setId(hostSystemTmp.getId());
hostSystem.setUser(hostSystemTmp.getUser());
hostSystem.setPort(hostSystemTmp.getPort());
updateSystem(con, hostSystem);
}
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
DBUtils.closeConn(con);
}
}
/**
* returns list of systems by system instance id
*
* @param instanceIdList system instance id
* @return system
*/
public static List<HostSystem> getSystems(List<String> instanceIdList) {
Connection con = null;
List<HostSystem> hostSystemList = new ArrayList<>();
for(String instanceId: instanceIdList){
try {
con = DBUtils.getConn();
hostSystemList.add(getSystem(con, instanceId));
} catch (Exception e) {
e.printStackTrace();
}
finally {
DBUtils.closeConn(con);
}
}
return hostSystemList;
}
}