package com.hongqiang.shop.modules.entity;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
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.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.dom4j.Document;
import org.dom4j.Element;
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.Store;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.springframework.core.io.ClassPathResource;
import org.wltea.analyzer.lucene.IKAnalyzer;
import com.hongqiang.shop.common.utils.FreeMarkers;
import com.hongqiang.shop.common.utils.StringUtils;
import com.hongqiang.shop.common.utils.model.CommonAttributes;
//文章
@Indexed
@Entity
@Table(name = "hq_article")
public class Article extends BaseEntity {
private static final long serialVersionUID = 1475773294701585482L;
private static final int MAX_PAGE_CONTENT_COUNT = 800;// 内容分页每页最大字数
private static final String contentBreake = "<hr class=\"pageBreak\" />";
private static final Pattern 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 localFile = new ClassPathResource(CommonAttributes.HQ_SHOP_XML_PATH).getFile();
Document localDocument = new SAXReader().read(localFile);
Element localElement = (org.dom4j.Element) localDocument
.selectSingleNode("/shophq/template[@id='articleContent']");
staticPath = localElement.attributeValue("staticPath");
} catch (Exception localException) {
localException.printStackTrace();
}
}
@Field(store = Store.YES, index = Index.YES, analyzer = @Analyzer(impl = IKAnalyzer.class))
@NotEmpty
@Length(max = 200)
@Column(nullable = false)
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
@Field(store = Store.YES, index = Index.NO)
@Length(max = 200)
public String getAuthor() {
return this.author;
}
public void setAuthor(String author) {
this.author = author;
}
@Field(store = Store.YES, index = Index.YES, analyzer = @Analyzer(impl = IKAnalyzer.class))
@Lob
public String getContent() {
if (this.pageNumber != null) {
String[] arrayOfString = getPageContents();
if (this.pageNumber.intValue() < 1)
this.pageNumber = Integer.valueOf(1);
if (this.pageNumber.intValue() > arrayOfString.length)
this.pageNumber = Integer.valueOf(arrayOfString.length);
return arrayOfString[(this.pageNumber.intValue() - 1)];
}
return this.content;
}
public void setContent(String content) {
this.content = content;
}
@Length(max = 200)
public String getSeoTitle() {
return this.seoTitle;
}
public void setSeoTitle(String seoTitle) {
this.seoTitle = seoTitle;
}
@Length(max = 200)
public String getSeoKeywords() {
return this.seoKeywords;
}
public void setSeoKeywords(String seoKeywords) {
if (seoKeywords != null)
seoKeywords = seoKeywords.replaceAll("[,\\s]*,[,\\s]*", ",")
.replaceAll("^,|,$", "");
this.seoKeywords = seoKeywords;
}
@Length(max = 200)
public String getSeoDescription() {
return this.seoDescription;
}
public void setSeoDescription(String seoDescription) {
this.seoDescription = seoDescription;
}
@Field(store = Store.YES, index = Index.YES)
@NotNull
@Column(nullable = false)
public Boolean getIsPublication() {
return this.isPublication;
}
public void setIsPublication(Boolean isPublication) {
this.isPublication = isPublication;
}
@Field(store = Store.YES, index = Index.YES)
@NotNull
@Column(nullable = false)
public Boolean getIsTop() {
return this.isTop;
}
public void setIsTop(Boolean isTop) {
this.isTop = isTop;
}
@Column(nullable = false)
public Long getHits() {
return this.hits;
}
public void setHits(Long hits) {
this.hits = hits;
}
@Transient
public Integer getPageNumber() {
return this.pageNumber;
}
@Transient
public void setPageNumber(Integer pageNumber) {
this.pageNumber = pageNumber;
}
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(nullable = false)
public ArticleCategory getArticleCategory() {
return this.articleCategory;
}
public void setArticleCategory(ArticleCategory articleCategory) {
this.articleCategory = articleCategory;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "hq_article_tag")
@OrderBy("order asc")
public Set<Tag> getTags() {
return this.tags;
}
public void setTags(Set<Tag> tags) {
this.tags = tags;
}
@Transient
public String getPath() {
HashMap<String, Object> localHashMap = new HashMap<String, Object>();
localHashMap.put("id", getId());
localHashMap.put("createDate", getCreateDate());
localHashMap.put("updateDate", getUpdateDate());
localHashMap.put("title", getTitle());
localHashMap.put("seoTitle", getSeoTitle());
localHashMap.put("seoKeywords", getSeoKeywords());
localHashMap.put("seoDescription", getSeoDescription());
localHashMap.put("pageNumber", getPageNumber());
localHashMap.put("articleCategory", getArticleCategory());
return FreeMarkers.renderString(staticPath, localHashMap);
}
@Transient
public String getText() {
if (getContent() != null)
return Jsoup.parse(getContent()).text();
return null;
}
@Transient
public String[] getPageContents() {
if (StringUtils.isEmpty(this.content))
return new String[] { "" };
if (this.content.contains(contentBreake))
return this.content.split(contentBreake);
ArrayList<String> localArrayList = new ArrayList<String>();
org.jsoup.nodes.Document localDocument = Jsoup.parse(this.content);
List<Node> localList = localDocument.body().childNodes();
if (localList != null) {
int i = 0;
StringBuffer localStringBuffer = new StringBuffer();
Iterator<Node> localIterator = localList.iterator();
while (localIterator.hasNext()) {
Node localObject1 = (Node) localIterator.next();
Object localObject2;
if ((localObject1 instanceof org.jsoup.nodes.Element)) {
localObject2 = (org.jsoup.nodes.Element) localObject1;
localStringBuffer
.append(((org.jsoup.nodes.Element) localObject2)
.outerHtml());
i += ((org.jsoup.nodes.Element) localObject2).text()
.length();
if (i < MAX_PAGE_CONTENT_COUNT)
continue;
localArrayList.add(localStringBuffer.toString());
i = 0;
localStringBuffer.setLength(0);
} else {
if (!(localObject1 instanceof TextNode))
continue;
localObject2 = (TextNode) localObject1;
String str1 = ((TextNode) localObject2).text();
String[] arrayOfString1 = pattern.split(str1);
Matcher localMatcher = pattern.matcher(str1);
for (String str2 : arrayOfString1) {
if (localMatcher.find())
str2 = str2 + localMatcher.group();
localStringBuffer.append(str2);
i += str2.length();
if (i < MAX_PAGE_CONTENT_COUNT)
continue;
localArrayList.add(localStringBuffer.toString());
i = 0;
localStringBuffer.setLength(0);
}
}
}
String localObject1 = localStringBuffer.toString();
if (StringUtils.isNotEmpty((String) localObject1))
localArrayList.add(localObject1);
}
return (String[]) localArrayList.toArray(new String[localArrayList
.size()]);
}
@Transient
public int getTotalPages() {
return getPageContents().length;
}
}