package org.brixcms.plugin.content.blog.post.comment; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.jcr.Node; import javax.jcr.Session; 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.ContentPlugin; /** * @author dan.simko@gmail.com */ @SuppressWarnings("serial") public class CommentNode extends BrixFileNode implements Commentable, Comparable<CommentNode> { public static final String TYPE = ContentPlugin.NS_PREFIX + "comment"; protected static final String COMMNETS_FOLDER_NAME = "comments"; private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss-SS"); public CommentNode(Node delegate, JcrSession session) { super(delegate, session); } public static JcrNodeWrapperFactory FACTORY = new JcrNodeWrapperFactory() { @Override public boolean canWrap(Brix brix, JcrNode node) { return TYPE.equals(getNodeType(node)); } @Override public JcrNode wrap(Brix brix, Node node, JcrSession session) { return new CommentNode(node, session); } @Override public void initializeRepository(Brix brix, Session session) { RepositoryUtil.registerNodeType(session.getWorkspace(), TYPE, false, false, true); } }; public static CommentNode initialize(JcrNode node) { BrixFileNode brixNode = BrixFileNode.initialize(node, "text/html"); BrixNode content = (BrixNode) node.getNode("jcr:content"); content.setHidden(true); brixNode.setNodeType(TYPE); brixNode.addNode(COMMNETS_FOLDER_NAME, "nt:folder"); return new CommentNode(node.getDelegate(), node.getSession()); } @Override public String getUserVisibleType() { return "Comment"; } @Override public List<CommentNode> getComments(int level) { List<CommentNode> comments = new ArrayList<>(); getNode(COMMNETS_FOLDER_NAME).accept(new CommentsCollector(comments, level)); Collections.sort(comments); return comments; } @Override public void addComment(String comment) { JcrNode comments = getNode(COMMNETS_FOLDER_NAME); JcrNode node = comments.addNode(LocalDateTime.now().format(FORMATTER), "nt:file"); CommentNode commentNode = CommentNode.initialize(node); commentNode.setData(comment); comments.save(); } @Override public boolean isFolder() { return true; } @Override public int compareTo(CommentNode o) { if (getCreated() != null && o.getCreated() != null) return o.getCreated().compareTo(getCreated()); return 0; } }