You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2021/03/18 09:51:57 UTC

[camel-quarkus] branch master updated: Register classes with Solr Field annotations for reflection

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

jamesnetherton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/master by this push:
     new da8bcc7  Register classes with Solr Field annotations for reflection
da8bcc7 is described below

commit da8bcc7aa2bde499b3483b8e61f326f68b331d83
Author: James Netherton <ja...@gmail.com>
AuthorDate: Wed Mar 17 14:51:06 2021 +0000

    Register classes with Solr Field annotations for reflection
    
    Fixes #2341
---
 .../component/solr/deployment/SolrProcessor.java   | 32 ++++++++++++++-
 .../component/solr/it/SolrCommonResource.java      | 18 +++++++--
 .../camel/quarkus/component/solr/it/bean/Item.java |  2 +-
 .../camel/quarkus/component/solr/it/SolrTest.java  | 47 +++++++++-------------
 4 files changed, 64 insertions(+), 35 deletions(-)

diff --git a/extensions/solr/deployment/src/main/java/org/apache/camel/quarkus/component/solr/deployment/SolrProcessor.java b/extensions/solr/deployment/src/main/java/org/apache/camel/quarkus/component/solr/deployment/SolrProcessor.java
index 403ee2e..1f9734f 100644
--- a/extensions/solr/deployment/src/main/java/org/apache/camel/quarkus/component/solr/deployment/SolrProcessor.java
+++ b/extensions/solr/deployment/src/main/java/org/apache/camel/quarkus/component/solr/deployment/SolrProcessor.java
@@ -16,15 +16,20 @@
  */
 package org.apache.camel.quarkus.component.solr.deployment;
 
+import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
 import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import org.jboss.logging.Logger;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.jboss.jandex.AnnotationTarget;
