WorkflowTimelineEventProvider.java
5.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* com.adobe.granite.workflow.WorkflowException
* com.adobe.granite.workflow.WorkflowSession
* com.adobe.granite.workflow.exec.HistoryItem
* com.adobe.granite.workflow.exec.WorkItem
* com.adobe.granite.workflow.exec.Workflow
* com.adobe.granite.workflow.model.WorkflowNode
* org.apache.felix.scr.annotations.Component
* org.apache.felix.scr.annotations.Service
* org.apache.jackrabbit.util.Text
* org.apache.sling.api.resource.Resource
* org.apache.sling.api.resource.ResourceResolver
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.adobe.granite.timeline.internal.providers;
import com.adobe.granite.timeline.TimelineEvent;
import com.adobe.granite.timeline.TimelineEventProvider;
import com.adobe.granite.timeline.TimelineEventType;
import com.adobe.granite.timeline.types.WorkflowTimelineEventType;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.HistoryItem;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.Workflow;
import com.adobe.granite.workflow.model.WorkflowNode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.util.Text;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*
* This class specifies class file version 49.0 but uses Java 6 signatures. Assumed Java 6.
*/
@Component
@Service
public class WorkflowTimelineEventProvider
implements TimelineEventProvider {
private static final Logger log = LoggerFactory.getLogger(WorkflowTimelineEventProvider.class);
public static final TimelineEventType EVENT_TYPE = new WorkflowTimelineEventType();
@Override
public boolean accepts(Resource resource) {
return true;
}
@Override
public Collection<TimelineEvent> getEvents(Resource resource) {
ArrayList<TimelineEvent> events = new ArrayList<TimelineEvent>();
ResourceResolver resolver = resource.getResourceResolver();
WorkflowSession workflowSession = (WorkflowSession)resolver.adaptTo(WorkflowSession.class);
if (null != workflowSession) {
log.debug(">>> querying workflow instances for resource [{}]", (Object)resource.getPath());
String query = "/jcr:root/etc/workflow//element(*,cq:Payload)[path='" + Text.escapeIllegalXpathSearchChars((String)resource.getPath()).replaceAll("'", "''") + "']";
long startQuery = System.currentTimeMillis();
Iterator resources = resolver.findResources(query, "xpath");
log.debug(">>> queried workflow instances for resource [{}] in [{}ms]", (Object)resource.getPath(), (Object)(System.currentTimeMillis() - startQuery));
long startTimelineEntries = System.currentTimeMillis();
while (resources.hasNext()) {
Resource instance = ((Resource)resources.next()).getParent().getParent();
try {
Workflow workflow = workflowSession.getWorkflow(instance.getPath());
List history = workflowSession.getHistory(workflow);
for (HistoryItem historyItem : history) {
events.add(new WorkflowTimelineEvent(historyItem, instance));
}
continue;
}
catch (WorkflowException e) {
log.error("error retrieving workflow history for instance [{}]: ", (Object)instance.getPath(), (Object)e);
continue;
}
}
log.debug(">>> transformation of workflow history to timeline events for resource [{}] took [{}ms]", (Object)resource.getPath(), (Object)(System.currentTimeMillis() - startTimelineEntries));
} else {
log.error("cannot get workflow timeline events: workflow session unavailable!");
}
return events;
}
@Override
public TimelineEventType getType() {
return EVENT_TYPE;
}
private static class WorkflowTimelineEvent
implements TimelineEvent {
private final HistoryItem historyItem;
private final Resource instance;
private WorkflowTimelineEvent(HistoryItem historyItem, Resource instance) {
this.historyItem = historyItem;
this.instance = instance;
}
public String getAction() {
return null != this.historyItem.getWorkItem() ? this.historyItem.getWorkItem().getNode().getTitle() : this.historyItem.getAction();
}
public String getDescription() {
return this.historyItem.getComment();
}
public String getOrigin() {
return this.instance.getPath();
}
public long getTime() {
return this.historyItem.getDate().getTime();
}
public TimelineEventType getType() {
return WorkflowTimelineEventProvider.EVENT_TYPE;
}
public String getUserID() {
return this.historyItem.getUserId();
}
}
}