ProvisioningCommand.java 11.9 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.security.user.UserProperties
 *  com.adobe.granite.security.user.UserPropertiesManager
 *  com.day.cq.commons.servlets.HtmlStatusResponseHelper
 *  com.day.cq.i18n.I18n
 *  com.day.cq.wcm.api.PageManager
 *  com.day.cq.wcm.api.commands.WCMCommand
 *  com.day.cq.wcm.api.commands.WCMCommandContext
 *  com.google.common.base.Function
 *  com.google.common.collect.Maps
 *  javax.annotation.Nullable
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Value
 *  javax.jcr.ValueFactory
 *  javax.servlet.http.HttpServletRequest
 *  org.apache.commons.collections.map.HashedMap
 *  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.jackrabbit.api.security.user.Authorizable
 *  org.apache.jackrabbit.api.security.user.UserManager
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.resource.PersistenceException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.HtmlResponse
 *  org.apache.sling.commons.osgi.PropertiesUtil
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.analytics.provisioning.impl;

import com.adobe.granite.security.user.UserProperties;
import com.adobe.granite.security.user.UserPropertiesManager;
import com.day.cq.analytics.provisioning.impl.ProvisioningException;
import com.day.cq.analytics.provisioning.impl.ProvisioningHandler;
import com.day.cq.analytics.provisioning.impl.ProvisioningHelper;
import com.day.cq.commons.servlets.HtmlStatusResponseHelper;
import com.day.cq.i18n.I18n;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.commands.WCMCommand;
import com.day.cq.wcm.api.commands.WCMCommandContext;
import com.google.common.base.Function;
import com.google.common.collect.Maps;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.collections.map.HashedMap;
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.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.HtmlResponse;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service
public class ProvisioningCommand
implements WCMCommand {
    private final Logger logger;
    private final String PARAM_SERVICE_NAME = "servicename";
    private final String PARAM_SITE_PATH = "sitepath";
    @Reference(name="provisioningHandler", referenceInterface=ProvisioningHandler.class, bind="bindProvisioningHandler", unbind="unbindProvisioningHandler", cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
    private Map<String, ProvisioningHandler> provisioningHandlers;

    public ProvisioningCommand() {
        this.logger = LoggerFactory.getLogger(this.getClass());
        this.PARAM_SERVICE_NAME = "servicename";
        this.PARAM_SITE_PATH = "sitepath";
        this.provisioningHandlers = new HashMap<String, ProvisioningHandler>();
    }

    public String getCommandName() {
        return "provisionCloudService";
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     * Enabled aggressive block sorting
     * Enabled unnecessary exception pruning
     * Enabled aggressive exception aggregation
     */
    public HtmlResponse performCommand(WCMCommandContext ctx, SlingHttpServletRequest request, SlingHttpServletResponse response, PageManager pageManager) {
        I18n i18n = new I18n((HttpServletRequest)request);
        try {
            this.checkParameters(request);
            this.provisionServices(request);
            this.updateUserPreferences(request.getResourceResolver(), request.getRemoteUser());
            HtmlResponse htmlResponse = HtmlStatusResponseHelper.createStatusResponse((boolean)true, (String)i18n.get("Service(s) provisioned successfully"));
            return htmlResponse;
        }
        catch (IllegalArgumentException e) {
            this.logger.warn("Request parameters missing: {}.", (Object)e.getMessage());
            HtmlResponse htmlResponse = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)i18n.get("Error: '{0}'", null, new Object[]{e.getMessage()}));
            return htmlResponse;
        }
        catch (Exception e) {
            try {
                this.logger.error("Could not enable services for selected sites.", (Throwable)e);
                HtmlResponse htmlResponse = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)i18n.get("Could not enable services for selected sites: '{0}'", null, new Object[]{e.getMessage()}));
                return htmlResponse;
            }
            catch (Throwable var9_14) {}
            throw var9_14;
            finally {
                if (request.getResourceResolver().hasChanges()) {
                    try {
                        request.getResourceResolver().commit();
                    }
                    catch (PersistenceException var8_13) {}
                }
            }
        }
    }

    private void provisionServices(SlingHttpServletRequest request) throws ProvisioningException {
        String[] servicenames = request.getParameterValues("servicename");
        String[] sites = request.getParameterValues("sitepath");
        ResourceResolver resourceResolver = request.getResourceResolver();
        Resource configuration = null;
        if (servicenames != null) {
            HashSet<ProvisioningHandler> ranHandlers = new HashSet<ProvisioningHandler>();
            for (String servicename : servicenames) {
                this.logger.debug("Invoking ProvisioningHandler for {}", (Object)servicename);
                Map<String, Object> payload = this.getPayloadForService(request, servicename);
                try {
                    ProvisioningHandler handler = this.provisioningHandlers.get(servicename);
                    if (handler != null) {
                        ranHandlers.add(handler);
                        configuration = handler.setup(resourceResolver, payload);
                        if (configuration == null || sites == null || sites.length <= 0) continue;
                        handler.applyToSites(resourceResolver, sites, configuration);
                        continue;
                    }
                    this.logger.warn("No ProvisioiningHandler registered for {}. Skipping provisioning.", (Object)servicename);
                    continue;
                }
                catch (ProvisioningException e) {
                    for (ProvisioningHandler h : ranHandlers) {
                        try {
                            if (configuration != null) {
                                h.revokeFromSites(resourceResolver, sites, configuration);
                            }
                        }
                        catch (ProvisioningException pe) {
                            this.logger.error("Unable to revoke configuration for {} ", (Object)servicename);
                        }
                        try {
                            h.rollback(resourceResolver, payload);
                        }
                        catch (ProvisioningException pe) {
                            this.logger.error("Unable to rollback setup for {} ", (Object)servicename);
                        }
                    }
                    throw e;
                }
            }
        }
    }

    private void updateUserPreferences(ResourceResolver resourceResolver, String authorizable) throws RepositoryException, PersistenceException {
        String modalAction;
        UserPropertiesManager upm = (UserPropertiesManager)resourceResolver.adaptTo(UserPropertiesManager.class);
        UserProperties up = upm.getUserProperties(authorizable, "preferences");
        if (up != null && (modalAction = up.getProperty("cq.authoring.cloudservices.optin")) != null && "skip".equals(modalAction)) {
            UserManager umgr = (UserManager)resourceResolver.adaptTo(UserManager.class);
            Authorizable user = umgr.getAuthorizable(authorizable);
            ValueFactory vf = ((Session)resourceResolver.adaptTo(Session.class)).getValueFactory();
            user.setProperty("preferences/cq.authoring.cloudservices.optin", vf.createValue("hide"));
            if (!umgr.isAutoSave()) {
                resourceResolver.commit();
            }
        }
    }

    private void checkParameters(SlingHttpServletRequest request) throws IllegalArgumentException {
        for (String param : new String[]{"servicename"}) {
            if (request.getParameter(param) != null) continue;
            throw new IllegalArgumentException("Request parameter '" + param + "' is missing.");
        }
    }

    private Map<String, Object> getPayloadForService(SlingHttpServletRequest request, String servicename) {
        HashedMap propertiesSource = new HashedMap(Maps.transformValues((Map)request.getParameterMap(), (Function)new Function<String[], Object>(){

            @Nullable
            public String apply(String[] input) {
                return input.length > 0 ? input[0] : null;
            }
        }));
        if (Boolean.parseBoolean(request.getParameter("automaticProvisioning"))) {
            propertiesSource.putAll(ProvisioningHelper.getAutomaticProvisioningData());
        }
        HashMap<String, Object> payload = new HashMap<String, Object>();
        for (Object key : propertiesSource.keySet()) {
            String keyS = (String)key;
            if (!keyS.startsWith(servicename)) continue;
            payload.put(keyS, propertiesSource.get(key));
        }
        return payload;
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void bindProvisioningHandler(ProvisioningHandler handler, Map<String, Object> properties) {
        String serviceId = PropertiesUtil.toString((Object)properties.get("cloudservice.id"), (String)null);
        if (serviceId == null) {
            this.logger.warn("Unnamed ProvisioningHandler. Dropping it.");
            return;
        }
        Map<String, ProvisioningHandler> map = this.provisioningHandlers;
        synchronized (map) {
            this.provisioningHandlers.put(serviceId, handler);
        }
        this.logger.info("bound new ProvisioningHandler: {}, id={}", (Object)handler.getClass().getName(), (Object)serviceId);
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void unbindProvisioningHandler(ProvisioningHandler handler, Map<String, Object> properties) {
        String serviceId = PropertiesUtil.toString((Object)properties.get("cloudservice.id"), (String)null);
        Map<String, ProvisioningHandler> map = this.provisioningHandlers;
        synchronized (map) {
            this.provisioningHandlers.remove(serviceId);
        }
        this.logger.info("unbound ProvisioningHandler: {}, id={}", (Object)handler.getClass().getName(), (Object)serviceId);
    }

}