/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.core.site.model; import java.io.Serializable; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.PostUpdate; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.annotate.JsonIgnore; import org.hibernate.annotations.Formula; /** * <ul> * <li>id:栏目编号</li> * <li>parent:所属父栏目</li> * <li>site:栏目所属站点</li> * <li>name: 栏目名称</li> * <li>dir: 栏目目录</li> * <li>pubPath:栏目发布路径</li> * <li>url:栏目域名</li> * <li>absUrl:栏目访问地址</li> * <li>listSize:列表显示最大条数</li> * <li>maxSize:最大显示条数</li> * <li>publicenable:是否允许发布</li> * <li>describe:专栏说明</li> * <li>channelEntity:专栏引导图</li> * <li>channelType:专栏类型</li> * <li>sort:排序号</li> * <li>appChannel:应用于频道</li> * </ul> * * @author 周冬初 * @author wuzhijun */ @Entity @Table(name = "site_channel") @SequenceGenerator(name = "seq_site_channel", sequenceName = "seq_site_channel_id", allocationSize = 1) public class Channel implements Serializable { private static final long serialVersionUID = 7813916065025966481L; public enum Type { NODE("节点"), ARTICLE("文章信息"), RETRIEVAL("文章信息(公文)"), LEADERARTICLE("文章信息(引用)"), LEADER("领导信息"), ONLINE("网上办事"), PROJECT("项目基本信息"), PROJECTARTICLE("项目文章信息"), ENTERPRISE("企业基本信息"), ENTERPRISEARTICLE("企业文章信息"), EMPLOYE("从业人员基本信息"), EMPLOYEARTICLE("从业人员文章信息"); private String description; private Type(String description) { this.description = description; } public String getDescription() { return description; } } private static final String PATH_SEPARATOR = "/"; @Id @GeneratedValue(generator = "seq_site_channel", strategy = GenerationType.SEQUENCE) private Integer id; @ManyToOne(cascade = { CascadeType.REFRESH }, targetEntity = Channel.class) @JoinColumn(name = "parent_id", nullable = true) private Channel parent; @ManyToOne(cascade = { CascadeType.REFRESH }, targetEntity = Site.class) @JoinColumn(name = "site_id", nullable = false) private Site site; @Column(length = 100) private String name; @Column(length = 50) private String dir; @Column(length = 150) private String url; @Column(length = 400) private String absUrl; @Column(length = 400) private String iconUrl; @Column(length = 400) private String pubPath; @Column() private Integer listSize = 20; @Column() private Integer maxSize = 9999; @Column() private Boolean publicenable = false; @Column() private Integer internalSort; @Formula(value = "(Select count(o.id) From site_channel o Where o.parent_id= id)") private int childrenCount = 0; @Column(length = 200) private String describe; @Column(name = "type", nullable = false) @Enumerated(EnumType.STRING) private Type type; @Column(name = "sort") private Long sort = 0L; @Column(name = "app_channel", columnDefinition="text") private String appChannel; public Channel() { type = Type.NODE; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getInternalSort() { return internalSort; } public void setInternalSort(Integer internalSort) { this.internalSort = internalSort; } @JsonIgnore public Channel getParent() { return parent; } public void setParent(Channel parent) { this.parent = parent; } @JsonIgnore public Site getSite() { return site; } public void setSite(Site site) { this.site = site; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDir() { return dir == null ? "" : dir; } public void setDir(String dir) { this.dir = dir; } public String getUrl() { return url == null ? "" : url; } public void setUrl(String url) { this.url = url; } public String getAbsUrl() { return absUrl; } public void setAbsUrl(String realDir) { this.absUrl = realDir; } public String getPubPath() { return pubPath; } public void setPubPath(String pubPath) { this.pubPath = pubPath; } public Integer getListSize() { return listSize; } public void setListSize(Integer listSize) { this.listSize = listSize; } public Integer getMaxSize() { return maxSize; } public void setMaxSize(Integer maxSize) { this.maxSize = maxSize; } public Boolean getPublicenable() { return publicenable; } public void setPublicenable(Boolean publicenable) { this.publicenable = publicenable; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } public boolean hasChildren() { return this.childrenCount > 0; } @PostUpdate public void afterPersist() { constructAbsUrl(); constructPubPath(); } public String getIconUrl() { return iconUrl; } public void setIconUrl(String iconUrl) { this.iconUrl = iconUrl; } private void constructAbsUrl() { if (StringUtils.isNotBlank(url)) { this.absUrl = url; } else { StringBuilder builder = new StringBuilder(); for (Channel channel = this; channel != null; channel = channel.parent) { if (StringUtils.isNotBlank(channel.getUrl()) || StringUtils.isBlank(channel.getDir())) { break; } String dir = removeStartAndEndPathSeparator(channel.getDir()); builder.insert(0, dir); builder.insert(0, PATH_SEPARATOR); } this.absUrl = builder.toString(); } } private void constructPubPath() { StringBuilder builder = new StringBuilder(); for (Channel channel = this; channel != null; channel = channel.parent) { if (StringUtils.isBlank(channel.getDir())) { break; } String dir = removeStartAndEndPathSeparator(channel.getDir()); builder.insert(0, dir); builder.insert(0, PATH_SEPARATOR); } pubPath = removeStartAndEndPathSeparator(builder.toString()); } private String removeStartAndEndPathSeparator(final String dir) { String path = dir; path = StringUtils.removeStart(path, PATH_SEPARATOR); path = StringUtils.removeEnd(path, PATH_SEPARATOR); return path; } public Type getType() { return type; } public String getTypeDescription() { if (type != null) { return type.getDescription(); } else { return Type.NODE.getDescription(); } } public void setType(Type type) { this.type = type; } public Long getSort() { return sort; } public void setSort(Long sort) { this.sort = sort; } public String getAppChannel() { return appChannel; } public void setAppChannel(String appChannel) { this.appChannel = appChannel; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Channel other = (Channel) obj; if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) { return false; } return true; } @Override public int hashCode() { int hash = 7; hash = 67 * hash + (this.id != null ? this.id.hashCode() : 0); return hash; } }