package org.jboss.seam.wiki.core.model; import javax.persistence.*; import java.util.*; import java.io.Serializable; @Entity @Table(name = "WIKI_FILE") @org.hibernate.annotations.ForeignKey(name = "FK_WIKI_FILE_NODE_ID") //TODO: @org.hibernate.annotations.OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE) public abstract class WikiFile<N extends WikiFile> extends WikiNode<N> implements Serializable { @org.hibernate.annotations.CollectionOfElements(fetch = FetchType.LAZY) @JoinTable(name = "WIKI_TAG", joinColumns = @JoinColumn(name = "FILE_ID")) @Column(name = "TAG", nullable = false) @org.hibernate.annotations.ForeignKey(name = "FK_WIKI_TAG_FILE_ID") @org.hibernate.annotations.Sort(type = org.hibernate.annotations.SortType.NATURAL) //@org.hibernate.annotations.Fetch(org.hibernate.annotations.FetchMode.SUBSELECT) @org.hibernate.annotations.BatchSize(size = 20) private SortedSet<String> tags = new TreeSet<String>(); @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "WIKI_FILE_LINK", joinColumns = @JoinColumn(name = "SOURCE_WIKI_FILE_ID", nullable = false, updatable = false), inverseJoinColumns= @JoinColumn(name = "TARGET_WIKI_FILE_ID", nullable = false, updatable = false) ) @org.hibernate.annotations.ForeignKey(name = "FK_SOURCE_WIKI_FILE_ID", inverseName = "FK_TARGET_WIKI_FILE_ID") @org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.EXTRA) protected Set<WikiFile> outgoingLinks = new HashSet<WikiFile>(); @ManyToMany(fetch = FetchType.LAZY, mappedBy = "outgoingLinks") @org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.EXTRA) protected Set<WikiFile> incomingLinks = new HashSet<WikiFile>(); // Uses Hibernates ability to map the same class twice, see HistoricalWikiFile.hbm.xml @Transient private Long historicalFileId; @Transient protected String lastModifiedByUsername; @Column(name = "FILE_REVISION", nullable = false) private int revision = 0; protected WikiFile() {} protected WikiFile(String name) { super(name); } public SortedSet<String> getTags() { return tags; } public void setTags(SortedSet<String> tags) { this.tags = tags; } public Set<WikiFile> getOutgoingLinks() { return outgoingLinks; } public void setOutgoingLinks(Set<WikiFile> outgoingLinks) { this.outgoingLinks = outgoingLinks; } public Set<WikiFile> getIncomingLinks() { return incomingLinks; } public void setIncomingLinks(Set<WikiFile> incomingLinks) { this.incomingLinks = incomingLinks; } public Long getHistoricalFileId() { return historicalFileId; } public String getLastModifiedByUsername() { return lastModifiedByUsername; } @Override public void setLastModifiedBy(User lastModifiedBy) { super.setLastModifiedBy(lastModifiedBy); if (lastModifiedBy != null) lastModifiedByUsername = lastModifiedBy.getUsername(); } public int getRevision() { return revision; } public void setRevision(int revision) { this.revision = revision; } public void incrementRevision() { revision++; } public boolean isHistoricalRevision() { return historicalFileId!=null; } public void flatCopy(WikiFile original, boolean copyLazyProperties) { super.flatCopy(original, copyLazyProperties); this.revision = original.revision; } public void rollback(WikiFile revision) { this.name = revision.name; } public List<String> getTagsAsList() { return new ArrayList<String>(getTags()); } public boolean isTagged(String tag) { return getTags().contains(tag); } /* TODO: Remove this at some point, when we are sure we don't need it anymore public String getTagsCommaSeparated() { if (getTags().size() == 0) return null; StringBuilder tagString = new StringBuilder(); for (String s : getTags()) { tagString.append(s).append(", "); } return tagString.length()>0 ? tagString.toString().substring(0, tagString.toString().length()-2) // Cut last comma : tagString.toString(); } public void setTagsCommaSeparated(String tagString) { getTags().clear(); if (tagString == null || tagString.length() == 0) return; String[] tagArray = tagString.split(","); for (String s : tagArray) { getTags().add(s.trim()); } } */ public abstract String getHistoricalEntityName(); public abstract String getFeedDescription(); }