All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sakaiproject.commons.api.datamodel.Post Maven / Gradle / Ivy

There is a newer version: 23.2
Show newest version
/**
 * Copyright (c) 2003-2017 The Apereo Foundation
 *
 * Licensed under the Educational Community License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *             http://opensource.org/licenses/ecl2
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.sakaiproject.commons.api.datamodel;

import java.time.Instant;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Stack;
import java.util.TimeZone;

import lombok.Getter;
import lombok.Setter;

import org.sakaiproject.commons.api.PostReferenceFactory;
import org.sakaiproject.commons.api.XmlDefs;
import org.sakaiproject.entity.api.Entity;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.util.BaseResourceProperties;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

@Getter @Setter
public class Post implements Entity {

    private static final String CDATA_SUFFIX = "]]>";
    private static final String CDATA_PREFIX = " comments = new ArrayList<>();
    private String content = "";
    private long createdDate = -1L;
    private String creatorDisplayName = null;
    private String creatorId = null;
    private String id = "";
    private long modifiedDate = -1L;
    private long releaseDate = -1L;
    private int numberOfComments = 0;
    private String embedder;
    private String siteId;
    private String commonsId;
    private String url = "";

    public Post() {

        long now = Instant.now().toEpochMilli();
        createdDate = now;
        modifiedDate = now;
        releaseDate = now;
    }

    public Post(ResultSet rs) throws SQLException {

        this.setId(rs.getString("ID"));
        this.setEmbedder(rs.getString("EMBEDDER"));
        this.setCommonsId(rs.getString("COMMONS_ID"));
        this.setSiteId(rs.getString("SITE_ID"));
        this.setContent(rs.getString("CONTENT"));
        this.setCreatorId(rs.getString("CREATOR_ID"));

        // retrieve time's in UTC since that's how it's stored
        this.setCreatedDate(rs.getTimestamp("CREATED_DATE", Calendar.getInstance(TimeZone.getTimeZone(ZoneId.of("UTC")))).getTime());
        this.setModifiedDate(rs.getTimestamp("MODIFIED_DATE", Calendar.getInstance(TimeZone.getTimeZone(ZoneId.of("UTC")))).getTime());
        this.setReleaseDate(rs.getTimestamp("RELEASE_DATE", Calendar.getInstance(TimeZone.getTimeZone(ZoneId.of("UTC")))).getTime());
    }

    public void addComment(Comment comment) {

        comments.add(comment);
        numberOfComments += 1;
    }

    public void setComments(List comments) {

        this.comments = comments;
        numberOfComments = comments.size();
    }

    /**
     * @see org.sakaiproject.entity.api.Entity#getProperties()
     */
    public ResourceProperties getProperties() {

        ResourceProperties rp = new BaseResourceProperties();
        rp.addProperty("id", getId());
        return rp;
    }

    /**
     * @see org.sakaiproject.entity.api.Entity#getReference()
     *
     * @return
     */
    public String getReference() {
        return PostReferenceFactory.getReference(commonsId, id);
    }

    /**
     * @see org.sakaiproject.entity.api.Entity#getReference()
     *
     * @return
     */
    public String getReference(String rootProperty) {
        return getReference();
    }

    /**
     * @see org.sakaiproject.entity.api.Entity#getUrl()
     */
    public String getUrl(String rootProperty) {
        return getUrl();
    }

    /**
     * @see org.sakaiproject.entity.api.Entity#toXml()
     *
     * @return
     */
    public Element toXml(Document doc, Stack stack) {

        Element postElement = doc.createElement(XmlDefs.POST);

        if (stack.isEmpty()) {
            doc.appendChild(postElement);
        } else {
            ((Element) stack.peek()).appendChild(postElement);
        }

        stack.push(postElement);

        Element idElement = doc.createElement(XmlDefs.ID);
        idElement.setTextContent(id);
        postElement.appendChild(idElement);

        Element createdDateElement = doc.createElement(XmlDefs.CREATEDDATE);
        createdDateElement.setTextContent(Long.toString(createdDate));
        postElement.appendChild(createdDateElement);

        Element modifiedDateElement = doc.createElement(XmlDefs.MODIFIEDDATE);
        modifiedDateElement.setTextContent(Long.toString(modifiedDate));
        postElement.appendChild(modifiedDateElement);

        Element creatorIdElement = doc.createElement(XmlDefs.CREATORID);
        creatorIdElement.setTextContent(creatorId);
        postElement.appendChild(creatorIdElement);

        Element contentElement = doc.createElement(XmlDefs.CONTENT);
        contentElement.setTextContent(wrapWithCDATA(content));
        postElement.appendChild(contentElement);

        if (comments.size() > 0) {
            Element commentsElement = doc.createElement(XmlDefs.COMMENTS);

            for (Comment comment : comments) {
                Element commentElement = doc.createElement(XmlDefs.COMMENT);
                commentElement.setAttribute(XmlDefs.ID, comment.getId());
                commentElement.setAttribute(XmlDefs.CREATORID, comment.getCreatorId());
                commentElement.setAttribute(XmlDefs.CREATEDDATE, Long.toString(comment.getCreatedDate()));
                commentElement.setAttribute(XmlDefs.MODIFIEDDATE, Long.toString(comment.getModifiedDate()));
                commentElement.setTextContent(wrapWithCDATA(comment.getContent()));

                commentsElement.appendChild(commentElement);
            }

            postElement.appendChild(commentsElement);
        }

        stack.pop();

        return postElement;
    }

    private String wrapWithCDATA(String s) {
        return CDATA_PREFIX + s + CDATA_SUFFIX;
    }

    private String stripCDATA(String s) {

        if (s.startsWith(CDATA_PREFIX) && s.endsWith(CDATA_SUFFIX)) {
            s = s.substring(CDATA_PREFIX.length());
            s = s.substring(0, s.length() - CDATA_SUFFIX.length());
        }

        return s;
    }

    public void fromXml(Element postElement) {

        if (!postElement.getTagName().equals(XmlDefs.POST)) {
            return;
        }

        NodeList children = postElement.getElementsByTagName(XmlDefs.CREATORID);
        setCreatorId(children.item(0).getFirstChild().getTextContent());

        children = postElement.getElementsByTagName(XmlDefs.CREATEDDATE);
        setCreatedDate(Long.parseLong(children.item(0).getFirstChild().getTextContent()));

        children = postElement.getElementsByTagName(XmlDefs.MODIFIEDDATE);
        setModifiedDate(Long.parseLong(children.item(0).getFirstChild().getTextContent()));

        children = postElement.getElementsByTagName(XmlDefs.CONTENT);
        if (children.getLength() > 0) {
            setContent(stripCDATA(children.item(0).getFirstChild().getTextContent()));
        }

        NodeList comments = postElement.getElementsByTagName(XmlDefs.COMMENTS);

        if (comments.getLength() == 1) {
            Element commentsElement = (Element) comments.item(0);

            children = commentsElement.getElementsByTagName(XmlDefs.COMMENT);
            int numChildren = children.getLength();
            for (int i = 0; i < numChildren; i++) {
                Element commentElement = (Element) children.item(i);

                String commentCreatorId = commentElement.getAttribute(XmlDefs.CREATORID);
                String commentCreatedDate = commentElement.getAttribute(XmlDefs.CREATEDDATE);
                String commentModifiedDate = commentElement.getAttribute(XmlDefs.MODIFIEDDATE);

                String text = commentElement.getFirstChild().getTextContent();

                Comment comment = new Comment();
                comment.setCreatorId(commentCreatorId);
                comment.setCreatedDate(Long.parseLong(commentCreatedDate));
                comment.setModifiedDate(Long.parseLong(commentModifiedDate));
                comment.setContent(stripCDATA(text), false);

                addComment(comment);
            }
        }
    }

    public boolean hasComments() {
        return comments.size() > 0;
    }

    public void removeComment(Comment comment) {
        comments.remove(comment);
    }

    public void minimise() {

        content = "";
        numberOfComments = comments.size();
        comments = new ArrayList<>();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy