InfoLetter.java
/*
* Copyright (C) 2000 - 2024 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:
* "https://www.silverpeas.org/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 <https://www.gnu.org/licenses/>.
*/
package org.silverpeas.components.infoletter.model;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.silverpeas.core.WAPrimaryKey;
import org.silverpeas.core.admin.user.model.User;
import org.silverpeas.core.contribution.content.ddwe.model.DragAndDropWebEditorStore;
import org.silverpeas.core.contribution.content.renderer.ContributionContentRenderer;
import org.silverpeas.core.contribution.content.wysiwyg.service.WysiwygController;
import org.silverpeas.core.contribution.model.ContributionContent;
import org.silverpeas.core.contribution.model.ContributionIdentifier;
import org.silverpeas.core.contribution.model.WysiwygContent;
import org.silverpeas.core.ddwe.DragAndDropEditorContent;
import org.silverpeas.core.i18n.I18NHelper;
import org.silverpeas.core.io.file.SilverpeasFile;
import org.silverpeas.core.persistence.jdbc.bean.SilverpeasBean;
import org.silverpeas.kernel.annotation.NonNull;
import org.silverpeas.kernel.util.StringUtil;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import static java.util.Optional.ofNullable;
import static org.silverpeas.core.i18n.I18NHelper.DEFAULT_LANGUAGE;
import static org.silverpeas.kernel.util.StringUtil.isNotDefined;
@SuppressWarnings("deprecation")
public class InfoLetter extends SilverpeasBean implements Comparable<InfoLetter> {
private static final long serialVersionUID = -4798869204934629386L;
public static final String TYPE = "Lettre";
public static final String TEMPLATE_ID = "template";
/** InfoLetter instance identifier */
private String instanceId;
/** InfoLetter name */
private String name;
/** Info Letter description */
private String description;
/** InfoLetter frequency */
private String periode;
private WysiwygContent templateContent;
/**
* Default constructor
*/
public InfoLetter() {
super();
instanceId = "";
name = "";
description = "";
periode = "";
}
/**
* @param pk the info letter identifier
* @param name the name
* @param instanceId the component instance identifier
* @param description the description
* @param periode the frequency
*/
public InfoLetter(WAPrimaryKey pk, String instanceId, String name, String description,
String periode) {
super();
setPK(pk);
this.instanceId = instanceId;
this.name = name;
this.description = description;
this.periode = periode;
}
// Assesseurs
public String getInstanceId() {
return instanceId;
}
public void setInstanceId(String instanceId) {
this.instanceId = instanceId;
}
public String getName() {
return name;
}
public void setName(String n) {
name = n;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPeriode() {
return periode;
}
public void setPeriode(String periode) {
this.periode = periode;
}
// Methodes
@Override
public int compareTo(@NonNull InfoLetter obj) {
Objects.requireNonNull(obj);
return (String.valueOf(getPK().getId())).compareTo(String.valueOf(obj.getPK().getId()));
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof InfoLetter)) {
return false;
}
final InfoLetter that = (InfoLetter) o;
return compareTo(that) == 0;
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(getPK().getId())
.append(getPK().getInstanceId())
.toHashCode();
}
@Override
@NonNull
protected String getTableName() {
return "SC_IL_Letter";
}
public boolean existsTemplateContent() {
return Optional.of(new DragAndDropWebEditorStore(getTemplateIdentifier()))
.map(DragAndDropWebEditorStore::getFile)
.map(SilverpeasFile::exists)
.filter(Boolean.TRUE::equals)
.orElseGet(() -> getTemplateWysiwygContent()
.map(ContributionContent::getRenderer)
.map(ContributionContentRenderer::renderEdition)
.filter(StringUtil::isDefined)
.filter(Predicate.not("<body></body>"::equalsIgnoreCase))
.isPresent());
}
public Optional<WysiwygContent> getTemplateWysiwygContent() {
if (this.templateContent == null) {
final ContributionIdentifier templateId = getTemplateIdentifier();
this.templateContent = WysiwygController.get(templateId.getComponentInstanceId(),
templateId.getLocalId(), DEFAULT_LANGUAGE);
}
return ofNullable(this.templateContent);
}
/**
* Saves given content.
* <p>
* The given content MAY be directly a WYSIWYG content, in a such case the content has been
* edited by a WYSIWYG editor.
* </p>
* <p>
* The given content is not defined, in a such case the content has been MAYBE edited by a
* Drag And Drop Web Editor. Then the temporary content is saved into final one and the
* Inlined HTML is saved into WYSIWYG repository.
* </p>
* @param manualContent a manual content. The content is specified when it comes directly from
* a WYSIWYG editing.
*/
public void saveTemplateContent(final String manualContent) {
this.templateContent = null;
final ContributionIdentifier templateId = getTemplateIdentifier();
String wysiwygContent = manualContent;
if (isNotDefined(manualContent)) {
// For now looking into Drag & Drop Edition Content
final DragAndDropWebEditorStore store = new DragAndDropWebEditorStore(templateId);
wysiwygContent = store.getFile()
.getContainer()
.getTmpContent()
.map(DragAndDropWebEditorStore.Content::getValue)
.map(c -> {
store.getFile().getContainer().getOrCreateContent().setValue(c);
store.save();
return new DragAndDropEditorContent(c).getInlinedHtml();
})
.orElse(manualContent);
}
// Update the Wysiwyg if exists, create one otherwise
WysiwygController.updateFileAndAttachment(wysiwygContent, templateId.getComponentInstanceId(),
templateId.getLocalId(), User.getCurrentUser().getId(), I18NHelper.DEFAULT_LANGUAGE);
}
public ContributionIdentifier getTemplateIdentifier() {
return ContributionIdentifier.from(getInstanceId(), TEMPLATE_ID + getPK().getId(), TYPE);
}
}