From bdf74ac0413d38e4dd6d222889c38538907a4a90 Mon Sep 17 00:00:00 2001 From: Yohan Avishke Date: Sun, 1 Sep 2019 23:57:51 +0530 Subject: [PATCH] API to integrate functionality of DAS Four endpoints to publish stream, receiver, publisher and siddhi script were added to the device.mgt.api. This commit contains implementation of the above end points, jax-rs beans, custom exceptions and common methods used for the endpoints. These changes were done in order to decouple the DAS ui from Entgra products. These endpoints will function by consuming JSON payloads to, generate custom artifacts and deploying them depending on the payload. BREAKING CHANGE: Four endpoints to publish stream, receiver, publisher and siddhi script were added to the device.mgt.api --- .../mgt/jaxrs/beans/analytics/Adapter.java | 69 ++ .../beans/analytics/AdapterConfiguration.java | 62 ++ .../AdapterMappingConfiguration.java | 104 +++ .../beans/analytics/AdapterProperty.java | 44 ++ .../jaxrs/beans/analytics/AdapterType.java | 31 + .../mgt/jaxrs/beans/analytics/Attribute.java | 18 +- ...ributeType.java => AttributeDataType.java} | 4 +- .../beans/analytics/EventAttributeLists.java | 62 ++ .../jaxrs/beans/analytics/EventStream.java | 69 ++ .../beans/analytics/MappingProperty.java | 59 ++ .../jaxrs/beans/analytics/MessageFormat.java | 31 + .../beans/analytics/SiddhiExecutionPlan.java | 48 ++ .../InvalidExecutionPlanException.java | 36 + .../api/AnalyticsManagementService.java | 290 ++++++++ .../impl/AnalyticsManagementServiceImpl.java | 684 ++++++++++++++++++ .../mgt/jaxrs/util/DeviceMgtAPIUtils.java | 45 ++ .../src/main/webapp/WEB-INF/cxf-servlet.xml | 2 + 17 files changed, 1647 insertions(+), 11 deletions(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Adapter.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterConfiguration.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterMappingConfiguration.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterProperty.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterType.java rename components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/{AttributeType.java => AttributeDataType.java} (90%) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeLists.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventStream.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MappingProperty.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MessageFormat.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/SiddhiExecutionPlan.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/exception/InvalidExecutionPlanException.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsManagementService.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsManagementServiceImpl.java diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Adapter.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Adapter.java new file mode 100644 index 00000000000..2cafd461ff8 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Adapter.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Receiver definition including : + * Attributes : Name, type, config and attached stream. + */ +public class Adapter { + @ApiModelProperty(value = "Adapter name") + private String adapterName; + @ApiModelProperty(value = "Attached stream name:version") + private String eventStreamWithVersion; + @ApiModelProperty(value = "Adapter type") + private AdapterType adapterType; + @ApiModelProperty(value = "Adapter main configurations") + private AdapterConfiguration adapterConfiguration; + + public String getAdapterName() { + return adapterName; + } + + public void setAdapterName(String adapterName) { + this.adapterName = adapterName; + } + + public String getEventStreamWithVersion() { + return eventStreamWithVersion; + } + + public void setEventStreamWithVersion(String eventStreamWithVersion) { + this.eventStreamWithVersion = eventStreamWithVersion; + } + + public AdapterType getAdapterType() { + return adapterType; + } + + public void setAdapterType(AdapterType adapterType) { + this.adapterType = adapterType; + } + + public AdapterConfiguration getAdapterConfiguration() { + return adapterConfiguration; + } + + public void setAdapterConfiguration( + AdapterConfiguration adapterConfiguration) { + this.adapterConfiguration = adapterConfiguration; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterConfiguration.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterConfiguration.java new file mode 100644 index 00000000000..ed518dd60eb --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterConfiguration.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; + +/** + * Adapter main configurations + * Attributes : Adapter properties list, custom-mapping flag, mapping configurations + */ +public class AdapterConfiguration { + @ApiModelProperty(value = "Adapter properties list") + private List adapterProperties = new ArrayList<>(); + @ApiModelProperty(value = "Custom-mapping flag") + private boolean isCustomMappingEnabled; + @ApiModelProperty(value = "Mapping configurations") + private AdapterMappingConfiguration adapterMappingConfiguration; + + public List getAdapterProperties() { + return adapterProperties; + } + + public void setAdapterProperties( + List adapterProperties) { + this.adapterProperties = adapterProperties; + } + + public boolean isCustomMappingEnabled() { + return isCustomMappingEnabled; + } + + public void setCustomMappingEnabled(boolean customMappingEnabled) { + isCustomMappingEnabled = customMappingEnabled; + } + + public AdapterMappingConfiguration getAdapterMappingConfiguration() { + return adapterMappingConfiguration; + } + + public void setAdapterMappingConfiguration( + AdapterMappingConfiguration adapterMappingConfiguration) { + this.adapterMappingConfiguration = adapterMappingConfiguration; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterMappingConfiguration.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterMappingConfiguration.java new file mode 100644 index 00000000000..afb499ee839 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterMappingConfiguration.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +import io.swagger.annotations.ApiModelProperty; +import java.util.List; + +/** + * Adapter mapping configuration definition + * Attributes : Mapping format and lists for each type of property + */ +public class AdapterMappingConfiguration { + @ApiModelProperty(value = "Mapping format") + private MessageFormat messageFormat; + @ApiModelProperty(value = "Input mapping for json,text and xml mappings") + private String inputMappingString; + @ApiModelProperty(value = "Input mapping for json,map and xml mappings") + private List inputMappingProperties; + @ApiModelProperty(value = "Name-scape mapping for xml mapping") + private List namespaceMappingProperties; + @ApiModelProperty(value = "Correlation mapping for wso2 mapping") + private List correlationMappingProperties; + @ApiModelProperty(value = "Payload mapping for wso2 mapping") + private List payloadMappingProperties; + @ApiModelProperty(value = "Meta mapping for wso2 mapping") + private List metaMappingProperties; + + public MessageFormat getMessageFormat() { + return messageFormat; + } + + public void setMessageFormat(MessageFormat messageFormat) { + this.messageFormat = messageFormat; + } + + public String getInputMappingString() { + return inputMappingString; + } + + public void setInputMappingString(String inputMappingString) { + this.inputMappingString = inputMappingString; + } + + public List getInputMappingProperties() { + return inputMappingProperties; + } + + public void setInputMappingProperties( + List inputMappingProperties) { + this.inputMappingProperties = inputMappingProperties; + } + + public List getNamespaceMappingProperties() { + return namespaceMappingProperties; + } + + public void setNamespaceMappingProperties( + List namespaceMappingProperties) { + this.namespaceMappingProperties = namespaceMappingProperties; + } + + public List getCorrelationMappingProperties() { + return correlationMappingProperties; + } + + public void setCorrelationMappingProperties( + List correlationMappingProperties) { + this.correlationMappingProperties = correlationMappingProperties; + } + + public List getPayloadMappingProperties() { + return payloadMappingProperties; + } + + public void setPayloadMappingProperties( + List payloadMappingProperties) { + this.payloadMappingProperties = payloadMappingProperties; + } + + public List getMetaMappingProperties() { + return metaMappingProperties; + } + + public void setMetaMappingProperties( + List metaMappingProperties) { + this.metaMappingProperties = metaMappingProperties; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterProperty.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterProperty.java new file mode 100644 index 00000000000..399ef3271ff --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterProperty.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +/** + * Receiver properties with it's display name(key) and user input(value) + */ +public class AdapterProperty { + private String key; + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterType.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterType.java new file mode 100644 index 00000000000..5227c4973cb --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AdapterType.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +/** + * Available adapter types + */ +public enum AdapterType { + EMAIL, FILE_TAIL, HTTP, IOT_EVENT, JMS, KAFKA, MQTT, OAUTH_MQTT, SOAP, WEBSOCKET, WEBSOCKET_LOCAL, + WSO2_EVENT, XMPP, UI, RDBMS, SECURED_WEBSOCKET, CASSANDRA, LOGGER; + + public String toStringFormatted() { + return super.toString().toLowerCase().replace("_", "-"); + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Attribute.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Attribute.java index 276fea9ee47..d661fdef9fd 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Attribute.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/Attribute.java @@ -22,24 +22,24 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModelProperty; /** - * This hold the attribute definition. + * Each attribute definition + * Attributes : name, type */ public class Attribute { - - @ApiModelProperty(value = "Event Attribute Name") + @ApiModelProperty(value = "Event attribute name") @JsonProperty("name") private String name; - @ApiModelProperty(value = "Event Attribute Type") + @ApiModelProperty(value = "Event attribute data type") @JsonProperty("type") - private AttributeType type; + private AttributeDataType type; public Attribute() { } - public Attribute(String name, AttributeType attributeType) { + public Attribute(String name, AttributeDataType attributeDataType) { this.name = name; - this.type = attributeType; + this.type = attributeDataType; } public String getName() { return name; @@ -49,11 +49,11 @@ public class Attribute { this.name = name; } - public AttributeType getType() { + public AttributeDataType getType() { return type; } - public void setType(AttributeType type) { + public void setType(AttributeDataType type) { this.type = type; } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AttributeType.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AttributeDataType.java similarity index 90% rename from components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AttributeType.java rename to components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AttributeDataType.java index 23235612b93..d7acab5696b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AttributeType.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/AttributeDataType.java @@ -19,9 +19,9 @@ package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; /** - * This hold the definition of the attribute type for the attributes. + * Attribute data types */ -public enum AttributeType { +public enum AttributeDataType { STRING, LONG, BOOL, INT, FLOAT, DOUBLE; @Override diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeLists.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeLists.java new file mode 100644 index 00000000000..23ee3fb4d57 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeLists.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +import io.swagger.annotations.ApiModelProperty; +import java.util.List; + +/** + * Stream event attribute data + * Attributes : three lists for each attribute type + */ +public class EventAttributeLists { + @ApiModelProperty(value = "Meta attribute list") + private List metaAttributes; + @ApiModelProperty(value = "Correlation attribute list") + private List correlationAttributes; + @ApiModelProperty(value = "Payload attribute list") + private List payloadAttributes; + + public List getMetaAttributes() { + return metaAttributes; + } + + public void setMetaAttributes( + List metaAttributes) { + this.metaAttributes = metaAttributes; + } + + public List getCorrelationAttributes() { + return correlationAttributes; + } + + public void setCorrelationAttributes( + List correlationAttributes) { + this.correlationAttributes = correlationAttributes; + } + + public List getPayloadAttributes() { + return payloadAttributes; + } + + public void setPayloadAttributes( + List payloadAttributes) { + this.payloadAttributes = payloadAttributes; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventStream.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventStream.java new file mode 100644 index 00000000000..f2ff053f667 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventStream.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Stream definition + * Attributes : name, version, definition and attribute data + */ +public class EventStream { + @ApiModelProperty(value = "Stream name") + private String streamName; + @ApiModelProperty(value = "Stream version") + private String streamVersion; + @ApiModelProperty(value = "Stream definition") + private String streamDefinition; + @ApiModelProperty(value = "Stream property attribute lists") + private EventAttributeLists eventAttributeLists; + + public String getStreamName() { + return streamName; + } + + public void setStreamName(String streamName) { + this.streamName = streamName; + } + + public String getStreamVersion() { + return streamVersion; + } + + public void setStreamVersion(String streamVersion) { + this.streamVersion = streamVersion; + } + + public String getStreamDefinition() { + return streamDefinition; + } + + public void setStreamDefinition(String streamDefinition) { + this.streamDefinition = streamDefinition; + } + + public EventAttributeLists getEventAttributeLists() { + return eventAttributeLists; + } + + public void setEventAttributeLists( + EventAttributeLists eventAttributeLists) { + this.eventAttributeLists = eventAttributeLists; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MappingProperty.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MappingProperty.java new file mode 100644 index 00000000000..05887be3036 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MappingProperty.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Mapping property data + * Attributes : name, data type and mapping value name + */ +public class MappingProperty { + @ApiModelProperty(value = "Property name") + private String name; + @ApiModelProperty(value = "Property data type") + private String type; + @ApiModelProperty(value = "Property mapping value name") + private String valueOf; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValueOf() { + return valueOf; + } + + public void setValueOf(String valueOf) { + this.valueOf = valueOf; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MessageFormat.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MessageFormat.java new file mode 100644 index 00000000000..9df8a4bd0e3 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/MessageFormat.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +/** + * Message protocol types + */ +public enum MessageFormat { + JSON, MAP, XML, WSO2EVENT, TEXT; + + @Override + public String toString() { + return super.toString().toLowerCase(); + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/SiddhiExecutionPlan.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/SiddhiExecutionPlan.java new file mode 100644 index 00000000000..0c68e91478b --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/SiddhiExecutionPlan.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.beans.analytics; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Execution plan definition including : + * Attributes : Name and Plan data. + */ +public class SiddhiExecutionPlan { + @ApiModelProperty(value = "Execution plan name") + private String executionPlanName; + @ApiModelProperty(value = "Execution plan") + private String executionPlanData; + + public String getExecutionPlanName() { + return executionPlanName; + } + + public void setExecutionPlanName(String executionPlanName) { + this.executionPlanName = executionPlanName; + } + + public String getExecutionPlanData() { + return executionPlanData; + } + + public void setExecutionPlanData(String executionPlanData) { + this.executionPlanData = executionPlanData; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/exception/InvalidExecutionPlanException.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/exception/InvalidExecutionPlanException.java new file mode 100644 index 00000000000..a741f67fb03 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/exception/InvalidExecutionPlanException.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.exception; + +public class InvalidExecutionPlanException extends Exception{ + private String errorMessage; + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public InvalidExecutionPlanException(String msg) { + super(msg); + setErrorMessage(msg); + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsManagementService.java new file mode 100644 index 00000000000..b81100c0fe6 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsManagementService.java @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.service.api; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Extension; +import io.swagger.annotations.ExtensionProperty; +import io.swagger.annotations.Info; +import io.swagger.annotations.ResponseHeader; +import io.swagger.annotations.SwaggerDefinition; +import io.swagger.annotations.Tag; +import org.wso2.carbon.apimgt.annotations.api.Scope; +import org.wso2.carbon.apimgt.annotations.api.Scopes; +import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.Adapter; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.EventStream; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.SiddhiExecutionPlan; +import org.wso2.carbon.device.mgt.jaxrs.util.Constants; + +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +@SwaggerDefinition( + info = @Info( + version = "1.0.0", + title = "", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = "name", value = "AnalyticsManagement"), + @ExtensionProperty(name = "context", value = "/api/device-mgt/v1.0/analytics"), + }) + } + ), + tags = { + @Tag(name = "analytics_management", description = "") + } +) +@Scopes( + scopes = { + @Scope( + name = "Add Event stream", + description = "Add definition of a Event stream", + key = "perm:analytics:events", + permissions = {"/device-mgt/analytics/event/add"} + ), + @Scope( + name = "Add Publisher", + description = "Add definition of a Publisher", + key = "perm:analytics:publisher", + permissions = {"/device-mgt/analytics/publisher/add"} + ), + @Scope( + name = "Add Receiver", + description = "Add definition of a Receiver", + key = "perm:analytics:receiver", + permissions = {"/device-mgt/analytics/receiver/add"} + ), + @Scope( + name = "Add Siddhi script", + description = "Add definition of a Siddhi script", + key = "perm:analytics:script", + permissions = {"/device-mgt/analytics/script/add"} + ) + } +) + +@Path("/analytics") +@Api(value = "Analytics Management", description = "This API corresponds to all tasks related analytics server") +@Consumes(MediaType.APPLICATION_JSON) +public interface AnalyticsManagementService { + + @POST + @Path("/event") + @ApiOperation( + httpMethod = "POST", + value = "Adding the Event Type Definition", + notes = "Add the event definition to analytics.", + tags = "Analytics Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:events") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully added the event defintion.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while publishing the " + + "Event stream.", + response = ErrorResponse.class) + } + ) + Response deployEventDefinition(@Valid EventStream stream); + + @POST + @Path("/receiver") + @ApiOperation( + httpMethod = "POST", + value = "Adding an Event Receiver", + notes = "Add the receiver for an event", + tags = "Analytics Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:receiver") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully added the receiver.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body."), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while publishing the " + + "Event receiver.", + response = ErrorResponse.class) + } + ) + Response deployEventReceiver(Adapter receiver); + + @POST + @Path("/publisher") + @ApiOperation( + httpMethod = "POST", + value = "Adding an Event Publisher", + notes = "Add the publisher for an event", + tags = "Analytics Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:publisher") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully added the publisher.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body."), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while publishing the " + + "Event publisher.", + response = ErrorResponse.class) + } + ) + Response deployEventPublisher(@Valid Adapter publisher); + + @POST + @Path("/executable") + @ApiOperation( + httpMethod = "POST", + value = "Adding a Siddhi executable", + notes = "Add a Siddhi executable for a event", + tags = "Analytics Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:script") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully added the execution plan.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body."), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while " + + "publishing the Execution plan.", + response = ErrorResponse.class) + } + ) + Response deploySiddhiExecutableScript(@Valid SiddhiExecutionPlan plan); +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsManagementServiceImpl.java new file mode 100644 index 00000000000..c6a5eb9b58f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsManagementServiceImpl.java @@ -0,0 +1,684 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.device.mgt.jaxrs.service.impl; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.client.Stub; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.base.MultitenantConstants; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.Attribute; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.AdapterMappingConfiguration; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.MappingProperty; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.AdapterConfiguration; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.AdapterProperty; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.MessageFormat; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.SiddhiExecutionPlan; +import org.wso2.carbon.device.mgt.jaxrs.exception.InvalidExecutionPlanException; +import org.wso2.carbon.device.mgt.jaxrs.service.api.AnalyticsManagementService; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.Adapter; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.EventAttributeLists; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.EventStream; +import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; +import org.wso2.carbon.event.processor.stub.EventProcessorAdminServiceStub; +import org.wso2.carbon.event.processor.stub.types.ExecutionPlanConfigurationDto; +import org.wso2.carbon.event.publisher.stub.EventPublisherAdminServiceStub; +import org.wso2.carbon.event.publisher.stub.types.BasicOutputAdapterPropertyDto; +import org.wso2.carbon.event.publisher.stub.types.EventPublisherConfigurationDto; +import org.wso2.carbon.event.receiver.stub.EventReceiverAdminServiceStub; +import org.wso2.carbon.event.receiver.stub.types.BasicInputAdapterPropertyDto; +import org.wso2.carbon.event.receiver.stub.types.EventMappingPropertyDto; +import org.wso2.carbon.event.receiver.stub.types.EventReceiverConfigurationDto; +import org.wso2.carbon.event.stream.stub.EventStreamAdminServiceStub; +import org.wso2.carbon.event.stream.stub.types.EventStreamAttributeDto; +import org.wso2.carbon.event.stream.stub.types.EventStreamDefinitionDto; +import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; +import org.wso2.carbon.user.api.UserStoreException; + +import javax.validation.Valid; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.core.Response; +import java.rmi.RemoteException; +import java.util.List; + +/** + * This class is used to create endpoints to serve the deployment of streams, adapters, siddhi + * execution plans to the DAS + */ +@Path("/analytics") +public class AnalyticsManagementServiceImpl implements AnalyticsManagementService { + private static final Log log = LogFactory.getLog(AnalyticsManagementServiceImpl.class); + + /** + * @param eventStream EventStream object with the properties of the stream + * @return A status code depending on the code result + * Function - Deploy a event stream + */ + @Override + @POST + @Path("/event") + public Response deployEventDefinition(@Valid EventStream eventStream) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + EventAttributeLists eventAttributes = eventStream.getEventAttributeLists(); + // Categorize attributes to three lists depending on their type + List eventMetaAttributes = eventAttributes.getMetaAttributes(); + List eventPayloadAttributes = eventAttributes.getPayloadAttributes(); + List eventCorrelationAttributes = eventAttributes.getCorrelationAttributes(); + + try { + /* Conditions + * - At least one list should always be not null + */ + if (eventStream.getEventAttributeLists() == null || + (eventMetaAttributes == null && eventCorrelationAttributes == null && + eventPayloadAttributes == null)) { + log.error("Invalid payload: eventAttributeLists"); + return Response.status(Response.Status.BAD_REQUEST).build(); + + } else { + String streamName = eventStream.getStreamName(); + String streamVersion = eventStream.getStreamVersion(); + String streamDefinition = eventStream.getStreamDefinition(); + // Publish the event stream + publishStream(streamName, streamVersion, streamDefinition, eventMetaAttributes, + eventPayloadAttributes, eventCorrelationAttributes); + try { + /* + * Create a new tenant and if that tenant is not the super tenant execute the publish + * function for the new tenant + */ + PrivilegedCarbonContext.startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain( + MultitenantConstants.SUPER_TENANT_DOMAIN_NAME, true); + if (!MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) { + publishStream(streamName, streamVersion, streamDefinition, eventMetaAttributes, + eventPayloadAttributes, eventCorrelationAttributes); + } + } finally { + // End the new tenant flow + PrivilegedCarbonContext.endTenantFlow(); + } + return Response.ok().build(); + } + } catch (AxisFault e) { + log.error("Failed to create event definitions for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (RemoteException e) { + log.error("Failed to connect with the remote services for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (JWTClientException e) { + log.error("Failed to generate jwt token for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (UserStoreException e) { + log.error("Failed to connect with the user store for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * @param receiver Receiver definition data + * @return a status code depending on the code execution + * * Function - Deploy a event receiver + */ + @Override + @POST + @Path("/receiver") + public Response deployEventReceiver(Adapter receiver) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + String receiverName = receiver.getAdapterName(); + String adapterType = receiver.getAdapterType().toStringFormatted(); + AdapterConfiguration adapterConfiguration = receiver.getAdapterConfiguration(); + AdapterMappingConfiguration adapterMappingConfiguration = adapterConfiguration.getAdapterMappingConfiguration(); + + try { + List adapterProperties = adapterConfiguration.getAdapterProperties(); + if (adapterProperties == null) { + log.error("Invalid attribute payload"); + return Response.status(Response.Status.BAD_REQUEST).build(); + } + + boolean customMapping = adapterConfiguration.isCustomMappingEnabled(); + List inputMappingProperties = adapterMappingConfiguration.getInputMappingProperties(); + List namespaceMappingProperties = adapterMappingConfiguration.getNamespaceMappingProperties(); + List correlationMappingProperties = adapterMappingConfiguration.getCorrelationMappingProperties(); + List payloadMappingProperties = adapterMappingConfiguration.getPayloadMappingProperties(); + List metaMappingProperties = adapterMappingConfiguration.getMetaMappingProperties(); + MessageFormat messageFormat = adapterMappingConfiguration.getMessageFormat(); + /* + * Conditions + * - if CustomMappingEnabled check validity of property lists + * - if both inputMappingProperties and namespaceMappingProperties null check remaining property lists + * - if all correlationMappingProperties, payloadMappingProperties, metaMappingProperties null log error + * - if message format is null change the final result to TRUE + * - else continue + * */ + if ((customMapping && + (inputMappingProperties == null && namespaceMappingProperties == null) && + (correlationMappingProperties == null && payloadMappingProperties == null && + metaMappingProperties == null)) || + messageFormat == null) { + log.error("Invalid mapping payload"); + return Response.status(Response.Status.BAD_REQUEST).build(); + } + String eventStreamWithVersion = receiver.getEventStreamWithVersion(); + + publishReceiver(receiverName, adapterType, adapterProperties, customMapping, inputMappingProperties, + namespaceMappingProperties, correlationMappingProperties, payloadMappingProperties, + metaMappingProperties, messageFormat, eventStreamWithVersion); + try { + /* + * Create a new tenant and if that tenant is not the super tenant execute the publish + * function for the new tenant + */ + PrivilegedCarbonContext.startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain( + MultitenantConstants.SUPER_TENANT_DOMAIN_NAME, true); + if (!MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) { + publishReceiver(receiverName, adapterType, adapterProperties, customMapping, inputMappingProperties, + namespaceMappingProperties, correlationMappingProperties, payloadMappingProperties, + metaMappingProperties, messageFormat, eventStreamWithVersion); + } + } finally { + // End the new tenant flow + PrivilegedCarbonContext.endTenantFlow(); + } + return Response.ok().build(); + } catch (AxisFault e) { + log.error("Failed to create event definitions for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (RemoteException e) { + log.error("Failed to connect with the remote services for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (JWTClientException e) { + log.error("Failed to generate jwt token for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (UserStoreException e) { + log.error("Failed to connect with the user store for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * @param publisher Publisher definition + * @return a status code depending on the code execution + */ + @Override + @POST + @Path("/publisher") + public Response deployEventPublisher(@Valid Adapter publisher) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + String publisherName = publisher.getAdapterName(); + String adapterType = publisher.getAdapterType().toStringFormatted(); + AdapterConfiguration adapterConfiguration = publisher.getAdapterConfiguration(); + AdapterMappingConfiguration adapterMappingConfiguration = adapterConfiguration.getAdapterMappingConfiguration(); + + try { + List adapterProperties = adapterConfiguration.getAdapterProperties(); + if (adapterProperties == null) { + log.error("Invalid attribute payload"); + return Response.status(Response.Status.BAD_REQUEST).build(); + } + + boolean customMapping = adapterConfiguration.isCustomMappingEnabled(); + String inputMappingString = adapterMappingConfiguration.getInputMappingString(); + List inputMappingProperties = adapterMappingConfiguration.getInputMappingProperties(); + List correlationMappingProperties = adapterMappingConfiguration.getCorrelationMappingProperties(); + List payloadMappingProperties = adapterMappingConfiguration.getPayloadMappingProperties(); + List metaMappingProperties = adapterMappingConfiguration.getMetaMappingProperties(); + MessageFormat messageFormat = adapterMappingConfiguration.getMessageFormat(); + /* + * Conditions + * - if CustomMappingEnabled check validity of property lists + * - if all correlationMappingProperties, payloadMappingProperties, metaMappingProperties null log error + * - if message format is null change the final result to TRUE + * - else continue + */ + if ((customMapping && + (inputMappingProperties == null && inputMappingString == null) && + (correlationMappingProperties == null && payloadMappingProperties == null && + metaMappingProperties == null)) || + messageFormat == null) { + log.error("Invalid mapping payload"); + return Response.status(Response.Status.BAD_REQUEST).build(); + } + String eventStreamWithVersion = publisher.getEventStreamWithVersion(); + + publishPublisher(publisherName, adapterType, adapterProperties, customMapping + , inputMappingString, inputMappingProperties, correlationMappingProperties + , payloadMappingProperties, metaMappingProperties, messageFormat + , eventStreamWithVersion); + try { + /* + * Create a new tenant and if that tenant is not the super tenant execute the publish + * function for the new tenant + */ + PrivilegedCarbonContext.startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain( + MultitenantConstants.SUPER_TENANT_DOMAIN_NAME, true); + if (!MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) { + publishPublisher(publisherName, adapterType, adapterProperties, customMapping + , inputMappingString, inputMappingProperties, correlationMappingProperties + , payloadMappingProperties, metaMappingProperties, messageFormat + , eventStreamWithVersion); + } + } finally { + // End the new tenant flow + PrivilegedCarbonContext.endTenantFlow(); + } + return Response.ok().build(); + } catch (AxisFault e) { + log.error("Failed to create event definitions for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (RemoteException e) { + log.error("Failed to connect with the remote services for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (JWTClientException e) { + log.error("Failed to generate jwt token for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (UserStoreException e) { + log.error("Failed to connect with the user store for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * @param executionPlan Siddhi execution plan definition + * @return a status code depending on the code execution + */ + @Override + @POST + @Path("/executable") + public Response deploySiddhiExecutableScript(@Valid SiddhiExecutionPlan executionPlan) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + try { + publishSiddhiExecutionPlan(executionPlan.getExecutionPlanName(), + executionPlan.getExecutionPlanData()); + try { + /* + * Create a new tenant and if that tenant is not the super tenant execute the publish + * function for the new tenant + */ + PrivilegedCarbonContext.startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain( + MultitenantConstants.SUPER_TENANT_DOMAIN_NAME, true); + if (!MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) { + publishSiddhiExecutionPlan(executionPlan.getExecutionPlanName(), + executionPlan.getExecutionPlanData()); + } + } finally { + // End the new tenant flow + PrivilegedCarbonContext.endTenantFlow(); + } + return Response.ok().build(); + } catch (AxisFault e) { + log.error("Failed to create event definitions for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (RemoteException e) { + log.error("Failed to connect with the remote services for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (JWTClientException e) { + log.error("Failed to generate jwt token for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (UserStoreException e) { + log.error("Failed to connect with the user store for tenantDomain: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (InvalidExecutionPlanException e) { + log.error("Invalid Execution plan: " + tenantDomain, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * @param streamName Name of the stream + * @param streamVersion Version of the stream + * @param streamDefinition Definition of the stream + * @param eventMetaAttributes Meta attributes of the stream + * @param eventPayloadAttributes Payload attributes of the stream + * @param eventCorrelationAttributes Correlation attributes of the stream + * @throws RemoteException exception that may occur during a remote method call + * @throws UserStoreException exception that may occur during JWT token generation + * @throws JWTClientException exception that may occur during connecting to client store + */ + private void publishStream(String streamName, String streamVersion, String streamDefinition, + List eventMetaAttributes, + List eventPayloadAttributes, + List eventCorrelationAttributes) + throws RemoteException, UserStoreException, JWTClientException { + EventStreamAdminServiceStub eventStreamAdminServiceStub = + DeviceMgtAPIUtils.getEventStreamAdminServiceStub(); + try { + EventStreamDefinitionDto eventStreamDefinitionDto = new EventStreamDefinitionDto(); + eventStreamDefinitionDto.setName(streamName); + eventStreamDefinitionDto.setVersion(streamVersion); + eventStreamDefinitionDto.setDescription(streamDefinition); + eventStreamDefinitionDto.setMetaData(addEventAttributesToDto(eventMetaAttributes)); + eventStreamDefinitionDto.setPayloadData(addEventAttributesToDto(eventPayloadAttributes)); + eventStreamDefinitionDto.setCorrelationData(addEventAttributesToDto(eventCorrelationAttributes)); + String streamId = streamName + ":" + streamVersion; + if (eventStreamAdminServiceStub.getStreamDefinitionDto(streamId) != null) { + eventStreamAdminServiceStub.editEventStreamDefinitionAsDto(eventStreamDefinitionDto, streamId); + } else { + eventStreamAdminServiceStub.addEventStreamDefinitionAsDto(eventStreamDefinitionDto); + } + } finally { + cleanup(eventStreamAdminServiceStub); + } + + } + + /** + * @param receiverName Receiver name + * @param adapterType Receiver type + * @param adapterProperties Receiver properties + * @param customMapping Is receiver mapped + * @param inputMappingProperties Receiver input attribute mapping + * @param namespaceMappingProperties Receiver name-scape attribute mapping + * @param correlationMappingProperties Receiver correlation attribute mapping + * @param payloadMappingProperties Receiver payload attribute mapping + * @param metaMappingProperties Receiver meta attribute mapping + * @param messageFormat Receiver mapping format + * @param eventStreamWithVersion Attached stream + * @throws RemoteException exception that may occur during a remote method call + * @throws UserStoreException exception that may occur during JWT token generation + * @throws JWTClientException exception that may occur during connecting to client store + */ + private void publishReceiver(String receiverName, String adapterType, + List adapterProperties, boolean customMapping, + List inputMappingProperties, + List namespaceMappingProperties, + List correlationMappingProperties, + List payloadMappingProperties, + List metaMappingProperties, + MessageFormat messageFormat, + String eventStreamWithVersion) + throws RemoteException, UserStoreException, JWTClientException { + EventReceiverAdminServiceStub eventReceiverAdminServiceStub = DeviceMgtAPIUtils.getEventReceiverAdminServiceStub(); + + try { + EventReceiverConfigurationDto eventReceiverConfigurationDto = eventReceiverAdminServiceStub + .getActiveEventReceiverConfiguration(receiverName); + + // Check if adapter already exists, if so un-deploy it + if (eventReceiverConfigurationDto != null) { + eventReceiverAdminServiceStub.undeployActiveEventReceiverConfiguration(receiverName); + } + + // Adding attribute properties to DTOs + BasicInputAdapterPropertyDto[] basicInputAdapterPropertyDtos = + addReceiverConfigToDto(adapterProperties); + + if (eventReceiverAdminServiceStub.getActiveEventReceiverConfiguration(receiverName) == null) { + // Call stub deploy methods according to the message format + if (!messageFormat.toString().equals("wso2event")) { + EventMappingPropertyDto[] inputMappingPropertyDtos = + addReceiverMappingToDto(inputMappingProperties); + if (messageFormat.toString().equals("xml")) { + EventMappingPropertyDto[] namespaceMappingPropertyDtos = + addReceiverMappingToDto(namespaceMappingProperties); + + eventReceiverAdminServiceStub.deployXmlEventReceiverConfiguration(receiverName + , eventStreamWithVersion, adapterType, null + , namespaceMappingPropertyDtos, inputMappingPropertyDtos + , basicInputAdapterPropertyDtos, customMapping); + } else { + if (messageFormat.toString().equals("map")) { + eventReceiverAdminServiceStub.deployMapEventReceiverConfiguration(receiverName + , eventStreamWithVersion, adapterType, inputMappingPropertyDtos + , basicInputAdapterPropertyDtos, customMapping); + } else if (messageFormat.toString().equals("text")) { + eventReceiverAdminServiceStub.deployTextEventReceiverConfiguration(receiverName + , eventStreamWithVersion, adapterType, inputMappingPropertyDtos + , basicInputAdapterPropertyDtos, customMapping); + } else { + eventReceiverAdminServiceStub.deployJsonEventReceiverConfiguration(receiverName + , eventStreamWithVersion, adapterType, inputMappingPropertyDtos + , basicInputAdapterPropertyDtos, customMapping); + } + } + } else { + EventMappingPropertyDto[] correlationMappingPropertyDtos = addReceiverMappingToDto(correlationMappingProperties); + EventMappingPropertyDto[] metaMappingPropertyDtos = addReceiverMappingToDto(metaMappingProperties); + EventMappingPropertyDto[] payloadMappingPropertyDtos = addReceiverMappingToDto(payloadMappingProperties); + + eventReceiverAdminServiceStub.deployWso2EventReceiverConfiguration(receiverName + , eventStreamWithVersion, adapterType, metaMappingPropertyDtos + , correlationMappingPropertyDtos, payloadMappingPropertyDtos + , basicInputAdapterPropertyDtos, customMapping + , eventStreamWithVersion); + } + + } + } finally { + cleanup(eventReceiverAdminServiceStub); + } + } + + /** + * @param publisherName Publisher name + * @param adapterType Publisher type + * @param adapterProperties Publisher properties + * @param customMapping Is publisher mapped + * @param correlationMappingProperties Publisher correlation attribute mapping + * @param payloadMappingProperties Publisher payload attribute mapping + * @param metaMappingProperties Publisher meta attribute mapping + * @param messageFormat Publisher mapping format + * @param eventStreamWithVersion Attached stream + * @throws RemoteException exception that may occur during a remote method call + * @throws UserStoreException exception that may occur during JWT token generation + * @throws JWTClientException exception that may occur during connecting to client store + */ + private void publishPublisher(String publisherName, String adapterType, + List adapterProperties, + boolean customMapping, + String inputMappingString, + List inputMappingProperties, + List correlationMappingProperties, + List payloadMappingProperties, + List metaMappingProperties, + MessageFormat messageFormat, + String eventStreamWithVersion) + throws RemoteException, UserStoreException, JWTClientException { + EventPublisherAdminServiceStub eventPublisherAdminServiceStub = DeviceMgtAPIUtils.getEventPublisherAdminServiceStub(); + // Check if adapter already exists, if so un-deploy it + try { + EventPublisherConfigurationDto eventPublisherConfigurationDto = eventPublisherAdminServiceStub + .getActiveEventPublisherConfiguration(publisherName); + if (eventPublisherConfigurationDto != null) { + eventPublisherAdminServiceStub.undeployActiveEventPublisherConfiguration(publisherName); + } + + // Adding attribute properties to DTOs + BasicOutputAdapterPropertyDto[] basicOutputAdapterPropertyDtos = + addPublisherConfigToDto(adapterProperties); + + if (eventPublisherAdminServiceStub.getActiveEventPublisherConfiguration(publisherName) == null) { + // Call stub deploy methods according to the message format + if (!messageFormat.toString().equals("wso2event")) { + if (!messageFormat.toString().equals("map")) { + if (messageFormat.toString().equals("xml")) { + eventPublisherAdminServiceStub.deployXmlEventPublisherConfiguration(publisherName + , eventStreamWithVersion, adapterType, inputMappingString + , basicOutputAdapterPropertyDtos, eventStreamWithVersion + , customMapping); + } else if (messageFormat.toString().equals("text")) { + eventPublisherAdminServiceStub.deployTextEventPublisherConfiguration(publisherName + , eventStreamWithVersion, adapterType, inputMappingString + , basicOutputAdapterPropertyDtos, eventStreamWithVersion + , customMapping); + } else { + eventPublisherAdminServiceStub.deployJsonEventPublisherConfiguration(publisherName + , eventStreamWithVersion, adapterType, inputMappingString + , basicOutputAdapterPropertyDtos, eventStreamWithVersion + , customMapping); + } + } else { + org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto[] inputMappingPropertyDtos = + addPublisherMappingToDto(inputMappingProperties); + eventPublisherAdminServiceStub.deployMapEventPublisherConfiguration(publisherName + , eventStreamWithVersion, adapterType, inputMappingPropertyDtos + , basicOutputAdapterPropertyDtos, customMapping); + } + } else { + org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto[] correlationMappingPropertyDtos = + addPublisherMappingToDto(correlationMappingProperties); + org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto[] metaMappingPropertyDtos = + addPublisherMappingToDto(metaMappingProperties); + org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto[] payloadMappingPropertyDtos = + addPublisherMappingToDto(payloadMappingProperties); + + eventPublisherAdminServiceStub.deployWSO2EventPublisherConfiguration(publisherName + , eventStreamWithVersion, adapterType, metaMappingPropertyDtos + , correlationMappingPropertyDtos, payloadMappingPropertyDtos + , basicOutputAdapterPropertyDtos, customMapping + , eventStreamWithVersion); + } + + } + } finally { + cleanup(eventPublisherAdminServiceStub); + } + } + + /** + * @param executionPlanName Siddhi execution plan name + * @param executionPlanData Siddhi execution plan + * @throws RemoteException exception that may occur during a remote method call + * @throws UserStoreException exception that may occur during JWT token generation + * @throws JWTClientException exception that may occur during connecting to client store + * @throws InvalidExecutionPlanException exception that may occur if execution plan validation fails + */ + private void publishSiddhiExecutionPlan(String executionPlanName, String executionPlanData) + throws RemoteException, UserStoreException, JWTClientException, + InvalidExecutionPlanException { + EventProcessorAdminServiceStub eventProcessorAdminServiceStub = null; + // Flag to check the existence of a plan + boolean isAvailable = false; + try { + eventProcessorAdminServiceStub = DeviceMgtAPIUtils.getEventProcessorAdminServiceStub(); + // Validate the plan code + String validationResponse = eventProcessorAdminServiceStub.validateExecutionPlan(executionPlanData); + if (validationResponse.equals("success")) { + String activeExecutionPlanName = null; + // Get active plans + ExecutionPlanConfigurationDto[] allActiveExecutionPlanConfigs = eventProcessorAdminServiceStub.getAllActiveExecutionPlanConfigurations(); + if (allActiveExecutionPlanConfigs != null) { + for (ExecutionPlanConfigurationDto activeExecutionPlanConfig : allActiveExecutionPlanConfigs) { + activeExecutionPlanName = activeExecutionPlanConfig.getName(); + if (activeExecutionPlanName.equals(executionPlanName)) { + isAvailable = true; + } + } + } + // Edit existing plan + if (isAvailable) { + eventProcessorAdminServiceStub.editActiveExecutionPlan(executionPlanData, + executionPlanName); + } + // Create a new plan + else { + eventProcessorAdminServiceStub.deployExecutionPlan(executionPlanData); + } + } else { + String errMsg = "Execution plan validation failed: " + validationResponse; + log.error(errMsg); + throw new InvalidExecutionPlanException(errMsg); + } + } finally { + cleanup(eventProcessorAdminServiceStub); + } + } + + private EventStreamAttributeDto[] addEventAttributesToDto(List attributes) { + EventStreamAttributeDto[] eventStreamAttributeDtos = new EventStreamAttributeDto[attributes.size()]; + for (int i = 0; i < attributes.size(); i++) { + EventStreamAttributeDto eventStreamAttributeDto = new EventStreamAttributeDto(); + eventStreamAttributeDto.setAttributeName(attributes.get(i).getName()); + eventStreamAttributeDto.setAttributeType(attributes.get(i).getType().toString()); + eventStreamAttributeDtos[i] = eventStreamAttributeDto; + } + return eventStreamAttributeDtos; + } + + + private BasicInputAdapterPropertyDto[] addReceiverConfigToDto( + List adapterProperties) { + BasicInputAdapterPropertyDto[] basicInputAdapterPropertyDtos + = new BasicInputAdapterPropertyDto[adapterProperties.size()]; + for (int i = 0; i < adapterProperties.size(); i++) { + BasicInputAdapterPropertyDto basicInputAdapterPropertyDto = new BasicInputAdapterPropertyDto(); + basicInputAdapterPropertyDto.setKey(adapterProperties.get(i).getKey()); + basicInputAdapterPropertyDto.setValue(adapterProperties.get(i).getValue()); + basicInputAdapterPropertyDtos[i] = basicInputAdapterPropertyDto; + } + return basicInputAdapterPropertyDtos; + } + + private EventMappingPropertyDto[] addReceiverMappingToDto(List mapProperties) { + EventMappingPropertyDto[] eventMappingPropertyDtos = new EventMappingPropertyDto[mapProperties.size()]; + for (int i = 0; i < mapProperties.size(); i++) { + EventMappingPropertyDto eventMappingPropertyDto = new EventMappingPropertyDto(); + eventMappingPropertyDto.setName(mapProperties.get(i).getName()); + eventMappingPropertyDto.setType(mapProperties.get(i).getType()); + eventMappingPropertyDto.setValueOf(mapProperties.get(i).getValueOf()); + eventMappingPropertyDtos[i] = eventMappingPropertyDto; + } + return eventMappingPropertyDtos; + } + + private BasicOutputAdapterPropertyDto[] addPublisherConfigToDto( + List adapterProperties) { + BasicOutputAdapterPropertyDto[] basicOutputAdapterPropertyDtos = + new BasicOutputAdapterPropertyDto[adapterProperties.size()]; + for (int i = 0; i < adapterProperties.size(); i++) { + BasicOutputAdapterPropertyDto basicOutputAdapterPropertyDto = + new BasicOutputAdapterPropertyDto(); + basicOutputAdapterPropertyDto.setKey(adapterProperties.get(i).getKey()); + basicOutputAdapterPropertyDto.setValue(adapterProperties.get(i).getValue()); + basicOutputAdapterPropertyDtos[i] = basicOutputAdapterPropertyDto; + } + return basicOutputAdapterPropertyDtos; + } + + private org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto[] addPublisherMappingToDto + (List mapProperties) { + org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto[] eventMappingPropertyDtos + = new org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto[mapProperties.size()]; + for (int i = 0; i < mapProperties.size(); i++) { + org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto eventMappingPropertyDto + = new org.wso2.carbon.event.publisher.stub.types.EventMappingPropertyDto(); + eventMappingPropertyDto.setName(mapProperties.get(i).getName()); + eventMappingPropertyDto.setType(mapProperties.get(i).getType()); + eventMappingPropertyDto.setValueOf(mapProperties.get(i).getValueOf()); + eventMappingPropertyDtos[i] = eventMappingPropertyDto; + } + return eventMappingPropertyDtos; + } + + private void cleanup(Stub stub) { + if (stub != null) { + try { + stub.cleanup(); + } catch (AxisFault axisFault) { + log.warn("Failed to clean the stub " + stub.getClass()); + } + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/util/DeviceMgtAPIUtils.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/util/DeviceMgtAPIUtils.java index a795fca1a54..60ddb958524 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/util/DeviceMgtAPIUtils.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/util/DeviceMgtAPIUtils.java @@ -56,6 +56,7 @@ import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderService; import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.EventAttributeList; import org.wso2.carbon.device.mgt.jaxrs.service.impl.util.InputValidationException; +import org.wso2.carbon.event.processor.stub.EventProcessorAdminServiceStub; import org.wso2.carbon.event.publisher.stub.EventPublisherAdminServiceStub; import org.wso2.carbon.event.receiver.stub.EventReceiverAdminServiceStub; import org.wso2.carbon.event.stream.stub.EventStreamAdminServiceStub; @@ -109,6 +110,7 @@ public class DeviceMgtAPIUtils { private static final String EVENT_PUBLISHER_CONTEXT = "EventPublisherAdminService/"; private static final String EVENT_STREAM_CONTEXT = "EventStreamAdminService/"; private static final String EVENT_PERSISTENCE_CONTEXT = "EventStreamPersistenceAdminService/"; + private static final String EVENT_PROCESSOR_CONTEXT = "EventProcessorAdminService"; private static final String AUTHORIZATION_HEADER = "Authorization"; private static final String AUTHORIZATION_HEADER_VALUE = "Bearer"; public static final String DAS_PORT = "${iot.analytics.https.port}"; @@ -637,6 +639,49 @@ public class DeviceMgtAPIUtils { return eventStreamPersistenceAdminServiceStub; } + /** + * + * @return + * @throws AxisFault + * @throws UserStoreException + * @throws JWTClientException + */ + public static EventProcessorAdminServiceStub getEventProcessorAdminServiceStub() + throws AxisFault, UserStoreException, JWTClientException { + // Send alert to event-processing + EventProcessorAdminServiceStub eventProcessorAdminServiceStub = new EventProcessorAdminServiceStub( + Utils.replaceSystemProperty(DAS_ADMIN_SERVICE_EP + EVENT_PROCESSOR_CONTEXT)); + Options eventProcessorOption = eventProcessorAdminServiceStub._getServiceClient().getOptions(); + if (eventProcessorOption == null) { + eventProcessorOption = new Options(); + } + // Get the tenant Domain + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm() + .getRealmConfiguration().getAdminUserName() + "@" + tenantDomain; + // Create the SSL context with the loaded TrustStore/keystore. + JWTClient jwtClient = getJWTClientManagerService().getJWTClient(); + + String authValue = AUTHORIZATION_HEADER_VALUE + " " + new String(Base64.encodeBase64( + jwtClient.getJwtToken(username).getBytes())); + + List
list = new ArrayList<>(); + Header httpHeader = new Header(); + httpHeader.setName(AUTHORIZATION_HEADER); + httpHeader.setValue(authValue); + list.add(httpHeader);//"https" + + eventProcessorOption.setProperty(HTTPConstants.HTTP_HEADERS, list); + eventProcessorOption.setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER + , new Protocol(DEFAULT_HTTP_PROTOCOL + , (ProtocolSocketFactory) new SSLProtocolSocketFactory(sslContext) + , Integer.parseInt(Utils.replaceSystemProperty(DAS_PORT)))); + + eventProcessorAdminServiceStub._getServiceClient().setOptions(eventProcessorOption); + return eventProcessorAdminServiceStub; + } + /** * This method is used to create the Cache that holds the event definition of the device type.. * diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/webapp/WEB-INF/cxf-servlet.xml b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/webapp/WEB-INF/cxf-servlet.xml index 7a2013037a5..6bdbfcb53fd 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/webapp/WEB-INF/cxf-servlet.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -46,6 +46,7 @@ + @@ -93,6 +94,7 @@ +