diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml new file mode 100644 index 0000000000..4271f6a815 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml @@ -0,0 +1,119 @@ + + + + + apimgt-extensions + org.wso2.carbon.devicemgt + 5.0.21-SNAPSHOT + + + 4.0.0 + io.entgra.device.mgt.core.apimgt.analytics.extension + bundle + Entgra - API mgt analytics extension + http://wso2.org + + + + org.wso2.carbon + org.wso2.carbon.core + + + org.wso2.carbon + org.wso2.carbon.utils + + + org.apache.velocity + velocity + 1.7 + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/Abstract* + + + + + org.apache.felix + maven-scr-plugin + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + ${carbon.device.mgt.version} + API Management Application Bundle + org.wso2.carbon.apimgt.application.extension.internal + + io.entgra.device.mgt.core.apimgt.analytics.extension.dto, + org.apache.velocity, + org.apache.velocity.app, + org.apache.velocity.context, + org.wso2.carbon.utils;version="[4.6,5)" + + + io.entgra.device.mgt.core.apimgt.analytics.extension.* + + + scribe;scope=compile|runtime;inline=false; + + + + + + org.jacoco + jacoco-maven-plugin + + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/site + + + + + + + + diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/AnalyticsArtifactsDeployer.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/AnalyticsArtifactsDeployer.java new file mode 100644 index 0000000000..fcd197bb0e --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/AnalyticsArtifactsDeployer.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension; + +import io.entgra.device.mgt.core.apimgt.analytics.extension.dto.EventPublisherData; +import io.entgra.device.mgt.core.apimgt.analytics.extension.dto.EventReceiverData; +import io.entgra.device.mgt.core.apimgt.analytics.extension.dto.EventStreamData; +import io.entgra.device.mgt.core.apimgt.analytics.extension.dto.MetaData; +import io.entgra.device.mgt.core.apimgt.analytics.extension.exception.EventPublisherDeployerException; +import io.entgra.device.mgt.core.apimgt.analytics.extension.exception.EventReceiverDeployerException; +import io.entgra.device.mgt.core.apimgt.analytics.extension.exception.EventStreamDeployerException; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; + +import org.apache.velocity.runtime.RuntimeConstants; +import org.wso2.carbon.utils.CarbonUtils; +import org.wso2.carbon.utils.multitenancy.MultitenantConstants; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; + +public class AnalyticsArtifactsDeployer { + + public static final String TEMPLATE_LOCATION = "repository" + File.separator + "resources" + File.separator + "iot-analytics-templates"; + public static final String EVENT_STREAM_LOCATION = "eventstreams"; + public static final String EVENT_PUBLISHER_LOCATION = "eventpublishers"; + public static final String EVENT_RECEIVER_LOCATION = "eventreceivers"; + public static final String EVENT_STREAM_TEMPLATE = TEMPLATE_LOCATION + File.separator + "event_stream.json.template"; + public static final String EVENT_PUBLISHER_TEMPLATE = TEMPLATE_LOCATION + File.separator + "event_publisher.xml.template"; + public static final String EVENT_RECEIVER_TEMPLATE = TEMPLATE_LOCATION + File.separator + "event_receiver.xml.template"; + + + public void deployEventStream(EventStreamData eventStreamData, int tenantId) throws EventStreamDeployerException { + try { + VelocityEngine ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, CarbonUtils.getCarbonHome()); + ve.init(); + Template template = ve.getTemplate(EVENT_STREAM_TEMPLATE); + + VelocityContext context = populateContextForEventStreams(eventStreamData); + StringWriter writer = new StringWriter(); + template.merge(context, writer); + + String fileName = eventStreamData.getName() + "_" + eventStreamData.getVersion() + ".json"; + String fileLocation = null; + if (MultitenantConstants.SUPER_TENANT_ID == tenantId) { + fileLocation = CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + "deployment" + + File.separator + "server" + File.separator + EVENT_STREAM_LOCATION + File.separator + fileName; + } else { + fileLocation = CarbonUtils.getCarbonTenantsDirPath() + File.separator + tenantId + File.separator + + EVENT_STREAM_LOCATION + File.separator + fileName; + } + + PrintWriter printWriter = new PrintWriter(fileLocation, "UTF-8"); + printWriter.println(writer.toString()); + printWriter.close(); + } catch (FileNotFoundException | UnsupportedEncodingException e) { + throw new EventStreamDeployerException("Error while persisting event stream definition ", e); + } + } + + public void deployEventPublisher(EventPublisherData eventPublisherData, int tenantId) throws EventPublisherDeployerException { + try { + VelocityEngine ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, CarbonUtils.getCarbonHome()); + ve.init(); + Template template = ve.getTemplate(EVENT_PUBLISHER_TEMPLATE); + + VelocityContext context = populateContextForEventPublisher(eventPublisherData); + StringWriter writer = new StringWriter(); + template.merge(context, writer); + + String fileName = eventPublisherData.getName() + ".xml"; + String fileLocation = null; + if (MultitenantConstants.SUPER_TENANT_ID == tenantId) { + fileLocation = CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + "deployment" + + File.separator + "server" + File.separator + EVENT_PUBLISHER_LOCATION + File.separator + fileName; + } else { + fileLocation = CarbonUtils.getCarbonTenantsDirPath() + File.separator + tenantId + File.separator + + EVENT_PUBLISHER_LOCATION + File.separator + fileName; + } + + PrintWriter printWriter = new PrintWriter(fileLocation, "UTF-8"); + printWriter.println(writer.toString()); + printWriter.close(); + } catch (FileNotFoundException | UnsupportedEncodingException e) { + throw new EventPublisherDeployerException("Error while persisting rdbms event publisher ", e); + } + } + + public void deployEventReceiver(EventReceiverData eventReceiverData, int tenantId) throws EventReceiverDeployerException { + try { + VelocityEngine ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, CarbonUtils.getCarbonHome()); + ve.init(); + Template template = ve.getTemplate(EVENT_RECEIVER_TEMPLATE); + + VelocityContext context = populateContextForEventReceiver(eventReceiverData); + StringWriter writer = new StringWriter(); + template.merge(context, writer); + + String fileName = eventReceiverData.getName() + ".xml"; + String fileLocation = null; + if (MultitenantConstants.SUPER_TENANT_ID == tenantId) { + fileLocation = CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + "deployment" + + File.separator + "server" + File.separator + EVENT_RECEIVER_LOCATION + File.separator + fileName; + } else { + fileLocation = CarbonUtils.getCarbonTenantsDirPath() + File.separator + tenantId + File.separator + + EVENT_RECEIVER_LOCATION + File.separator + fileName; + } + + PrintWriter printWriter = new PrintWriter(fileLocation, "UTF-8"); + printWriter.println(writer.toString()); + printWriter.close(); + } catch (FileNotFoundException | UnsupportedEncodingException e) { + throw new EventReceiverDeployerException("Error while persisting oauth mqtt event receiver ", e); + } + } + + private VelocityContext populateContextForEventStreams(EventStreamData eventStreamData) { + VelocityContext context = new VelocityContext(); + context.put("name", eventStreamData.getName()); + context.put("version", eventStreamData.getVersion()); + context.put("metaData", + eventStreamData.getMetaData() != null ? eventStreamData.getMetaData() : new MetaData("deviceId", "STRING")); + if (eventStreamData.getPayloadData() != null) { + context.put("properties", eventStreamData.getPayloadData()); + } + return context; + } + + private VelocityContext populateContextForEventPublisher(EventPublisherData eventPublisherData) { + VelocityContext context = new VelocityContext(); + + context.put("name", eventPublisherData.getName()); + context.put("streamName", eventPublisherData.getStreamName()); + context.put("streamVersion", eventPublisherData.getStreamVersion()); + context.put("properties", eventPublisherData.getPropertyList()); + context.put("eventAdapterType", eventPublisherData.getEventAdaptorType()); + context.put("customMappingType", eventPublisherData.getCustomMappingType()); + + return context; + } + + private VelocityContext populateContextForEventReceiver(EventReceiverData eventReceiverData) { + VelocityContext context = new VelocityContext(); + + context.put("name", eventReceiverData.getName()); + context.put("streamName", eventReceiverData.getStreamName()); + context.put("streamVersion", eventReceiverData.getStreamVersion()); + context.put("properties", eventReceiverData.getPropertyList()); + context.put("eventAdapterType", eventReceiverData.getEventAdapterType()); + context.put("customMappingType", eventReceiverData.getCustomMappingType()); + + return context; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventPublisherData.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventPublisherData.java new file mode 100644 index 0000000000..6d1620a5b9 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventPublisherData.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.dto; + +import java.util.List; + +public class EventPublisherData { + private String name; + private String streamVersion; + private String streamName; + + private List propertyList; + + private String eventAdaptorType; + + private String customMappingType; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getStreamVersion() { + return streamVersion; + } + + public void setStreamVersion(String streamVersion) { + this.streamVersion = streamVersion; + } + + public String getStreamName() { + return streamName; + } + + public void setStreamName(String streamName) { + this.streamName = streamName; + } + + public List getPropertyList() { + return propertyList; + } + + public void setPropertyList(List propertyList) { + this.propertyList = propertyList; + } + + public String getEventAdaptorType() { + return eventAdaptorType; + } + + public void setEventAdaptorType(String eventAdaptorType) { + this.eventAdaptorType = eventAdaptorType; + } + + public String getCustomMappingType() { + return customMappingType; + } + + public void setCustomMappingType(String customMappingType) { + this.customMappingType = customMappingType; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventReceiverData.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventReceiverData.java new file mode 100644 index 0000000000..764229c55a --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventReceiverData.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.dto; + +import java.util.List; + +public class EventReceiverData { + + private String name; + private String streamVersion; + private String streamName; + + private String eventAdapterType; + + List propertyList; + + private String customMappingType; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getStreamVersion() { + return streamVersion; + } + + public void setStreamVersion(String streamVersion) { + this.streamVersion = streamVersion; + } + + public String getStreamName() { + return streamName; + } + + public void setStreamName(String streamName) { + this.streamName = streamName; + } + + public String getEventAdapterType() { + return eventAdapterType; + } + + public void setEventAdapterType(String eventAdapterType) { + this.eventAdapterType = eventAdapterType; + } + + public List getPropertyList() { + return propertyList; + } + + public void setPropertyList(List propertyList) { + this.propertyList = propertyList; + } + + public String getCustomMappingType() { + return customMappingType; + } + + public void setCustomMappingType(String customMappingType) { + this.customMappingType = customMappingType; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventStreamData.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventStreamData.java new file mode 100644 index 0000000000..a80520bef4 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/EventStreamData.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.dto; + +import java.util.List; + +public class EventStreamData { + private String name; + private String version; + private MetaData metaData; + private List payloadData; + + 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 MetaData getMetaData() { + return metaData; + } + + public void setMetaData(MetaData metaData) { + this.metaData = metaData; + } + + public List getPayloadData() { + return payloadData; + } + + public void setPayloadData(List payloadData) { + this.payloadData = payloadData; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/MetaData.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/MetaData.java new file mode 100644 index 0000000000..ba77d04413 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/MetaData.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.dto; + +public class MetaData { + String name; + String type; + + public MetaData(String name, String type){ + this.setName(name); + this.setType(type); + } + + 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; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/Property.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/Property.java new file mode 100644 index 0000000000..995cf2c5a8 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/dto/Property.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.dto; + +public class Property { + String name; + String value; + + public Property(String name, String value){ + this.setName(name); + this.setValue(value); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventPublisherDeployerException.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventPublisherDeployerException.java new file mode 100644 index 0000000000..2f924d0e7b --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventPublisherDeployerException.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.exception; + +public class EventPublisherDeployerException extends Exception { + + private static final long serialVersionUID = -3151279311929070299L; + + public EventPublisherDeployerException(String msg, Exception nestedEx) { + super(msg, nestedEx); + } + + public EventPublisherDeployerException(String message, Throwable cause) { + super(message, cause); + } + + public EventPublisherDeployerException(String msg) { + super(msg); + } + + public EventPublisherDeployerException() { + super(); + } + + public EventPublisherDeployerException(Throwable cause) { + super(cause); + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventReceiverDeployerException.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventReceiverDeployerException.java new file mode 100644 index 0000000000..3e0d49e088 --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventReceiverDeployerException.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.exception; + +public class EventReceiverDeployerException extends Exception { + + private static final long serialVersionUID = -3151279311929070299L; + + public EventReceiverDeployerException(String msg, Exception nestedEx) { + super(msg, nestedEx); + } + + public EventReceiverDeployerException(String message, Throwable cause) { + super(message, cause); + } + + public EventReceiverDeployerException(String msg) { + super(msg); + } + + public EventReceiverDeployerException() { + super(); + } + + public EventReceiverDeployerException(Throwable cause) { + super(cause); + } +} diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventStreamDeployerException.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventStreamDeployerException.java new file mode 100644 index 0000000000..1bba4c8cfe --- /dev/null +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/src/main/java/io/entgra/device/mgt/core/apimgt/analytics/extension/exception/EventStreamDeployerException.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.device.mgt.core.apimgt.analytics.extension.exception; + +public class EventStreamDeployerException extends Exception { + + private static final long serialVersionUID = -3151279311929070298L; + + public EventStreamDeployerException(String msg, Exception nestedEx) { + super(msg, nestedEx); + } + + public EventStreamDeployerException(String message, Throwable cause) { + super(message, cause); + } + + public EventStreamDeployerException(String msg) { + super(msg); + } + + public EventStreamDeployerException() { + super(); + } + + public EventStreamDeployerException(Throwable cause) { + super(cause); + } +} diff --git a/components/apimgt-extensions/pom.xml b/components/apimgt-extensions/pom.xml index ba99795a04..f2426c980f 100644 --- a/components/apimgt-extensions/pom.xml +++ b/components/apimgt-extensions/pom.xml @@ -39,6 +39,7 @@ org.wso2.carbon.apimgt.annotations org.wso2.carbon.apimgt.keymgt.extension org.wso2.carbon.apimgt.keymgt.extension.api + io.entgra.device.mgt.core.apimgt.analytics.extension diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.extensions.logger/src/main/java/io/entgra/device/mgt/extensions/logger/spi/EntgraLogger.java b/components/device-mgt-extensions/io.entgra.device.mgt.extensions.logger/src/main/java/io/entgra/device/mgt/extensions/logger/spi/EntgraLogger.java index c959eb4885..2ffa6ffa8d 100644 --- a/components/device-mgt-extensions/io.entgra.device.mgt.extensions.logger/src/main/java/io/entgra/device/mgt/extensions/logger/spi/EntgraLogger.java +++ b/components/device-mgt-extensions/io.entgra.device.mgt.extensions.logger/src/main/java/io/entgra/device/mgt/extensions/logger/spi/EntgraLogger.java @@ -48,6 +48,22 @@ public interface EntgraLogger extends Log { void warn(Object object, Throwable t, LogContext logContext); + void info(String message, LogContext logContext); + + void debug(String message, LogContext logContext); + + void error(String message, LogContext logContext); + + void error(String message, Throwable t, LogContext logContext); + + void warn(String message, LogContext logContext); + + void warn(String message, Throwable t, LogContext logContext); + + void trace(String message, LogContext logContext); + + void fatal(String message, LogContext logContext); + void clearLogContext(); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml index f43128fc6c..f552c5aebf 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml @@ -450,5 +450,10 @@ org.wso2.carbon.event.output.adapter.rdbms provided + + org.wso2.carbon.devicemgt + io.entgra.device.mgt.core.apimgt.analytics.extension + provided + \ 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/api/DeviceManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceManagementService.java index 6a55207923..a080208de2 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/DeviceManagementService.java @@ -188,6 +188,13 @@ import java.util.List; roles = {"Internal/devicemgt-user"}, permissions = {"/device-mgt/devices/owning-device/add"} ), + @Scope( + name = "Viewing Enrollment Guide", + description = "Show enrollment guide to users", + key = "perm:devices:enrollment-guide:view", + roles = {"Internal/devicemgt-user"}, + permissions = {"/device-mgt/devices/enrollment-guide/view"} + ), } ) @Path("/devices") @@ -553,12 +560,12 @@ public interface DeviceManagementService { required = false, defaultValue = "0") @QueryParam("offset") int offset, - @ApiParam( - name = "limit", - value = "Provide how many device details you require from the starting pagination index/offset.", - required = false, - defaultValue = "100") - @QueryParam("limit") int limit + @ApiParam( + name = "limit", + value = "Provide how many device details you require from the starting pagination index/offset.", + required = false, + defaultValue = "100") + @QueryParam("limit") int limit ); @GET @@ -802,6 +809,59 @@ public interface DeviceManagementService { @QueryParam("requireDeviceInfo") boolean requireDeviceInfo); + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Path("/enrollment/guide") + @ApiOperation( + consumes = MediaType.MULTIPART_FORM_DATA, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Sending Enrollment Mode chosen by customer", + notes = "Enrollment mode selected and path is sent as parameters", + tags = "Device Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:enrollment-guide:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully mailed the Enrollment Guide of customer.", + response = Device.class, + 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. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while sending mail of the Enrollment Guide.", + response = ErrorResponse.class) + }) + Response sendEnrollmentGuide( + @ApiParam( + name = "enrolmentGuide", + value = "The details of the enrolment path suggested.", + required = true) + String enrolmentGuide); + @POST @Produces(MediaType.APPLICATION_JSON) @Path("/type/any/list") @@ -1475,15 +1535,15 @@ public interface DeviceManagementService { @ResponseHeader( name = "ETag", description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), + "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.")}), + "Used by caches, or in conditional requests.")}), @ApiResponse( code = 304, message = "Not Modified. \n " + - "Empty body because the client already has the latest version of the requested resource.\n"), + "Empty body because the client already has the latest version of the requested resource.\n"), @ApiResponse( code = 400, message = "Bad Request. \n Invalid request or validation error.", @@ -1501,7 +1561,7 @@ public interface DeviceManagementService { @ApiResponse( code = 500, message = "Internal Server Error. \n " + - "Server error occurred while getting the device details.", + "Server error occurred while getting the device details.", response = ErrorResponse.class) }) Response queryDevicesByProperties( @@ -1523,7 +1583,7 @@ public interface DeviceManagementService { name = "device property map", value = "properties by which devices need filtered", required = true) - PropertyMap map); + PropertyMap map); @GET @Produces(MediaType.APPLICATION_JSON) @@ -1949,140 +2009,141 @@ public interface DeviceManagementService { @Size(max = 45) String id); - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("/{type}/{id}/getstatushistory") - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "Get Device status history", - notes = "Get a list of status history associated with the device type and id", - tags = "Device Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") - }) - } - ) - @ApiResponses( - value = { - @ApiResponse( - code = 200, - message = "OK. \n Successfully fetched the status history of matching devices.", - response = List.class, - 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 = 304, - message = "Not Modified. Empty body because the client already has the latest version" + - " of the requested resource.\n"), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid request or validation error.", - response = ErrorResponse.class), - @ApiResponse( - code = 404, - message = "Not Found. \n A device with the specified device type and id was not found.", - response = ErrorResponse.class), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n " + - "Server error occurred while retrieving the device details.", - response = ErrorResponse.class) - }) + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/{type}/{id}/status-history") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get Device status history", + notes = "Get a list of status history associated with the device type and id", + tags = "Device Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the status history of matching devices.", + response = List.class, + 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 = 304, + message = "Not Modified. Empty body because the client already has the latest version" + + " of the requested resource.\n"), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 404, + message = "Not Found. \n A device with the specified device type and id was not found.", + response = ErrorResponse.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while retrieving the device details.", + response = ErrorResponse.class) + }) Response getDeviceStatusHistory( - @ApiParam( - name = "type", - value = "The device type, such as ios, android, or windows.", - required = true) - @PathParam("type") - @Size(max = 45) - String type, - @ApiParam( - name = "id", - value = "Device ID.", - required = true) - @PathParam("id") - @Size(max = 45) - String id); - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("/{type}/{id}/getenrolmentstatushistory") - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "Get Device Current Enrolment status history", - notes = "Get a list of status history associated with the device type and id for the current enrolment", - tags = "Device Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") - }) - } - ) - @ApiResponses( - value = { - @ApiResponse( - code = 200, - message = "OK. \n Successfully fetched the status history of matching devices.", - response = List.class, - 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 = 304, - message = "Not Modified. Empty body because the client already has the latest version" + - " of the requested resource.\n"), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid request or validation error.", - response = ErrorResponse.class), - @ApiResponse( - code = 404, - message = "Not Found. \n A device with the specified device type and id was not found.", - response = ErrorResponse.class), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n " + - "Server error occurred while retrieving the device details.", - response = ErrorResponse.class) - }) + @ApiParam( + name = "type", + value = "The device type, such as ios, android, or windows.", + required = true) + @PathParam("type") + @Size(max = 45) + String type, + @ApiParam( + name = "id", + value = "Device ID.", + required = true) + @PathParam("id") + @Size(max = 45) + String id); + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/{type}/{id}/enrolment-status-history") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get Device Current Enrolment status history", + notes = "Get a list of status history associated with the device type and id for the current enrolment", + tags = "Device Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the status history of matching devices.", + response = List.class, + 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 = 304, + message = "Not Modified. Empty body because the client already has the latest version" + + " of the requested resource.\n"), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 404, + message = "Not Found. \n A device with the specified device type and id was not found.", + response = ErrorResponse.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while retrieving the device details.", + response = ErrorResponse.class) + }) Response getCurrentEnrolmentDeviceStatusHistory( - @ApiParam( - name = "type", - value = "The device type, such as ios, android, or windows.", - required = true) - @PathParam("type") - @Size(max = 45) - String type, - @ApiParam( - name = "id", - value = "Device ID.", - required = true) - @PathParam("id") - @Size(max = 45) - String id); + @ApiParam( + name = "type", + value = "The device type, such as ios, android, or windows.", + required = true) + @PathParam("type") + @Size(max = 45) + String type, + @ApiParam( + name = "id", + value = "Device ID.", + required = true) + @PathParam("id") + @Size(max = 45) + String id); @PUT @Produces(MediaType.APPLICATION_JSON) @@ -2247,16 +2308,16 @@ public interface DeviceManagementService { @ResponseHeader( name = "ETag", description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), + "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."), + "Used by caches, or in conditional requests."), }), @ApiResponse( code = 304, message = "Not Modified. Empty body because the client already has the latest version" + - " of the requested resource.\n"), + " of the requested resource.\n"), @ApiResponse( code = 400, message = "Bad Request. \n Invalid request or validation error.", @@ -2268,7 +2329,7 @@ public interface DeviceManagementService { @ApiResponse( code = 500, message = "Internal Server Error. \n " + - "Server error occurred while retrieving the device details.", + "Server error occurred while retrieving the device details.", response = ErrorResponse.class) }) Response getDeviceCountByStatus( @@ -2316,16 +2377,16 @@ public interface DeviceManagementService { @ResponseHeader( name = "ETag", description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), + "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."), + "Used by caches, or in conditional requests."), }), @ApiResponse( code = 304, message = "Not Modified. Empty body because the client already has the latest version" + - " of the requested resource.\n"), + " of the requested resource.\n"), @ApiResponse( code = 400, message = "Bad Request. \n Invalid request or validation error.", @@ -2337,7 +2398,7 @@ public interface DeviceManagementService { @ApiResponse( code = 500, message = "Internal Server Error. \n " + - "Server error occurred while retrieving the device details.", + "Server error occurred while retrieving the device details.", response = ErrorResponse.class) }) Response getDeviceIdentifiersByStatus( @@ -2386,16 +2447,16 @@ public interface DeviceManagementService { @ResponseHeader( name = "ETag", description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), + "Used by caches, or in conditional requests."), @ResponseHeader( name = "Last-Modified", description = "Date and time the resource has been modified the last time.\n" + - "Used by caches, or in conditional requests."), + "Used by caches, or in conditional requests."), }), @ApiResponse( code = 304, message = "Not Modified. Empty body because the client already has the latest " + - "version of the requested resource."), + "version of the requested resource."), @ApiResponse( code = 400, message = "Bad Request. \n Invalid request or validation error.", @@ -2407,7 +2468,7 @@ public interface DeviceManagementService { @ApiResponse( code = 500, message = "Internal Server Error. \n " + - "Server error occurred while retrieving information requested device.", + "Server error occurred while retrieving information requested device.", response = ErrorResponse.class) }) Response bulkUpdateDeviceStatus( @@ -2718,11 +2779,11 @@ public interface DeviceManagementService { @ResponseHeader( name = "ETag", description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), + "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."), + "Used by caches, or in conditional requests."), }), @ApiResponse( code = 500, 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 49cbdae59a..23be4d88eb 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 @@ -1,30 +1,20 @@ package org.wso2.carbon.device.mgt.jaxrs.service.impl; -import edu.emory.mathcs.backport.java.util.Arrays; +import io.entgra.device.mgt.core.apimgt.analytics.extension.AnalyticsArtifactsDeployer; +import io.entgra.device.mgt.core.apimgt.analytics.extension.dto.*; +import io.entgra.device.mgt.core.apimgt.analytics.extension.exception.EventReceiverDeployerException; +import io.entgra.device.mgt.core.apimgt.analytics.extension.exception.EventPublisherDeployerException; +import io.entgra.device.mgt.core.apimgt.analytics.extension.exception.EventStreamDeployerException; import org.apache.axis2.AxisFault; import org.apache.axis2.client.Stub; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.velocity.util.ArrayListWrapper; -import org.json.JSONObject; -import org.opensaml.xml.signature.J; -import org.wso2.carbon.analytics.stream.persistence.stub.EventStreamPersistenceAdminService; -import org.wso2.carbon.analytics.stream.persistence.stub.EventStreamPersistenceAdminServiceEventStreamPersistenceAdminServiceExceptionException; -import org.wso2.carbon.analytics.stream.persistence.stub.EventStreamPersistenceAdminServiceStub; -import org.wso2.carbon.analytics.stream.persistence.stub.dto.AnalyticsTable; -import org.wso2.carbon.analytics.stream.persistence.stub.dto.AnalyticsTableRecord; import org.wso2.carbon.base.MultitenantConstants; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.databridge.commons.StreamDefinition; import org.wso2.carbon.databridge.commons.exception.MalformedStreamDefinitionException; import org.wso2.carbon.device.mgt.common.exceptions.DeviceManagementException; -import org.wso2.carbon.device.mgt.core.dto.DeviceType; -import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.Attribute; import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.AttributeType; import org.wso2.carbon.device.mgt.jaxrs.beans.analytics.DeviceTypeEvent; @@ -34,24 +24,16 @@ import org.wso2.carbon.device.mgt.jaxrs.service.api.DeviceEventManagementService import org.wso2.carbon.device.mgt.jaxrs.util.Constants; import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration; -import org.wso2.carbon.event.input.adapter.core.MessageType; import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterConfiguration; -import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterService; -import org.wso2.carbon.event.output.adapter.rdbms.RDBMSEventAdapter; -import org.wso2.carbon.event.output.adapter.rdbms.internal.ds.RDBMSEventAdapterServiceDS; -import org.wso2.carbon.event.processor.manager.core.EventProcessorManagementService; -import org.wso2.carbon.event.processor.manager.core.EventPublisherManagementService; import org.wso2.carbon.event.publisher.core.EventPublisherService; import org.wso2.carbon.event.publisher.core.config.EventPublisherConfiguration; import org.wso2.carbon.event.publisher.core.config.mapping.JSONOutputMapping; import org.wso2.carbon.event.publisher.core.config.mapping.MapOutputMapping; import org.wso2.carbon.event.publisher.core.exception.EventPublisherConfigurationException; -import org.wso2.carbon.event.publisher.core.internal.ds.EventPublisherServiceDS; import org.wso2.carbon.event.publisher.stub.EventPublisherAdminServiceCallbackHandler; import org.wso2.carbon.event.publisher.stub.EventPublisherAdminServiceStub; import org.wso2.carbon.event.receiver.core.EventReceiverService; import org.wso2.carbon.event.receiver.core.config.EventReceiverConfiguration; -import org.wso2.carbon.event.receiver.core.config.InputMapping; import org.wso2.carbon.event.receiver.core.config.mapping.JSONInputMapping; import org.wso2.carbon.event.receiver.core.config.mapping.WSO2EventInputMapping; import org.wso2.carbon.event.receiver.core.exception.EventReceiverConfigurationException; @@ -59,7 +41,6 @@ import org.wso2.carbon.event.receiver.stub.EventReceiverAdminServiceCallbackHand 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.EventReceiverConfigurationDto; -import org.wso2.carbon.event.receiver.stub.types.InputAdapterConfigurationDto; import org.wso2.carbon.event.stream.core.EventStreamService; import org.wso2.carbon.event.stream.core.exception.EventStreamConfigurationException; import org.wso2.carbon.event.stream.stub.EventStreamAdminServiceStub; @@ -71,7 +52,6 @@ import org.wso2.carbon.user.api.UserStoreException; import javax.validation.Valid; import javax.ws.rs.*; import javax.ws.rs.core.Response; -import java.io.IOException; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.HashMap; @@ -225,6 +205,7 @@ public class DeviceEventManagementServiceImpl implements DeviceEventManagementSe String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); try { for (DeviceTypeEvent deviceTypeEvent : deviceTypeEvents) { TransportType transportType = deviceTypeEvent.getTransportType(); @@ -239,46 +220,101 @@ public class DeviceEventManagementServiceImpl implements DeviceEventManagementSe log.error(errorMessage); return Response.status(Response.Status.BAD_REQUEST).build(); } + // event stream String streamName = DeviceMgtAPIUtils.getStreamDefinition(deviceType, tenantDomain, eventName); - publishStreamDefinitons(streamName, Constants.DEFAULT_STREAM_VERSION, eventAttributes); - + AnalyticsArtifactsDeployer artifactsDeployer = new AnalyticsArtifactsDeployer(); + List props = new ArrayList<>(); + for (Attribute attribute : eventAttributes.getList()) { + props.add(new Property(attribute.getName(), attribute.getType().name())); + } + EventStreamData eventStreamData = new EventStreamData(); + eventStreamData.setName(streamName); + eventStreamData.setVersion(Constants.DEFAULT_STREAM_VERSION); + eventStreamData.setMetaData(new MetaData(DEFAULT_DEVICE_ID_ATTRIBUTE, "STRING")); + eventStreamData.setPayloadData(props); + artifactsDeployer.deployEventStream(eventStreamData, tenantId); + + // event receiver String receiverName = getReceiverName(deviceType, tenantDomain, transportType, eventName); - publishEventReceivers(streamName, Constants.DEFAULT_STREAM_VERSION, transportType, tenantDomain, - isSharedWithAllTenants, deviceType, deviceTypeEvent.getEventTopicStructure(), receiverName); + EventReceiverData receiverData = new EventReceiverData(); + receiverData.setName(receiverName); + receiverData.setStreamName(streamName); + receiverData.setStreamVersion(Constants.DEFAULT_STREAM_VERSION); + List propertyList = new ArrayList<>(); + if (transportType == TransportType.MQTT) { + receiverData.setEventAdapterType(OAUTH_MQTT_ADAPTER_TYPE); + propertyList.add(new Property(MQTT_CONTENT_TRANSFORMER_TYPE, MQTT_CONTENT_TRANSFORMER)); + propertyList.add(new Property(MQTT_CONTENT_VALIDATOR_TYPE, MQTT_CONTENT_VALIDATOR)); + String topic; + if (!StringUtils.isEmpty(deviceTypeEvent.getEventTopicStructure())) { + if (isSharedWithAllTenants) { + topic = deviceTypeEvent.getEventTopicStructure().replace("${deviceId}", "+") + .replace("${deviceType}", deviceType) + .replace("${tenantDomain}", "+"); + } else { + topic = deviceTypeEvent.getEventTopicStructure().replace("${deviceId}", "+") + .replace("${deviceType}", deviceType) + .replace("${tenantDomain}", tenantDomain); + } + } else { + if (isSharedWithAllTenants) { + topic = "+/" + deviceType + "/+/events"; + } else { + topic = tenantDomain + "/" + deviceType + "/+/events"; + } + } + propertyList.add(new Property("topic", topic)); + receiverData.setCustomMappingType("json"); + + } else { + receiverData.setEventAdapterType(THRIFT_ADAPTER_TYPE); + propertyList.add(new Property("events.duplicated.in.cluster", "false")); + receiverData.setCustomMappingType("wso2event"); + } + receiverData.setPropertyList(propertyList); + artifactsDeployer.deployEventReceiver(receiverData, tenantId); + if (!skipPersist) { + // rdbms event publisher String rdbmsPublisherName = getPublisherName(deviceType, tenantDomain, eventName) + "_rdbms_publisher"; - publishEventStore(streamName, Constants.DEFAULT_STREAM_VERSION, rdbmsPublisherName); + + EventPublisherData eventPublisherData = new EventPublisherData(); + eventPublisherData.setName(rdbmsPublisherName); + eventPublisherData.setStreamName(streamName); + eventPublisherData.setStreamVersion(Constants.DEFAULT_STREAM_VERSION); + eventPublisherData.setEventAdaptorType("rdbms"); + eventPublisherData.setCustomMappingType("map"); + List publisherProps = new ArrayList<>(); + publisherProps.add(new Property("datasource.name", "EVENT_DB")); + publisherProps.add(new Property("table.name", "table_" + rdbmsPublisherName.replace(".", ""))); + publisherProps.add(new Property("execution.mode", "insert")); + eventPublisherData.setPropertyList(publisherProps); + artifactsDeployer.deployEventPublisher(eventPublisherData, tenantId); } + + // web socket event publisher String wsPublisherName = getPublisherName(deviceType, tenantDomain, eventName) + "_ws_publisher"; - publishWebsocketPublisherDefinition(streamName, Constants.DEFAULT_STREAM_VERSION, wsPublisherName); - try { - PrivilegedCarbonContext.startTenantFlow(); - PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain( - MultitenantConstants.SUPER_TENANT_DOMAIN_NAME, true); - if (!MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equals(tenantDomain)) { - publishStreamDefinitons(streamName, Constants.DEFAULT_STREAM_VERSION, eventAttributes); - publishEventReceivers(streamName, Constants.DEFAULT_STREAM_VERSION, transportType, tenantDomain, - isSharedWithAllTenants, deviceType, deviceTypeEvent.getEventTopicStructure(), receiverName); - } - } finally { - PrivilegedCarbonContext.endTenantFlow(); - } + EventPublisherData wsEventPublisherData = new EventPublisherData(); + wsEventPublisherData.setName(wsPublisherName); + wsEventPublisherData.setStreamName(streamName); + wsEventPublisherData.setStreamVersion(Constants.DEFAULT_STREAM_VERSION); + wsEventPublisherData.setEventAdaptorType("websocket-local"); + wsEventPublisherData.setCustomMappingType("json"); + artifactsDeployer.deployEventPublisher(wsEventPublisherData, tenantId); + } return Response.ok().build(); } catch (DeviceManagementException e) { log.error("Failed to access device management service, tenantDomain: " + tenantDomain, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); - } catch (MalformedStreamDefinitionException e) { - log.error("Failed while creating stream definition, tenantDomain: " + tenantDomain, e); + } catch (EventStreamDeployerException e) { + log.error("Failed while deploying event stream definition, tenantDomain: " + tenantDomain, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); - } catch (EventStreamConfigurationException e) { - log.error("Failed while configuring stream definition, tenantDomain: " + tenantDomain, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); - } catch (EventPublisherConfigurationException e) { - log.error("Failed while configuring event publisher, tenantDomain: " + tenantDomain, e); + } catch (EventPublisherDeployerException e) { + log.error("Failed while deploying event publisher, tenantDomain: " + tenantDomain, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); - } catch (EventReceiverConfigurationException e) { - log.error("Failed while configuring event receiver, tenantDomain: " + tenantDomain, e); + } catch (EventReceiverDeployerException e) { + log.error("Failed while deploying event receiver, tenantDomain: " + tenantDomain, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java index e37472bb69..6d0696df84 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/DeviceManagementServiceImpl.java @@ -80,6 +80,8 @@ import org.wso2.carbon.device.mgt.common.search.PropertyMap; import org.wso2.carbon.device.mgt.common.search.SearchContext; import org.wso2.carbon.device.mgt.common.type.mgt.DeviceStatus; import org.wso2.carbon.device.mgt.core.app.mgt.ApplicationManagementProviderService; +import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager; +import org.wso2.carbon.device.mgt.core.config.DeviceManagementConfig; import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOException; import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtException; import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager; @@ -784,6 +786,32 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { return Response.status(Response.Status.OK).entity(device).build(); } + @POST + @Path("/enrollment/guide") + @Override + public Response sendEnrollmentGuide(String enrolmentGuide) { + if (log.isDebugEnabled()) { + log.debug("Sending enrollment invitation mail to existing user."); + } + DeviceManagementConfig config = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(); + if (!config.getEnrollmentGuideConfiguration().isEnabled()) { + String msg = "Sending enrollment guide config is not enabled."; + log.error(msg); + return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); + } + DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService(); + try { + dms.sendEnrolmentGuide(enrolmentGuide); + return Response.status(Response.Status.OK).entity("Invitation mails have been sent.").build(); + } catch (DeviceManagementException e) { + String msg = "Error occurred sending mail to group in enrollment guide"; + log.error(msg, e); + return Response.serverError().entity( + new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build(); + } + } + + @POST @Path("/type/any/list") @Override @@ -872,6 +900,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { DeviceManagementProviderService deviceManagementProviderService = DeviceMgtAPIUtils.getDeviceManagementService(); int validityTime = 3600; + // add scopes for event topics List mqttEventTopicStructure = new ArrayList<>(); try { DeviceType deviceType = deviceManagementProviderService.getDeviceType(type); @@ -912,10 +941,16 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { topic = topic.replace("${deviceId}", id); } topic = topic.replace("/",":"); - scopes.append(" perm:topic:sub:".concat(topic)); +// scopes.append(" perm:topic:sub:".concat(topic)); scopes.append(" perm:topic:pub:".concat(topic)); } + // add scopes for retrieve operation topic /tenantDomain/deviceType/deviceId/operation/# + scopes.append(" perm:topic:sub:" + tenantDomain + ":" + type + ":" + id + ":operation"); + + // add scopes for update operation /tenantDomain/deviceType/deviceId/update/operation + scopes.append(" perm:topic:pub:" + tenantDomain + ":" + type + ":" + id + ":update:operation"); + TokenRequest tokenRequest = new TokenRequest(dcrResponse.getClientId(), dcrResponse.getClientSecret(), null, scopes.toString(), "client_credentials", null, null, null, null, validityTime); @@ -1324,7 +1359,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { * @return {@link Response} object */ @GET - @Path("/{type}/{id}/getstatushistory") + @Path("/{type}/{id}/status-history") public Response getDeviceStatusHistory(@PathParam("type") @Size(max = 45) String type, @PathParam("id") @Size(max = 45) String id) { //TODO check authorization for this @@ -1356,7 +1391,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService { * @return {@link Response} object */ @GET - @Path("/{type}/{id}/getenrolmentstatushistory") + @Path("/{type}/{id}/enrolment-status-history") public Response getCurrentEnrolmentDeviceStatusHistory(@PathParam("type") @Size(max = 45) String type, @PathParam("id") @Size(max = 45) String id) { //TODO check authorization for this or current enrolment should be based on for the enrolment associated with the user diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index cb9d37a5b4..e0ce6e82a7 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -113,7 +113,9 @@ org.wso2.carbon.event.processor.stub, org.wso2.carbon.identity.jwt.client.extension.service, org.apache.commons.codec.binary, - io.entgra.server.bootup.heartbeat.beacon + io.entgra.server.bootup.heartbeat.beacon, + io.entgra.device.mgt.extensions.logger.*, + io.entgra.notification.logger.* !org.wso2.carbon.device.mgt.core.internal, @@ -352,6 +354,10 @@ org.wso2.carbon.devicemgt io.entgra.task.mgt.common + + org.wso2.carbon.devicemgt + io.entgra.notification.logger + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java index 9ba76f99fb..0d45a2efc1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java @@ -136,6 +136,7 @@ public final class DeviceManagementConstants { public static final String POLICY_VIOLATE_TEMPLATE = "policy-violating-notifier"; public static final String USER_WELCOME_TEMPLATE = "user-welcome"; public static final String DEFAULT_ENROLLMENT_TEMPLATE = "default-enrollment-invitation"; + public static final String ENROLLMENT_GUIDE_TEMPLATE = "enrollment-guide"; } public static final class OperationAttributes { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java index f2ad40abb7..cc3a3dc5b4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java @@ -25,6 +25,7 @@ import org.wso2.carbon.device.mgt.core.config.cache.BillingCacheConfiguration; import org.wso2.carbon.device.mgt.core.config.cache.CertificateCacheConfiguration; import org.wso2.carbon.device.mgt.core.config.cache.DeviceCacheConfiguration; import org.wso2.carbon.device.mgt.core.config.cache.GeoFenceCacheConfiguration; +import org.wso2.carbon.device.mgt.core.config.enrollment.guide.EnrollmentGuideConfiguration; import org.wso2.carbon.device.mgt.core.config.operation.timeout.OperationTimeoutConfiguration; import org.wso2.carbon.device.mgt.core.event.config.EventOperationTaskConfiguration; import org.wso2.carbon.device.mgt.core.config.geo.location.GeoLocationConfiguration; @@ -70,6 +71,7 @@ public final class DeviceManagementConfig { private EnrollmentNotificationConfiguration enrollmentNotificationConfiguration; private DefaultRoles defaultRoles; private OperationTimeoutConfiguration operationTimeoutConfiguration; + private EnrollmentGuideConfiguration enrollmentGuideConfiguration; @XmlElement(name = "ManagementRepository", required = true) public DeviceManagementConfigRepository getDeviceManagementConfigRepository() { @@ -265,5 +267,14 @@ public final class DeviceManagementConfig { public void setOperationTimeoutConfiguration(OperationTimeoutConfiguration operationTimeoutConfiguration) { this.operationTimeoutConfiguration = operationTimeoutConfiguration; } + + @XmlElement(name = "EnrollmentGuideConfiguration", required = true) + public EnrollmentGuideConfiguration getEnrollmentGuideConfiguration() { + return enrollmentGuideConfiguration; + } + + public void setEnrollmentGuideConfiguration(EnrollmentGuideConfiguration enrollmentGuideConfiguration) { + this.enrollmentGuideConfiguration = enrollmentGuideConfiguration; + } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/enrollment/guide/EnrollmentGuideConfiguration.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/enrollment/guide/EnrollmentGuideConfiguration.java new file mode 100644 index 0000000000..5f54cf79d4 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/enrollment/guide/EnrollmentGuideConfiguration.java @@ -0,0 +1,30 @@ +package org.wso2.carbon.device.mgt.core.config.enrollment.guide; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "EnrollmentGuideConfiguration") +public class EnrollmentGuideConfiguration { + + private boolean isEnabled; + private String mail; + + @XmlElement(name = "Enable", required = true) + public boolean isEnabled() { + return isEnabled; + } + + public void setEnabled(boolean enabled) { + isEnabled = enabled; + } + + @XmlElement(name = "Mail", required = true) + public String getMail() { + return mail; + } + + public void setMail(String mail) { + this.mail = mail; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/ui/HubspotChat.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/ui/HubspotChat.java new file mode 100644 index 0000000000..ec22d125a1 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/ui/HubspotChat.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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.core.config.ui; + +import javax.xml.bind.annotation.XmlElement; + +public class HubspotChat { + private boolean isEnableHubspot; + private String trackingUrl; + private String accessToken; + private String senderActorId; + + @XmlElement(name = "EnableHubspot") + public boolean isEnableHubspot() { + return isEnableHubspot; + } + + public void setEnableHubspot(boolean enableHubspot) { + isEnableHubspot = enableHubspot; + } + + @XmlElement(name = "TrackingUrl") + public String getTrackingUrl() { + return trackingUrl; + } + + public void setTrackingUrl(String trackingUrl) { + this.trackingUrl = trackingUrl; + } + + @XmlElement(name = "AccessToken") + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + @XmlElement(name = "SenderActorId") + public String getSenderActorId() { + return senderActorId; + } + + public void setSenderActorId(String senderActorId) { + this.senderActorId = senderActorId; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/ui/UIConfiguration.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/ui/UIConfiguration.java index 551c1558ea..dca4a76a6b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/ui/UIConfiguration.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/ui/UIConfiguration.java @@ -34,6 +34,7 @@ public class UIConfiguration { private int sessionTimeOut; private int loginCacheCapacity; private Billing billing; + private HubspotChat hubspotChat; @XmlElement(name = "AppRegistration", required=true) public AppRegistration getAppRegistration() { @@ -63,6 +64,14 @@ public class UIConfiguration { isSsoEnable = ssoEnable; } + @XmlElement(name = "HubspotChat", required = true) + public HubspotChat getHubspotChat() { + return hubspotChat; + } + + public void setHubspotChat(HubspotChat hubspotChat) { + this.hubspotChat = hubspotChat; + } @XmlElement(name = "Billing", required=true) public Billing getBilling() { return billing; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/MetadataManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/MetadataManagementServiceImpl.java index 7d7fd1d7c0..455a583520 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/MetadataManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/MetadataManagementServiceImpl.java @@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.core.metadata.mgt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.base.MultitenantConstants; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.mgt.common.PaginationRequest; import org.wso2.carbon.device.mgt.common.PaginationResult; @@ -91,8 +92,14 @@ public class MetadataManagementServiceImpl implements MetadataManagementService } try { MetadataManagementDAOFactory.openConnection(); - return metadataDAO.getMetadata( - PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true), metaKey); + int tenantId; + if (metaKey.equals("EVALUATE_TENANTS")){ + // for getting evaluate tenant list to provide the live chat feature + tenantId = MultitenantConstants.SUPER_TENANT_ID; + } else { + tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + } + return metadataDAO.getMetadata(tenantId, metaKey); } catch (MetadataManagementDAOException e) { String msg = "Error occurred while retrieving the metadata entry for metaKey:" + metaKey; log.error(msg, e); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/notification/mgt/NotificationManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/notification/mgt/NotificationManagementServiceImpl.java index 3371f8d804..4770f9fee4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/notification/mgt/NotificationManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/notification/mgt/NotificationManagementServiceImpl.java @@ -18,8 +18,9 @@ package org.wso2.carbon.device.mgt.core.notification.mgt; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import io.entgra.device.mgt.extensions.logger.spi.EntgraLogger; +import io.entgra.notification.logger.DeviceLogContext; +import io.entgra.notification.logger.impl.EntgraDeviceLoggerImpl; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.exceptions.DeviceManagementException; @@ -45,8 +46,8 @@ import java.util.List; */ public class NotificationManagementServiceImpl implements NotificationManagementService { - private static final Log log = LogFactory.getLog(NotificationManagementServiceImpl.class); - + private static final EntgraLogger log = new EntgraDeviceLoggerImpl(NotificationManagementServiceImpl.class); + DeviceLogContext.Builder deviceLogContexBuilder = new DeviceLogContext.Builder(); private NotificationDAO notificationDAO; public NotificationManagementServiceImpl() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java index 4e12d2cf1a..3dedb8d551 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java @@ -645,6 +645,8 @@ public interface DeviceManagementProviderService { void sendEnrolmentInvitation(String templateName, EmailMetaInfo metaInfo) throws DeviceManagementException, ConfigurationManagementException; + void sendEnrolmentGuide(String enrolmentGuide) throws DeviceManagementException; + void sendRegistrationEmail(EmailMetaInfo metaInfo) throws DeviceManagementException, ConfigurationManagementException; FeatureManager getFeatureManager(String deviceType) throws DeviceTypeNotFoundException; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index 9b28775687..6257e0b34d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -198,6 +198,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv private final ApplicationDAO applicationDAO; private MetadataDAO metadataDAO; private final DeviceStatusDAO deviceStatusDAO; + int count = 0; public DeviceManagementProviderServiceImpl() { this.pluginRepository = new DeviceManagementPluginRepository(); @@ -1555,6 +1556,25 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } } + @Override + public void sendEnrolmentGuide(String enrolmentGuide) throws DeviceManagementException { + + DeviceManagementConfig config = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(); + String recipientMail = config.getEnrollmentGuideConfiguration().getMail(); + Properties props = new Properties(); + props.setProperty("mail-subject", "[Enrollment Guide Triggered] (#" + ++count + ")"); + props.setProperty("enrollment-guide", enrolmentGuide); + + try { + EmailMetaInfo metaInfo = new EmailMetaInfo(recipientMail, props); + sendEnrolmentInvitation(DeviceManagementConstants.EmailAttributes.ENROLLMENT_GUIDE_TEMPLATE, metaInfo); + } catch (ConfigurationManagementException e) { + String msg = "Error occurred while sending the mail."; + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } + } + @Override public void sendRegistrationEmail(EmailMetaInfo metaInfo) throws DeviceManagementException, ConfigurationManagementException { diff --git a/components/logger/io.entgra.notification.logger/pom.xml b/components/logger/io.entgra.notification.logger/pom.xml new file mode 100644 index 0000000000..6044056d1d --- /dev/null +++ b/components/logger/io.entgra.notification.logger/pom.xml @@ -0,0 +1,88 @@ + + + + + 4.0.0 + + + org.wso2.carbon.devicemgt + logger + 5.0.21-SNAPSHOT + + + io.entgra.notification.logger + Entgra - Notification Logger + bundle + http://entgra.io + + + + org.wso2.carbon + org.wso2.carbon.logging + + + org.testng + testng + + + org.wso2.carbon.devicemgt + io.entgra.device.mgt.extensions.logger + + + + + 8 + 8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + ${carbon.device.mgt.version} + Device Notification Logger Bundle + + io.entgra.device.mgt.extensions.logger.*, + org.apache.commons.logging;version="[1.2,2)", + org.apache.log4j;version="[1.2,2)", + org.wso2.carbon.context;version="[4.4,5) + + + io.entgra.notification.logger.* + + + + + + + + \ No newline at end of file diff --git a/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/DeviceLogContext.java b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/DeviceLogContext.java new file mode 100644 index 0000000000..3becd28b9c --- /dev/null +++ b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/DeviceLogContext.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2023, 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 io.entgra.notification.logger; + +import io.entgra.device.mgt.extensions.logger.LogContext; + +public class DeviceLogContext extends LogContext { + private final String deviceName; + private final String operationCode; + private final String deviceType; + private final String tenantID; + + private DeviceLogContext(Builder builder) { + this.operationCode = builder.operationCode; + this.deviceName = builder.deviceName; + this.deviceType = builder.deviceType; + this.tenantID = builder.tenantID; + } + + public String getTenantID() { + return tenantID; + } + + public String getDeviceName() { + return deviceName; + } + + public String getOperationCode() { + return operationCode; + } + + public String getDeviceType() { + return deviceType; + } + + + public static class Builder { + private String deviceName; + private String operationCode; + private String deviceType; + private String tenantID; + + public Builder() { + } + + public String getDeviceType() { + return deviceType; + } + + public Builder setDeviceType(String deviceType) { + this.deviceType = deviceType; + return this; + } + + public String getTenantID() { + return tenantID; + } + + public Builder setTenantID(String tenantID) { + this.tenantID = tenantID; + return this; + } + + public String getDeviceName() { + return deviceName; + } + + public Builder setDeviceName(String deviceName) { + this.deviceName = deviceName; + return this; + } + + public String getOperationCode() { + return operationCode; + } + + public Builder setOperationCode(String operationCode) { + this.operationCode = operationCode; + return this; + } + + public DeviceLogContext build() { + return new DeviceLogContext(this); + } + + } +} diff --git a/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/UserLogContext.java b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/UserLogContext.java new file mode 100644 index 0000000000..13702d570b --- /dev/null +++ b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/UserLogContext.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2023, 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 io.entgra.notification.logger; + +import io.entgra.device.mgt.extensions.logger.LogContext; + +public class UserLogContext extends LogContext { + private final String userName; + private final String userEmail; + private final String metaInfo; + private final String tenantID; + + private UserLogContext(Builder builder) { + this.userEmail = builder.userEmail; + this.userName = builder.userName; + this.metaInfo = builder.metaInfo; + this.tenantID = builder.tenantID; + } + + public String getTenantID() { + return tenantID; + } + + public String getUserName() { + return userName; + } + + public String getUserEmail() { + return userEmail; + } + + public String getMetaInfo() { + return metaInfo; + } + + + public static class Builder { + private String userName; + private String userEmail; + private String metaInfo; + private String tenantID; + + public Builder() { + } + + public String getMetaInfo() { + return metaInfo; + } + + public Builder setMetaInfo(String metaInfo) { + this.metaInfo = metaInfo; + return this; + } + + public String getTenantID() { + return tenantID; + } + + public Builder setTenantID(String tenantID) { + this.tenantID = tenantID; + return this; + } + + public String getUserName() { + return userName; + } + + public Builder setUserName(String userName) { + this.userName = userName; + return this; + } + + public String getUserEmail() { + return userEmail; + } + + public Builder setUserEmail(String userEmail) { + this.userEmail = userEmail; + return this; + } + + public UserLogContext build() { + return new UserLogContext(this); + } + + } +} diff --git a/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/impl/EntgraDeviceLoggerImpl.java b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/impl/EntgraDeviceLoggerImpl.java new file mode 100644 index 0000000000..f1360ae6c3 --- /dev/null +++ b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/impl/EntgraDeviceLoggerImpl.java @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2023, 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 io.entgra.notification.logger.impl; + + +import io.entgra.device.mgt.extensions.logger.LogContext; +import io.entgra.device.mgt.extensions.logger.spi.EntgraLogger; +import io.entgra.notification.logger.DeviceLogContext; +import io.entgra.notification.logger.util.MDCContextUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.MDC; + + +public class EntgraDeviceLoggerImpl implements EntgraLogger { + + private static Log log = null; + + public EntgraDeviceLoggerImpl(Class clazz) { + log = LogFactory.getLog(clazz); + } + + @Override + public void info(Object object, LogContext logContext) { + } + + @Override + public void info(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void debug(Object object, LogContext logContext) { + } + + @Override + public void debug(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void error(Object object, LogContext logContext) { + } + + @Override + public void error(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void fatal(Object object, LogContext logContext) { + } + + @Override + public void fatal(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void trace(Object object, LogContext logContext) { + + } + + @Override + public void trace(Object object, Throwable t, LogContext logContext) { + + } + + @Override + public void warn(Object object, LogContext logContext) { + } + + @Override + public void warn(Object object, Throwable t, LogContext logContext) { + } + + public void info(String message) { + } + + public void info(String message, Throwable t) { + log.info(message, t); + } + + @Override + public void info(String message, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.info(message); + } + + + public void debug(String message) { + log.debug(message); + } + + + public void debug(String message, Throwable t) { + log.debug(message, t); + } + + @Override + public void debug(String message, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.debug(message); + } + + public void error(String message) { + log.error(message); + } + + + public void error(String message, Throwable t) { + log.error(message, t); + } + + @Override + public void error(String message, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.error(message); + } + + @Override + public void error(String message, Throwable t, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.error(message, t); + } + + + public void warn(String message) { + log.warn(message); + } + + + public void warn(String message, Throwable t) { + log.warn(message, t); + } + + @Override + public void warn(String message, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.warn(message); + } + + @Override + public void warn(String message, Throwable t, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.warn(message, t); + } + + + public void trace(String message) { + log.trace(message); + } + + + public void trace(String message, Throwable t) { + log.trace(message, t); + } + + @Override + public void trace(String message, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.trace(message); + } + + + public void fatal(String message) { + log.fatal(message); + } + + + public void fatal(String message, Throwable t) { + log.fatal(message, t); + } + + @Override + public void fatal(String message, LogContext logContext) { + DeviceLogContext deviceLogContext = (DeviceLogContext) logContext; + MDCContextUtil.populateDeviceMDCContext(deviceLogContext); + log.fatal(message); + } + + @Override + public void debug(Object o) { + log.debug(o); + } + + @Override + public void debug(Object o, Throwable throwable) { + log.debug(o, throwable); + } + + @Override + public void error(Object o) { + log.error(o); + } + + @Override + public void error(Object o, Throwable throwable) { + log.error(o, throwable); + } + + @Override + public void fatal(Object o) { + log.fatal(0); + } + + @Override + public void fatal(Object o, Throwable throwable) { + log.fatal(0, throwable); + } + + @Override + public void info(Object o) { + log.info(o); + } + + @Override + public void info(Object o, Throwable throwable) { + log.info(o, throwable); + } + + @Override + public boolean isDebugEnabled() { + return log.isDebugEnabled(); + } + + @Override + public boolean isErrorEnabled() { + return log.isErrorEnabled(); + } + + @Override + public boolean isFatalEnabled() { + return log.isFatalEnabled(); + } + + @Override + public boolean isInfoEnabled() { + return log.isInfoEnabled(); + } + + @Override + public boolean isTraceEnabled() { + return log.isTraceEnabled(); + } + + @Override + public boolean isWarnEnabled() { + return log.isWarnEnabled(); + } + + @Override + public void trace(Object o) { + log.trace(o); + } + + @Override + public void trace(Object o, Throwable throwable) { + log.trace(o, throwable); + } + + @Override + public void warn(Object o) { + log.warn(o); + } + + @Override + public void warn(Object o, Throwable throwable) { + log.warn(o, throwable); + } + + @Override + public void clearLogContext() { + MDC.clear(); + } +} diff --git a/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/impl/EntgraUserLoggerImpl.java b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/impl/EntgraUserLoggerImpl.java new file mode 100644 index 0000000000..92beeabb2f --- /dev/null +++ b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/impl/EntgraUserLoggerImpl.java @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2023, 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 io.entgra.notification.logger.impl; + + +import io.entgra.device.mgt.extensions.logger.LogContext; +import io.entgra.device.mgt.extensions.logger.spi.EntgraLogger; +import io.entgra.notification.logger.UserLogContext; +import io.entgra.notification.logger.util.MDCContextUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.MDC; + + +public class EntgraUserLoggerImpl implements EntgraLogger { + + private static Log log = null; + + public EntgraUserLoggerImpl(Class clazz) { + log = LogFactory.getLog(clazz); + } + + @Override + public void info(Object object, LogContext logContext) { + } + + @Override + public void info(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void debug(Object object, LogContext logContext) { + } + + @Override + public void debug(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void error(Object object, LogContext logContext) { + } + + @Override + public void error(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void fatal(Object object, LogContext logContext) { + } + + @Override + public void fatal(Object object, Throwable t, LogContext logContext) { + } + + @Override + public void trace(Object object, LogContext logContext) { + + } + + @Override + public void trace(Object object, Throwable t, LogContext logContext) { + + } + + @Override + public void warn(Object object, LogContext logContext) { + } + + @Override + public void warn(Object object, Throwable t, LogContext logContext) { + } + + public void info(String message) { + } + + public void info(String message, Throwable t) { + log.info(message, t); + } + + @Override + public void info(String message, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.info(message); + } + + + public void debug(String message) { + log.debug(message); + } + + + public void debug(String message, Throwable t) { + log.debug(message, t); + } + + @Override + public void debug(String message, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.debug(message); + } + + public void error(String message) { + log.error(message); + } + + + public void error(String message, Throwable t) { + log.error(message, t); + } + + @Override + public void error(String message, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.error(message); + } + + @Override + public void error(String message, Throwable t, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.error(message, t); + } + + + public void warn(String message) { + log.warn(message); + } + + + public void warn(String message, Throwable t) { + log.warn(message, t); + } + + @Override + public void warn(String message, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.warn(message); + } + + @Override + public void warn(String message, Throwable t, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.warn(message, t); + } + + + public void trace(String message) { + log.trace(message); + } + + + public void trace(String message, Throwable t) { + log.trace(message, t); + } + + @Override + public void trace(String message, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.trace(message); + } + + + public void fatal(String message) { + log.fatal(message); + } + + + public void fatal(String message, Throwable t) { + log.fatal(message, t); + } + + @Override + public void fatal(String message, LogContext logContext) { + UserLogContext userLogContext = (UserLogContext) logContext; + MDCContextUtil.populateUserMDCContext(userLogContext); + log.fatal(message); + } + + @Override + public void debug(Object o) { + log.debug(o); + } + + @Override + public void debug(Object o, Throwable throwable) { + log.debug(o, throwable); + } + + @Override + public void error(Object o) { + log.error(o); + } + + @Override + public void error(Object o, Throwable throwable) { + log.error(o, throwable); + } + + @Override + public void fatal(Object o) { + log.fatal(0); + } + + @Override + public void fatal(Object o, Throwable throwable) { + log.fatal(0, throwable); + } + + @Override + public void info(Object o) { + log.info(o); + } + + @Override + public void info(Object o, Throwable throwable) { + log.info(o, throwable); + } + + @Override + public boolean isDebugEnabled() { + return log.isDebugEnabled(); + } + + @Override + public boolean isErrorEnabled() { + return log.isErrorEnabled(); + } + + @Override + public boolean isFatalEnabled() { + return log.isFatalEnabled(); + } + + @Override + public boolean isInfoEnabled() { + return log.isInfoEnabled(); + } + + @Override + public boolean isTraceEnabled() { + return log.isTraceEnabled(); + } + + @Override + public boolean isWarnEnabled() { + return log.isWarnEnabled(); + } + + @Override + public void trace(Object o) { + log.trace(o); + } + + @Override + public void trace(Object o, Throwable throwable) { + log.trace(o, throwable); + } + + @Override + public void warn(Object o) { + log.warn(o); + } + + @Override + public void warn(Object o, Throwable throwable) { + log.warn(o, throwable); + } + + @Override + public void clearLogContext() { + MDC.clear(); + } +} diff --git a/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/util/MDCContextUtil.java b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/util/MDCContextUtil.java new file mode 100644 index 0000000000..fd78c26dba --- /dev/null +++ b/components/logger/io.entgra.notification.logger/src/main/java/io/entgra/notification/logger/util/MDCContextUtil.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2023, 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 io.entgra.notification.logger.util; + +import io.entgra.notification.logger.DeviceLogContext; +import io.entgra.notification.logger.UserLogContext; +import org.apache.log4j.MDC; + +public final class MDCContextUtil { + + public static void populateDeviceMDCContext(final DeviceLogContext mdcContext) { + if (mdcContext.getDeviceName() != null) { + MDC.put("DeviceName", mdcContext.getDeviceName()); + } + if (mdcContext.getDeviceType() != null) { + MDC.put("DeviceType", mdcContext.getDeviceType()); + } + if (mdcContext.getOperationCode() != null) { + MDC.put("OperationCode", mdcContext.getOperationCode()); + } + if (mdcContext.getTenantID() != null) { + MDC.put("TenantId", mdcContext.getTenantID()); + } + } + + public static void populateUserMDCContext(final UserLogContext mdcContext) { + if (mdcContext.getUserName() != null) { + MDC.put("UserName", mdcContext.getUserName()); + } + if (mdcContext.getUserEmail() != null) { + MDC.put("UserEmail", mdcContext.getUserEmail()); + } + if (mdcContext.getMetaInfo() != null) { + MDC.put("MetaInfo", mdcContext.getMetaInfo()); + } + if (mdcContext.getTenantID() != null) { + MDC.put("TenantId", mdcContext.getTenantID()); + } + } +} + + diff --git a/components/logger/io.entgra.notification.logger/src/test/resources/log4j.properties b/components/logger/io.entgra.notification.logger/src/test/resources/log4j.properties new file mode 100644 index 0000000000..b174b35e36 --- /dev/null +++ b/components/logger/io.entgra.notification.logger/src/test/resources/log4j.properties @@ -0,0 +1,32 @@ +# +# Copyright 2023 Entgra Pvt. Ltd.. (http://entgra.io) +# +# Licensed 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. +# + +# +# This is the log4j configuration file used by Entgra Pvt. Ltd. +# +# IMPORTANT : Please do not remove or change the names of any +# of the Appenders defined here. The layout pattern & log file +# can be changed using the WSO2 Carbon Management Console, and those +# settings will override the settings in this file. +# + +log4j.rootLogger=DEBUG, STD_OUT + +# Redirect log messages to console +log4j.appender.STD_OUT=org.apache.log4j.ConsoleAppender +log4j.appender.STD_OUT.Target=System.out +log4j.appender.STD_OUT.layout=org.apache.log4j.PatternLayout +log4j.appender.STD_OUT.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n diff --git a/components/logger/pom.xml b/components/logger/pom.xml new file mode 100644 index 0000000000..f0884c2238 --- /dev/null +++ b/components/logger/pom.xml @@ -0,0 +1,46 @@ + + + + 4.0.0 + + + carbon-devicemgt + org.wso2.carbon.devicemgt + 5.0.21-SNAPSHOT + ../../pom.xml + + + logger + pom + Entgra - Notification Logger Component + http://entgra.io + + + io.entgra.notification.logger + + + + 8 + 8 + UTF-8 + + + \ No newline at end of file diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java index 3667f258c6..74e5d8e7f1 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java @@ -44,6 +44,8 @@ import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementExcept import org.wso2.carbon.device.mgt.common.policy.mgt.Policy; import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation; import org.wso2.carbon.device.mgt.core.operation.mgt.OperationMgtConstants; +import org.wso2.carbon.device.mgt.core.operation.mgt.PolicyOperation; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.policy.mgt.common.PolicyAdministratorPoint; import org.wso2.carbon.policy.mgt.common.PolicyEvaluationException; import org.wso2.carbon.policy.mgt.common.PolicyManagementException; @@ -96,6 +98,7 @@ public class PolicyEnforcementDelegatorImpl implements PolicyEnforcementDelegato */ if (devicePolicy == null || devicePolicy.getId() != policy.getId() || updatedPolicyIds.contains (policy.getId())) { + this.markPreviousPolicyBundlesRepeated(device); this.addPolicyRevokeOperation(deviceIdentifiers); this.addPolicyOperation(deviceIdentifiers, policy); } @@ -202,4 +205,29 @@ public class PolicyEnforcementDelegatorImpl implements PolicyEnforcementDelegato throw new PolicyDelegationException(msg, e); } } + + /** + * Update the previous pending policy operation's status as REPEATED + * @param device Device + * @throws PolicyDelegationException throws when getting pending operations + */ + public void markPreviousPolicyBundlesRepeated(Device device) throws PolicyDelegationException { + DeviceManagementProviderService deviceManagerService = PolicyManagementDataHolder.getInstance(). + getDeviceManagementService(); + try { + List operations = deviceManagerService.getPendingOperations(device); + for(Operation operation : operations) { + String operationCode = operation.getCode(); + if(PolicyOperation.POLICY_OPERATION_CODE.equals(operationCode) || + OperationMgtConstants.OperationCodes.POLICY_REVOKE.equals(operationCode)) { + operation.setStatus(Operation.Status.REPEATED); + deviceManagerService.updateOperation(device, operation); + } + } + } catch (OperationManagementException e) { + String msg = "Error occurred while retrieving pending operations of device id "+device.getId(); + log.error(msg, e); + throw new PolicyDelegationException(msg, e); + } + } } diff --git a/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/HubspotHandler.java b/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/HubspotHandler.java new file mode 100644 index 0000000000..b649d341fe --- /dev/null +++ b/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/HubspotHandler.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2023, Entgra (Pvt) Ltd. (http://www.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 io.entgra.ui.request.interceptor; + +import com.google.gson.JsonObject; +import io.entgra.ui.request.interceptor.beans.ProxyResponse; +import io.entgra.ui.request.interceptor.util.HandlerConstants; +import io.entgra.ui.request.interceptor.util.HandlerUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; + +import javax.servlet.annotation.MultipartConfig; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +@MultipartConfig +@WebServlet( + name = "HubspotRequestHandlerServlet", + description = "", + urlPatterns = { + "/hubspot/*" + } +) +public class HubspotHandler extends HttpServlet { + + private static final Log log = LogFactory.getLog(HubspotHandler.class); + private HttpSession httpSession; + private static String hubspotEndpoint; + private static String chatConfig; + private JsonObject uiConfigJsonObject; + private static String gatewayUrl; + private static String iotsCoreUrl; + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) { + try { + if (validateRequest(req, resp)) { + HttpPost postRequest = new HttpPost(HandlerUtil.generateBackendRequestURL(req, hubspotEndpoint)); + HandlerUtil.generateChatRequestEntity(req, postRequest); + postRequest.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + postRequest.setHeader(HttpHeaders.AUTHORIZATION, HandlerConstants.BEARER + chatConfig); + ProxyResponse proxyResponse = HandlerUtil.execute(postRequest); + HandlerUtil.handleSuccess(resp, proxyResponse); + } + } catch (IOException e) { + log.error("Error occurred when processing POST request.", e); + } + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) { + try { + if (validateRequest(req, resp)) { + HttpGet getRequest = new HttpGet(HandlerUtil.generateBackendRequestURL(req,hubspotEndpoint)); + getRequest.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + getRequest.setHeader(HttpHeaders.AUTHORIZATION, HandlerConstants.BEARER + chatConfig); + ProxyResponse proxyResponse = HandlerUtil.execute(getRequest); + HandlerUtil.handleSuccess(resp, proxyResponse); + } + } catch (IOException e) { + log.error("Error occurred when processing GET request.", e); + } + } + + /*** + * Validates the hubspot's incoming request. + * + * @param req {@link HttpServletRequest} + * @param resp {@link HttpServletResponse} + * @return If request is a valid one, returns TRUE, otherwise return FALSE + * @throws IOException If and error occurs while witting error response to client side + */ + private boolean validateRequest(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + httpSession = req.getSession(false); + if (httpSession == null) { + log.error("Unauthorized, You are not logged in. Please log in to the portal"); + HandlerUtil.handleError(resp, HttpStatus.SC_UNAUTHORIZED); + return false; + } + if (req.getMethod() == null) { + log.error("Bad Request, Request method is empty"); + HandlerUtil.handleError(resp, HttpStatus.SC_BAD_REQUEST); + return false; + } + gatewayUrl = req.getScheme() + HandlerConstants.SCHEME_SEPARATOR + System.getProperty(HandlerConstants.IOT_GW_HOST_ENV_VAR) + + HandlerConstants.COLON + HandlerUtil.getGatewayPort(req.getScheme()); + iotsCoreUrl = req.getScheme() + HandlerConstants.SCHEME_SEPARATOR + System.getProperty(HandlerConstants.IOT_CORE_HOST_ENV_VAR) + + HandlerConstants.COLON + HandlerUtil.getCorePort(req.getScheme()); + String uiConfigUrl = iotsCoreUrl + HandlerConstants.UI_CONFIG_ENDPOINT; + uiConfigJsonObject = HandlerUtil.getUIConfigAndPersistInSession(uiConfigUrl, gatewayUrl, httpSession, resp); + chatConfig = uiConfigJsonObject.get("hubspotChat").getAsJsonObject().get("accessToken").getAsString(); + hubspotEndpoint = HandlerConstants.HTTPS_PROTOCOL + HandlerConstants.SCHEME_SEPARATOR + HandlerConstants.HUBSPOT_CHAT_URL; + return true; + } +} diff --git a/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerConstants.java b/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerConstants.java index bf9947a9af..27d6afaadc 100644 --- a/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerConstants.java +++ b/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerConstants.java @@ -105,4 +105,5 @@ public class HandlerConstants { public static final String IOT_GW_HTTPS_PORT_ENV_VAR = "iot.gateway.https.port"; public static final String IOT_REPORTING_WEBAPP_HOST_ENV_VAR = "iot.reporting.webapp.host"; public static final String USER_SCOPES = "userScopes"; + public static final String HUBSPOT_CHAT_URL = "api.hubapi.com"; } diff --git a/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerUtil.java b/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerUtil.java index fb565bf59b..b7376abddc 100644 --- a/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerUtil.java +++ b/components/ui-request-interceptor/io.entgra.ui.request.interceptor/src/main/java/io/entgra/ui/request/interceptor/util/HandlerUtil.java @@ -435,6 +435,23 @@ public class HandlerUtil { } } + /** + * Generate te request entity for POST requests from the hubspot's incoming request. + * + * @param req incoming {@link HttpServletRequest}. + * @param proxyRequest proxy request instance. + * @throws IOException If error occurred while generating the request body. + */ + public static void generateChatRequestEntity(HttpServletRequest req, HttpEntityEnclosingRequestBase proxyRequest) + throws IOException { + if (StringUtils.isNotEmpty(req.getHeader(HttpHeaders.CONTENT_LENGTH)) || + StringUtils.isNotEmpty(req.getHeader(HttpHeaders.TRANSFER_ENCODING))) { + InputStreamEntity entity = new InputStreamEntity(req.getInputStream(), + Long.parseLong(req.getHeader(HttpHeaders.CONTENT_LENGTH))); + proxyRequest.setEntity(new BufferedHttpEntity(entity)); + } + } + /*** * Constructs the application registration payload for DCR. * diff --git a/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/pom.xml b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/pom.xml new file mode 100644 index 0000000000..0446649036 --- /dev/null +++ b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/pom.xml @@ -0,0 +1,99 @@ + + + + + org.wso2.carbon.devicemgt + apimgt-extensions-feature + 5.0.21-SNAPSHOT + ../pom.xml + + + 4.0.0 + io.entgra.device.mgt.core.apimgt.analytics.extension.feature + pom + Entgra - APIM Analytics Extension Feature + http://entgra.io + + + + org.wso2.carbon.devicemgt + io.entgra.device.mgt.core.apimgt.analytics.extension + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + p2-feature-generation + package + + p2-feature-gen + + + io.entgra.device.mgt.core.apimgt.analytics.extension + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:true + + + + + org.wso2.carbon.devicemgt:io.entgra.device.mgt.core.apimgt.analytics.extension:${carbon.device.mgt.version} + + + + + + + + + + diff --git a/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/build.properties b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/build.properties new file mode 100644 index 0000000000..93c4b10701 --- /dev/null +++ b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/build.properties @@ -0,0 +1 @@ +custom = true \ No newline at end of file diff --git a/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_publisher.xml.template b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_publisher.xml.template new file mode 100644 index 0000000000..b103c8d1ac --- /dev/null +++ b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_publisher.xml.template @@ -0,0 +1,19 @@ + + + + + + + #foreach( $property in $properties ) + ${property.value} + #end + + \ No newline at end of file diff --git a/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_receiver.xml.template b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_receiver.xml.template new file mode 100644 index 0000000000..c9b90877f0 --- /dev/null +++ b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_receiver.xml.template @@ -0,0 +1,20 @@ + + + + + #foreach( $property in $properties ) + ${property.value} + #end + + + + \ No newline at end of file diff --git a/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_stream.json.template b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_stream.json.template new file mode 100644 index 0000000000..5f0b85ad3b --- /dev/null +++ b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/iot-analytics-templates/event_stream.json.template @@ -0,0 +1,26 @@ +{ + "streamId": "$name:$version", + "name": "$name", + "version": "$version", + "nickName": "", + "description": "", + "metaData": [ + { + "name": "${metaData.name}", + "type": "${metaData.type}" + } + ], + "correlationData": [], + "payloadData": [ +#foreach( $property in $properties ) + { + "name": "${property.name}", + "type": "${property.value}" + }, +#end + { + "name": "ts", + "type": "LONG" + } + ] +} \ No newline at end of file diff --git a/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/p2.inf b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/p2.inf new file mode 100644 index 0000000000..235bd0424c --- /dev/null +++ b/features/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension.feature/src/main/resources/p2.inf @@ -0,0 +1,3 @@ +instructions.configure = \ +org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../../repository/resources/iot-analytics-templates);\ +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/io.entgra.device.mgt.core.apimgt.analytics.extension_${feature.version}/iot-analytics-templates/,target:${installFolder}/../../resources/iot-analytics-templates/,overwrite:true);\ diff --git a/features/apimgt-extensions/pom.xml b/features/apimgt-extensions/pom.xml index 45a706e7a9..ecb17f4c15 100644 --- a/features/apimgt-extensions/pom.xml +++ b/features/apimgt-extensions/pom.xml @@ -37,6 +37,7 @@ org.wso2.carbon.apimgt.webapp.publisher.feature org.wso2.carbon.apimgt.application.extension.feature org.wso2.carbon.apimgt.keymgt.extension.feature + io.entgra.device.mgt.core.apimgt.analytics.extension.feature diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/cdm-config.xml b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/cdm-config.xml index 340b22802b..f0ebf0de84 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/cdm-config.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/cdm-config.xml @@ -187,5 +187,9 @@ + + false + Replace with mail + diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml index d36e26a3cc..1c33bddfdb 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml @@ -24,6 +24,14 @@ 3600 10000 + + + false + tracking_url + + access_token + sender_actorId + false true @@ -100,6 +108,7 @@ perm:devices:details perm:devices:update perm:devices:view + perm:devices:enrollment-guide:view perm:view-configuration perm:manage-configuration perm:policies:remove diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf_templates/templates/repository/conf/cdm-config.xml.j2 b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf_templates/templates/repository/conf/cdm-config.xml.j2 index f567bb9dd2..09e3fad19b 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf_templates/templates/repository/conf/cdm-config.xml.j2 +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/conf_templates/templates/repository/conf/cdm-config.xml.j2 @@ -322,7 +322,7 @@ - + @@ -350,6 +350,15 @@ {% endfor %} {% endif%} - + + + {% if device_mgt_conf.enrollment_guide_conf is defined %} + {{device_mgt_conf.enrollment_guide_conf.enable}} + {{device_mgt_conf.enrollment_guide_conf.mail}} + {% else %} + false + Replace with mail + {% endif %} + diff --git a/features/logger/io.entgra.notification.logger.feature/pom.xml b/features/logger/io.entgra.notification.logger.feature/pom.xml new file mode 100644 index 0000000000..be7f7146f2 --- /dev/null +++ b/features/logger/io.entgra.notification.logger.feature/pom.xml @@ -0,0 +1,116 @@ + + + + + + + + org.wso2.carbon.devicemgt + logger-feature + 5.0.21-SNAPSHOT + ../pom.xml + + + 4.0.0 + io.entgra.notification.logger.feature + pom + Entgra - Notification logger + http://entgra.io + + This feature bundles for the Entgra Notification logger + + + + + org.wso2.carbon + org.wso2.carbon.logging + + + org.testng + testng + + + org.wso2.carbon.devicemgt + io.entgra.device.mgt.extensions.logger + + + org.wso2.carbon.devicemgt + io.entgra.notification.logger + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + p2-feature-generation + package + + p2-feature-gen + + + io.entgra.notification.logger + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:true + + + + + org.wso2.carbon.devicemgt:io.entgra.notification.logger:${carbon.device.mgt.version} + + + + + + + + + diff --git a/features/logger/io.entgra.notification.logger.feature/src/main/resources/build.properties b/features/logger/io.entgra.notification.logger.feature/src/main/resources/build.properties new file mode 100644 index 0000000000..e98fb2729f --- /dev/null +++ b/features/logger/io.entgra.notification.logger.feature/src/main/resources/build.properties @@ -0,0 +1,20 @@ +# +# Copyright (C) 2018 - 2023 Entgra (Pvt) Ltd, Inc - All Rights Reserved. +# +# Unauthorised copying/redistribution of this file, via any medium is strictly prohibited. +# +# Licensed under the Entgra Commercial License, Version 1.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://entgra.io/licenses/entgra-commercial/1.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. +# + +custom = true diff --git a/features/logger/io.entgra.notification.logger.feature/src/main/resources/p2.inf b/features/logger/io.entgra.notification.logger.feature/src/main/resources/p2.inf new file mode 100644 index 0000000000..7ab37b9d7d --- /dev/null +++ b/features/logger/io.entgra.notification.logger.feature/src/main/resources/p2.inf @@ -0,0 +1 @@ +instructions.configure = \ \ No newline at end of file diff --git a/features/logger/pom.xml b/features/logger/pom.xml new file mode 100644 index 0000000000..10fc1b3f0b --- /dev/null +++ b/features/logger/pom.xml @@ -0,0 +1,40 @@ + + + + + + + + org.wso2.carbon.devicemgt + carbon-devicemgt + 5.0.21-SNAPSHOT + ../../pom.xml + + + 4.0.0 + logger-feature + pom + Entgra - Logger Feature + http://entgra.io + + + io.entgra.notification.logger.feature + + + diff --git a/features/transport-mgt/email-sender/org.wso2.carbon.email.sender.feature/src/main/resources/email/templates/enrollment-guide.vm b/features/transport-mgt/email-sender/org.wso2.carbon.email.sender.feature/src/main/resources/email/templates/enrollment-guide.vm new file mode 100644 index 0000000000..f4f16cc8d7 --- /dev/null +++ b/features/transport-mgt/email-sender/org.wso2.carbon.email.sender.feature/src/main/resources/email/templates/enrollment-guide.vm @@ -0,0 +1,34 @@ +#* + Copyright (c) 2023, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + + WSO2 Inc. licenses this file to you under the Apache License, + Version 2.0 (the "License"); you may not use this file except + in compliance with the License. + you may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*# + + $mail-subject + + + + Enrollment Questions and Answers + + +
+ $enrollment-guide +
+ + + ]]> + +
diff --git a/pom.xml b/pom.xml index cf130f5b40..978a200b23 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ components/transport-mgt components/analytics-mgt components/webapp-authenticator-framework + components/logger components/task-mgt features/device-mgt features/apimgt-extensions @@ -59,6 +60,7 @@ features/transport-mgt features/analytics-mgt features/webapp-authenticator-framework + features/logger features/task-mgt @@ -282,6 +284,11 @@ org.wso2.carbon.apimgt.application.extension ${carbon.device.mgt.version} + + org.wso2.carbon.devicemgt + io.entgra.device.mgt.core.apimgt.analytics.extension + ${carbon.device.mgt.version} + org.wso2.carbon.devicemgt org.wso2.carbon.identity.jwt.client.extension @@ -356,6 +363,11 @@ org.wso2.carbon.apimgt.keymgt.extension ${carbon.device.mgt.version} + + org.wso2.carbon.devicemgt + io.entgra.notification.logger + ${carbon.device.mgt.version} +