package org.brixcms.plugin.content.blog.post;
import java.util.Calendar;
import java.util.Date;
import javax.jcr.Node;
import javax.jcr.Session;
import org.apache.wicket.util.string.Strings;
import org.brixcms.Brix;
import org.brixcms.jcr.JcrNodeWrapperFactory;
import org.brixcms.jcr.RepositoryUtil;
import org.brixcms.jcr.api.JcrNode;
import org.brixcms.jcr.api.JcrSession;
import org.brixcms.jcr.wrapper.BrixFileNode;
import org.brixcms.jcr.wrapper.BrixNode;
import org.brixcms.plugin.content.blog.post.comment.CommentNode;
import org.brixcms.plugin.content.folder.FolderNode;
import org.brixcms.web.reference.Reference;
/**
* @author dan.simko@gmail.com
*/
@SuppressWarnings("serial")
public class PostNode extends CommentNode {
public static final int MAX_PERMALINK_LENGTH = 250;
private static final String RESOURCES_FOLDER_NAME = "resources";
public static enum State {
Draft, PendingReview, Published
}
public static enum Visibility {
// TODO implement feature "Stick this post to the front page"
Public, PublicHighlighted, PasswordProtected, Private
}
public PostNode(Node delegate, JcrSession session) {
super(delegate, session);
}
public static JcrNodeWrapperFactory FACTORY = new JcrNodeWrapperFactory() {
@Override
public boolean canWrap(Brix brix, JcrNode node) {
return PostNodePlugin.TYPE.equals(getNodeType(node));
}
@Override
public JcrNode wrap(Brix brix, Node node, JcrSession session) {
return new PostNode(node, session);
}
@Override
public void initializeRepository(Brix brix, Session session) {
RepositoryUtil.registerNodeType(session.getWorkspace(), PostNodePlugin.TYPE, false, false, true);
}
};
private static class Properties {
public static final String TITLE = Brix.NS_PREFIX + "title";
public static final String STATE = Brix.NS_PREFIX + "state";
public static final String VISIBILITY = Brix.NS_PREFIX + "visibility";
// TODO implement: immediately, date
public static final String PUBLISH = Brix.NS_PREFIX + "publish";
// TODO implement: uncategorized, ...
public static final String CATEGORIES = Brix.NS_PREFIX + "categories";
// TODO implement
public static final String TAGS = Brix.NS_PREFIX + "tags";
// TODO implement
public static final String FEATURED_IMAGE = Brix.NS_PREFIX + "featuredImage";
}
public String getTitle() {
return loadStringProperty(Properties.TITLE);
}
public void setTitle(String title) {
setProperty(Properties.TITLE, title);
}
public State getState() {
String state = loadStringProperty(Properties.STATE);
if (Strings.isEmpty(state)) {
return null;
}
return State.valueOf(state);
}
public void setState(State state) {
if (state != null) {
setProperty(Properties.STATE, state.name());
}
}
public Visibility getVisibility() {
String visibility = loadStringProperty(Properties.VISIBILITY);
if (Strings.isEmpty(visibility)) {
return null;
}
return Visibility.valueOf(visibility);
}
public void setVisibility(Visibility visibility) {
if (visibility != null) {
setProperty(Properties.VISIBILITY, visibility.name());
}
}
public Date getPublish() {
return loadDateAttribute(Properties.PUBLISH);
}
public void setPublish(Date date) {
setDateAttribute(Properties.PUBLISH, date);
}
public FolderNode getResourcesFolder() {
return (FolderNode) getNode(RESOURCES_FOLDER_NAME);
}
public Reference getFeaturedImageReference() {
return Reference.load(this, Properties.FEATURED_IMAGE);
}
public void setFeaturedImageReference(Reference reference) {
if (reference == null) {
reference = new Reference();
}
reference.save(this, Properties.FEATURED_IMAGE);
}
public static PostNode initialize(JcrNode node) {
BrixFileNode brixNode = BrixFileNode.initialize(node, "text/html");
BrixNode content = (BrixNode) node.getNode("jcr:content");
content.setHidden(true);
brixNode.setNodeType(PostNodePlugin.TYPE);
brixNode.addNode(COMMNETS_FOLDER_NAME, "nt:folder");
brixNode.addNode(RESOURCES_FOLDER_NAME, "nt:folder");
return new PostNode(node.getDelegate(), node.getSession());
}
private Date loadDateAttribute(String attribute) {
Date result = null;
if (hasProperty(attribute)) {
result = getProperty(attribute).getDate().getTime();
}
return result;
}
private void setDateAttribute(String attribute, Date date) {
Calendar calendar = null;
if (date != null) {
calendar = Calendar.getInstance();
calendar.setTime(date);
}
setProperty(attribute, calendar);
}
private String loadStringProperty(String attribute) {
String result = null;
if (hasProperty(attribute)) {
result = getProperty(attribute).getString();
}
return result;
}
@Override
public String getUserVisibleType() {
return "Post";
}
}