package models.origo.core;
import play.data.validation.Required;
import play.db.jpa.Model;
import play.modules.origo.core.Node;
import play.modules.origo.core.ui.UIElement;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* The basic type for a page. Directly linked to a RootNode, both it's version and id.
*
* @see play.modules.origo.core.Node
* @see RootNode
* @see origo.listeners.BasicPageProvider
*/
@Entity
@Table(uniqueConstraints = @UniqueConstraint(name = "pageVersion", columnNames = {"parentNodeId", "parentVersion"}))
public class BasicPage extends Model implements Node {
@Required
@Column(name = "parentNodeId")
public String nodeId;
// TODO: Should only have to be Integer but because of defect #521 in play that doesn't work. Should be fixed in 1.3 (2.0?)
@Required
@Column(name = "parentVersion")
public Long version;
@Transient
public RootNode rootNode;
@Required
public String title;
@Required
public String leadReferenceId;
@Required
public String bodyReferenceId;
@Override
public String getNodeId() {
return this.nodeId;
}
@Override
public Long getVersion() {
return this.version;
}
@Override
public Date getDatePublished() {
return this.rootNode.publish;
}
@Override
public Date getDateUnpublished() {
return this.rootNode.unPublish;
}
@Override
public String getTitle() {
return title;
}
@Override
public String getThemeVariant() {
return rootNode.themeVariant;
}
@Override
public Set<String> getRegions() {
return rootNode.getRegions();
}
@Override
public List<UIElement> getUIElements(String region) {
return rootNode.getUIElements(region);
}
@Override
public UIElement addHeadUIElement(UIElement uiElement) {
return rootNode.addHeadUIElement(uiElement);
}
@Override
public UIElement addUIElement(UIElement uiElement) {
return rootNode.addUIElement(uiElement, false);
}
@Override
public UIElement addHeadUIElement(UIElement uiElement, boolean reorderElementsBelow) {
return rootNode.addHeadUIElement(uiElement, reorderElementsBelow);
}
@Override
public UIElement addUIElement(UIElement uiElement, boolean reorderElementsBelow) {
return rootNode.addUIElement(uiElement, reorderElementsBelow);
}
@Override
public boolean removeHeadUIElement(UIElement uiElement) {
return rootNode.removeHeadUIElement(uiElement);
}
@Override
public boolean removeUIElement(UIElement uiElement) {
return rootNode.removeUIElement(uiElement);
}
public BasicPage copy(RootNode oldRootNode) {
BasicPage newPage = new BasicPage();
RootNode rootNodeCopy = oldRootNode.copy(true);
newPage.rootNode = rootNodeCopy;
newPage.nodeId = nodeId;
newPage.version = rootNodeCopy.version;
newPage.title = title;
newPage.leadReferenceId = leadReferenceId;
newPage.bodyReferenceId = bodyReferenceId;
return newPage;
}
@Override
public String toString() {
return new StringBuilder().
append("BasicPage {").
append("nodeId='").append(nodeId).append("\', ").
append("version=").append(version).append(", ").
append("rootNode=").append(rootNode).append(", ").
append("title='").append(title).append("\', ").
append("leadReferenceId='").append(leadReferenceId).append("\', ").
append("bodyReferenceId='").append(bodyReferenceId).append("\', ").
append('}').toString();
}
public static List<BasicPage> findAllCurrentVersions(Date asOfDate) {
return BasicPage.
find(
"select p from BasicPage p " +
"where p.id in (" +
"select l.id from RootNode l " +
"where l.version = (" +
"select max(l2.version) from RootNode l2 " +
"where l2.nodeId = l.nodeId and " +
"(l2.publish = null or l2.publish < :today) and " +
"(l2.unPublish = null or l2.unPublish >= :today)" +
")" +
")").
bind("today", asOfDate).
fetch();
}
public static BasicPage findCurrentVersion(String nodeId, Date asOfDate) {
return BasicPage.
find(
"select p from BasicPage p " +
"where p.nodeId = :nodeId and p.id in (" +
"select l.id from RootNode l " +
"where l.version = (" +
"select max(l2.version) from RootNode l2 " +
"where l2.nodeId = l.nodeId and " +
"(l2.publish = null or l2.publish < :today) and " +
"(l2.unPublish = null or l2.unPublish >= :today)" +
")" +
")").
bind("nodeId", nodeId).
bind("today", asOfDate).
first();
}
public static BasicPage findLatestVersion(String nodeId) {
return BasicPage.
find(
"select p from BasicPage p " +
"where p.nodeId = :nodeId and p.version = (" +
"select max(n.version) from RootNode n " +
"where p.nodeId = n.nodeId" +
")").
bind("nodeId", nodeId).
first();
}
public static BasicPage findWithNodeIdAndSpecificVersion(String nodeId, Long version) {
return RootNode.
find("select distinct p from BasicPage p where p.nodeId = :nodeId and p.version = :version").
bind("nodeId", nodeId).
bind("version", version).
first();
}
public static List<BasicPage> findAllLatestVersions() {
return BasicPage.
find(
"select p from BasicPage p " +
"where p.version = (" +
"select max(n.version) from RootNode n " +
"where p.nodeId = n.nodeId" +
")").
fetch();
}
}