+import org.jboss.jandex.ClassInfo;
+import org.jboss.jandex.DotName;
 
 class SolrProcessor {
 
-    private static final Logger LOG = Logger.getLogger(SolrProcessor.class);
     private static final String FEATURE = "camel-solr";
+    private static final DotName FIELD_DOT_NAME = DotName.createSimple("org.apache.solr.client.solrj.beans.Field");
 
     @BuildStep
     FeatureBuildItem feature() {
@@ -35,4 +40,27 @@ class SolrProcessor {
     ExtensionSslNativeSupportBuildItem activateSslNativeSupport() {
         return new ExtensionSslNativeSupportBuildItem(FEATURE);
     }
+
+    @BuildStep
+    void registerForReflection(BuildProducer<ReflectiveClassBuildItem> reflectiveClass, CombinedIndexBuildItem combinedIndex) {
+        // Register any classes within the application archive that contain the Solr Field annotation
+        combinedIndex.getIndex()
+                .getAnnotations(FIELD_DOT_NAME)
+                .stream()
+                .map(annotationInstance -> {
+                    AnnotationTarget target = annotationInstance.target();
+                    AnnotationTarget.Kind kind = target.kind();
+                    if (kind.equals(AnnotationTarget.Kind.FIELD)) {
+                        ClassInfo classInfo = target.asField().declaringClass();
+                        return new ReflectiveClassBuildItem(false, true, classInfo.name().toString());
+                    } else if (kind.equals(AnnotationTarget.Kind.METHOD)) {
+                        ClassInfo classInfo = target.asMethod().declaringClass();
+                        return new ReflectiveClassBuildItem(true, false, classInfo.name().toString());
+                    } else {
+                        throw new RuntimeException(
+                                FIELD_DOT_NAME.toString() + " cannot be applied to " + target.kind().toString());
+                    }
+                })
+                .forEach(reflectiveClass::produce);
+    }
 }
diff --git a/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/SolrCommonResource.java b/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/SolrCommonResource.java
index ef4a1b0..16a1446 100644
--- a/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/SolrCommonResource.java
+++ b/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/SolrCommonResource.java
@@ -19,6 +19,7 @@ package org.apache.camel.quarkus.component.solr.it;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.ws.rs.DELETE;
@@ -64,7 +65,8 @@ public abstract class SolrCommonResource {
 
     @PUT
     @Path("bean")
-    public Response addBean(Item bean) {
+    public Response addBean(String name) {
+        Item bean = createItem(name);
         producerTemplate.sendBodyAndHeader(solrComponentURI, bean, SolrConstants.OPERATION, SolrConstants.OPERATION_ADD_BEAN);
         solrCommit();
         return Response.accepted().build();
@@ -72,7 +74,8 @@ public abstract class SolrCommonResource {
 
     @PUT
     @Path("beans")
-    public Response addBeans(List<Item> beans) {
+    public Response addBeans(List<String> names) {
+        List<Item> beans = names.stream().map(this::createItem).collect(Collectors.toList());
         producerTemplate.sendBodyAndHeader(solrComponentURI, beans, SolrConstants.OPERATION, SolrConstants.OPERATION_ADD_BEANS);
         solrCommit();
         return Response.accepted().build();
@@ -165,12 +168,19 @@ public abstract class SolrCommonResource {
 
     @GET
     @Path("bean/{id}")
-    public Item getBeanById(@PathParam("id") String id) throws IOException, SolrServerException {
+    public String getBeanById(@PathParam("id") String id) throws IOException, SolrServerException {
         SolrQuery solrQuery = new SolrQuery();
         solrQuery.set("q", "id:" + id);
         QueryRequest queryRequest = new QueryRequest(solrQuery);
         QueryResponse response = queryRequest.process(solrClient);
         List<Item> responses = response.getBeans(Item.class);
-        return responses.size() != 0 ? responses.get(0) : new Item();
+        return responses.size() != 0 ? responses.get(0).getId() : "";
+    }
+
+    private Item createItem(String id) {
+        Item item = new Item();
+        item.setId(id);
+        item.setCategories(new String[] { "aaa", "bbb", "ccc" });
+        return item;
     }
 }
diff --git a/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/bean/Item.java b/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/bean/Item.java
index 80103cb..114b96b 100644
--- a/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/bean/Item.java
+++ b/integration-tests/solr/src/main/java/org/apache/camel/quarkus/component/solr/it/bean/Item.java
@@ -20,7 +20,6 @@ import org.apache.solr.client.solrj.beans.Field;
 
 public class Item {
 
-    @Field
     String id;
 
     @Field("cat")
@@ -33,6 +32,7 @@ public class Item {
         return id;
     }
 
+    @Field
     public void setId(String id) {
         this.id = id;
     }
diff --git a/integration-tests/solr/src/test/java/org/apache/camel/quarkus/component/solr/it/SolrTest.java b/integration-tests/solr/src/test/java/org/apache/camel/quarkus/component/solr/it/SolrTest.java
index 5e29775..e317ac1 100644
--- a/integration-tests/solr/src/test/java/org/apache/camel/quarkus/component/solr/it/SolrTest.java
+++ b/integration-tests/solr/src/test/java/org/apache/camel/quarkus/component/solr/it/SolrTest.java
@@ -25,7 +25,6 @@ import java.util.stream.Stream;
 import io.quarkus.test.common.QuarkusTestResource;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.http.ContentType;
-import org.apache.camel.quarkus.component.solr.it.bean.Item;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.jupiter.params.provider.ValueSource;
@@ -50,10 +49,9 @@ public class SolrTest {
     @MethodSource("resources")
     public void testSingleBean(String resource) {
         // create a bean item
-        Item item = createItem("test1");
         given()
                 .contentType(ContentType.JSON)
-                .body(item)
+                .body("test1")
                 .put(resource + "/bean")
                 .then()
                 .statusCode(202);
@@ -61,7 +59,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/test1")
                 .then()
-                .body("id", equalTo("test1"));
+                .body(equalTo("test1"));
 
         // delete bean by id
         given()
@@ -74,21 +72,21 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/test1")
                 .then()
-                .body("id", emptyOrNullString());
+                .body(emptyOrNullString());
     }
 
     @ParameterizedTest
     @MethodSource("resources")
     public void testMultipleBeans(String resource) {
         // create list of beans
-        List<Item> beans = new ArrayList<>();
-        beans.add(createItem("bean1"));
-        beans.add(createItem("bean2"));
+        List<String> beanNames = new ArrayList<>();
+        beanNames.add("bean1");
+        beanNames.add("bean2");
 
         // add beans with camel
         given()
                 .contentType(ContentType.JSON)
-                .body(beans)
+                .body(beanNames)
                 .put(resource + "/beans")
                 .then()
                 .statusCode(202);
@@ -97,11 +95,11 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/bean1")
                 .then()
-                .body("id", equalTo("bean1"));
+                .body(equalTo("bean1"));
         given()
                 .get(resource + "/bean/bean2")
                 .then()
-                .body("id", equalTo("bean2"));
+                .body(equalTo("bean2"));
 
         // delete all beans that has id begins with bean
         given()
@@ -115,11 +113,11 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/bean1")
                 .then()
-                .body("id", emptyOrNullString());
+                .body(emptyOrNullString());
         given()
                 .get(resource + "/bean/bean2")
                 .then()
-                .body("id", emptyOrNullString());
+                .body(emptyOrNullString());
     }
 
     @ParameterizedTest
@@ -140,7 +138,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/id1")
                 .then()
-                .body("id", equalTo("id1"));
+                .body(equalTo("id1"));
 
     }
 
@@ -160,7 +158,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/opt1")
                 .then()
-                .body("id", emptyOrNullString());
+                .body(emptyOrNullString());
         // optimize
         given()
                 .get(resource + "/optimize")
@@ -170,7 +168,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/opt1")
                 .then()
-                .body("id", equalTo("opt1"));
+                .body(equalTo("opt1"));
 
     }
 
@@ -191,7 +189,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/roll1")
                 .then()
-                .body("id", emptyOrNullString());
+                .body(emptyOrNullString());
         // rollback
         given()
                 .get(resource + "/rollback")
@@ -206,7 +204,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/roll1")
                 .then()
-                .body("id", emptyOrNullString());
+                .body(emptyOrNullString());
     }
 
     @ParameterizedTest
@@ -225,7 +223,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/com1")
                 .then()
-                .body("id", emptyOrNullString());
+                .body(emptyOrNullString());
         // soft commit
         given()
                 .get(resource + "/softcommit")
@@ -235,7 +233,7 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/com1")
                 .then()
-                .body("id", equalTo("com1"));
+                .body(equalTo("com1"));
     }
 
     @ParameterizedTest
@@ -260,13 +258,6 @@ public class SolrTest {
         given()
                 .get(resource + "/bean/stream1")
                 .then()
-                .body("id", equalTo("stream1"));
-    }
-
-    private Item createItem(String id) {
-        Item item = new Item();
-        item.setId(id);
-        item.setCategories(new String[] { "aaa", "bbb", "ccc" });
-        return item;
+                .body(equalTo("stream1"));
     }
 }