package models.origo.structuredcontent; import models.origo.core.RootNode; 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; @Entity @Table(uniqueConstraints = @UniqueConstraint(name = "pageVersion", columnNames = {"parentNodeId", "parentVersion"})) public class StructuredPage 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; @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); } @Override public String toString() { return new StringBuilder(). append("StructuredPage {"). append("nodeId='").append(nodeId).append("\', "). append("version=").append(version).append(", "). append("rootNode=").append(rootNode).append(", "). append("title='").append(title).append("\'"). append("}").toString(); } public static List<StructuredPage> findAllCurrentVersions(Date asOfDate) { return StructuredPage. find( "select p from StructuredPage 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 StructuredPage findCurrentVersion(String nodeId, Date asOfDate) { return StructuredPage. find( "select p from StructuredPage 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 StructuredPage findWithNodeIdAndSpecificVersion(String nodeId, Long version) { return RootNode. find( "select distinct p from StructuredPage p " + "where p.nodeId = :nodeId and " + "p.version = :version"). bind("nodeId", nodeId). bind("version", version). first(); } }