LastPublicationsRenderer.java

/*
 * Copyright (C) 2000 - 2026 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.kmelia.servlets.renderers;

import org.apache.ecs.wml.Img;
import org.owasp.encoder.Encode;
import org.silverpeas.components.kmelia.model.KmeliaPublication;
import org.silverpeas.core.contribution.publication.model.PublicationDetail;
import org.silverpeas.core.date.TemporalFormatter;
import org.silverpeas.core.util.URLUtil;
import org.silverpeas.core.util.WebEncodeHelper;

import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.Optional;

import static org.silverpeas.kernel.util.StringUtil.EMPTY;

/**
 * Renderer of the last publications published in a given Kmelia instance.
 *
 * @author mmoquillon
 */
public class LastPublicationsRenderer implements Renderer {

  @Override
  public void render(Writer writer, RenderingContext ctx) throws IOException {
    writer.write("<div class=\"tableBoard\" id=\"latestPublications\">");

    var kmeliaScc = ctx.getSessionController();
    var resources = ctx.getResources();
    List<KmeliaPublication> pubs = kmeliaScc.getLatestPublications();
    boolean displayLinks = URLUtil.displayUniversalLinks();
    String language = kmeliaScc.getCurrentLanguage();

    Img img = new Img(resources.getIcon("kmelia.publication"));
    writer.write("<div id=\"pubsHeader\">" + img);
    writer.write("<b>" + kmeliaScc.getString("PublicationsLast") +
        "</b></div>");

    if (!pubs.isEmpty()) {
      writer.write("<ul class=\"list-publication-home\">");
      String linkIcon = resources.getIcon("kmelia.link");
      for (KmeliaPublication kmeliaPub : pubs) {
        PublicationDetail pub = kmeliaPub.getDetail();
        String shortcut;
        if (pub.isAlias()) {
          shortcut = " (" + resources.getString("kmelia.Shortcut") + ")";
        } else {
          shortcut = "";
        }

        final String liClass = Optional.of(" class=\"new-contribution\"")
            .filter(s -> pub.isNew())
            .orElse(EMPTY);
        writer.write("<li" + liClass + ">");
        writer.write("<div class=\"publication-name line1\"><a class=\"sp-permalink\"" +
            " href=\"" + pub.getPermalink() + "\">" + Encode.forHtml(pub.getName(language)) +
            "</a>" + shortcut +
            "</div>");

        if (kmeliaScc.showUserNameInList()) {
          writer.write("<span class=\"publication-user\">");
          writer.write(ctx.getLastAuthor(kmeliaPub));
          writer.write("</span>");
        }
        writer.write("<span class=\"publication-date\">" + TemporalFormatter.toLocalizedDate(pub.getVisibility().getPeriod().getStartDate(), kmeliaScc.getZoneId(), kmeliaScc.getLanguage()) +
            "</span>");
        if (displayLinks) {
          String link = URLUtil.getSimpleURL(URLUtil.URL_PUBLI, pub.getPK().getId());
          writer.write("<a class=\"sp-permalink publication-hyperlink\" href=\"" + link +
              "\"><img src=\"" + linkIcon +
              "\"  alt=\"" +
              resources.getString("kmelia.CopyPublicationLink") + "\" title=\"" +
              resources.getString("kmelia.CopyPublicationLink") + "\" /></a>");
        }
        writer.write("<p class=\"publication-description\">" + WebEncodeHelper.convertBlanksForHtml(Encode.forHtml(pub.
            getDescription(language))));
        writer.write("</p>");
        writer.write("</li>");
      }

      writer.write("</ul>");
    }

    writer.write("</div>");
  }
}