Add improvments to oauth-http publisher to work with url templates

revert-dabc3590
charitha 7 years ago
parent 69b1102ee2
commit 5f4bada92a

@ -19,24 +19,24 @@
<eventPublisher name="WSO2IoT-DeviceOperation-Publisher" xmlns="http://wso2.org/carbon/eventpublisher"> <eventPublisher name="WSO2IoT-DeviceOperation-Publisher" xmlns="http://wso2.org/carbon/eventpublisher">
<from streamName="org.wso2.iot.operation" version="1.0.0"/> <from streamName="org.wso2.iot.operation" version="1.0.0"/>
<mapping customMapping="enable" type="json"> <mapping customMapping="enable" type="text">
<inline> <inline>
{ {
"deviceIdentifiers": [ "deviceIdentifiers": {{meta_deviceIdentifiers}},
{{meta_deviceIdentifier}} "deviceType": "{{meta_deviceType}}",
],
"operation": { "operation": {
"code": {{code}}, "code": "{{code}}",
"type": {{type}}, "type": "{{type}}",
"status": "PENDING", "status": "PENDING",
"isEnabled": {{isEnabled}}, "isEnabled": "{{isEnabled}}",
"payLoad": {{payLoad}} "payLoad": "{{payLoad}}"
} }
} }
</inline> </inline>
</mapping> </mapping>
<to eventAdapterType="oauth-http"> <to eventAdapterType="oauth-http">
<property name="http.client.method">HttpPost</property> <property name="http.client.method">HttpPost</property>
<property name="http.url">https://localhost:9443/api/device-mgt/v1.0/devices/android/operations</property> <property name="http.url">https://localhost:9443/api/device-mgt/v1.0/devices/{deviceType}/operations</property>
<property name="http.url.templated">true</property>
</to> </to>
</eventPublisher> </eventPublisher>

