You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2018/06/07 10:00:25 UTC
[camel] branch master updated: CAMEL-12556: camel-servicenow: add
metadata option to list available import set
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 <lb...@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
lburgazzoli@apache.org.