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

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


The following commit(s) were added to refs/heads/master by this push:
     new b513fd3  CAMEL-12556: camel-servicenow: add metadata option to list 
available import set
b513fd3 is described below

commit b513fd3901ecd8b1c10226eb5fff8adf9496e4fb
Author: lburgazzoli <lburgazz...@gmail.com>
AuthorDate: Thu Jun 7 11:43:01 2018 +0200

    CAMEL-12556: camel-servicenow: add metadata option to list available import 
set
---
 .../component/extension/MetaDataExtension.java     |   1 +
 .../servicenow/ServiceNowMetaDataExtension.java    | 111 +++++++++++++++++----
 .../ServiceNowMetaDataExtensionTest.java           |  21 +++-
 3 files changed, 112 insertions(+), 21 deletions(-)

diff --git 
a/camel-core/src/main/java/org/apache/camel/component/extension/MetaDataExtension.java
 
b/camel-core/src/main/java/org/apache/camel/component/extension/MetaDataExtension.java
index 01eb680..74c582b 100644
--- 
a/camel-core/src/main/java/org/apache/camel/component/extension/MetaDataExtension.java
+++ 
b/camel-core/src/main/java/org/apache/camel/component/extension/MetaDataExtension.java
@@ -33,6 +33,7 @@ public interface MetaDataExtension extends ComponentExtension 
{
         // Common meta-data attributes
         String CONTENT_TYPE = Exchange.CONTENT_TYPE;
         String JAVA_TYPE = "Java-Type";
+        String CONTEXT = "Meta-Context";
 
         /**
          * Returns an attribute associated with this meta data by name.
diff --git 
a/components/camel-servicenow/camel-servicenow-component/src/main/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtension.java
 
b/components/camel-servicenow/camel-servicenow-component/src/main/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtension.java
index 9b40df4..50ef892 100644
--- 
a/components/camel-servicenow/camel-servicenow-component/src/main/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtension.java
+++ 
b/components/camel-servicenow/camel-servicenow-component/src/main/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtension.java
@@ -64,20 +64,28 @@ final class ServiceNowMetaDataExtension extends 
AbstractMetaDataExtension {
 
     @Override
     public Optional<MetaDataExtension.MetaData> meta(Map<String, Object> 
parameters) {
-        try {
+        final String objectType = (String)parameters.get("objectType");
+
+        if (ObjectHelper.equalIgnoreCase(objectType, 
ServiceNowConstants.RESOURCE_TABLE)) {
             final MetaContext context = new MetaContext(parameters);
 
-            if (!ObjectHelper.equalIgnoreCase(context.getObjectType(), 
"table")) {
-                throw new UnsupportedOperationException("Unsupported object 
type <" + context.getObjectType() + ">");
-            }
+            // validate meta parameters
+            ObjectHelper.notNull(context.getObjectType(), "objectType");
+            ObjectHelper.notNull(context.getObjectName(), "objectName");
 
             return tableMeta(context);
+        }
 
-        } catch (UnsupportedOperationException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+        if (ObjectHelper.equalIgnoreCase(objectType, 
ServiceNowConstants.RESOURCE_IMPORT)) {
+            final MetaContext context = new MetaContext(parameters);
+
+            // validate mate parameters
+            ObjectHelper.notNull(context.getObjectType(), "objectType");
+
+            return importSetMeta(context);
         }
+
+        throw new UnsupportedOperationException("Unsupported object type <" + 
objectType + ">");
     }
 
     private Optional<MetaDataExtension.MetaData> tableMeta(MetaContext 
context) {
@@ -86,10 +94,6 @@ final class ServiceNowMetaDataExtension extends 
AbstractMetaDataExtension {
             final ObjectNode root = 
context.getConfiguration().getOrCreateMapper().createObjectNode();
             final String baseUrn = 
(String)context.getParameters().getOrDefault("baseUrn", 
"org:apache:camel:component:servicenow");
 
-            if (names.isEmpty()) {
-                return Optional.empty();
-            }
-
             // Schema
             root.put("$schema", "http://json-schema.org/schema#";);
             root.put("id", String.format("urn:jsonschema:%s:%s)", baseUrn, 
context.getObjectName()));
@@ -117,6 +121,7 @@ final class ServiceNowMetaDataExtension extends 
AbstractMetaDataExtension {
                 MetaDataBuilder.on(getCamelContext())
                     .withAttribute(MetaData.CONTENT_TYPE, 
"application/schema+json")
                     .withAttribute(MetaData.JAVA_TYPE, JsonNode.class)
+                    .withAttribute(MetaData.CONTEXT, 
ServiceNowConstants.RESOURCE_TABLE)
                     .withAttribute("date.format", dateFormat)
                     .withAttribute("time.format", timeFormat)
                     .withAttribute("date-time.format", dateFormat + " " + 
timeFormat)
@@ -128,6 +133,67 @@ final class ServiceNowMetaDataExtension extends 
AbstractMetaDataExtension {
         }
     }
 
+    private Optional<MetaDataExtension.MetaData> importSetMeta(MetaContext 
context) {
+        try {
+            Optional<JsonNode> response = context.getClient().reset()
+                .types(MediaType.APPLICATION_JSON_TYPE)
+                .path("now")
+                .path(context.getConfiguration().getApiVersion())
+                .path("table")
+                .path("sys_db_object")
+                .query("sysparm_exclude_reference_link", "true")
+                .query("sysparm_fields", "name%2Csys_id")
+                .query("sysparm_query", "name=sys_import_set_row")
+                .trasform(HttpMethod.GET, this::findResultNode);
+
+            if (response.isPresent()) {
+                final JsonNode node = response.get();
+                final JsonNode sysId = node.findValue("sys_id");
+
+                if (sysId == null) {
+                    throw new RuntimeException("Unable to determine sys_id of 
sys_import_set_row");
+                }
+
+                response = context.getClient().reset()
+                    .types(MediaType.APPLICATION_JSON_TYPE)
+                    .path("now")
+                    .path(context.getConfiguration().getApiVersion())
+                    .path("table")
+                    .path("sys_db_object")
+                    .query("sysparm_exclude_reference_link", "true")
+                    .query("sysparm_fields", "name%2Csys_name")
+                    .queryF("sysparm_query", "super_class=%s", 
sysId.textValue())
+                    .trasform(HttpMethod.GET, this::findResultNode);
+
+                if (response.isPresent()) {
+                    final ObjectNode root = 
context.getConfiguration().getOrCreateMapper().createObjectNode();
+
+                    processResult(response.get(), n -> {
+                        final JsonNode name = n.findValue("name");
+                        final JsonNode label = n.findValue("sys_name");
+
+                        if (name != null && label != null) {
+                            root.put(name.textValue(), label.textValue());
+                        }
+                    });
+
+                    return Optional.of(
+                        MetaDataBuilder.on(getCamelContext())
+                            .withAttribute(MetaData.CONTENT_TYPE, 
"application/json")
+                            .withAttribute(MetaData.JAVA_TYPE, JsonNode.class)
+                            .withAttribute(MetaData.CONTEXT, 
ServiceNowConstants.RESOURCE_IMPORT)
+                            .withPayload(root)
+                            .build()
+                    );
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        return Optional.empty();
+    }
+
     // ********************************
     // Properties
     // ********************************
@@ -322,6 +388,9 @@ final class ServiceNowMetaDataExtension extends 
AbstractMetaDataExtension {
     // Helpers
     // *************************************
 
+    /**
+     * Determine the hierarchy of a table by inspecting the super_class 
attribute.
+     */
     private List<String> getObjectHierarchy(MetaContext context) throws 
Exception {
         List<String> hierarchy = new ArrayList<>();
         String query = String.format("name=%s", context.getObjectName());
@@ -339,9 +408,9 @@ final class ServiceNowMetaDataExtension extends 
AbstractMetaDataExtension {
                 .trasform(HttpMethod.GET, this::findResultNode);
 
             if (response.isPresent()) {
-                JsonNode node = response.get();
-                JsonNode nameNode = node.findValue("name");
-                JsonNode classNode = node.findValue("super_class");
+                final JsonNode node = response.get();
+                final JsonNode nameNode = node.findValue("name");
+                final JsonNode classNode = node.findValue("super_class");
 
                 if (nameNode != null && classNode != null) {
                     query = String.format("sys_id=%s", classNode.textValue());
@@ -401,20 +470,22 @@ final class ServiceNowMetaDataExtension extends 
AbstractMetaDataExtension {
         private final String objectType;
         private final Stack<String> stack;
 
-        MetaContext(Map<String, Object> parameters) throws Exception {
+        MetaContext(Map<String, Object> parameters) {
             this.parameters = parameters;
             this.configuration = 
getComponent(ServiceNowComponent.class).getConfiguration().copy();
             this.stack = new Stack<>();
 
-            IntrospectionSupport.setProperties(configuration, new 
HashMap<>(parameters));
+            try {
+                IntrospectionSupport.setProperties(configuration, new 
HashMap<>(parameters));
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
 
             this.instanceName = 
(String)parameters.getOrDefault("instanceName", 
getComponent(ServiceNowComponent.class).getInstanceName());
-            this.objectType = (String)parameters.getOrDefault("objectType", 
"table");
+            this.objectType = (String)parameters.getOrDefault("objectType", 
ServiceNowConstants.RESOURCE_TABLE);
             this.objectName = (String)parameters.getOrDefault("objectName", 
configuration.getTable());
 
             ObjectHelper.notNull(instanceName, "instanceName");
-            ObjectHelper.notNull(objectName, "objectName");
-            ObjectHelper.notNull(objectType, "objectType");
 
             // Configure Api and OAuthToken ULRs using instanceName
             if (!configuration.hasApiUrl()) {
diff --git 
a/components/camel-servicenow/camel-servicenow-component/src/test/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtensionTest.java
 
b/components/camel-servicenow/camel-servicenow-component/src/test/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtensionTest.java
index 9e5b0c9..a384ed9 100644
--- 
a/components/camel-servicenow/camel-servicenow-component/src/test/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtensionTest.java
+++ 
b/components/camel-servicenow/camel-servicenow-component/src/test/java/org/apache/camel/component/servicenow/ServiceNowMetaDataExtensionTest.java
@@ -51,7 +51,7 @@ public class ServiceNowMetaDataExtensionTest extends 
ServiceNowTestSupport {
     // *********************************
 
     @Test
-    public void testMetaData() throws Exception {
+    public void testTableMetaData() throws Exception {
         Map<String, Object> parameters = getParameters();
         parameters.put("objectType", "table");
         parameters.put("objectName", "incident");
@@ -79,6 +79,25 @@ public class ServiceNowMetaDataExtensionTest extends 
ServiceNowTestSupport {
         );
     }
 
+    @Test
+    public void testImportMetaData() throws Exception {
+        Map<String, Object> parameters = getParameters();
+        parameters.put("objectType", "import");
+        //parameters.put("object.sys_user.fields", "first_name,last_name");
+        //parameters.put("object.incident.fields", 
"caller_id,severity,resolved_at,sys_id");
+        //parameters.put("object.incident.fields", "^sys_.*$");
+        //parameters.put("object.task.fields", "");
+
+        MetaDataExtension.MetaData result = 
getExtension().meta(parameters).orElseThrow(RuntimeException::new);
+
+        Assert.assertEquals("application/json", 
result.getAttribute(MetaDataExtension.MetaData.CONTENT_TYPE));
+        Assert.assertEquals(JsonNode.class, 
result.getAttribute(MetaDataExtension.MetaData.JAVA_TYPE));
+
+        LOGGER.debug(
+            new 
ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(result.getPayload())
+        );
+    }
+
     @Test(expected = UnsupportedOperationException.class)
     public void testInvalidObjectType() throws Exception {
         Map<String, Object> parameters = getParameters();

-- 
To stop receiving notification emails like this one, please contact
lburgazz...@apache.org.

Reply via email to