net.groupbuy.entity.Article.java Source code

Java tutorial

Introduction

Here is the source code for net.groupbuy.entity.Article.java

Source

/*
 * Copyright 2005-2013 shopxx.net. All rights reserved.
 * Support: http://www.shopxx.net
 * License: http://www.shopxx.net/license
 */
package net.groupbuy.entity;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OrderBy;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;

import net.groupbuy.CommonAttributes;
import net.groupbuy.util.FreemarkerUtils;

import org.apache.commons.lang.StringUtils;
import org.dom4j.io.SAXReader;
import org.hibernate.search.annotations.Analyzer;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Similarity;
import org.hibernate.search.annotations.Store;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.springframework.core.io.ClassPathResource;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKSimilarity;

import freemarker.template.TemplateException;

/**
 * Entity - 
 * 
 * @author SHOP++ Team
 * @version 3.0
 */
@Indexed
@Similarity(impl = IKSimilarity.class)
@Entity
@Table(name = "xx_article")
@SequenceGenerator(name = "sequenceGenerator", sequenceName = "xx_article_sequence")
public class Article extends BaseEntity {

    private static final long serialVersionUID = 1475773294701585482L;

    /** ?? */
    public static final String HITS_CACHE_NAME = "articleHits";

    /**  */
    public static final int HITS_CACHE_INTERVAL = 600000;

    /**  */
    private static final int PAGE_CONTENT_LENGTH = 800;

    /**  */
    private static final String PAGE_BREAK_SEPARATOR = "<hr class=\"pageBreak\" />";

    /** ?? */
    private static final Pattern PARAGRAPH_SEPARATOR_PATTERN = Pattern.compile("[,;\\.!??]");

    /** ?? */
    private static String staticPath;

    /**  */
    private String title;

    /**  */
    private String author;

    /**  */
    private String content;

    /** ? */
    private String seoTitle;

    /** ?? */
    private String seoKeywords;

    /** ??? */
    private String seoDescription;

    /** ?? */
    private Boolean isPublication;

    /** ? */
    private Boolean isTop;

    /**  */
    private Long hits;

    /** ? */
    private Integer pageNumber;

    /**  */
    private ArticleCategory articleCategory;

    /**  */
    private Set<Tag> tags = new HashSet<Tag>();

