TimelineAggregatorImpl.java 5.03 KB
/*
 * 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());
    }

}