CQWorkflowService.java 7.13 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.workflow.WorkflowSession
 *  com.day.cq.workflow.WorkflowException
 *  com.day.cq.workflow.WorkflowService
 *  com.day.cq.workflow.WorkflowSession
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.jackrabbit.api.security.user.UserManager
 *  org.apache.sling.api.adapter.AdapterFactory
 *  org.apache.sling.api.adapter.AdapterManager
 *  org.apache.sling.api.resource.LoginException
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.commons.osgi.OsgiUtil
 *  org.apache.sling.jcr.api.SlingRepository
 *  org.osgi.service.component.ComponentContext
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.workflow.impl;

import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowService;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.impl.CQWorkflowSessionWrapper;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.sling.api.adapter.AdapterFactory;
import org.apache.sling.api.adapter.AdapterManager;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.osgi.OsgiUtil;
import org.apache.sling.jcr.api.SlingRepository;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=1, label="%cq.workflow.service.name", description="%cq.workflow.service.description")
@Property(name="service.description", value={"%cq.workflow.service.description"})
@Service
public class CQWorkflowService
implements WorkflowService {
    private static Logger log = LoggerFactory.getLogger(CQWorkflowService.class);
    private static final String WORKFLOW_USER_SERVICE = "workflow-user";
    @Property(boolValue={0}, label="%cq.workflow.service.allow.locking", description="%cq.workflow.service.allow.locking.description")
    public static final String WF_ALLOW_LOCKING = "cq.workflow.service.allow.locking";
    @Reference(policy=ReferencePolicy.STATIC)
    private SlingRepository repository = null;
    @Reference
    private AdapterManager adapterManager = null;
    @Reference(target="(graniteWorkflowSessionFactory=running)")
    private AdapterFactory workflowSessionAdapter = null;
    @Reference
    private ResourceResolverFactory resourceResolverFactory = null;
    private Dictionary<String, Object> config;
    private boolean allowLocking = false;

    protected void activate(ComponentContext context) throws WorkflowException, RepositoryException {
        this.config = new Hashtable<String, Object>();
        this.config.put("componentContext", (Object)context);
        if (context.getProperties().get("cq.workflow.service.allow.locking") != null) {
            this.allowLocking = OsgiUtil.toBoolean(context.getProperties().get("cq.workflow.service.allow.locking"), (boolean)false);
        }
        log.info("Enable LockProcess/UnlockProcess? : {}", (Object)this.allowLocking);
        this.start();
    }

    protected void deactivate(ComponentContext context) {
        this.stop();
    }

    public UserManager getUserManager() {
        UserManager um = null;
        try {
            um = (UserManager)this.resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap("sling.service.subservice", "workflow-user")).adaptTo(UserManager.class);
        }
        catch (LoginException e) {
            log.error("Unable to retrieve the UserManager.", (Throwable)e);
        }
        return um;
    }

    public void start() throws WorkflowException {
        log.debug("Starting CQWorkflowService...");
        log.debug("...CQWorkflowService started");
    }

    public void stop() {
        log.debug("Stopping CQWorkflowService...");
        log.debug("... CQWorkflowService stopped.");
    }

    public WorkflowSession getWorkflowSession(Session userSession) {
        log.debug("Creating GRANITE workflow session wrapper for user: " + userSession.getUserID());
        if (userSession == null) {
            throw new IllegalArgumentException("User Session required to get a WorkflowSession");
        }
        com.adobe.granite.workflow.WorkflowSession graniteSession = (com.adobe.granite.workflow.WorkflowSession)this.adapterManager.getAdapter((Object)userSession, com.adobe.granite.workflow.WorkflowSession.class);
        if (graniteSession == null && this.workflowSessionAdapter != null) {
            graniteSession = (com.adobe.granite.workflow.WorkflowSession)this.workflowSessionAdapter.getAdapter((Object)userSession, com.adobe.granite.workflow.WorkflowSession.class);
        }
        if (graniteSession == null) {
            throw new RuntimeException("Failed to adapt to Granite Workflow Session");
        }
        CQWorkflowSessionWrapper sessionWrapper = new CQWorkflowSessionWrapper(this, graniteSession);
        return sessionWrapper;
    }

    public Dictionary<String, Object> getConfig() {
        return this.config;
    }

    public boolean isAllowLocking() {
        return this.allowLocking;
    }

    protected void bindRepository(SlingRepository slingRepository) {
        this.repository = slingRepository;
    }

    protected void unbindRepository(SlingRepository slingRepository) {
        if (this.repository == slingRepository) {
            this.repository = null;
        }
    }

    protected void bindAdapterManager(AdapterManager adapterManager) {
        this.adapterManager = adapterManager;
    }

    protected void unbindAdapterManager(AdapterManager adapterManager) {
        if (this.adapterManager == adapterManager) {
            this.adapterManager = null;
        }
    }

    protected void bindWorkflowSessionAdapter(AdapterFactory adapterFactory) {
        this.workflowSessionAdapter = adapterFactory;
    }

    protected void unbindWorkflowSessionAdapter(AdapterFactory adapterFactory) {
        if (this.workflowSessionAdapter == adapterFactory) {
            this.workflowSessionAdapter = null;
        }
    }

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

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