    static {
        try {
            File shopxxXmlFile = new ClassPathResource(CommonAttributes.SHOPXX_XML_PATH).getFile();
            org.dom4j.Document document = new SAXReader().read(shopxxXmlFile);
            org.dom4j.Element element = (org.dom4j.Element) document
                    .selectSingleNode("/groupbuy/template[@id='articleContent']");
            staticPath = element.attributeValue("staticPath");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * ?
     * 
     * @return 
     */
    @Field(store = Store.YES, index = Index.TOKENIZED, analyzer = @Analyzer(impl = IKAnalyzer.class))
    @NotEmpty
    @Length(max = 200)
    @Column(nullable = false)
    public String getTitle() {
        return title;
    }

    /**
     * 
     * 
     * @param title
     *            
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * ?
     * 
     * @return 
     */
    @Field(store = Store.YES, index = Index.NO)
    @Length(max = 200)
    public String getAuthor() {
        return author;
    }

    /**
     * 
     * 
     * @param author
     *            
     */
    public void setAuthor(String author) {
        this.author = author;
    }

    /**
     * ?
     * 
     * @return 
     */
    @Field(store = Store.YES, index = Index.TOKENIZED, analyzer = @Analyzer(impl = IKAnalyzer.class))
    @Lob
    public String getContent() {
        if (pageNumber != null) {
            String[] pageContents = getPageContents();
            if (pageNumber < 1) {
                pageNumber = 1;
            }
            if (pageNumber > pageContents.length) {
                pageNumber = pageContents.length;
            }
            return pageContents[pageNumber - 1];
        } else {
            return content;
        }
    }

    /**
     * 
     * 
     * @param content
     *            
     */
    public void setContent(String content) {
        this.content = content;
    }

    /**
     * ??
     * 
     * @return ?
     */
    @Length(max = 200)
    public String getSeoTitle() {
        return seoTitle;
    }

    /**
     * ?
     * 
     * @param seoTitle
     *            ?
     */
    public void setSeoTitle(String seoTitle) {
        this.seoTitle = seoTitle;
    }

    /**
     * ???
     * 
     * @return ??
     */
    @Length(max = 200)
    public String getSeoKeywords() {
        return seoKeywords;
    }

    /**
     * ??
     * 
     * @param seoKeywords
     *            ??
     */
    public void setSeoKeywords(String seoKeywords) {
        if (seoKeywords != null) {
            seoKeywords = seoKeywords.replaceAll("[,\\s]*,[,\\s]*", ",").replaceAll("^,|,$", "");
        }
        this.seoKeywords = seoKeywords;
    }

    /**
     * ????
     * 
     * @return ???
     */
    @Length(max = 200)
    public String getSeoDescription() {
        return seoDescription;
    }

    /**
     * ???
     * 
     * @param seoDescription
     *            ???
     */
    public void setSeoDescription(String seoDescription) {
        this.seoDescription = seoDescription;
    }

    /**
     * ???
     * 
     * @return ??
     */
    @Field(store = Store.YES, index = Index.UN_TOKENIZED)
    @NotNull
    @Column(nullable = false)
    public Boolean getIsPublication() {
        return isPublication;
    }

    /**
     * ??
     * 
     * @param isPublication
     *            ??
     */
    public void setIsPublication(Boolean isPublication) {
        this.isPublication = isPublication;
    }

    /**
     * ??
     * 
     * @return ?
     */
    @Field(store = Store.YES, index = Index.UN_TOKENIZED)
    @NotNull
    @Column(nullable = false)
    public Boolean getIsTop() {
        return isTop;
    }

    /**
     * ?
     * 
     * @param isTop
     *            ?
     */
    public void setIsTop(Boolean isTop) {
        this.isTop = isTop;
    }

    /**
     * ?
     * 
     * @return 
     */
    @Column(nullable = false)
    public Long getHits() {
        return hits;
    }

    /**
     * 
     * 
     * @param hits
     *            
     */
    public void setHits(Long hits) {
        this.hits = hits;
    }

    /**
     * ??
     * 
     * @return ?
     */
    @Transient
    public Integer getPageNumber() {
        return pageNumber;
    }

    /**
     * ?
     * 
     * @param pageNumber
     *            ?
     */
    @Transient
    public void setPageNumber(Integer pageNumber) {
        this.pageNumber = pageNumber;
    }

    /**
     * ?
     * 
     * @return 
     */
    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(nullable = false)
    public ArticleCategory getArticleCategory() {
        return articleCategory;
    }

    /**
     * 
     * 
     * @param articleCategory
     *            
     */
    public void setArticleCategory(ArticleCategory articleCategory) {
        this.articleCategory = articleCategory;
    }

    /**
     * ?
     * 
     * @return 
     */
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "xx_article_tag")
    @OrderBy("order asc")
    public Set<Tag> getTags() {
        return tags;
    }

    /**
     * 
     * 
     * @param tags
     *            
     */
    public void setTags(Set<Tag> tags) {
        this.tags = tags;
    }

    /**
     * ?
     * 
     * @return 
     */
    @Transient
    public String getPath() {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("id", getId());
        model.put("createDate", getCreateDate());
        model.put("modifyDate", getModifyDate());
        model.put("title", getTitle());
        model.put("seoTitle", getSeoTitle());
        model.put("seoKeywords", getSeoKeywords());
        model.put("seoDescription", getSeoDescription());
        model.put("pageNumber", getPageNumber());
        model.put("articleCategory", getArticleCategory());
        try {
            return FreemarkerUtils.process(staticPath, model);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * ?
     * 
     * @return 
     */
    @Transient
    public String getText() {
        if (getContent() != null) {
            return Jsoup.parse(getContent()).text();
        }
        return null;
    }

    /**
     * ?
     * 
     * @return 
     */
    @Transient
    public String[] getPageContents() {
        if (StringUtils.isEmpty(content)) {
            return new String[] { "" };
        }
        if (content.contains(PAGE_BREAK_SEPARATOR)) {
            return content.split(PAGE_BREAK_SEPARATOR);
        } else {
            List<String> pageContents = new ArrayList<String>();
            Document document = Jsoup.parse(content);
            List<Node> children = document.body().childNodes();
            if (children != null) {
                int textLength = 0;
                StringBuffer html = new StringBuffer();
                for (Node node : children) {
                    if (node instanceof Element) {
                        Element element = (Element) node;
                        html.append(element.outerHtml());
                        textLength += element.text().length();
                        if (textLength >= PAGE_CONTENT_LENGTH) {
                            pageContents.add(html.toString());
                            textLength = 0;
                            html.setLength(0);
                        }
                    } else if (node instanceof TextNode) {
                        TextNode textNode = (TextNode) node;
                        String text = textNode.text();
                        String[] contents = PARAGRAPH_SEPARATOR_PATTERN.split(text);
                        Matcher matcher = PARAGRAPH_SEPARATOR_PATTERN.matcher(text);
                        for (String content : contents) {
                            if (matcher.find()) {
                                content += matcher.group();
                            }
                            html.append(content);
                            textLength += content.length();
                            if (textLength >= PAGE_CONTENT_LENGTH) {
                                pageContents.add(html.toString());
                                textLength = 0;
                                html.setLength(0);
                            }
                        }
                    }
                }
                String pageContent = html.toString();
                if (StringUtils.isNotEmpty(pageContent)) {
                    pageContents.add(pageContent);
                }
            }
            return pageContents.toArray(new String[pageContents.size()]);
        }
    }

    /**
     * ?
     * 
     * @return 
     */
    @Transient
    public int getTotalPages() {
        return getPageContents().length;
    }

}