From 3d8af10d170a7c1c8ed5559ccc9b067fdbf39ae0 Mon Sep 17 00:00:00 2001 From: jensp Date: Sat, 28 Sep 2019 18:10:01 +0000 Subject: [PATCH] Function for sorting AttachmentLists in Freemarker Templates git-svn-id: https://svn.libreccm.org/ccm/trunk@6223 8810af33-2d31-482b-a856-94f89814c4df --- .../FreeMarkerPresentationManager.java | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/ccm-themedirector/src/org/libreccm/theming/FreeMarkerPresentationManager.java b/ccm-themedirector/src/org/libreccm/theming/FreeMarkerPresentationManager.java index d34efd36f..c285405fb 100644 --- a/ccm-themedirector/src/org/libreccm/theming/FreeMarkerPresentationManager.java +++ b/ccm-themedirector/src/org/libreccm/theming/FreeMarkerPresentationManager.java @@ -20,11 +20,12 @@ import freemarker.cache.TemplateLoader; import freemarker.cache.WebappTemplateLoader; import freemarker.ext.dom.NodeModel; import freemarker.template.Configuration; -import freemarker.template.SimpleNumber; +import freemarker.template.SimpleScalar; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateMethodModelEx; import freemarker.template.TemplateModelException; +import freemarker.template.TemplateModelListSequence; import freemarker.template.TemplateNumberModel; import freemarker.template.TemplateScalarModel; import org.libreccm.theming.manifest.DateFormat; @@ -53,6 +54,8 @@ import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; +import java.util.Comparator; + /** * * @author Jens Pelzetter @@ -617,6 +620,7 @@ public class FreeMarkerPresentationManager implements PresentationManager { @Override public Object exec(final List list) throws TemplateModelException { + // list.get(0).get(0).get("fileOrder").getNode().getTextContent() if (list.isEmpty() || list.size() != 2) { throw new IllegalArgumentException( "SortAttachmentList requires the following parameters: " @@ -625,11 +629,67 @@ public class FreeMarkerPresentationManager implements PresentationManager { ); } + if (!(list.get(0) instanceof TemplateModelListSequence)) { + throw new IllegalArgumentException( + String.format( + "The first argument of SortAttachmentList must be a " + + "Sequence." + ) + ); + } + + if (!(list.get(1) instanceof SimpleScalar)) { + throw new IllegalArgumentException( + String.format( + "The second argument of SortAttachmentList must be a " + + "string." + ) + ); + } + + final List attachmentList + = (List) ((TemplateModelListSequence) list + .get(0)) + .getWrappedObject(); + final String sortBy = ((SimpleScalar) list.get(1)).getAsString(); + + attachmentList.sort(new AttachmentListComparator(sortBy)); return list.get(0); } } + private class AttachmentListComparator implements Comparator { + + private final String sortBy; + + public AttachmentListComparator(final String sortBy) { + this.sortBy = sortBy; + } + + @Override + public int compare( + final NodeModel attachment1, final NodeModel attachment2 + ) { + try { + final String value1 = ((NodeModel) attachment1.get(sortBy)) + .getNode().getTextContent(); + final String value2 = ((NodeModel) attachment2.get(sortBy)) + .getNode().getTextContent(); + + final int order1 = Integer.parseInt(value1); + final int order2 = Integer.parseInt(value2); + + return Integer.compare(order1, order2); + + } catch (TemplateModelException ex) { + throw new UncheckedWrapperException(ex); + } + + } + + } + private String findContentItemTemplate( final Templates templates, final String objectType,