Skip to content

Commit

Permalink
TASK-56182: Add analytics for processes app (#90)
Browse files Browse the repository at this point in the history
Add analytics for processes app
  • Loading branch information
hakermi authored Apr 15, 2022
1 parent 463c6dc commit 51a62ce
Show file tree
Hide file tree
Showing 12 changed files with 166 additions and 20 deletions.
10 changes: 9 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
<org.exoplatform.social.version>6.3.x-SNAPSHOT</org.exoplatform.social.version>
<org.exoplatform.platform-ui.version>6.3.x-SNAPSHOT</org.exoplatform.platform-ui.version>
<addon.exo.tasks.version>3.3.x-SNAPSHOT</addon.exo.tasks.version>

<addon.exo.analytics.version>1.2.x-SNAPSHOT</addon.exo.analytics.version>

<!-- Sonar properties -->
<sonar.organization>exoplatform</sonar.organization>
</properties>
Expand Down Expand Up @@ -65,6 +66,13 @@
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.exoplatform.addons.analytics</groupId>
<artifactId>analytics-parent</artifactId>
<version>${addon.exo.analytics.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Current project artifacts -->
<dependency>
<groupId>${project.groupId}</groupId>
Expand Down
5 changes: 5 additions & 0 deletions processes-services/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@
<artifactId>ecms-core-services</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.exoplatform.addons.analytics</groupId>
<artifactId>analytics-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.exoplatform.processes.Utils;

import org.exoplatform.commons.utils.CommonsUtils;
import org.exoplatform.services.listener.ListenerService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.social.core.identity.model.Identity;
Expand Down Expand Up @@ -37,4 +38,11 @@ public static Space getProjectParentSpace(Long projectId) {
return null;
}

public static <S, D> void broadcast(ListenerService listenerService, String eventName, S source, D data) {
try {
listenerService.broadcast(eventName, source, data);
} catch (Exception e) {
LOG.error("Error while broadcasting event: {}", eventName, e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.exoplatform.processes.listener;

import org.exoplatform.analytics.model.StatisticData;
import org.exoplatform.analytics.utils.AnalyticsUtils;
import org.exoplatform.processes.model.WorkFlow;
import org.exoplatform.services.listener.Event;
import org.exoplatform.services.listener.Listener;
import org.exoplatform.container.xml.InitParams;

public class ProcessAnalyticsListener extends Listener<Long, WorkFlow> {

private final String operation;

public ProcessAnalyticsListener(InitParams initParams) {
this.operation = initParams.getValueParam("operation").getValue();
}

@Override
public void onEvent(Event<Long, WorkFlow> event) throws Exception {
StatisticData statisticData = new StatisticData();
long userId = event.getSource();
WorkFlow workFlow = event.getData();
statisticData.setModule("processes");
statisticData.setSubModule("process");
statisticData.setOperation(operation);
statisticData.setUserId(userId);
statisticData.addParameter("processID", workFlow.getId());
statisticData.addParameter("processName", workFlow.getTitle());
AnalyticsUtils.addStatisticData(statisticData);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.exoplatform.processes.listener;

import org.exoplatform.analytics.model.StatisticData;
import org.exoplatform.analytics.utils.AnalyticsUtils;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.processes.model.Work;
import org.exoplatform.processes.model.WorkFlow;
import org.exoplatform.processes.service.ProcessesService;
import org.exoplatform.services.listener.Event;
import org.exoplatform.services.listener.Listener;
import org.exoplatform.task.dto.ProjectDto;

public class RequestAnalyticsListener extends Listener<Work, ProjectDto> {

private ProcessesService processesService;
private final String operation;

public RequestAnalyticsListener(InitParams initParams, ProcessesService processesService) {
this.operation = initParams.getValueParam("operation").getValue();
this.processesService = processesService;
}

@Override
public void onEvent(Event<Work, ProjectDto> event) throws Exception {
StatisticData statisticData = new StatisticData();
Work work = event.getSource();
ProjectDto project = event.getData();
WorkFlow workFlow = processesService.getWorkFlowByProjectId(project.getId());
long userId = work.getCreatorId();
statisticData.setModule("processes");
statisticData.setSubModule("request");
statisticData.setOperation(operation);
statisticData.setUserId(userId);
statisticData.addParameter("processID", workFlow.getId());
statisticData.addParameter("processName", workFlow.getTitle());
statisticData.addParameter("requestID", work.getId());
statisticData.addParameter("requestName", work.getTitle());
AnalyticsUtils.addStatisticData(statisticData);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,6 @@ public static String getRequestLink(Long taskId) {
return stringBuilder.toString();
}

public static <S, D> void broadcast(ListenerService listenerService, String eventName, S source, D data) {
try {
listenerService.broadcast(eventName, source, data);
} catch (Exception e) {
LOG.error("Error while broadcasting event: {}", eventName, e);
}
}

public static Object getRequestCommentsLink(Long taskId) {
StringBuilder stringBuilder = new StringBuilder();
String portalOwner = CommonsUtils.getCurrentPortalOwner();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ public WorkFlow saveWorkFlow(WorkFlow workFlow, long userId) throws IllegalArgum
workFlowEntity.setProjectId(projectId);
}
workFlowEntity = workFlowDAO.create(workFlowEntity);
WorkFlow newWorkflow = EntityMapper.fromEntity(workFlowEntity, illustrativeAttachment);
ProcessesUtils.broadcast(listenerService, "exo.process.created", userId, newWorkflow);
} else {
workFlowEntity.setModifiedDate(new Date());
workFlowEntity.setModifierId(userId);
Expand Down Expand Up @@ -356,7 +358,7 @@ private TaskDto updateWorkTask(Work work) {
taskDto = taskService.updateTask(taskDto);
if (taskDto.isCompleted() && taskDto.getStatus().getName().equals(DEFAULT_PROCESS_STATUS[4])) {
ProjectDto projectDto = taskDto.getStatus().getProject();
NotificationUtils.broadcast(listenerService, "exo.process.request.canceled", taskDto, projectDto);
ProcessesUtils.broadcast(listenerService, "exo.process.request.canceled", taskDto, projectDto);
}
return taskDto;
}
Expand All @@ -383,7 +385,8 @@ public Work saveWork(Work work, long userId) throws IllegalArgumentException {
deleteWorkDraftById(work.getDraftId());
}
Work newWork = EntityMapper.taskToWork(taskDto);
NotificationUtils.broadcast(listenerService, "exo.process.request.created", newWork, projectDto);
newWork.setCreatorId(userId);
ProcessesUtils.broadcast(listenerService, "exo.process.request.created", newWork, projectDto);
return newWork;
} else {
TaskDto taskDto = updateWorkTask(work);
Expand Down Expand Up @@ -442,7 +445,7 @@ public void deleteWorkById(Long workId) {
if (taskDto != null) {
taskService.removeTask(workId);
ProjectDto projectDto = taskDto.getStatus().getProject();
NotificationUtils.broadcast(listenerService, "exo.process.request.removed", taskDto, projectDto);
ProcessesUtils.broadcast(listenerService, "exo.process.request.removed", taskDto, projectDto);
}
} catch (EntityNotFoundException e) {
LOG.error("Work not found", e);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package org.exoplatform.processes.storage;

import org.apache.xmlbeans.impl.xb.xsdschema.Public;
import org.exoplatform.commons.exception.ObjectNotFoundException;
import org.exoplatform.commons.file.model.FileInfo;
import org.exoplatform.commons.file.model.FileItem;
import org.exoplatform.commons.file.services.FileService;
import org.exoplatform.commons.file.services.FileStorageException;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.processes.Utils.EntityMapper;
import org.exoplatform.processes.Utils.ProcessesUtils;
Expand Down Expand Up @@ -44,7 +42,6 @@
import org.powermock.modules.junit4.PowerMockRunner;

import javax.ws.rs.ext.RuntimeDelegate;
import java.io.IOException;
import java.util.*;

import static org.junit.Assert.*;
Expand Down Expand Up @@ -189,6 +186,8 @@ public void saveWorkflow() {
when(workFlow.getIllustrativeAttachment()).thenReturn(illustrativeAttachment);
this.processesStorage.saveWorkFlow(workFlow, 1L);
verify(workFlowDAO, times(1)).create(workFlowEntity);
PowerMockito.verifyStatic(ProcessesUtils.class, times(1));
ProcessesUtils.broadcast(listenerService, "exo.process.created", 1L, EntityMapper.fromEntity(workFlowEntity, illustrativeAttachment));
verify(processesAttachmentService, times(1)).linkAttachmentsToEntity(attachments.toArray(new Attachment[0]),
1L,
1L,
Expand Down Expand Up @@ -255,8 +254,8 @@ public void saveWork() throws EntityNotFoundException, IllegalAccessException, O
when(taskDto.getTitle()).thenReturn("");
when(taskService.createTask(taskDto)).thenReturn(taskDto);
processesStorage.saveWork(work, 1L);
PowerMockito.verifyStatic(NotificationUtils.class, times(1));
NotificationUtils.broadcast(listenerService, "exo.process.request.created", work, projectDto);
PowerMockito.verifyStatic(ProcessesUtils.class, times(1));
ProcessesUtils.broadcast(listenerService, "exo.process.request.created", work, projectDto);

work.setIsDraft(true);
work.setId(0);
Expand Down Expand Up @@ -285,8 +284,8 @@ public void saveWork() throws EntityNotFoundException, IllegalAccessException, O
when(statusService.getStatuses(1L)).thenReturn(statuses);
work.setStatus("Canceled");
processesStorage.saveWork(work, 1L);
PowerMockito.verifyStatic(NotificationUtils.class, times(1));
NotificationUtils.broadcast(listenerService, "exo.process.request.canceled", updatedTask, updatedTask.getStatus().getProject());
PowerMockito.verifyStatic(ProcessesUtils.class, times(1));
ProcessesUtils.broadcast(listenerService, "exo.process.request.canceled", updatedTask, updatedTask.getStatus().getProject());
verify(taskService, times(1)).updateTask(taskDto);

when(taskService.getTask(work.getId())).thenThrow(EntityNotFoundException.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
analytics.field.label.processID=Processes: Process ID
analytics.field.label.processName=Processes: Process Name
analytics.field.label.requestID=Processes: Request ID
analytics.field.label.requestName=Processes: Request Name

analytics.processCreated=Process created
analytics.requestCreated=Request created

analytics.process=Process
analytics.request=Request
analytics.origin.process=Processes
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
<import>war:/conf/processes/dynamic-container-configuration.xml</import>
<import profiles="app-center">war:/conf/processes/app-center-configuration.xml</import>
<import>war:/conf/processes/notification-configuration.xml</import>
<import profiles="analytics">war:/conf/processes/analytics-configuration.xml</import>
</configuration>
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
* Copyright (C) 2022 eXo Platform SAS.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-->
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.exoplatform.org/xml/ns/kernel_1_3.xsd http://www.exoplatform.org/xml/ns/kernel_1_3.xsd"
xmlns="http://www.exoplatform.org/xml/ns/kernel_1_3.xsd">

<external-component-plugins profiles="analytics">
<target-component>org.exoplatform.services.listener.ListenerService</target-component>
<component-plugin>
<name>exo.process.created</name>
<set-method>addListener</set-method>
<type>org.exoplatform.processes.listener.ProcessAnalyticsListener</type>
<init-params>
<value-param>
<name>operation</name>
<value>processCreated</value>
</value-param>
</init-params>
</component-plugin>
<component-plugin>
<name>exo.process.request.created</name>
<set-method>addListener</set-method>
<type>org.exoplatform.processes.listener.RequestAnalyticsListener</type>
<init-params>
<value-param>
<name>operation</name>
<value>requestCreated</value>
</value-param>
</init-params>
</component-plugin>
</external-component-plugins>
</configuration>
2 changes: 1 addition & 1 deletion translations.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ baseDir=add-ons/processes/
Processes.properties=processes-webapp/src/main/resources/locale/portlet/Processes_en.properties
Processes/global.properties=processes-webapp/src/main/resources/locale/navigation/portal/global_en.properties
ProcessesNotification.properties=processes-webapp/src/main/resources/locale/notification/ProcessesNotification_en.properties

Analytics.properties=processes-webapp/src/main/resources/locale/portlet/Analytics_en.properties

0 comments on commit 51a62ce

Please sign in to comment.