@ -1,11 +1,15 @@
{ {
"name": "org.wso2.iot.operation", "name": "org.wso2.iot.operation",
"version": "1.0.0", "version": "1.0.0",
"nickName": "", "nickName": "Operation Stream",
"description": "Operation stream for WSO2 IoT Devices", "description": "Operation stream for WSO2 IoT Devices",
"metaData": [ "metaData": [
{ {
"name": "deviceIdentifier", "name": "deviceIdentifiers",
"type": "STRING"
},
{
"name": "deviceType",
"type": "STRING" "type": "STRING"
} }
], ],

@ -59,13 +59,17 @@ import java.net.UnknownHostException;
import java.security.KeyManagementException; import java.security.KeyManagementException;
import java.security.KeyStoreException; import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HTTPEventAdapter implements OutputEventAdapter { public class HTTPEventAdapter implements OutputEventAdapter {
@ -181,6 +185,32 @@ public class HTTPEventAdapter implements OutputEventAdapter {
.extractHeaders(dynamicProperties.get(HTTPEventAdapterConstants.ADAPTER_HEADERS)); .extractHeaders(dynamicProperties.get(HTTPEventAdapterConstants.ADAPTER_HEADERS));
String payload = message.toString(); String payload = message.toString();
if ("true".equals(dynamicProperties.get(HTTPEventAdapterConstants.ADAPTER_MESSAGE_URL_TEMPLATED))) {
try {
JSONParser jsonParser = new JSONParser();
JSONObject jsonPayload = (JSONObject) jsonParser.parse(payload);
List<String> matchList = new ArrayList<>();
Pattern regex = Pattern.compile("\\{(.*?)\\}");
Matcher regexMatcher = regex.matcher(url);
while (regexMatcher.find()) {//Finds Matching Pattern in String
matchList.add(regexMatcher.group(1));//Fetching Group from String
}
for(String str:matchList) {
if (jsonPayload.containsKey(str)) {
url = url.replace("{" + str + "}", jsonPayload.get(str).toString());
}
}
if (log.isDebugEnabled()) {
log.debug("Modified url: " + url);
}
} catch (ParseException e) {
log.error("Unable to parse request body to Json.", e);
}
}
try { try {
executorService.submit(new HTTPSender(url, payload, headers, httpClient)); executorService.submit(new HTTPSender(url, payload, headers, httpClient));
} catch (RejectedExecutionException e) { } catch (RejectedExecutionException e) {

@ -76,6 +76,12 @@ public class HTTPEventAdapterFactory extends OutputEventAdapterFactory {
urlProp.setHint(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_MESSAGE_URL_HINT)); urlProp.setHint(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_MESSAGE_URL_HINT));
urlProp.setRequired(true); urlProp.setRequired(true);
Property urlTemplateProp = new Property(HTTPEventAdapterConstants.ADAPTER_MESSAGE_URL_TEMPLATED);
urlTemplateProp.setDisplayName(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_MESSAGE_URL_TEMPLATED));
urlTemplateProp.setHint(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_MESSAGE_URL_TEMPLATED_HINT));
urlTemplateProp.setRequired(true);
urlTemplateProp.setOptions(new String[]{"true", "false"});
Property usernameProp = new Property(HTTPEventAdapterConstants.ADAPTER_USERNAME); Property usernameProp = new Property(HTTPEventAdapterConstants.ADAPTER_USERNAME);
usernameProp.setDisplayName(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_USERNAME)); usernameProp.setDisplayName(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_USERNAME));
usernameProp.setHint(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_USERNAME_HINT)); usernameProp.setHint(resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_USERNAME_HINT));
@ -94,6 +100,7 @@ public class HTTPEventAdapterFactory extends OutputEventAdapterFactory {
headersProp.setRequired(false); headersProp.setRequired(false);
dynamicPropertyList.add(urlProp); dynamicPropertyList.add(urlProp);
dynamicPropertyList.add(urlTemplateProp);
dynamicPropertyList.add(usernameProp); dynamicPropertyList.add(usernameProp);
dynamicPropertyList.add(passwordProp); dynamicPropertyList.add(passwordProp);
dynamicPropertyList.add(headersProp); dynamicPropertyList.add(headersProp);

@ -21,6 +21,8 @@ public class HTTPEventAdapterConstants {
public static final String ADAPTER_TYPE_HTTP = "oauth-http"; public static final String ADAPTER_TYPE_HTTP = "oauth-http";
public static final String ADAPTER_MESSAGE_URL = "http.url"; public static final String ADAPTER_MESSAGE_URL = "http.url";
public static final String ADAPTER_MESSAGE_URL_TEMPLATED = "http.url.templated";
public static final String ADAPTER_MESSAGE_URL_TEMPLATED_HINT = "http.url.templated.hint";
public static final String ADAPTER_MESSAGE_URL_HINT = "http.url.hint"; public static final String ADAPTER_MESSAGE_URL_HINT = "http.url.hint";
public static final String ADAPTER_CONF_DCR_URL = "dcrUrl"; public static final String ADAPTER_CONF_DCR_URL = "dcrUrl";
public static final String ADAPTER_CONF_TOKEN_URL = "tokenUrl"; public static final String ADAPTER_CONF_TOKEN_URL = "tokenUrl";

@ -18,6 +18,8 @@
http.url=URL http.url=URL
http.url.hint=The target HTTP/HTTPS URL, e.g. "http://yourhost:8080/service (URL will auto format for tenants)" http.url.hint=The target HTTP/HTTPS URL, e.g. "http://yourhost:8080/service (URL will auto format for tenants)"
http.url.templated=URL Templated
http.url.templated.hint=The target HTTP/HTTPS URL has template value(s) to fill from event. e.g. "http://yourhost:8080/service/{variable1}/{variable2}" variable1 & variable2 should be available in the event and event should be in json format
username=Username username=Username
http.username.hint=Username to obtain oauth token. Leave empty to use default. http.username.hint=Username to obtain oauth token. Leave empty to use default.
password=Password password=Password

Loading…
Cancel
Save