From 212ca9c037a0add4ed9cc37998000b30de825d04 Mon Sep 17 00:00:00 2001 From: Michael Ritter Date: Wed, 16 Oct 2024 13:24:07 -0500 Subject: [PATCH] Support for deurning arrays in reports (#426) --- .../jasperreports/CSpaceReportScriptlet.java | 45 ++++++++++-- .../report/jasperreports/DeurnArray.java | 73 +++++++++++++++++++ 2 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/DeurnArray.java diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java index 420daf730..7f8da1943 100644 --- a/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java +++ b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java @@ -1,6 +1,10 @@ package org.collectionspace.services.report.jasperreports; +import java.sql.Array; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import net.sf.jasperreports.engine.JRDefaultScriptlet; @@ -75,17 +79,48 @@ public class CSpaceReportScriptlet extends JRDefaultScriptlet { continue; } - if (!field.getValueClass().equals(String.class)) { - logger.warn("{}: deurn field is not a string: {}", getReportName(), fieldName); - - continue; + if (field.getValueClass().equals(String.class)) { + deurnField(field); + } else if (field.getValueClass().equals(Array.class)) { + deurnArray(field); + } else { + logger.warn("{}: deurn field is not a string or array: {}", getReportName(), fieldName); } - deurnField(field); } } } + private void deurnArray(JRFillField field) { + Array array = (Array) field.getValue(); + List deurned = new ArrayList(); + try { + if (array == null) { + return; + } + + if (!array.getBaseTypeName().equals("varchar")) { + logger.warn("{}: array base type is not varchar: {}", getReportName(), field.getName()); + return; + } + + for (String value : (String[]) array.getArray()) { + try { + if (value != null) { + deurned.add(RefNameUtils.getDisplayName(value)); + } + } catch (IllegalArgumentException ex) { + logger.debug("{}: skipping {}", getReportName(), value); + deurned.add(value); + } + } + } catch (SQLException e) { + logger.warn("{}: array could not be read for field: {}", getReportName(), field.getName(), e); + } + + field.setValue(new DeurnArray(deurned)); + } + private void deurnField(JRFillField field) { String value = (String) field.getValue(); diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/DeurnArray.java b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/DeurnArray.java new file mode 100644 index 000000000..025297f45 --- /dev/null +++ b/services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/DeurnArray.java @@ -0,0 +1,73 @@ +package org.collectionspace.services.report.jasperreports; + +import java.sql.Array; +import java.sql.ResultSet; +import java.util.List; +import java.util.Map; + +/** + * A java.sql.Array of deurned refnames. Only supports varchar arrays. + */ +public class DeurnArray implements Array { + + private final String[] array; + + public DeurnArray(final List array) { + this.array = array.toArray(new String[0]); + } + + @Override + public String getBaseTypeName() { + return "varchar"; + } + + @Override + public int getBaseType() { + return 12; + } + + @Override + public Object getArray() { + return array; + } + + @Override + public Object getArray(Map> map) { + throw new UnsupportedOperationException(); + } + + @Override + public Object getArray(long index, int count) { + throw new UnsupportedOperationException(); + } + + @Override + public Object getArray(long index, int count, Map> map) { + throw new UnsupportedOperationException(); + } + + @Override + public ResultSet getResultSet() { + throw new UnsupportedOperationException(); + } + + @Override + public ResultSet getResultSet(Map> map) { + throw new UnsupportedOperationException(); + } + + @Override + public ResultSet getResultSet(long index, int count) { + throw new UnsupportedOperationException(); + } + + @Override + public ResultSet getResultSet(long index, int count, Map> map) { + throw new UnsupportedOperationException(); + } + + @Override + public void free() { + // no-op + } +} -- 2.47.3