Skip to content

Commit 51a62ce

Browse files
authored
TASK-56182: Add analytics for processes app (#90)
Add analytics for processes app
1 parent 463c6dc commit 51a62ce

File tree

12 files changed

+166
-20
lines changed

12 files changed

+166
-20
lines changed

pom.xml

+9-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
<org.exoplatform.social.version>6.3.x-SNAPSHOT</org.exoplatform.social.version>
3232
<org.exoplatform.platform-ui.version>6.3.x-SNAPSHOT</org.exoplatform.platform-ui.version>
3333
<addon.exo.tasks.version>3.3.x-SNAPSHOT</addon.exo.tasks.version>
34-
34+
<addon.exo.analytics.version>1.2.x-SNAPSHOT</addon.exo.analytics.version>
35+
3536
<!-- Sonar properties -->
3637
<sonar.organization>exoplatform</sonar.organization>
3738
</properties>
@@ -65,6 +66,13 @@
6566
<type>pom</type>
6667
<scope>import</scope>
6768
</dependency>
69+
<dependency>
70+
<groupId>org.exoplatform.addons.analytics</groupId>
71+
<artifactId>analytics-parent</artifactId>
72+
<version>${addon.exo.analytics.version}</version>
73+
<type>pom</type>
74+
<scope>import</scope>
75+
</dependency>
6876
<!-- Current project artifacts -->
6977
<dependency>
7078
<groupId>${project.groupId}</groupId>

processes-services/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@
7878
<artifactId>ecms-core-services</artifactId>
7979
<scope>provided</scope>
8080
</dependency>
81+
<dependency>
82+
<groupId>org.exoplatform.addons.analytics</groupId>
83+
<artifactId>analytics-api</artifactId>
84+
<scope>provided</scope>
85+
</dependency>
8186
<!-- Test -->
8287
<dependency>
8388
<groupId>junit</groupId>

processes-services/src/main/java/org/exoplatform/processes/Utils/ProcessesUtils.java

+8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.exoplatform.processes.Utils;
22

33
import org.exoplatform.commons.utils.CommonsUtils;
4+
import org.exoplatform.services.listener.ListenerService;
45
import org.exoplatform.services.log.ExoLogger;
56
import org.exoplatform.services.log.Log;
67
import org.exoplatform.social.core.identity.model.Identity;
@@ -37,4 +38,11 @@ public static Space getProjectParentSpace(Long projectId) {
3738
return null;
3839
}
3940

41+
public static <S, D> void broadcast(ListenerService listenerService, String eventName, S source, D data) {
42+
try {
43+
listenerService.broadcast(eventName, source, data);
44+
} catch (Exception e) {
45+
LOG.error("Error while broadcasting event: {}", eventName, e);
46+
}
47+
}
4048
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.exoplatform.processes.listener;
2+
3+
import org.exoplatform.analytics.model.StatisticData;
4+
import org.exoplatform.analytics.utils.AnalyticsUtils;
5+
import org.exoplatform.processes.model.WorkFlow;
6+
import org.exoplatform.services.listener.Event;
7+
import org.exoplatform.services.listener.Listener;
8+
import org.exoplatform.container.xml.InitParams;
9+
10+
public class ProcessAnalyticsListener extends Listener<Long, WorkFlow> {
11+
12+
private final String operation;
13+
14+
public ProcessAnalyticsListener(InitParams initParams) {
15+
this.operation = initParams.getValueParam("operation").getValue();
16+
}
17+
18+
@Override
19+
public void onEvent(Event<Long, WorkFlow> event) throws Exception {
20+
StatisticData statisticData = new StatisticData();
21+
long userId = event.getSource();
22+
WorkFlow workFlow = event.getData();
23+
statisticData.setModule("processes");
24+
statisticData.setSubModule("process");
25+
statisticData.setOperation(operation);
26+
statisticData.setUserId(userId);
27+
statisticData.addParameter("processID", workFlow.getId());
28+
statisticData.addParameter("processName", workFlow.getTitle());
29+
AnalyticsUtils.addStatisticData(statisticData);
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.exoplatform.processes.listener;
2+
3+
import org.exoplatform.analytics.model.StatisticData;
4+
import org.exoplatform.analytics.utils.AnalyticsUtils;
5+
import org.exoplatform.container.xml.InitParams;
6+
import org.exoplatform.processes.model.Work;
7+
import org.exoplatform.processes.model.WorkFlow;
8+
import org.exoplatform.processes.service.ProcessesService;
9+
import org.exoplatform.services.listener.Event;
10+
import org.exoplatform.services.listener.Listener;
11+
import org.exoplatform.task.dto.ProjectDto;
12+
13+
public class RequestAnalyticsListener extends Listener<Work, ProjectDto> {
14+
15+
private ProcessesService processesService;
16+
private final String operation;
17+
18+
public RequestAnalyticsListener(InitParams initParams, ProcessesService processesService) {
19+
this.operation = initParams.getValueParam("operation").getValue();
20+
this.processesService = processesService;
21+
}
22+
23+
@Override
24+
public void onEvent(Event<Work, ProjectDto> event) throws Exception {
25+
StatisticData statisticData = new StatisticData();
26+
Work work = event.getSource();
27+
ProjectDto project = event.getData();
28+
WorkFlow workFlow = processesService.getWorkFlowByProjectId(project.getId());
29+
long userId = work.getCreatorId();
30+
statisticData.setModule("processes");
31+
statisticData.setSubModule("request");
32+
statisticData.setOperation(operation);
33+
statisticData.setUserId(userId);
34+
statisticData.addParameter("processID", workFlow.getId());
35+
statisticData.addParameter("processName", workFlow.getTitle());
36+
statisticData.addParameter("requestID", work.getId());
37+
statisticData.addParameter("requestName", work.getTitle());
38+
AnalyticsUtils.addStatisticData(statisticData);
39+
}
40+
}

processes-services/src/main/java/org/exoplatform/processes/notification/utils/NotificationUtils.java

-8
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,6 @@ public static String getRequestLink(Long taskId) {
7575
return stringBuilder.toString();
7676
}
7777

78-
public static <S, D> void broadcast(ListenerService listenerService, String eventName, S source, D data) {
79-
try {
80-
listenerService.broadcast(eventName, source, data);
81-
} catch (Exception e) {
82-
LOG.error("Error while broadcasting event: {}", eventName, e);
83-
}
84-
}
85-
8678
public static Object getRequestCommentsLink(Long taskId) {
8779
StringBuilder stringBuilder = new StringBuilder();
8880
String portalOwner = CommonsUtils.getCurrentPortalOwner();

processes-services/src/main/java/org/exoplatform/processes/storage/ProcessesStorageImpl.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ public WorkFlow saveWorkFlow(WorkFlow workFlow, long userId) throws IllegalArgum
169169
workFlowEntity.setProjectId(projectId);
170170
}
171171
workFlowEntity = workFlowDAO.create(workFlowEntity);
172+
WorkFlow newWorkflow = EntityMapper.fromEntity(workFlowEntity, illustrativeAttachment);
173+
ProcessesUtils.broadcast(listenerService, "exo.process.created", userId, newWorkflow);
172174
} else {
173175
workFlowEntity.setModifiedDate(new Date());
174176
workFlowEntity.setModifierId(userId);
@@ -356,7 +358,7 @@ private TaskDto updateWorkTask(Work work) {
356358
taskDto = taskService.updateTask(taskDto);
357359
if (taskDto.isCompleted() && taskDto.getStatus().getName().equals(DEFAULT_PROCESS_STATUS[4])) {
358360
ProjectDto projectDto = taskDto.getStatus().getProject();
359-
NotificationUtils.broadcast(listenerService, "exo.process.request.canceled", taskDto, projectDto);
361+
ProcessesUtils.broadcast(listenerService, "exo.process.request.canceled", taskDto, projectDto);
360362
}
361363
return taskDto;
362364
}
@@ -383,7 +385,8 @@ public Work saveWork(Work work, long userId) throws IllegalArgumentException {
383385
deleteWorkDraftById(work.getDraftId());
384386
}
385387
Work newWork = EntityMapper.taskToWork(taskDto);
386-
NotificationUtils.broadcast(listenerService, "exo.process.request.created", newWork, projectDto);
388+
newWork.setCreatorId(userId);
389+
ProcessesUtils.broadcast(listenerService, "exo.process.request.created", newWork, projectDto);
387390
return newWork;
388391
} else {
389392
TaskDto taskDto = updateWorkTask(work);
@@ -442,7 +445,7 @@ public void deleteWorkById(Long workId) {
442445
if (taskDto != null) {
443446
taskService.removeTask(workId);
444447
ProjectDto projectDto = taskDto.getStatus().getProject();
445-
NotificationUtils.broadcast(listenerService, "exo.process.request.removed", taskDto, projectDto);
448+
ProcessesUtils.broadcast(listenerService, "exo.process.request.removed", taskDto, projectDto);
446449
}
447450
} catch (EntityNotFoundException e) {
448451
LOG.error("Work not found", e);

processes-services/src/test/java/org/exoplatform/processes/storage/ProcessesStorageImplTest.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package org.exoplatform.processes.storage;
22

3-
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
43
import org.exoplatform.commons.exception.ObjectNotFoundException;
54
import org.exoplatform.commons.file.model.FileInfo;
65
import org.exoplatform.commons.file.model.FileItem;
76
import org.exoplatform.commons.file.services.FileService;
8-
import org.exoplatform.commons.file.services.FileStorageException;
97
import org.exoplatform.container.ExoContainerContext;
108
import org.exoplatform.processes.Utils.EntityMapper;
119
import org.exoplatform.processes.Utils.ProcessesUtils;
@@ -44,7 +42,6 @@
4442
import org.powermock.modules.junit4.PowerMockRunner;
4543

4644
import javax.ws.rs.ext.RuntimeDelegate;
47-
import java.io.IOException;
4845
import java.util.*;
4946

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

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

292291
when(taskService.getTask(work.getId())).thenThrow(EntityNotFoundException.class);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
analytics.field.label.processID=Processes: Process ID
2+
analytics.field.label.processName=Processes: Process Name
3+
analytics.field.label.requestID=Processes: Request ID
4+
analytics.field.label.requestName=Processes: Request Name
5+
6+
analytics.processCreated=Process created
7+
analytics.requestCreated=Request created
8+
9+
analytics.process=Process
10+
analytics.request=Request
11+
analytics.origin.process=Processes

processes-webapp/src/main/webapp/WEB-INF/conf/configuration.xml

+1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
<import>war:/conf/processes/dynamic-container-configuration.xml</import>
88
<import profiles="app-center">war:/conf/processes/app-center-configuration.xml</import>
99
<import>war:/conf/processes/notification-configuration.xml</import>
10+
<import profiles="analytics">war:/conf/processes/analytics-configuration.xml</import>
1011
</configuration>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?xml version="1.0" encoding="ISO-8859-1"?>
2+
<!--
3+
* Copyright (C) 2022 eXo Platform SAS.
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Affero General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU Affero General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Affero General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
-->
19+
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
20+
xsi:schemaLocation="http://www.exoplatform.org/xml/ns/kernel_1_3.xsd http://www.exoplatform.org/xml/ns/kernel_1_3.xsd"
21+
xmlns="http://www.exoplatform.org/xml/ns/kernel_1_3.xsd">
22+
23+
<external-component-plugins profiles="analytics">
24+
<target-component>org.exoplatform.services.listener.ListenerService</target-component>
25+
<component-plugin>
26+
<name>exo.process.created</name>
27+
<set-method>addListener</set-method>
28+
<type>org.exoplatform.processes.listener.ProcessAnalyticsListener</type>
29+
<init-params>
30+
<value-param>
31+
<name>operation</name>
32+
<value>processCreated</value>
33+
</value-param>
34+
</init-params>
35+
</component-plugin>
36+
<component-plugin>
37+
<name>exo.process.request.created</name>
38+
<set-method>addListener</set-method>
39+
<type>org.exoplatform.processes.listener.RequestAnalyticsListener</type>
40+
<init-params>
41+
<value-param>
42+
<name>operation</name>
43+
<value>requestCreated</value>
44+
</value-param>
45+
</init-params>
46+
</component-plugin>
47+
</external-component-plugins>
48+
</configuration>

translations.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ baseDir=add-ons/processes/
2121
Processes.properties=processes-webapp/src/main/resources/locale/portlet/Processes_en.properties
2222
Processes/global.properties=processes-webapp/src/main/resources/locale/navigation/portal/global_en.properties
2323
ProcessesNotification.properties=processes-webapp/src/main/resources/locale/notification/ProcessesNotification_en.properties
24-
24+
Analytics.properties=processes-webapp/src/main/resources/locale/portlet/Analytics_en.properties

0 commit comments

Comments
 (0)