TimelineAggregatorImpl.java
5.03 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
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* org.apache.felix.scr.annotations.Activate
* org.apache.felix.scr.annotations.Component
* org.apache.felix.scr.annotations.Reference
* org.apache.felix.scr.annotations.ReferenceCardinality
* org.apache.felix.scr.annotations.ReferencePolicy
* org.apache.felix.scr.annotations.Service
* org.apache.sling.api.resource.Resource
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.adobe.granite.timeline.internal;
import com.adobe.granite.timeline.Timeline;
import com.adobe.granite.timeline.TimelineAggregator;
import com.adobe.granite.timeline.TimelineEvent;
import com.adobe.granite.timeline.TimelineEventProvider;
import com.adobe.granite.timeline.TimelineEventType;
import com.adobe.granite.timeline.internal.TimelineImpl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
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(metatype=0)
@Service
@Reference(name="timelineEventProvider", bind="bindTimelineEventProvider", unbind="unbindTimelineEventProvider", referenceInterface=TimelineEventProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
public class TimelineAggregatorImpl
implements TimelineAggregator {
private static final Logger log = LoggerFactory.getLogger(TimelineAggregatorImpl.class);
private static final Comparator<TimelineEvent> TIMELINE_EVENT_COMPARATOR = new Comparator<TimelineEvent>(){
@Override
public int compare(TimelineEvent event1, TimelineEvent event2) {
return Long.valueOf(event1.getTime()).compareTo(event2.getTime());
}
};
private final Map<String, TimelineEventProvider> providerCache = new ConcurrentHashMap<String, TimelineEventProvider>(10);
private final Map<String, TimelineEventType> typeCache = new ConcurrentHashMap<String, TimelineEventType>(10);
@Override
public Timeline createTimeline(Resource resource) {
if (null == resource) {
throw new IllegalArgumentException("resource must not be null");
}
ArrayList<TimelineEvent> timelineEvents = new ArrayList<TimelineEvent>();
long start = System.currentTimeMillis();
for (TimelineEventProvider provider : this.providerCache.values()) {
if (!provider.accepts(resource)) continue;
long providerStart = System.currentTimeMillis();
Collection<TimelineEvent> events = provider.getEvents(resource);
log.debug(">> provider [{}] got [{}] timeline events in [" + (System.currentTimeMillis() - providerStart) + "ms]", (Object)provider.getClass().getName(), (Object)events.size());
timelineEvents.addAll(events);
}
log.debug("got [{}] total timeline events in [{}ms]", (Object)timelineEvents.size(), (Object)(System.currentTimeMillis() - start));
long sortStart = System.currentTimeMillis();
Collections.sort(timelineEvents, TIMELINE_EVENT_COMPARATOR);
log.debug("sorted [{}] timeline events chronologically in [{}ms]", (Object)timelineEvents.size(), (Object)(System.currentTimeMillis() - sortStart));
return new TimelineImpl(resource, timelineEvents);
}
@Override
public Map<String, TimelineEventType> getTypes() {
return Collections.unmodifiableMap(this.typeCache);
}
@Activate
protected void activate() {
}
protected void bindTimelineEventProvider(TimelineEventProvider newProvider, Map<String, Object> config) {
String className = newProvider.getClass().getName();
TimelineEventProvider provider = this.providerCache.get(className);
if (null == provider) {
this.providerCache.put(className, newProvider);
this.typeCache.put(newProvider.getType().getClass().getName(), newProvider.getType());
log.info("bound new provider [{}]. got [{}] providers.", (Object)className, (Object)this.providerCache.size());
} else {
log.error("cannot bind new provider: provider with same class [{}] already present.", (Object)className);
}
}
protected void unbindTimelineEventProvider(TimelineEventProvider provider, Map<String, Object> config) {
String className = provider.getClass().getName();
this.providerCache.remove(className);
this.typeCache.remove(provider.getType().getClass().getName());
log.info("removed provider [{}]. got [{}] providers.", (Object)className, (Object)this.providerCache.size());
}
}