diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java index 54d68e7baa4..cb7183266ec 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java @@ -44,6 +44,9 @@ public class APIUtil { private static final String DEFAULT_CDMF_API_TAG = "device_management"; private static final String DEFAULT_AGENT_API_TAG = "device_agent"; private static final String DEFAULT_CERT_API_TAG = "scep_management"; + private static final String DEFAULT_ANALYTICS_ARTIFACT_TAG = "analytics_artifacts_management"; + + public static final String PERMISSION_PROPERTY_NAME = "name"; public static String getAuthenticatedUser() { @@ -108,6 +111,7 @@ public class APIUtil { allowedApisTags.add(DEFAULT_CDMF_API_TAG); allowedApisTags.add(DEFAULT_CERT_API_TAG); allowedApisTags.add(DEFAULT_AGENT_API_TAG); + allowedApisTags.add(DEFAULT_ANALYTICS_ARTIFACT_TAG); return allowedApisTags; } 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..f3d3bcb639f --- /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,68 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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..5c0b820f412 --- /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,61 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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..3984b23065e --- /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,103 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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..4457da1c2a6 --- /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,43 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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..413be9fd907 --- /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,30 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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..e112782a641 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 @@ -1,20 +1,19 @@ /* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) 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 + * Entgra (pvt) Ltd. 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. + * 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; @@ -22,14 +21,14 @@ 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; 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/AttributeType.java index 23235612b93..1fde19f8a91 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/AttributeType.java @@ -1,32 +1,26 @@ /* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) 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 + * Entgra (pvt) Ltd. 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. + * 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; /** - * This hold the definition of the attribute type for the attributes. + * Attribute data types */ public enum AttributeType { STRING, LONG, BOOL, INT, FLOAT, DOUBLE; - - @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/DeviceTypeEvent.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/DeviceTypeEvent.java index 7ff162b357a..b8e07df6d54 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/DeviceTypeEvent.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/DeviceTypeEvent.java @@ -1,20 +1,19 @@ /* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) 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 + * Entgra (pvt) Ltd. 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. + * 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; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeList.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeList.java index fe9bd39e032..a80604bbe62 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeList.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventAttributeList.java @@ -1,20 +1,19 @@ /* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) 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 + * Entgra (pvt) Ltd. 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. + * 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; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventPublisher.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventPublisher.java new file mode 100644 index 00000000000..a7e7a1f84b8 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventPublisher.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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; + +public class EventPublisher { + @ApiModelProperty(value = "Publisher definition") + private String definition; + + public String getDefinition() { + return definition; + } + + public void setDefinition(String definition) { + this.definition = definition; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventReceiver.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventReceiver.java new file mode 100755 index 00000000000..dd0c00f8db5 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventReceiver.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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; + +public class EventReceiver { + @ApiModelProperty(value = "Stream definition") + private String definition; + + public String getDefinition() { + return definition; + } + + public void setDefinition(String definition) { + this.definition = definition; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventRecords.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventRecords.java index 0dacde38330..84589cd8917 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventRecords.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/EventRecords.java @@ -1,20 +1,19 @@ /* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) 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 + * Entgra (pvt) Ltd. 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. + * 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; 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..17100e75f2b --- /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,114 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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 com.sun.istack.NotNull; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotEmpty; + +import java.util.List; + +/** + * Stream definition + * Attributes : name, version, definition and attribute data + */ +public class EventStream { + @ApiModelProperty(value = "Stream name") + private String name; + @ApiModelProperty(value = "Stream version") + private String version; + @ApiModelProperty(value = "Stream nickName") + private String nickName; + @ApiModelProperty(value = "Stream description") + private String description; + @ApiModelProperty(value = "Meta attribute list") + private List metaData; + @ApiModelProperty(value = "Correlation attribute list") + private List correlationData; + @ApiModelProperty(value = "Payload attribute list") + private List payloadData; + @ApiModelProperty(value = "Stream definition") @NotNull @NotEmpty + private String definition; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getMetaData() { + return metaData; + } + + public void setMetaData( + List metaData) { + this.metaData = metaData; + } + + public List getCorrelationData() { + return correlationData; + } + + public void setCorrelationData( + List correlationData) { + this.correlationData = correlationData; + } + + public List getPayloadData() { + return payloadData; + } + + public void setPayloadData( + List payloadData) { + this.payloadData = payloadData; + } + + public String getDefinition() { + return definition; + } + + public void setDefinition(String definition) { + this.definition = definition; + } +} 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..1fbbc600643 --- /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,58 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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..f1ef70de918 --- /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,30 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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..597a932516f --- /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,37 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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 : Plan data. + */ +public class SiddhiExecutionPlan { + @ApiModelProperty(value = "Execution plan definition") + private String definition; + + public String getDefinition() { + return definition; + } + + public void setDefinition(String definition) { + this.definition = definition; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/TransportType.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/TransportType.java index 58eae4e6165..abf6122459f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/TransportType.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/analytics/TransportType.java @@ -1,20 +1,19 @@ /* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) 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 + * Entgra (pvt) Ltd. 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. + * 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; 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..c366b37ef4b --- /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,47 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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; + +import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; +import org.wso2.carbon.device.mgt.jaxrs.util.Constants; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +public class InvalidExecutionPlanException extends WebApplicationException { + private String message; + private static final long serialVersionUID = 7583096344745990515L; + + public InvalidExecutionPlanException(ErrorResponse error) { + super(Response.status(Response.Status.NOT_FOUND).entity(error).build()); + } + + public InvalidExecutionPlanException(ErrorDTO errorDTO) { + super(Response.status(Response.Status.NOT_FOUND) + .entity(errorDTO) + .header(Constants.DeviceConstants.HEADER_CONTENT_TYPE, Constants.DeviceConstants.APPLICATION_JSON) + .build()); + message = errorDTO.getDescription(); + } + + @Override + public String getMessage() { + return message; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsArtifactsManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsArtifactsManagementService.java new file mode 100644 index 00000000000..260ec66a11f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsArtifactsManagementService.java @@ -0,0 +1,454 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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 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.beans.analytics.EventPublisher; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.EventReceiver; +import org.wso2.carbon.device.mgt.jaxrs.util.Constants; + +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 javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; +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 = "AnalyticsArtifactsManagement"), + @ExtensionProperty(name = "context", value = "/api/device-mgt/v1.0/analytics/artifacts"), + }) + } + ), + tags = { + @Tag(name = "analytics_artifacts_management", description = "") + } +) +@Scopes( + scopes = { + @Scope( + name = "Create Event Stream Artifact", + description = "Create Event Stream Artifact", + key = "perm:analytics:artifacts:stream", + permissions = {"/device-mgt/analytics/artifacts/stream/add"} + ), + @Scope( + name = "Create Event Receiver Artifact", + description = "Create Event Receiver Artifact", + key = "perm:analytics:artifacts:receiver", + permissions = {"/device-mgt/analytics/artifacts/receiver/add"} + ), + @Scope( + name = "Create Event Publisher Artifact", + description = "Create Event Publisher Artifact", + key = "perm:analytics:artifacts:publisher", + permissions = {"/device-mgt/analytics/artifacts/publisher/add"} + ), + @Scope( + name = "Create Siddhi Script Artifact", + description = "Create Siddhi Script Artifact", + key = "perm:analytics:artifacts:siddhi", + permissions = {"/device-mgt/analytics/artifacts/siddhi-script/add"} + ) + } +) + +@Path("/analytics/artifacts") +@Api(value = "Analytics Artifacts Management", description = "This API corresponds to services" + + " related to Analytics Artifacts management") +public interface AnalyticsArtifactsManagementService { + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/stream/{id}") + @ApiOperation( + httpMethod = "POST", + value = "Create Event Stream Artifact as String", + notes = "Deploy a Json Stream Artifact in Analytics server.", + tags = "Analytics Artifacts Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:artifacts:stream") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deployed the Stream Artifact.", + 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 deploying the " + + "Stream Artifact.", + response = ErrorResponse.class) + } + ) + Response deployEventDefinitionAsString(@PathParam("id") String id, + @QueryParam("isEdited") boolean isEdited, + @Valid EventStream stream); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/stream") + @ApiOperation( + httpMethod = "POST", + value = "Create Event Stream Artifact as DTO", + notes = "Deploy a Json Stream Artifact in Analytics server.", + tags = "Analytics Artifacts Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:artifacts:stream") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deployed the Stream Artifact.", + 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 deploying the " + + "Stream Artifact.", + response = ErrorResponse.class) + } + ) + Response deployEventDefinitionAsDto(@Valid EventStream stream); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/receiver/{name}") + @ApiOperation( + httpMethod = "POST", + value = "Create Event Receiver Artifact as String", + notes = "Deploy a XML Event Receiver Artifact in Analytics server.", + tags = "Analytics Artifacts Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:artifacts:receiver") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deployed the Receiver Artifact.", + 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 deploying the " + + "Event Receiver Artifact.", + response = ErrorResponse.class) + } + ) + Response deployEventReceiverAsString(@PathParam("name") String name, + @QueryParam("isEdited") boolean isEdited, + @Valid EventReceiver receiver); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/receiver") + @ApiOperation( + httpMethod = "POST", + value = "Create Event Receiver Artifact as DTO", + notes = "Deploy a JSON Event Receiver Artifact in Analytics server.", + tags = "Analytics Artifacts Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:artifacts:receiver") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deployed the Receiver Artifact.", + 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 deploying the " + + "Event Receiver Artifact.", + response = ErrorResponse.class) + } + ) + Response deployEventReceiverAsDto(@Valid Adapter receiver); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/publisher/{name}") + @ApiOperation( + httpMethod = "POST", + value = "Create Event Publisher Artifact as String", + notes = "Deploy a XML Event Publisher Artifact in Analytics server.", + tags = "Analytics Artifacts Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:artifacts:publisher") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deployed the Publisher Artifact.", + 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 deploying the " + + "Event Publisher Artifact.", + response = ErrorResponse.class) + } + ) + Response deployEventPublisherAsString(@PathParam("name") String name, + @QueryParam("isEdited") boolean isEdited, + @Valid EventPublisher publisher); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/publisher") + @ApiOperation( + httpMethod = "POST", + value = "Create Event Publisher Artifact as DTO", + notes = "Deploy a JSON Event Publisher Artifact in Analytics server.", + tags = "Analytics Artifacts Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:artifacts:publisher") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deployed the Publisher Artifact.", + 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 deploying the " + + "Event Publisher Artifact.", + response = ErrorResponse.class) + } + ) + Response deployEventPublisherAsDto(@Valid Adapter publisher); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/siddhi-script/{name}") + @ApiOperation( + httpMethod = "POST", + value = "Create Siddhi Script Artifact as String", + notes = "Deploy a SiddhiQL Siddhi script Artifact in Analytics server.", + tags = "Analytics Artifacts Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:analytics:artifacts:siddhi") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deployed the Siddhi script Artifact.", + 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 " + + "deploying the Siddhi script Artifact.", + response = ErrorResponse.class) + } + ) + Response deploySiddhiExecutableScript( + @PathParam("name") String name, @QueryParam("isEdited") boolean isEdited, + @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/api/DeviceEventManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceEventManagementService.java index 26904a9cdff..c49f9698c1b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceEventManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceEventManagementService.java @@ -123,6 +123,7 @@ public interface DeviceEventManagementService { Response deployDeviceTypeEventDefinition(@ApiParam(name = "type", value = "The device type, such as android, ios," + " and windows.", required = false) @PathParam("type")String deviceType, + @QueryParam("skipPersist")boolean skipPersist, @ApiParam(name = "deviceTypeEvent", value = "Add the data to complete " + "the DeviceTypeEvent object.", required = true) @Valid DeviceTypeEvent deviceTypeEvent); @@ -357,7 +358,7 @@ public interface DeviceEventManagementService { @QueryParam("max") double max ); - + @GET @Path("/{type}") @ApiOperation( @@ -411,4 +412,4 @@ public interface DeviceEventManagementService { " ios, or windows.", required = false) @PathParam("type")String deviceType) ; -} \ No newline at end of file +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsArtifactsManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsArtifactsManagementServiceImpl.java new file mode 100644 index 00000000000..21583f0f281 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsArtifactsManagementServiceImpl.java @@ -0,0 +1,724 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. 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.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.beans.analytics.EventPublisher; +import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.EventReceiver; +import org.wso2.carbon.device.mgt.jaxrs.exception.ErrorDTO; +import org.wso2.carbon.device.mgt.jaxrs.exception.InvalidExecutionPlanException; +import org.wso2.carbon.device.mgt.jaxrs.service.api.AnalyticsArtifactsManagementService; +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.util.DeviceMgtAPIUtils; +import org.wso2.carbon.event.processor.stub.EventProcessorAdminServiceStub; +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 org.apache.axis2.AxisFault; +import org.apache.axis2.client.Stub; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.validation.Valid; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Response; +import java.nio.charset.StandardCharsets; +import java.rmi.RemoteException; +import java.util.List; + +/** + * This class is used to create endpoints to serve the deployment of streams, publishers, receivers, + * siddhi scripts to the Analytics server as Artifacts + */ +@Path("/analytics/artifacts") +public class AnalyticsArtifactsManagementServiceImpl implements AnalyticsArtifactsManagementService { + private static final Log log = LogFactory.getLog(AnalyticsArtifactsManagementServiceImpl.class); + + /** + * @param stream EventStream object with the properties of the stream + * @return A status code depending on the code result + * Function - Used to deploy stream as an artifact using a String + */ + @Override + @POST + @Path("/stream/{id}") + public Response deployEventDefinitionAsString(@PathParam("id") String id, + @QueryParam("isEdited") boolean isEdited, + @Valid EventStream stream) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + EventStreamAdminServiceStub eventStreamAdminServiceStub = null; + try { + String streamDefinition = new String(stream.getDefinition().getBytes(), StandardCharsets.UTF_8); + eventStreamAdminServiceStub = DeviceMgtAPIUtils.getEventStreamAdminServiceStub(); + if (!isEdited) { + eventStreamAdminServiceStub.addEventStreamDefinitionAsString(streamDefinition); + } else { + // Find and edit stream + if (eventStreamAdminServiceStub.getStreamDetailsForStreamId(id) != null) { + eventStreamAdminServiceStub.editEventStreamDefinitionAsString(streamDefinition, id); + } + } + 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(); + } finally { + cleanup(eventStreamAdminServiceStub); + } + } + + /** + * @param stream EventStream object with the properties of the stream + * @return A status code depending on the code result + * Function - Used to deploy stream as an artifact using a DTO + */ + @Override + @POST + @Path("/stream") + public Response deployEventDefinitionAsDto(@Valid EventStream stream) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + // Categorize attributes to three lists depending on their type + List metaData = stream.getMetaData(); + List payloadData = stream.getPayloadData(); + List correlationData = stream.getCorrelationData(); + + try { + /* Conditions + * - At least one list should always be not null + */ + if (metaData == null && correlationData == null && payloadData == null) { + log.error("Invalid payload: event attributes"); + return Response.status(Response.Status.BAD_REQUEST).build(); + + } else { + // Publish the event stream + publishStream(stream, metaData, correlationData, payloadData); + 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 name Receiver name + * @param isEdited If receiver is created or edited + * @param receiver Receiver object with the properties of the receiver + * @return A status code depending on the code result + * Function - Used to deploy receiver as an artifact using a String + */ + @Override + @POST + @Path("/receiver/{name}") + public Response deployEventReceiverAsString(@PathParam("name") String name, + @QueryParam("isEdited") boolean isEdited, + @Valid EventReceiver receiver) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + EventReceiverAdminServiceStub eventReceiverAdminServiceStub; + try { + String receiverDefinition = receiver.getDefinition(); + eventReceiverAdminServiceStub = DeviceMgtAPIUtils.getEventReceiverAdminServiceStub(); + if (!isEdited) { + eventReceiverAdminServiceStub.deployEventReceiverConfiguration(receiverDefinition); + } else { + eventReceiverAdminServiceStub.editActiveEventReceiverConfiguration(receiverDefinition, name); + } + } 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(); + } + return Response.ok().entity(name).build(); + } + + /** + * @param receiver Receiver object with the properties of the receiver + * @return A status code depending on the code result + * Function - Used to deploy receiver as an artifact using a DTO + */ + @Override + @POST + @Path("/receiver") + public Response deployEventReceiverAsDto(@Valid 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) { + String errMsg = "Invalid mapping payload"; + log.error(errMsg); + return Response.status(Response.Status.BAD_REQUEST).entity(errMsg).build(); + } + String eventStreamWithVersion = receiver.getEventStreamWithVersion(); + + publishReceiver(receiverName, adapterType, adapterProperties, customMapping, inputMappingProperties, + namespaceMappingProperties, correlationMappingProperties, payloadMappingProperties, + metaMappingProperties, messageFormat, eventStreamWithVersion); + 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 name Publisher name + * @param isEdited If receiver is created or edited + * @param publisher Publisher object with the properties of the publisher + * @return A status code depending on the code result + * Function - Used to deploy publisher as an artifact using a String + */ + @Override + @POST + @Path("/publisher/{name}") + public Response deployEventPublisherAsString(@PathParam("name") String name, + @QueryParam("isEdited") boolean isEdited, + @Valid EventPublisher publisher) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + EventPublisherAdminServiceStub eventPublisherAdminServiceStub; + + try { + String publisherDefinition = publisher.getDefinition(); + + eventPublisherAdminServiceStub = DeviceMgtAPIUtils.getEventPublisherAdminServiceStub(); + if (!isEdited) { + eventPublisherAdminServiceStub.deployEventPublisherConfiguration(publisherDefinition); + } else { + eventPublisherAdminServiceStub.editActiveEventPublisherConfiguration(publisherDefinition, name); + } + } 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(); + } + return Response.ok().entity(publisher).build(); + } + + /** + * @param publisher Publisher object with the properties of the publisher + * @return A status code depending on the code result + * Function - Used to deploy publisher as an artifact using a DTO + */ + @Override + @POST + @Path("/publisher") + public Response deployEventPublisherAsDto(@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) { + String errMsg = "Invalid mapping payload"; + log.error(errMsg); + return Response.status(Response.Status.BAD_REQUEST).entity(errMsg).build(); + } + String eventStreamWithVersion = publisher.getEventStreamWithVersion(); + + publishPublisher(publisherName, adapterType, adapterProperties, customMapping + , inputMappingString, inputMappingProperties, correlationMappingProperties + , payloadMappingProperties, metaMappingProperties, messageFormat + , eventStreamWithVersion); + 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 name Siddhi plan name + * @param isEdited If receiver is created or edited + * @param plan Siddhi plan definition + * @return a status code depending on the code execution + * Function - Used to deploy Siddhi script as an artifact using a String + */ + @Override + @POST + @Path("/siddhi-script/{name}") + public Response deploySiddhiExecutableScript(@PathParam("name") String name, + @QueryParam("isEdited") boolean isEdited, + @Valid SiddhiExecutionPlan plan) { + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + try { + publishSiddhiExecutionPlan(name, isEdited, plan.getDefinition()); + 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 (InvalidExecutionPlanException e) { + log.error("Invalid Execution plan: " + tenantDomain, e); + return e.getResponse(); + } 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 stream Stream definition + * @param metaData Meta attributes of the stream + * @param correlationData Correlation attributes of the stream + * @param payloadData Payload 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(EventStream stream, List metaData, + List correlationData, List payloadData) + throws RemoteException, UserStoreException, JWTClientException { + EventStreamAdminServiceStub eventStreamAdminServiceStub = + DeviceMgtAPIUtils.getEventStreamAdminServiceStub(); + try { + EventStreamDefinitionDto eventStreamDefinitionDto = new EventStreamDefinitionDto(); + eventStreamDefinitionDto.setName(stream.getName()); + eventStreamDefinitionDto.setVersion(stream.getVersion()); + eventStreamDefinitionDto.setNickName(stream.getNickName()); + eventStreamDefinitionDto.setDescription(stream.getDescription()); + eventStreamDefinitionDto.setMetaData(addEventAttributesToDto(metaData)); + eventStreamDefinitionDto.setPayloadData(addEventAttributesToDto(payloadData)); + eventStreamDefinitionDto.setCorrelationData(addEventAttributesToDto(correlationData)); + String streamId = stream.getName() + ":" + stream.getVersion(); + 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 name plan name + * @param isEdited is plan edited + * @param plan plan data + * @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 name, boolean isEdited, + String plan) + throws RemoteException, UserStoreException, JWTClientException, + InvalidExecutionPlanException { + EventProcessorAdminServiceStub eventProcessorAdminServiceStub = null; + try { + eventProcessorAdminServiceStub = DeviceMgtAPIUtils.getEventProcessorAdminServiceStub(); + // Validate the plan code + String validationResponse = eventProcessorAdminServiceStub.validateExecutionPlan(plan); + if (validationResponse.equals("success")) { + if (!isEdited) { + // Create a new plan + eventProcessorAdminServiceStub.deployExecutionPlan(plan); + } else { + // Edit plan + eventProcessorAdminServiceStub.editActiveExecutionPlan(plan, name); + } + } else { + ErrorDTO errorDTO = new ErrorDTO(); + errorDTO.setMessage(validationResponse); + throw new InvalidExecutionPlanException(errorDTO); + } + } 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/service/impl/DeviceEventManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceEventManagementServiceImpl.java index 2bbcee2d43a..b33d044d22a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceEventManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceEventManagementServiceImpl.java @@ -106,7 +106,9 @@ public class DeviceEventManagementServiceImpl implements DeviceEventManagementSe List recordIds = getRecordIds(resultEntries); AnalyticsDataResponse response = analyticsDataAPI.get(tenantId, tableName, 1, null, recordIds); eventRecords.setCount(eventCount); - eventRecords.setList(AnalyticsDataAPIUtil.listRecords(analyticsDataAPI, response)); + List records = AnalyticsDataAPIUtil.listRecords(analyticsDataAPI, response); + records.sort((Record r1, Record r2) -> Long.compare(r2.getTimestamp(), r1.getTimestamp())); + eventRecords.setList(records); return eventRecords; } @@ -192,6 +194,7 @@ public class DeviceEventManagementServiceImpl implements DeviceEventManagementSe @Path("/{type}") @Override public Response deployDeviceTypeEventDefinition(@PathParam("type") String deviceType, + @QueryParam("skipPersist") boolean skipPersist, @Valid DeviceTypeEvent deviceTypeEvent) { TransportType transportType = deviceTypeEvent.getTransportType(); EventAttributeList eventAttributes = deviceTypeEvent.getEventAttributeList(); @@ -208,7 +211,9 @@ public class DeviceEventManagementServiceImpl implements DeviceEventManagementSe String streamNameWithVersion = streamName + ":" + Constants.DEFAULT_STREAM_VERSION; publishStreamDefinitons(streamName, Constants.DEFAULT_STREAM_VERSION, deviceType, eventAttributes); publishEventReceivers(streamNameWithVersion, transportType, tenantDomain, deviceType); - publishEventStore(streamName, Constants.DEFAULT_STREAM_VERSION, eventAttributes); + if (!skipPersist) { + publishEventStore(streamName, Constants.DEFAULT_STREAM_VERSION, eventAttributes); + } publishWebsocketPublisherDefinition(streamNameWithVersion, deviceType); try { PrivilegedCarbonContext.startTenantFlow(); 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..2b05778e685 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,41 @@ public class DeviceMgtAPIUtils { return eventStreamPersistenceAdminServiceStub; } + public static EventProcessorAdminServiceStub getEventProcessorAdminServiceStub() + throws AxisFault, UserStoreException, JWTClientException { + 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..f08b6ebda1e 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 @@ + @@ -101,4 +103,4 @@ - \ No newline at end of file + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.analytics-view/public/js/device.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.analytics-view/public/js/device.js index e7a216dd3e6..e18af314333 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.analytics-view/public/js/device.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.default.device.type.analytics-view/public/js/device.js @@ -45,7 +45,14 @@ function drawTable(from, to) { order: [], ajax: { url: "/devicemgt/api/stats/paginate", - data: buildAjaxData + data: buildAjaxData, + dataSrc: function(json) { + return json.data.map(function(event) { + event[0] = new moment(event[0]). + format("YYYY-MM-DD HH:mm:ss.SSS"); + return event; + }) + } } }); } @@ -71,4 +78,4 @@ function buildAjaxData (){ return obj; -} \ No newline at end of file +} diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql index b4edb116094..7d0cff55563 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql @@ -8,6 +8,15 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( PRIMARY KEY (ID) ); +CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE ( + ID INTEGER auto_increment NOT NULL, + SERIAL_NUMBER VARCHAR(500) DEFAULT NULL, + CERTIFICATE BLOB DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + USERNAME VARCHAR(500) DEFAULT NULL, + PRIMARY KEY (ID) +); + CREATE TABLE IF NOT EXISTS DM_GROUP ( ID INTEGER AUTO_INCREMENT NOT NULL, GROUP_NAME VARCHAR(100) DEFAULT NULL, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql index bcb80732180..4a3882f06a6 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql @@ -10,6 +10,16 @@ CREATE TABLE DM_DEVICE_TYPE ( CONSTRAINT DEVICE_TYPE_NAME UNIQUE(NAME, PROVIDER_TENANT_ID) ); +IF NOT EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[DM_DEVICE_CERTIFICATE]') AND TYPE IN (N'U')) +CREATE TABLE DM_DEVICE_CERTIFICATE ( + ID INTEGER IDENTITY(1,1) NOT NULL, + SERIAL_NUMBER VARCHAR(500) DEFAULT NULL, + CERTIFICATE VARBINARY(max) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + USERNAME VARCHAR(500) DEFAULT NULL, +PRIMARY KEY (ID) +); + IF NOT EXISTS (SELECT * FROM SYS.INDEXES WHERE NAME = 'IDX_DEVICE_TYPE' AND OBJECT_ID = OBJECT_ID('DM_DEVICE_TYPE')) CREATE INDEX IDX_DEVICE_TYPE ON DM_DEVICE_TYPE (NAME, PROVIDER_TENANT_ID); diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql index df2a6fbb4c0..9d1f0bd4e45 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql @@ -12,6 +12,15 @@ CREATE INDEX IDX_DEVICE_TYPE ON DM_DEVICE_TYPE (NAME, PROVIDER_TENANT_ID); CREATE INDEX IDX_DEVICE_NAME ON DM_DEVICE_TYPE (NAME); CREATE INDEX IDX_DEVICE_TYPE_DEVICE_NAME ON DM_DEVICE_TYPE(ID, NAME); +CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE ( + ID INTEGER auto_increment NOT NULL, + SERIAL_NUMBER VARCHAR(500) DEFAULT NULL, + CERTIFICATE BLOB DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + USERNAME VARCHAR(500) DEFAULT NULL, + PRIMARY KEY (ID) +)ENGINE = InnoDB; + CREATE TABLE IF NOT EXISTS DM_GROUP ( ID INTEGER AUTO_INCREMENT NOT NULL, GROUP_NAME VARCHAR(100) DEFAULT NULL, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql index 847c86d87f8..9b5cc5dc1b3 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql @@ -23,6 +23,27 @@ WHEN (NEW.ID IS NULL) END; / +CREATE TABLE DM_DEVICE_CERTIFICATE ( + ID NUMBER(10) NOT NULL, + SERIAL_NUMBER VARCHAR2(500) DEFAULT NULL, + CERTIFICATE BLOB DEFAULT NULL, + TENANT_ID NUMBER(10) DEFAULT 0, + USERNAME VARCHAR2(500) DEFAULT NULL, + PRIMARY KEY (ID) +) +/ + +-- Generate ID using sequence and trigger +CREATE SEQUENCE DM_DEVICE_CERTIFICATE_seq START WITH 1 INCREMENT BY 1 NOCACHE +/ +CREATE OR REPLACE TRIGGER DM_DEVICE_CERTIFICATE_seq_tr +BEFORE INSERT ON DM_DEVICE_CERTIFICATE FOR EACH ROW +WHEN (NEW.ID IS NULL) + BEGIN + SELECT DM_DEVICE_CERTIFICATE_seq.NEXTVAL INTO :NEW.ID FROM DUAL; + END; +/ + CREATE TABLE DM_GROUP ( ID NUMBER(10) NOT NULL, DESCRIPTION CLOB DEFAULT NULL, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql index e9b4e75efff..02d717f7e9b 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql @@ -8,6 +8,14 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( UNIQUE(NAME, PROVIDER_TENANT_ID) ); +CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE ( + ID BIGSERIAL NOT NULL PRIMARY KEY, + SERIAL_NUMBER VARCHAR(500) DEFAULT NULL, + CERTIFICATE BYTEA DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + USERNAME VARCHAR(500) DEFAULT NULL +); + CREATE TABLE IF NOT EXISTS DM_GROUP ( ID BIGSERIAL NOT NULL PRIMARY KEY, GROUP_NAME VARCHAR(100) DEFAULT NULL,