This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new a165c8937 TIKA-3945 -- improve serialization of CompositePipesReporter 
(#852)
a165c8937 is described below

commit a165c89373da954b42640ec06e7d24182361cc57
Author: Tim Allison <[email protected]>
AuthorDate: Tue Dec 13 14:23:09 2022 -0500

    TIKA-3945 -- improve serialization of CompositePipesReporter (#852)
---
 .../java/org/apache/tika/config/ConfigBase.java    | 70 +++++++++++++++-------
 .../apache/tika/pipes/CompositePipesReporter.java  | 14 ++++-
 .../apache/tika/pipes/async/MockReporterTest.java  | 11 ++++
 .../{TIKA-3865.xml => TIKA-3865-deprecated.xml}    |  0
 .../org/apache/tika/pipes/async/TIKA-3865.xml      | 24 ++++----
 5 files changed, 81 insertions(+), 38 deletions(-)

diff --git a/tika-core/src/main/java/org/apache/tika/config/ConfigBase.java 
b/tika-core/src/main/java/org/apache/tika/config/ConfigBase.java
index 6af662dfc..734bc442c 100644
--- a/tika-core/src/main/java/org/apache/tika/config/ConfigBase.java
+++ b/tika-core/src/main/java/org/apache/tika/config/ConfigBase.java
@@ -219,28 +219,11 @@ public abstract class ConfigBase {
                 params = child.getChildNodes();
             } else if (child.getNodeType() == 1 && ! 
child.getLocalName().equals(exceptNodeName)) {
                 String itemName = child.getLocalName();
-                String setter = "set" + itemName.substring(0, 
1).toUpperCase(Locale.US) +
-                        itemName.substring(1);
-                Class itemClass = null;
-                Method setterMethod = null;
-                for (Method method : object.getClass().getMethods()) {
-                    if (setter.equals(method.getName())) {
-                        Class<?>[] classes = method.getParameterTypes();
-                        if (classes.length == 1) {
-                            itemClass = classes[0];
-                            setterMethod = method;
-                            break;
-                        }
-                    }
-                }
-                if (itemClass == null) {
-                    throw new TikaConfigException("Couldn't find setter '" +
-                            setter + "' for " + itemName);
-                }
-                Object item = buildClass(child, itemName, itemClass);
-                setParams(itemClass.cast(item), child, new HashSet<>());
+                SetterClassPair setterClassPair = findSetterClassPair(object, 
itemName);
+                Object item = buildClass(child, itemName, 
setterClassPair.itemClass);
+                setParams(setterClassPair.itemClass.cast(item), child, new 
HashSet<>());
                 try {
-                    setterMethod.invoke(object, item);
+                    setterClassPair.setterMethod.invoke(object, item);
                 } catch (IllegalAccessException | InvocationTargetException e) 
{
                     throw new TikaConfigException("problem creating " + 
itemName, e);
                 }
@@ -278,6 +261,40 @@ public abstract class ConfigBase {
         }
     }
 
+    private static SetterClassPair findSetterClassPair(Object object, String 
itemName)
+            throws TikaConfigException {
+        String setter = "set" + itemName.substring(0, 
1).toUpperCase(Locale.US) +
+                itemName.substring(1);
+        Class itemClass = null;
+        Method setterMethod = null;
+        for (Method method : object.getClass().getMethods()) {
+            if (setter.equals(method.getName())) {
+                Class<?>[] classes = method.getParameterTypes();
+                if (classes.length == 1) {
+                    itemClass = classes[0];
+                    setterMethod = method;
+                    return new SetterClassPair(setterMethod, itemClass);
+                }
+            }
+        }
+
+        String adder = "add" + itemName.substring(0, 1).toUpperCase(Locale.US) 
+
+                itemName.substring(1);
+        for (Method method : object.getClass().getMethods()) {
+            if (adder.equals(method.getName())) {
+                Class<?>[] classes = method.getParameterTypes();
+                if (classes.length == 1) {
+                    itemClass = classes[0];
+                    setterMethod = method;
+                    return new SetterClassPair(setterMethod, itemClass);
+                }
+            }
+        }
+        throw new TikaConfigException("Couldn't find setter '" +
+                setter + "' or adder '" + adder + "' for " + itemName +
+                " of class: " + object.getClass());
+    }
+
     private static boolean hasChildNodes(Node param) {
         if (!param.hasChildNodes()) {
             return false;
@@ -323,7 +340,7 @@ public abstract class ConfigBase {
 
         } catch (ClassNotFoundException | InvocationTargetException | 
NoSuchMethodException |
                  IllegalAccessException e) {
-            throw new TikaConfigException("couldn't find class", e);
+            throw new TikaConfigException("couldn't build class for " + name, 
e);
         }
     }
 
@@ -523,4 +540,13 @@ public abstract class ConfigBase {
 
         return settings;
     }
+
+    private static class SetterClassPair {
+        private final Method setterMethod;
+        private final Class itemClass;
+        public SetterClassPair(Method setterMethod, Class itemClass) {
+            this.setterMethod = setterMethod;
+            this.itemClass = itemClass;
+        }
+    }
 }
diff --git 
a/tika-core/src/main/java/org/apache/tika/pipes/CompositePipesReporter.java 
b/tika-core/src/main/java/org/apache/tika/pipes/CompositePipesReporter.java
index 997e7ca18..6532e2c3c 100644
--- a/tika-core/src/main/java/org/apache/tika/pipes/CompositePipesReporter.java
+++ b/tika-core/src/main/java/org/apache/tika/pipes/CompositePipesReporter.java
@@ -17,6 +17,7 @@
 package org.apache.tika.pipes;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -29,7 +30,7 @@ import org.apache.tika.pipes.pipesiterator.TotalCountResult;
 
 public class CompositePipesReporter extends PipesReporter implements 
Initializable {
 
-    private List<PipesReporter> pipesReporters;
+    private List<PipesReporter> pipesReporters = new ArrayList<>();
 
     @Override
     public void report(FetchEmitTuple t, PipesResult result, long elapsed) {
@@ -70,12 +71,21 @@ public class CompositePipesReporter extends PipesReporter 
implements Initializab
         }
     }
 
+    /**
+     * 
+     * @param pipesReporters
+     * @deprecated use {@link 
CompositePipesReporter#addPipesReporter(PipesReporter)}
+     */
     @Field
+    @Deprecated
     public void setPipesReporters(List<PipesReporter> pipesReporters) {
         this.pipesReporters = pipesReporters;
     }
 
-
+    @Field
+    public void addPipesReporter(PipesReporter pipesReporter) {
+        this.pipesReporters.add(pipesReporter);
+    }
     public List<PipesReporter> getPipesReporters() {
         return pipesReporters;
     }
diff --git 
a/tika-core/src/test/java/org/apache/tika/pipes/async/MockReporterTest.java 
b/tika-core/src/test/java/org/apache/tika/pipes/async/MockReporterTest.java
index 9bfcd5591..a9bae3397 100644
--- a/tika-core/src/test/java/org/apache/tika/pipes/async/MockReporterTest.java
+++ b/tika-core/src/test/java/org/apache/tika/pipes/async/MockReporterTest.java
@@ -39,6 +39,17 @@ public class MockReporterTest {
         assertEquals("somethingOrOther", 
((MockReporter)reporter).getEndpoint());
     }
 
+    @Test
+    public void testOlderCompositePipesReporter() throws Exception {
+        Path configPath = 
Paths.get(this.getClass().getResource("TIKA-3865-deprecated.xml").toURI());
+        AsyncConfig asyncConfig = AsyncConfig.load(configPath);
+        PipesReporter reporter = asyncConfig.getPipesReporter();
+        assertTrue(reporter instanceof CompositePipesReporter);
+        List<PipesReporter> reporters = 
((CompositePipesReporter)reporter).getPipesReporters();
+        assertEquals("somethingOrOther1", 
((MockReporter)reporters.get(0)).getEndpoint());
+        assertEquals("somethingOrOther2", 
((MockReporter)reporters.get(1)).getEndpoint());
+    }
+
     @Test
     public void testCompositePipesReporter() throws Exception {
         Path configPath = 
Paths.get(this.getClass().getResource("TIKA-3865.xml").toURI());
diff --git 
a/tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865.xml 
b/tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865-deprecated.xml
similarity index 100%
copy from tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865.xml
copy to 
tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865-deprecated.xml
diff --git 
a/tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865.xml 
b/tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865.xml
index 04f7dfa6f..44733a495 100644
--- a/tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865.xml
+++ b/tika-core/src/test/resources/org/apache/tika/pipes/async/TIKA-3865.xml
@@ -26,20 +26,16 @@
       <numEmitters>1</numEmitters>
     </params>
     <pipesReporter class="org.apache.tika.pipes.CompositePipesReporter">
-      <params>
-        <pipesReporters class="org.apache.tika.pipes.PipesReporter">
-          <pipesReporter class="org.apache.tika.pipes.async.MockReporter">
-            <params>
-              <endpoint>somethingOrOther1</endpoint>
-            </params>
-          </pipesReporter>
-          <pipesReporter class="org.apache.tika.pipes.async.MockReporter">
-            <params>
-              <endpoint>somethingOrOther2</endpoint>
-            </params>
-          </pipesReporter>
-        </pipesReporters>
-      </params>
+      <pipesReporter class="org.apache.tika.pipes.async.MockReporter">
+        <params>
+          <endpoint>somethingOrOther1</endpoint>
+        </params>
+      </pipesReporter>
+      <pipesReporter class="org.apache.tika.pipes.async.MockReporter">
+        <params>
+          <endpoint>somethingOrOther2</endpoint>
+        </params>
+      </pipesReporter>
     </pipesReporter>
   </async>
 </properties>
\ No newline at end of file

Reply via email to