org.silverpeas.core.contribution.model.WysiwygContent.java Source code

Java tutorial

Introduction

Here is the source code for org.silverpeas.core.contribution.model.WysiwygContent.java

Source

/*
 * Copyright (C) 2000 - 2018 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of
 * the GPL, you may redistribute this Program in connection with Free/Libre
 * Open Source Software ("FLOSS") applications as described in Silverpeas's
 * FLOSS exception.  You should have received a copy of the text describing
 * the FLOSS exception, and it is also available here:
 * "http://www.silverpeas.org/docs/core/legal/floss_exception.html"
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.silverpeas.core.contribution.model;

import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.silverpeas.core.admin.user.model.User;
import org.silverpeas.core.contribution.service.WysiwygContentRepository;
import org.silverpeas.core.util.ServiceProvider;

/**
 * A WYSIWYG content is a rich text (text with styles with graphics and images) that is produced by
 * an editor in a form closely resembling its appearance when printed or displayed.
 * <p>
 * Usually a WYSIWYG content doesn't require to be compiled or transpiled into another form
 * dedicated to the rendering. The WYSIWYG content is enough by itself as it contains all the
 * information to be displayed.
 * @author mmoquillon
 */
public class WysiwygContent implements ContributionContent<String> {

    private final LocalizedContribution contribution;
    private String text;
    private User author;
    private boolean modified;

    /**
     * Constructs a new WYSIWYG content for the specified contribution with the given rich text.
     * @param contribution the contribution related by the content.
     * @param richText the data of the content. If null then an empty text is set.
     */
    public WysiwygContent(final LocalizedContribution contribution, final String richText) {
        this.contribution = contribution;
        this.text = richText == null ? "" : richText;
    }

    /**
     * Constructs an empty WYSIWYG content for the specified contribution.
     * @param contribution the contribution related by the content.
     */
    public WysiwygContent(final LocalizedContribution contribution) {
        this(contribution, "");
    }

    /**
     * Gets the WYSIWYG content of the specified contribution.
     * @param contribution a localized contribution.
     * @return the WYSIWYG content of the contribution or null if no such content exists.
     */
    public static WysiwygContent getContent(final LocalizedContribution contribution) {
        WysiwygContentRepository repository = ServiceProvider.getService(WysiwygContentRepository.class);
        return repository.getByContribution(contribution);
    }

    /**
     * Deletes all the WYSIWYG contents of the specified contribution. If the given contribution is
     * an I18n one (a multi-localized contribution) then all of its WYSIWYG contents, one per
     * localization, will be deleted. In the case of a single one localized contribution, only this
     * single WYSIWYG content will be deleted. If the contribution has no WYSIWYG contents, nothing is
     * done.
     * @param contribution the contribution for which the WYSIWYG contents have to be deleted.
     */
    public static void deleteAllContents(final Contribution contribution) {
        WysiwygContentRepository repository = ServiceProvider.getService(WysiwygContentRepository.class);
        repository.deleteByContribution(contribution);
    }

    /**
     * Sets a user as the current author of this content.
     * @param author the user to set.
     * @return itself.
     */
    public WysiwygContent authoredBy(final User author) {
        this.author = author;
        return this;
    }

    @Override
    public LocalizedContribution getContribution() {
        return contribution;
    }

    /**
     * The rich text of this content.
     * @return the rich text as a non null string.
     */
    @Override
    public String getData() {
        return this.text;
    }

    /**
     * Modifies the text of this content. The content is effectively modified only if the specified
     * text is different to the actual one; in such a case, the content is marked as modified and
     * is then elective for the next storage update.
     * @param richTest the new text to set. If null then an empty text is set.
     */
    public void setData(final String richTest) {
        String newText = richTest == null ? "" : richTest;
        if (!newText.contentEquals(this.text)) {
            this.text = newText;
            this.modified = true;
        }
    }

    @Override
    public boolean isEmpty() {
        return this.text.isEmpty();
    }

    /**
     * Is this content was modified since its getting.
     * @return true if this content is modified, false otherwise.
     */
    public boolean isModified() {
        return this.modified;
    }

    /**
     * Gets the user that has authored this content. If no specific user was set as author then
     * returns the user behind the current request if any.
     * @return the author of this content. He can be either the creator of this content or a modifier.
     */
    public User getAuthor() {
        return author == null ? User.getCurrentRequester() : author;
    }

    /**
     * Saves this content.
     */
    public void save() {
        WysiwygContentRepository repository = ServiceProvider.getService(WysiwygContentRepository.class);
        repository.save(this);
    }

    /**
     * Deletes this content.
     */
    public void delete() {
        WysiwygContentRepository repository = ServiceProvider.getService(WysiwygContentRepository.class);
        repository.delete(this);
    }

    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof WysiwygContent)) {
            return false;
        }

        final WysiwygContent content = (WysiwygContent) o;

        if (!contribution.getContributionId().equals(content.contribution.getContributionId())) {
            return false;
        }
        return text != null ? text.equals(content.text) : content.text == null;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(contribution.getContributionId()).append(text).toHashCode();
    }
}