/*
* Copyright [duowan.com]
* Web Site: http://www.duowan.com
* Since 2005 - 2012
*/
package com.fpcms.home.controller;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.tika.io.IOUtils;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.github.rapid.common.util.DateConvertUtil;
import com.fpcms.common.BaseController;
import com.fpcms.common.util.SpiderUtil;
import com.fpcms.common.util.WebUtil;
import com.fpcms.model.CmsContent;
import com.fpcms.query.CmsChannelQuery;
import com.fpcms.service.CmsChannelService;
import com.fpcms.service.CmsContentService;
/**
* [CmsChannel] 的业务操作
*
* @author badqiu email:badqiu(a)gmail.com
* @version 1.0
* @since 1.0
*
*/
@Controller
public class ContentController extends BaseController{
private CmsChannelService cmsChannelService;
private CmsContentService cmsContentService;
private final String LIST_ACTION = "redirect:/admin/cmschannel/refreshParent.jsp";
/**
* 增加setXXXX()方法,spring就可以通过autowire自动设置对象属性,注意大小写
**/
public void setCmsChannelService(CmsChannelService service) {
this.cmsChannelService = service;
}
public void setCmsContentService(CmsContentService cmsContentService) {
this.cmsContentService = cmsContentService;
}
/** binder用于bean属性的设置 */
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
/**
* 增加了@ModelAttribute的方法可以在本controller方法调用前执行,可以存放一些共享变量,如枚举值,或是一些初始化操作
*/
@ModelAttribute
public void init(ModelMap model) {
}
public String last(ModelMap model,HttpServletRequest request,HttpServletResponse response) throws IOException {
CmsContent content = cmsContentService.findLastBySite(getSite());
if(content == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
return show0(model, content.getId(), response, DateConvertUtil.extract(content.getDateCreated(),"yyyyMMdd"), content);
}
/**
* 用于外链使用的链接
* @param model
* @param dateCreatedString
* @param request
* @param response
* @return
* @throws IOException
*/
@RequestMapping("/linked/{dateCreated}.do")
public String linked(ModelMap model,@PathVariable("dateCreated") String dateCreatedString,HttpServletRequest request,HttpServletResponse response) throws IOException {
if(SpiderUtil.isSpider(request) || StringUtils.isNotBlank(request.getParameter("debug"))) {
Date dateCreated = null;
try {
dateCreated = DateConvertUtil.parse(dateCreatedString, "yyyyMMdd");
}catch(Exception e) {
return last(model,request,response);
}
CmsContent cmsContent = cmsContentService.findFirstByCreatedDay(getSite(),dateCreated);
if(cmsContent == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
// return show0(model, cmsContent.getId(), response, dateCreated, cmsContent);
WebUtil.send301Redirect(response,cmsContent.getUrl());
return null;
}else {
return "/linked";
}
}
/**
* 显示内容
*/
@RequestMapping("/content/{dateCreated}/{contentId}.do")
public String show(ModelMap model,CmsChannelQuery query,@PathVariable("dateCreated") String dateCreatedString,@PathVariable("contentId") long contentId,HttpServletRequest request,HttpServletResponse response) throws IOException {
Date dateCreated = DateConvertUtil.parse(dateCreatedString, "yyyyMMdd");
CmsContent cmsContent = cmsContentService.getById(dateCreated,contentId);
return show0(model, contentId, response, dateCreated, cmsContent);
}
private String show0(ModelMap model, long contentId,
HttpServletResponse response, Date dateCreated,
CmsContent cmsContent) throws IOException {
if(cmsContent == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
// if(!cmsContent.getSite().equals(getSite())) {
// String location = "http://"+cmsContent.getSite()+"/content/show/"+contentId+".do";
// WebUtil.send301Redirect(response, location);
// return null;
// }
model.put("cmsContent", cmsContent);
model.put("nextCmsContent", cmsContentService.getNextCmsContent(dateCreated,cmsContent.getSite(),contentId));
model.put("preCmsContent", cmsContentService.getPreCmsContent(dateCreated,cmsContent.getSite(),contentId));
return "/content/show";
}
/**
* 显示内容
*/
@RequestMapping("/content/show/{contentId}.do")
@Deprecated
public void showDeprecated(ModelMap model,CmsChannelQuery query,@PathVariable("contentId") long contentId,HttpServletRequest request,HttpServletResponse response) throws IOException {
CmsContent cmsContent = cmsContentService.getById(contentId);
if(cmsContent == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
String day = DateConvertUtil.format(cmsContent.getDateCreated(), "yyyyMMdd");
String location = request.getContextPath() + "/content/"+day+"/"+contentId+".do";
WebUtil.send301Redirect(response,location);
}
@RequestMapping("/content_img/{dateCreated}/{contentId}.jpg")
public void content_img(@PathVariable("dateCreated") String dateCreatedString,@PathVariable("contentId") long contentId,HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/jpeg;");
response.setDateHeader("Expires", DateUtils.addDays(new Date(), 360 * 5).getTime());
response.setHeader("Cache-Control", "max-age=180000");
Date dateCreated = DateConvertUtil.parse(dateCreatedString, "yyyyMMdd");
CmsContent cmsContent = cmsContentService.getById(dateCreated,contentId);
if(cmsContent == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
String content = cmsContent.getContent();
BufferedImage backgroudImage = getBackgroudImage();
BufferedImage outputImage = new GenImageByContentProcessor(content,backgroudImage).execute();
ImageIO.write(outputImage, "JPG", response.getOutputStream());
}
public class GenImageByContentProcessor {
private String content;
private BufferedImage backgroudImage;
int width;
int height;
int ROWS = 30;
int COLS = 20;
public GenImageByContentProcessor(String content,
BufferedImage backgroudImage) {
super();
this.content = content;
this.backgroudImage = backgroudImage;
width = backgroudImage.getWidth();
height = backgroudImage.getHeight();
}
private BufferedImage execute() {
BufferedImage outputImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
// 得到该图片的绘图对象
Graphics g = outputImage.getGraphics();
// 填充整个图片的颜色
g.fillRect(0, 0, 680, 220);
g.drawImage(backgroudImage,0,0,null);
for (int i = 0; i < ROWS; i++) {
for(int j = 0; j < COLS; j++) {
g.setColor(new Color(0,0,255));
g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 15));// 输出的
int index = i * COLS + j;
if(index >= content.length()) {
break;
}
char charAt = content.charAt(index);
int x = (i * 15) + 3;
int y = j * 18;
if(x >= width || y >= height) {
break;
}
g.drawString(""+charAt,x, y);
}
}
return outputImage;
}
}
static BufferedImage backgroudImage = null;
private static BufferedImage getBackgroudImage() throws IOException {
if(backgroudImage == null) {
InputStream input = ContentController.class.getResourceAsStream("/img/content_img_backgroud.jpg");
try {
backgroudImage = ImageIO.read(input);
return backgroudImage;
}finally {
IOUtils.closeQuietly(input);
}
}
return backgroudImage;
}
}