|
package com.ekexiu.portal.msg;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.ListIterator;
import org.jfw.apt.annotation.Autowrie;
import org.jfw.apt.annotation.DefaultValue;
import org.jfw.apt.annotation.Nullable;
import org.jfw.apt.web.annotation.Path;
import org.jfw.apt.web.annotation.operate.Get;
import org.jfw.apt.web.annotation.operate.Post;
import org.jfw.apt.web.annotation.param.JdbcConn;
import org.jfw.util.DateUtil;
import org.jfw.util.PageQueryResult;
import org.jfw.util.jdbc.JdbcUtil;
import org.jfw.util.jdbc.PreparedStatementConfig;
import org.jfw.util.jdbc.ResultSetExtractor;
import org.jfw.util.json.JsonService;
import com.ekexiu.portal.util.WebMsgSocketServlet;
@Path("/webMsg")
public class Service {
public static final List<ActorItem> EMPTY_ACTORS = Collections.<ActorItem> emptyList();
@Autowrie
private WebMsgDao webMsgDao;
public WebMsgDao getWebMsgDao() {
return webMsgDao;
}
public void setWebMsgDao(WebMsgDao webMsgDao) {
this.webMsgDao = webMsgDao;
}
public static ActorItem build(WebMsgIdx wmi, String owner, SimpleDateFormat sf) {
ActorItem item = new ActorItem();
item.setCnt(wmi.getLastCnt());
String actor = wmi.getActor();
if (owner.equals(actor)) {
item.setId(wmi.getOwner());
item.setNum(wmi.getNumOfOwner());
} else {
item.setId(actor);
item.setNum(wmi.getNumOfActor());
}
item.setTime(wmi.getLastTime());
item.setTimeStr(sf.format(new Date(wmi.getLastTime())));
return item;
}
public static List<ActorItem> build(List<WebMsgIdx> list, String owner) {
if (list == null || list.isEmpty())
return EMPTY_ACTORS;
SimpleDateFormat sf = new SimpleDateFormat(DateUtil.TIMESTAMP_FORMAT);
List<ActorItem> ret = new ArrayList<ActorItem>(list.size());
for (ListIterator<WebMsgIdx> it = list.listIterator(); it.hasNext();) {
ret.add(build(it.next(), owner, sf));
}
return ret;
}
@Get
@Path("/idx/qm")
public List<ActorItem> query(@JdbcConn Connection con, String id) throws SQLException {
List<WebMsgIdx> list = webMsgDao.query(con, id);
return build(list, id);
}
@Get
@Path("/idx/qo")
public ActorItem query(@JdbcConn Connection con, String id, String oid) throws SQLException {
WebMsgIdx wmi = null;
if (id.compareTo(oid) < 0) {
wmi = webMsgDao.query(con, id, oid);
} else {
wmi = webMsgDao.query(con, oid, id);
}
SimpleDateFormat sf = new SimpleDateFormat(DateUtil.TIMESTAMP_FORMAT);
if (wmi != null) {
return build(wmi, id, sf);
}
return null;
}
@Get
@Path("/idx/pq")
public PageQueryResult<ActorItem> query(@JdbcConn Connection con, String id, @DefaultValue("1") int pageNo, @DefaultValue("10") int pageSize)
throws SQLException {
PageQueryResult<WebMsgIdx> wmis = this.webMsgDao.query(con, id, pageSize, pageNo);
PageQueryResult<ActorItem> ret = new PageQueryResult<ActorItem>();
ret.setPageNo(ret.getPageNo());
ret.setPageSize(wmis.getPageSize());
ret.setTotal(wmis.getTotal());
ret.setData(build(wmis.getData(), id));
return ret;
}
@Get
@Path("/unReadedCount")
public Integer queryUnReadedCount(@JdbcConn Connection con, final String id) throws SQLException {
return JdbcUtil.query(con,
"SELECT NUM_OF_OWNER FROM WEB_MSG_IDX WHERE OWNER ='' AND SHOW_OF_OWNER='1' UNION ALL SELECT NUM_OF_ACTOR FROM WEB_MSG_IDX WHERE ACTOR ='' AND SHOW_OF_ACTOR='1' ",
new ResultSetExtractor<Integer>() {
@Override
public Integer extractData(ResultSet rs) throws SQLException {
int ret = 0;
while (rs.next()) {
ret += rs.getInt(1);
}
return ret;
}
}, new PreparedStatementConfig() {
@Override
public void config(PreparedStatement ps) throws SQLException {
ps.setString(1, id);
ps.setString(2, id);
}
});
}
@Post
@Path
public void send(@JdbcConn Connection con, String sender, String reciver, String cnt) throws SQLException {
boolean ownerSend = true;
String owner = sender;
String actor = reciver;
boolean next = true;
if (sender.compareTo(reciver) < 0) {
ownerSend = false;
owner = reciver;
actor = sender;
}
WebMsgCnt wmc = new WebMsgCnt();
wmc.setCnt(cnt);
wmc.setReaded(false);
wmc.setReciver(reciver);
wmc.setSender(sender);
WebMsgIdx wmi = null;
while (next) {
try {
long time = System.currentTimeMillis();
wmc.setSendTime(DateUtil.formatTimeStamp(time));
webMsgDao.insert(con, wmc);
int numOfUpdate = 0;
if (ownerSend) {
numOfUpdate = webMsgDao.incActorNum(con, owner, actor, cnt, time);
} else {
numOfUpdate = webMsgDao.incOwnerNum(con, owner, actor, cnt, time);
}
if (numOfUpdate == 0) {
if (wmi == null) {
wmi = new WebMsgIdx();
wmi.setActor(actor);
wmi.setLastCnt(cnt);
wmi.setNumOfActor(ownerSend ? 1 : 0);
wmi.setNumOfOwner(ownerSend ? 0 : 1);
wmi.setOwner(owner);
wmi.setShowOfActor(true);
wmi.setShowOfOwner(true);
}
wmi.setLastTime(time);
webMsgDao.insert(con, wmi);
}
con.commit();
next = false;
WebMsgSocketServlet.sendMessage(reciver, JsonService.toJson(wmc));
} catch (SQLException e) {
if ("23505".equals(e.getSQLState())) {
con.rollback();
}
throw e;
}
}
}
@Get
@Path("/cnt/load")
public List<WebMsgCnt> load(@JdbcConn Connection con, String sender, String reciver, @Nullable String bt, @DefaultValue("true") boolean all)
throws SQLException {
if (all) {
return webMsgDao.queryAll(con, sender, reciver, bt);
} else {
return webMsgDao.query(con, sender, reciver, bt);
}
}
@Post
@Path("/readed")
public void readed(@JdbcConn(true) Connection con, String sender, String reciver, String time) throws SQLException {
int num = webMsgDao.readed(con, sender, reciver, time);
if (num > 0) {
String owner = sender;
String actor = reciver;
boolean ownerSend = true;
if (sender.compareTo(reciver) > 0) {
owner = reciver;
actor = sender;
ownerSend = false;
}
if (ownerSend) {
webMsgDao.decActorNum(con, owner, actor, num);
} else {
webMsgDao.decOwnerNum(con, owner, actor, num);
}
}
}
}
|