DistributionQueueImpl.java 7.46 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.apache.sling.api.resource.LoginException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.api.resource.ResourceUtil
 *  org.apache.sling.api.resource.ValueMap
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.replication.impl.distribution;

import com.day.cq.replication.ReplicationAction;
import com.day.cq.replication.ReplicationActionType;
import com.day.cq.replication.ReplicationContentFacade;
import com.day.cq.replication.ReplicationQueue;
import com.day.cq.replication.impl.queue.ReplicationQueueImpl;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DistributionQueueImpl
implements ReplicationQueue {
    private Logger log = LoggerFactory.getLogger(DistributionQueueImpl.class);
    static final String RESOURCE_AGENTS_PATH = "/libs/sling/distribution/services/agents/";
    private final ResourceResolverFactory resourceResolverFactory;
    private final String name;

    public DistributionQueueImpl(ResourceResolverFactory resourceResolverFactory, String name) {
        this.resourceResolverFactory = resourceResolverFactory;
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public List<ReplicationQueue.Entry> entries() {
        return this.getEntries();
    }

    @Override
    public List<ReplicationQueue.Entry> entries(String path) {
        ArrayList<ReplicationQueue.Entry> result = new ArrayList<ReplicationQueue.Entry>();
        if (path == null) {
            return result;
        }
        for (ReplicationQueue.Entry e : this.entries()) {
            if (!path.equals(e.getAction().getPath())) continue;
            result.add(e);
        }
        return result;
    }

    @Override
    public ReplicationQueue.Entry getEntry(String path, Calendar after) {
        long time = after == null ? 0 : after.getTimeInMillis();
        for (ReplicationQueue.Entry e : this.entries(path)) {
            if (e.getAction().getTime() < time) continue;
            return e;
        }
        return null;
    }

    @Override
    public void clear() {
    }

    @Override
    public void clear(Set<String> ids) {
    }

    @Override
    public boolean isPaused() {
        return false;
    }

    @Override
    public void setPaused(boolean paused) {
    }

    @Override
    public boolean isBlocked() {
        return this.getStatus().getNextRetryTime() > 0;
    }

    @Override
    public long nextRetryPeriod() {
        ReplicationQueue.Status st = this.getStatus();
        return st.getNextRetryTime() - st.getStatusTime();
    }

    @Override
    public long lastProcessTime() {
        return this.getStatus().getLastProcessTime();
    }

    @Override
    public ReplicationQueue.Status getStatus() {
        return new ReplicationQueueImpl.StatusImpl(System.currentTimeMillis(), -1, -1, -1);
    }

    @Override
    public void forceRetry() {
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    List<ReplicationQueue.Entry> getEntries() {
        ArrayList<ReplicationQueue.Entry> entries;
        entries = new ArrayList<ReplicationQueue.Entry>();
        ResourceResolver resolver = null;
        try {
            HashMap<String, String> authInfo = new HashMap<String, String>();
            authInfo.put("sling.service.subservice", "replicationService");
            resolver = this.resourceResolverFactory.getServiceResourceResolver(authInfo);
            Resource agentResource = resolver.getResource("/libs/sling/distribution/services/agents/" + this.name);
            if (agentResource == null) {
                ArrayList<ReplicationQueue.Entry> arrayList = entries;
                return arrayList;
            }
            Resource queuesResource = agentResource.getChild("queues");
            if (queuesResource == null) {
                ArrayList<ReplicationQueue.Entry> arrayList = entries;
                return arrayList;
            }
            for (Resource queueResource : queuesResource.getChildren()) {
                for (Resource itemResource : queueResource.getChildren()) {
                    DistributionQueueEntry entry = this.readEntry(itemResource);
                    if (entry != null) {
                        entries.add(entry);
                        continue;
                    }
                    this.log.warn("cannot read distribution queue entry for {}", (Object)itemResource.getPath());
                }
            }
        }
        catch (LoginException e) {
            this.log.error("Error", (Throwable)e);
        }
        finally {
            if (resolver != null) {
                resolver.close();
            }
        }
        return entries;
    }

    private DistributionQueueEntry readEntry(Resource itemResource) {
        ValueMap valueMap = ResourceUtil.getValueMap((Resource)itemResource);
        String id = (String)valueMap.get("id", (Object)"");
        String[] paths = (String[])valueMap.get("paths", (Object)new String[0]);
        String action = (String)valueMap.get("action", (Object)"");
        Calendar cal = Calendar.getInstance();
        Date date = (Date)valueMap.get("time", (Object)cal.getTime());
        String userid = (String)valueMap.get("userid", (Object)"N/A");
        cal.setTime(date);
        return new DistributionQueueEntry(this, id, paths, action, userid, cal);
    }

    private class DistributionQueueEntry
    implements ReplicationQueue.Entry {
        private final DistributionQueueImpl queue;
        private final String id;
        private final String[] paths;
        private final String userId;
        private final ReplicationActionType action;
        private final Calendar time;

        public DistributionQueueEntry(DistributionQueueImpl queue, String id, String[] paths, String action, String userId, Calendar time) {
            this.queue = queue;
            this.id = id;
            this.paths = paths;
            this.userId = userId;
            this.action = "DELETE".equals(action) ? ReplicationActionType.DEACTIVATE : ReplicationActionType.ACTIVATE;
            this.time = time;
        }

        @Override
        public String getId() {
            return this.id;
        }

        @Override
        public ReplicationQueue getQueue() {
            return this.queue;
        }

        @Override
        public ReplicationAction getAction() {
            return new ReplicationAction(this.action, this.paths, this.time.getTimeInMillis(), this.userId, null);
        }

        @Override
        public ReplicationContentFacade getContent() {
            return null;
        }

        @Override
        public int getQueuePosition() {
            return 0;
        }

        @Override
        public Calendar getLastProcessTime() {
            return this.time;
        }

        @Override
        public int getNumProcessed() {
            return 0;
        }
    }

}