SyncAudienceManagerSegmentsJob.java 8.37 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.wcm.api.WCMException
 *  javax.jcr.Node
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.LoginException
 *  org.apache.sling.api.resource.PersistenceException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.event.jobs.Job
 *  org.apache.sling.event.jobs.consumer.JobConsumer
 *  org.apache.sling.event.jobs.consumer.JobConsumer$JobResult
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.aam;

import com.adobe.cq.aam.SyncAudienceManagerSegments;
import com.adobe.cq.aam.client.spi.*;
import com.day.cq.wcm.api.WCMException;
import org.apache.felix.scr.annotations.*;
import org.apache.sling.api.resource.*;
import org.apache.sling.event.jobs.Job;
import org.apache.sling.event.jobs.consumer.JobConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.jcr.Node;
import javax.jcr.RepositoryException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

@Component(immediate=1, metatype=0)
@Service(value={SyncAudienceManagerSegments.class, JobConsumer.class})
@Properties(value={@Property(name="job.topics", value={"cq/personalization/audiencemanager/sync"})})
public class SyncAudienceManagerSegmentsJob
implements SyncAudienceManagerSegments,
JobConsumer {
    private static final String NN_PUBLIC = "public";
    private static final String SERVICE_SYNCSEGMENTSJOB = "syncsegementsjob";
    public static final String JOB_TOPIC = "cq/personalization/audiencemanager/sync";
    public static final String PROPERTY_CONFIG = "configpath";
    private static final String EVENT_PROPERTY_PREFIX = "aam_";
    @Property(boolValue={0}, description="Private since traits are not synced at present")
    private static final String CONFIG_SUNC_TRAITS = "sync-traits";
    private static final String[] NODE_PROPERTY_NAMES = new String[]{"partner", "container"};
    private static final Logger LOGGER = LoggerFactory.getLogger(SyncAudienceManagerSegmentsJob.class);
    @Reference
    private ResourceResolverFactory resourceResolverFactory;
    @Reference
    private AudienceManagerClient audienceManagerClient;
    @Reference
    private SegmentService segmentService;

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public JobConsumer.JobResult process(Job job) {
        LOGGER.debug("Recieved Job Event for Sync Job");
        ResourceResolver resourceResolver = null;
        try {
            resourceResolver = this.getServiceResolver();
            String path = (String)job.getProperty("configpath");
            Resource resource = resourceResolver.getResource(path);
            if (!SyncAudienceManagerSegmentsJob.hasChangesSinceJob(resource, job)) {
                this.performSync(resource);
                if (resourceResolver.hasChanges()) {
                    resourceResolver.commit();
                }
            }
            JobConsumer.JobResult jobResult = JobConsumer.JobResult.OK;
            return jobResult;
        }
        catch (AudienceManagerAccessDenied e) {
            LOGGER.error(e.getMessage(), (Throwable)e);
        }
        catch (RepositoryException e) {
            LOGGER.error(e.getMessage(), (Throwable)e);
        }
        catch (LoginException e) {
            LOGGER.error(e.getMessage(), (Throwable)e);
        }
        catch (WCMException e) {
            LOGGER.error(e.getMessage(), (Throwable)e);
        }
        catch (PersistenceException e) {
            LOGGER.error(e.getMessage(), (Throwable)e);
        }
        finally {
            this.closeResolver(resourceResolver);
        }
        return JobConsumer.JobResult.FAILED;
    }

    @Override
    public void performSync(Resource configResource) throws RepositoryException, WCMException, AudienceManagerAccessDenied {
        AudienceManagerConfiguration config = new AudienceManagerConfiguration(configResource);
        if (!this.audienceManagerClient.isValidForUse(config)) {
            LOGGER.warn("Configuration is not valid, skipping {} ", (Object)configResource.getPath());
            return;
        }
        long startSync = System.currentTimeMillis();
        AudienceManagerFolders audienceManagerSegmentFolders = this.audienceManagerClient.getSegmentFolders(config, false);
        Iterable<AudienceManagerItem> segments = this.audienceManagerClient.getSegments(config, audienceManagerSegmentFolders, false);
        SyncResult result = this.segmentService.syncSegments(config, audienceManagerSegmentFolders, segments);
        if (!config.isOfflineTest()) {
            this.audienceManagerClient.setupDestinations(config, result);
        }
        long endSync = System.currentTimeMillis();
        LOGGER.info("Sync Complete for {} operation took {} ms and visited {} folders and {} segments, updated {} segments", new Object[]{configResource.getPath(), endSync - startSync, result.getFoldersSynced(), result.getSegmentsSynced(), result.getNewSegments().size()});
    }

    private static boolean hasChangesSinceJob(Resource resource, Job job) {
        try {
            Node node = (Node)resource.adaptTo(Node.class);
            if (node.hasNode("public")) {
                node = node.getNode("public");
            }
            for (String p : NODE_PROPERTY_NAMES) {
                if (node.getProperty(p).getString().equals(job.getProperty("aam_" + p))) continue;
                LOGGER.debug("Property {} changed from {} to {} ", new Object[]{p, job.getProperty("aam_" + p), node.getProperty(p).getString()});
                return true;
            }
            return false;
        }
        catch (Exception e) {
            LOGGER.error(e.getMessage(), (Throwable)e);
            return true;
        }
    }

    public static Map<String, Object> createJobProperties(Node configNode) throws RepositoryException {
        HashMap<String, Object> props = new HashMap<String, Object>();
        props.put("configpath", configNode.getPath());
        if (configNode.hasNode("public")) {
            configNode = configNode.getNode("public");
        }
        SyncAudienceManagerSegmentsJob.loadProperties(props, configNode);
        return props;
    }

    private static void loadProperties(Map<String, Object> props, Node configNode) {
        for (String p : NODE_PROPERTY_NAMES) {
            props.put("aam_" + p, SyncAudienceManagerSegmentsJob.safeGetProperty(configNode, p));
        }
    }

    private static String safeGetProperty(Node configNode, String name) {
        try {
            return configNode.getProperty(name).getString();
        }
        catch (Exception e) {
            return "";
        }
    }

    private ResourceResolver getServiceResolver() throws LoginException {
        return this.resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap("sling.service.subservice", "syncsegementsjob"));
    }

    private void closeResolver(ResourceResolver resolver) {
        if (resolver != null) {
            resolver.close();
        }
    }

    protected void bindResourceResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        this.resourceResolverFactory = resourceResolverFactory;
    }

    protected void unbindResourceResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        if (this.resourceResolverFactory == resourceResolverFactory) {
            this.resourceResolverFactory = null;
        }
    }

    protected void bindAudienceManagerClient(AudienceManagerClient audienceManagerClient) {
        this.audienceManagerClient = audienceManagerClient;
    }

    protected void unbindAudienceManagerClient(AudienceManagerClient audienceManagerClient) {
        if (this.audienceManagerClient == audienceManagerClient) {
            this.audienceManagerClient = null;
        }
    }

    protected void bindSegmentService(SegmentService segmentService) {
        this.segmentService = segmentService;
    }

    protected void unbindSegmentService(SegmentService segmentService) {
        if (this.segmentService == segmentService) {
            this.segmentService = null;
        }
    }
}