package com.ctrip.platform.dal.daogen.resource;
import com.ctrip.platform.dal.daogen.domain.Status;
import com.ctrip.platform.dal.daogen.entity.*;
import com.ctrip.platform.dal.daogen.enums.DatabaseType;
import com.ctrip.platform.dal.daogen.utils.DataSourceUtil;
import com.ctrip.platform.dal.daogen.utils.RequestUtil;
import com.ctrip.platform.dal.daogen.utils.SpringBeanGetter;
import org.apache.log4j.Logger;
import javax.annotation.Resource;
import javax.inject.Singleton;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.sql.Connection;
import java.util.*;
/**
* DAL database of group manage.
*
* @author gzxia
* @modified yn.wang
*/
@Resource
@Singleton
@Path("groupdb")
public class DalGroupDbResource {
private static Logger log = Logger.getLogger(DalGroupDbResource.class);
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<DalGroup> getGroups(@Context HttpServletRequest request, @QueryParam("root") boolean root) {
List<DalGroup> groups = SpringBeanGetter.getDaoOfDalGroup().getAllGroups();
for (DalGroup group : groups) {
group.setText(group.getGroup_name());
group.setIcon("glyphicon glyphicon-folder-close");
group.setChildren(false);
}
String userNo = RequestUtil.getUserNo(request);
return sortGroups(groups, userNo);
}
private List<DalGroup> sortGroups(List<DalGroup> groups, String userNo) {
List<DalGroup> result = new ArrayList<DalGroup>(groups.size());
LoginUser user = SpringBeanGetter.getDaoOfLoginUser().getUserByNo(userNo);
List<UserGroup> joinedGroups = SpringBeanGetter.getDalUserGroupDao().getUserGroupByUserId(user.getId());
if (joinedGroups != null && joinedGroups.size() > 0) {
for (UserGroup joinedGroup : joinedGroups) {
Iterator<DalGroup> ite = groups.iterator();
while (ite.hasNext()) {
DalGroup group = ite.next();
if (group.getId() == joinedGroup.getGroup_id()) {
result.add(group);
ite.remove();
}
}
}
result.addAll(groups);
}
return result;
}
@GET
@Path("groupdb")
@Produces(MediaType.APPLICATION_JSON)
public List<DalGroupDB> getGroupUsers(@QueryParam("groupId") String id) {
int groupId = -1;
try {
groupId = Integer.parseInt(id);
} catch (NumberFormatException ex) {
log.error("get Group Users failed", ex);
return null;
}
List<DalGroupDB> dbs = SpringBeanGetter.getDaoOfDalGroupDB().getGroupDBsByGroup(groupId);
return dbs;
}
@GET
@Path("allgroupdbs")
@Produces(MediaType.APPLICATION_JSON)
public List<DalGroupDB> getAllGroupDbs() {
List<DalGroupDB> dbs = SpringBeanGetter.getDaoOfDalGroupDB().getAllGroupDbs();
for (DalGroupDB db : dbs) {
db.setDb_user("******");
db.setDb_password("******");
if (DatabaseType.SQLServer.getValue().equals(db.getDb_providerName())) {
db.setDb_providerName("SQLServer");
} else if (DatabaseType.MySQL.getValue().equals(db.getDb_providerName())) {
db.setDb_providerName("MySQL");
} else {
db.setDb_providerName("unknown");
}
}
Collections.sort(dbs, new Comparator<DalGroupDB>() {
@Override
public int compare(DalGroupDB o1, DalGroupDB o2) {
return o1.getDbname().compareTo(o2.getDbname());
}
});
return dbs;
}
@POST
@Path("add")
public Status add(@Context HttpServletRequest request, @FormParam("groupId") String groupId, @FormParam("dbname") String dbname, @FormParam("comment") String comment, @FormParam("gen_default_dbset") boolean gen_default_dbset) {
String userNo = RequestUtil.getUserNo(request);
if (userNo == null || groupId == null || dbname == null) {
log.error(String.format("Add member failed, caused by illegal parameters: " + "[groupId=%s, dbname=%s]", groupId, dbname));
Status status = Status.ERROR;
status.setInfo("Illegal parameters.");
return status;
}
int groupID = -1;
try {
groupID = Integer.parseInt(groupId);
} catch (NumberFormatException ex) {
log.error("Add dal team database failed", ex);
Status status = Status.ERROR;
status.setInfo("Illegal group id");
return status;
}
if (!this.validatePermision(userNo, groupID)) {
Status status = Status.ERROR;
status.setInfo("你没有当前DAL Team的操作权限。");
return status;
}
DalGroupDB groupdb = SpringBeanGetter.getDaoOfDalGroupDB().getGroupDBByDbName(dbname);
if (null != groupdb && groupdb.getDal_group_id() > 0) {
DalGroup group = SpringBeanGetter.getDaoOfDalGroup().getDalGroupById(groupdb.getDal_group_id());
Status status = Status.ERROR;
status.setInfo(groupdb.getDbname() + " is already added in " + group.getGroup_name());
return status;
}
int ret = -1;
if (null != groupdb) {
ret = SpringBeanGetter.getDaoOfDalGroupDB().updateGroupDB(groupdb.getId(), groupID);
SpringBeanGetter.getDaoOfDalGroupDB().updateGroupDB(groupdb.getId(), comment);
} else {
Status status = Status.ERROR;
status.setInfo(dbname + " 不存在,请先到数据库一览界面添加DB。");
return status;
}
if (ret <= 0) {
log.error("Add dal group db failed, caused by db operation failed, pls check the log.");
Status status = Status.ERROR;
status.setInfo("Add operation failed.");
return status;
}
if (gen_default_dbset) {
Status status = genDefaultDbset(groupID, dbname);
if (status == Status.ERROR) {
return status;
}
}
return Status.OK;
}
@POST
@Path("update")
public Status update(@Context HttpServletRequest request, @FormParam("groupId") String groupId, @FormParam("dbId") String dbId, @FormParam("comment") String comment) {
String userNo = RequestUtil.getUserNo(request);
if (userNo == null || groupId == null || dbId == null) {
log.error(String.format("Add member failed, caused by illegal parameters: " + "[groupId=%s, dbId=%s]", groupId, dbId));
Status status = Status.ERROR;
status.setInfo("Illegal parameters.");
return status;
}
int groupID = -1;
int dbID = -1;
try {
dbID = Integer.parseInt(dbId);
groupID = Integer.parseInt(groupId);
} catch (NumberFormatException ex) {
log.error("Update failed", ex);
Status status = Status.ERROR;
status.setInfo("Illegal group id");
return status;
}
if (!this.validatePermision(userNo, groupID)) {
Status status = Status.ERROR;
status.setInfo("你没有当前DAL Team的操作权限。");
return status;
}
int ret = SpringBeanGetter.getDaoOfDalGroupDB().updateGroupDB(dbID, comment);
if (ret <= 0) {
log.error("Update dal group db failed, caused by db operation failed, pls check the spring log");
Status status = Status.ERROR;
status.setInfo("Update operation failed.");
return status;
}
return Status.OK;
}
@POST
@Path("delete")
public Status delete(@Context HttpServletRequest request, @FormParam("groupId") String groupId, @FormParam("dbId") String dbId) {
String userNo = RequestUtil.getUserNo(request);
if (userNo == null || groupId == null || dbId == null) {
log.error(String.format("Delete db failed, caused by illegal parameters: " + "[groupId=%s, dbId=%s]", groupId, dbId));
Status status = Status.ERROR;
status.setInfo("Illegal parameters.");
return status;
}
int groupID = -1;
int dbID = -1;
try {
groupID = Integer.parseInt(groupId);
dbID = Integer.parseInt(dbId);
} catch (NumberFormatException ex) {
log.error("Delete db failed", ex);
Status status = Status.ERROR;
status.setInfo("Illegal group id");
return status;
}
if (!this.validatePermision(userNo, groupID)) {
Status status = Status.ERROR;
status.setInfo("你没有当前DAL Team的操作权限。");
return status;
}
int ret = SpringBeanGetter.getDaoOfDalGroupDB().updateGroupDB(dbID, -1);
if (ret <= 0) {
log.error("Delete db failed, caused by db operation failed, pls check the spring log");
Status status = Status.ERROR;
status.setInfo("Delete operation failed.");
return status;
}
return Status.OK;
}
@POST
@Path("transferdb")
public Status transferdb(@Context HttpServletRequest request, @FormParam("groupId") String groupId, @FormParam("dbId") String dbId) {
String userNo = RequestUtil.getUserNo(request);
if (userNo == null || groupId == null || dbId == null) {
log.error(String.format("transfer db failed, caused by illegal parameters: " + "[groupId=%s, dbId=%s]", groupId, dbId));
Status status = Status.ERROR;
status.setInfo("Illegal parameters.");
return status;
}
int groupID = -1;
int dbID = -1;
try {
groupID = Integer.parseInt(groupId);
dbID = Integer.parseInt(dbId);
} catch (NumberFormatException ex) {
log.error("transfer db failed", ex);
Status status = Status.ERROR;
status.setInfo("Illegal group id or db id");
return status;
}
if (!this.validateTransferPermision(userNo, dbID)) {
Status status = Status.ERROR;
status.setInfo("你没有当前DataBase的操作权限。");
return status;
}
int ret = SpringBeanGetter.getDaoOfDalGroupDB().updateGroupDB(dbID, groupID);
if (ret <= 0) {
log.error("transfer db failed, caused by db operation failed, pls check the spring log");
Status status = Status.ERROR;
status.setInfo("transfer operation failed.");
return status;
}
return Status.OK;
}
private boolean validatePermision(String userNo, int groupId) {
boolean havaPermision = false;
LoginUser user = SpringBeanGetter.getDaoOfLoginUser().getUserByNo(userNo);
List<UserGroup> urGroups = SpringBeanGetter.getDalUserGroupDao().getUserGroupByUserId(user.getId());
if (urGroups != null && urGroups.size() > 0) {
for (UserGroup urGroup : urGroups) {
if (urGroup.getGroup_id() == groupId) {
havaPermision = true;
}
}
}
return havaPermision;
}
private boolean validateTransferPermision(String userNo, int dbId) {
LoginUser user = SpringBeanGetter.getDaoOfLoginUser().getUserByNo(userNo);
if (user == null) {
return false;
}
List<UserGroup> urGroups = SpringBeanGetter.getDalUserGroupDao().getUserGroupByUserId(user.getId());
if (urGroups != null && urGroups.size() > 0) {
for (UserGroup urGroup : urGroups) {
List<DalGroupDB> groupDbs = SpringBeanGetter.getDaoOfDalGroupDB().getGroupDBsByGroup(urGroup.getGroup_id());
if (groupDbs != null && groupDbs.size() > 0) {
for (DalGroupDB db : groupDbs) {
if (db.getId() == dbId) {
return true;
}
}
}
}
}
return false;
}
/**
* 生成默认的databaseSet和databaseSet Entry
*
* @param dbname
*/
public static Status genDefaultDbset(int groupId, String dbname) {
Status status = Status.OK;
List<DatabaseSet> exist = SpringBeanGetter.getDaoOfDatabaseSet().getAllDatabaseSetByName(dbname);
if (exist != null && exist.size() > 0) {
status = Status.ERROR;
status.setInfo("数据库" + dbname + "已添加成功。由于已存在名为" + dbname + "的逻辑数据库,所以无法默认生成同名的逻辑库,请到逻辑数据库管理页面中手动添加不同名称的逻辑库。请点击关闭按钮以关闭窗口。");
return status;
}
DatabaseSet dbset = new DatabaseSet();
dbset.setName(dbname);
dbset.setProvider("sqlProvider");
try {
Connection connection = DataSourceUtil.getConnection(dbname);
String dbType = connection.getMetaData().getDatabaseProductName();
if (dbType != null && (!dbType.equals("Microsoft SQL Server"))) {
dbset.setProvider("mySqlProvider");
}
} catch (Exception e) {
log.warn("", e);
}
dbset.setGroupId(groupId);
int ret = SpringBeanGetter.getDaoOfDatabaseSet().insertDatabaseSet(dbset);
if (ret > 0) {
dbset = SpringBeanGetter.getDaoOfDatabaseSet().getAllDatabaseSetByName(dbname).get(0);
DatabaseSetEntry entry = new DatabaseSetEntry();
entry.setDatabaseSet_Id(dbset.getId());
entry.setDatabaseType("Master");
entry.setName(dbname);
entry.setConnectionString(dbname);
SpringBeanGetter.getDaoOfDatabaseSet().insertDatabaseSetEntry(entry);
}
return status;
}
}