package net.changwoo.chat.web;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import net.changwoo.chat.atmosphere.AtmosphereUtils;
import net.changwoo.chat.entity.Join;
import net.changwoo.chat.entity.JsonResponse;
import net.changwoo.chat.entity.Message;
import net.changwoo.chat.entity.Room;
import net.changwoo.chat.service.ChatServiceImpl;
import net.changwoo.common.Common;
import net.sf.json.JSONObject;
import org.atmosphere.cpr.AtmosphereResource;
import org.codehaus.jackson.JsonGenerationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Handles requests for the application home page.
*/
@Controller
@RequestMapping(value = "/chat")
public class ChatController {
private static final Logger logger = LoggerFactory.getLogger(ChatController.class);
@Autowired
private ChatServiceImpl chatService;
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/send", method = RequestMethod.POST)
@ResponseBody
public void post(final AtmosphereResource event, @RequestBody String message)
throws IOException {
logger.info("websockets POST");
logger.info("Received message to broadcast: {}", message);
event.getBroadcaster().getAtmosphereResources().size();
event.getBroadcaster().broadcast(message);
}
/**
* Responsible for suspending the {@link HttpServletResponse} and executing
* a broadcasts periodically.
*
* @throws IOException
* @throws JsonMappingException
* @throws JsonGenerationException
*/
@RequestMapping(value = "/recevice/{roomid}", method = RequestMethod.GET)
@ResponseBody
public void websockets(final AtmosphereResource event, @PathVariable("roomid") int roomid)
throws IOException {
logger.info("websockets GET");
AtmosphereUtils.suspend(event);
}
/*
* test url
* http://localhost:8080/FlowerPaper/chat/message/save?content=hihi&userid=34&roomid=4
*/
@RequestMapping(value = "/message/save", method = RequestMethod.POST)
public String saveMessage(final AtmosphereResource event, Locale locale, @Valid Message message, BindingResult result, Model model) {
JsonResponse res = new JsonResponse();
try{
int check = chatService.saveMessage(message);
if(!result.hasErrors() && check!=0){
res.setStatus(Common.SUCCESS);
res.setResult(message);
}else{
res.setStatus(Common.FAIL);
res.setResult(result.getAllErrors());
}
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
logger.info("websockets POST");
logger.info("Received message to broadcast: {}", message);
JSONObject jsonObject = JSONObject.fromObject(res);
event.getBroadcaster().getAtmosphereResources().size();
event.getBroadcaster().broadcast(jsonObject);
return "jsonView";
}
/*
* test url
* http://localhost:8080/FlowerPaper/chat/message/find/4
*/
@RequestMapping(value = "/message/find/{roomid}", method = RequestMethod.GET)
public String findMessage(Locale locale, Model model, @PathVariable("roomid") int roomid) {
logger.debug("roomid = "+roomid);
JsonResponse res = new JsonResponse();
String status = Common.SUCCESS;
try{
List messages = chatService.findMessage(roomid);
res.setResult(messages);
res.setStatus(status);
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/join/save?userid=33&roomid=4
*/
@RequestMapping(value = "/join/save", method = RequestMethod.POST)
public String saveJoin(Locale locale, @Valid Join join, BindingResult result, Model model) {
JsonResponse res = new JsonResponse();
try{
int check = chatService.saveJoin(join);
if(!result.hasErrors() && check!=0){
res.setStatus(Common.SUCCESS);
res.setResult(join);
}else{
res.setStatus(Common.FAIL);
res.setResult(result.getAllErrors());
}
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/join/find/userid/33
*/
@RequestMapping(value = "/join/find/userid/{userid}", method = RequestMethod.GET)
public String findUserJoins(Locale locale, Model model, @PathVariable("userid") int userid) {
logger.debug("userid = "+userid);
JsonResponse res = new JsonResponse();
String status = Common.SUCCESS;
try{
List joins = chatService.findUserJoins(userid);
res.setResult(joins);
res.setStatus(status);
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/join/find/roomid/4
*/
@RequestMapping(value = "/join/find/roomid/{roomid}", method = RequestMethod.GET)
public String findRoomJoins(Locale locale, Model model, @PathVariable("roomid") int roomid) {
logger.debug("roomid = "+roomid);
JsonResponse res = new JsonResponse();
String status = Common.SUCCESS;
try{
List joins = chatService.findRoomJoins(roomid);
res.setResult(joins);
res.setStatus(status);
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/join/delete/51/4
*/
@RequestMapping(value = "/join/delete/{userid}/{roomid}", method = RequestMethod.POST)
public String deleteJoin(Locale locale, Model model, @PathVariable("userid") int userid, @PathVariable("roomid") int roomid) {
logger.debug("userid = "+userid);
logger.debug("roomid = "+roomid);
JsonResponse res = new JsonResponse();
String status = Common.SUCCESS;
try{
chatService.deleteJoin(userid, roomid);
res.setStatus(status);
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/room/save?subject=test room&masterUserid=12
*/
@RequestMapping(value = "/room/save", method = RequestMethod.POST)
public String saveRoom(Locale locale, @Valid Room room, BindingResult result, Model model) {
JsonResponse res = new JsonResponse();
try{
int check = chatService.saveRoom(room);
if(!result.hasErrors() && check!=0){
res.setStatus(Common.SUCCESS);
res.setResult(room);
}else{
res.setStatus(Common.FAIL);
res.setResult(result.getAllErrors());
}
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/room/find
*/
@RequestMapping(value = "/room/find", method = RequestMethod.GET)
public String findRoom(Locale locale, Model model) {
JsonResponse res = new JsonResponse();
String status = Common.SUCCESS;
try{
List rooms = chatService.findRooms();
res.setResult(rooms);
res.setStatus(status);
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/room/delete/12/1
*/
@RequestMapping(value = "/room/delete/{userid}/{roomid}", method = RequestMethod.POST)
public String deleteRoom(Locale locale, Model model, @PathVariable("userid") int userid, @PathVariable("roomid") int roomid) {
logger.debug("userid = "+userid);
logger.debug("roomid = "+roomid);
JsonResponse res = new JsonResponse();
String status = Common.SUCCESS;
try{
chatService.deleteRoom(userid, roomid);
res.setStatus(status);
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
/*
* http://localhost:8080/FlowerPaper/chat/room/update?subject=qqqq&masterUserid=12&id=4
*/
@RequestMapping(value = "/room/update", method = RequestMethod.POST)
public String updateRoom(Locale locale, @Valid Room room, BindingResult result, Model model) {
logger.debug("room.getSubject() = "+room.getSubject());
logger.debug("room.getMasterUserid = "+room.getMasterUserid());
JsonResponse res = new JsonResponse();
String status = Common.SUCCESS;
try{
chatService.updateRoom(room);
res.setStatus(status);
}catch(Exception e){
logger.debug(e.getMessage());
res.setStatus(Common.FAIL);
res.setResult(e.getMessage());
}
model.addAttribute("res",res);
return "jsonView";
}
}