QuestionReplyExport.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:
* "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 <https://www.gnu.org/licenses/>.
*/
package org.silverpeas.components.questionreply.control;
import org.silverpeas.components.questionreply.QuestionReplyException;
import org.silverpeas.components.questionreply.model.Question;
import org.silverpeas.components.questionreply.model.Reply;
import org.silverpeas.core.admin.user.model.SilverpeasRole;
import org.silverpeas.core.importexport.attachment.AttachmentDetail;
import org.silverpeas.core.importexport.attachment.AttachmentImportExport;
import org.silverpeas.core.util.MultiSilverpeasBundle;
import org.silverpeas.core.util.UnitUtil;
import org.silverpeas.core.util.WebEncodeHelper;
import java.io.File;
import java.text.ParseException;
import java.util.Collection;
import java.util.Iterator;
/**
* @author ehugonnet
*/
public class QuestionReplyExport {
private File file;
private MultiSilverpeasBundle resource;
public QuestionReplyExport(MultiSilverpeasBundle resource, File file) {
this.file = file;
this.resource = resource;
}
public void exportQuestion(Question question, StringBuilder sb,
QuestionReplySessionController scc) throws QuestionReplyException, ParseException {
String questionId = question.getPK().getId();
String qId = "q" + questionId;
sb.append(
"<table class=\"question\" width=\"98%\" align=\"center\" border=\"0\" cellpadding=\"0\" " +
"cellspacing=\"0\">\n");
sb.append("<tr>\n");
sb.append("<td>\n");
sb.append("<table width=\"100%\" cellpadding=\"0\" cellspacing=\"2\">\n");
sb.append("<tr>\n");
sb.append("<td></td>\n");
sb.append("<td class=\"titreQuestionReponse\" width=\"100%\">\n");
sb.append("<div id=").append(qId).append(" class=\"question\">");
sb.append(WebEncodeHelper.javaStringToHtmlParagraphe(question.getTitle()));
sb.append("</div>\n");
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("<tr>\n");
sb.append("<td colspan=\"2\">\n");
sb.append("<span class=\"txtBaseline\">");
sb.append(question.readCreatorName()).append(" - ")
.append(resource.getOutputDate(question.getCreationDate()));
sb.append("</span>\n");
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("</table>\n");
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("</table>\n");
// affichage des réponses
String aId = "a" + questionId;
Collection<Reply> replies = question.readReplies();
Iterator<Reply> itR = replies.iterator();
boolean existe = false;
if (itR.hasNext()) {
existe = true;
}
existe = true;
if (existe) {
sb.append("<table width=\"98%\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">\n");
sb.append("<tr>\n");
sb.append("<td class=\"answers\">\n");
sb.append("<div id=").append(aId).append(" class=\"answer\">\n");
// contenu de la question
sb.append("<table>\n");
sb.append("<tr>\n");
sb.append("<td>");
sb.append(WebEncodeHelper.javaStringToHtmlParagraphe(question.getContent()));
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("</table>\n");
}
while (itR.hasNext()) {
Reply reply = itR.next();
if (isReplyVisible(question, reply, scc)) {
reply.getPK().setComponentName(question.getInstanceId());
exportReply(scc, reply, sb);
}
}
if (existe) {
sb.append("<br>\n");
sb.append("</div>\n");
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("</table>\n");
}
}
protected void exportReply(final QuestionReplySessionController qRSC, Reply reply,
StringBuilder sb) throws QuestionReplyException, ParseException {
sb.append("<br>\n");
sb.append("<center>\n");
sb.append(
"<table class=\"tableBoard\" width=\"98%\" border=\"0\" cellpadding=\"5\" " +
"cellspacing=\"0\">\n");
sb.append("<tr>\n");
sb.append("<td nowrap=\"nowrap\">\n");
sb.append("<table width=\"100%\" cellpadding=\"0\" cellspacing=\"2\">\n");
sb.append("<tr>\n");
sb.append("<td class=\"titreQuestionReponse\" width=\"100%\">\n");
sb.append(" <span class=\"titreQuestionReponse\">")
.append(WebEncodeHelper.javaStringToHtmlParagraphe(reply.getTitle())).append("</span>\n");
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("</table>\n");
sb.append("<br>\n");
sb.append("<table>\n");
sb.append("<tr>\n");
sb.append("<td width=\"90%\">");
sb.append(reply.readCurrentWysiwygContent());
sb.append("</td>\n");
// récupération des fichiers joints : copie de ces fichiers dans le dossier "files"
AttachmentImportExport attachmentIE = new AttachmentImportExport(qRSC.getUserDetail());
Collection<AttachmentDetail> attachments = null;
try {
String filePath = file.getParentFile().getPath() + File.separator + "files";
String relativeFilePath = file.getParentFile().getPath();
attachments = attachmentIE.getAttachments(reply.getPK().toResourceReference(), filePath,
relativeFilePath, null);
} catch (Exception ex) {
// En cas d"objet non trouvé: pas d'exception gérée par le système
throw new QuestionReplyException(ex);
}
if (attachments != null && !attachments.isEmpty()) {
// les fichiers joints : création du lien dans la page
sb.append("<td valign=\"top\" align=\"left\">\n");
sb.append("<a name=\"attachments\"></a>\n");
sb.append("<td valign=\"top\" align=\"left\">\n");
sb.append("<center>\n");
sb.append(
"<table class=\"tableBoard\" width=\"98%\" border=\"0\" cellpadding=\"5\" " +
"cellspacing=\"0\">\n");
sb.append("<tr>\n");
sb.append("<td nowrap=\"nowrap\">\n");
sb.append("<table width=\"150\">\n");
// pour chaque fichier
for (AttachmentDetail attachment : attachments) {
exportAttachment(attachment, sb);
}
sb.append("</table>\n");
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("</table>\n");
sb.append("</center>\n");
sb.append("</td>\n");
}
sb.append("</tr>\n");
sb.append("</table>\n");
sb.append("<br>\n");
sb.append("<span class=\"txtBaseline\">");
sb.append(resource.getString("questionReply.replyOf")).append(" ")
.append(reply.readCreatorName());
sb.append(" - ").append(resource.getOutputDate(reply.getCreationDateAsString()));
sb.append("</span>\n");
sb.append("</td>\n");
sb.append("</tr>\n");
sb.append("</table>\n");
sb.append("</center>\n");
}
protected void exportAttachment(AttachmentDetail attachment, StringBuilder sb) {
// attachment
sb.append("<tr>\n");
sb.append("<td align=\"center\"></td>\n");
sb.append("</tr>\n");
sb.append("<tr>\n");
sb.append("<td valign=\"top\">\n");
sb.append("<nobr>\n");
sb.append("<a href=\"files/");
sb.append(attachment.getLogicalName());
sb.append("\" target=\"_blank\">");
sb.append(attachment.getLogicalName());
sb.append("</a>\n");
sb.append("</nobr>\n");
sb.append("<br>\n");
sb.append(UnitUtil.formatMemSize(attachment.getSize()));
sb.append("</td>\n");
sb.append("</tr>\n");
}
public boolean isReplyVisible(Question question, Reply reply,
QuestionReplySessionController scc) {
return isReplyVisible(question, reply, scc.getUserRole(), scc.getUserId());
}
public static boolean isReplyVisible(Question question, Reply reply, SilverpeasRole role,
String userId) {
boolean isPrivate = reply.getPublicReply() == 0;
boolean isPublisherQuestion = true;
if (SilverpeasRole.PUBLISHER == role && isPrivate) {
isPublisherQuestion = question.getCreatorId().equals(userId);
}
return !(isPrivate && SilverpeasRole.USER == role || !isPublisherQuestion);
}
}