]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
Support for deurning arrays in reports (#426)
authorMichael Ritter <mikejritter@users.noreply.github.com>
Wed, 16 Oct 2024 18:24:07 +0000 (13:24 -0500)
committerGitHub <noreply@github.com>
Wed, 16 Oct 2024 18:24:07 +0000 (12:24 -0600)
services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/CSpaceReportScriptlet.java
services/report/service/src/main/java/org/collectionspace/services/report/jasperreports/DeurnArray.java [new file with mode: 0644]

index 420daf730e81b3c68547593d4a4f62be94e956d4..7f8da19437110d00d9d269336b2e2cb73e8adadb 100644 (file)
@@ -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<String> deurned = new ArrayList<String>();
+               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 (file)
index 0000000..025297f
--- /dev/null
@@ -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<String> 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<String, Class<?>> map) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Object getArray(long index, int count) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Object getArray(long index, int count, Map<String, Class<?>> map) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ResultSet getResultSet() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ResultSet getResultSet(Map<String, Class<?>> map) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ResultSet getResultSet(long index, int count) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ResultSet getResultSet(long index, int count, Map<String, Class<?>> map) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void free() {
+        // no-op
+    }
+}