TranslateSitePrepareProcess.java 16 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.aemds.guide.service.GuideLocalizationService
 *  com.adobe.granite.translation.api.TranslationConfig
 *  com.adobe.granite.translation.api.TranslationException
 *  com.adobe.granite.translation.api.TranslationManager
 *  com.adobe.granite.translation.core.MachineTranslationCloudConfig
 *  com.adobe.granite.translation.core.MachineTranslationUtil
 *  com.adobe.granite.translation.core.TranslationCloudConfigUtil
 *  com.adobe.granite.ui.clientlibs.HtmlLibraryManager
 *  com.day.cq.wcm.api.LanguageManager
 *  com.day.cq.wcm.api.PageManagerFactory
 *  com.day.cq.workflow.WorkflowException
 *  com.day.cq.workflow.WorkflowSession
 *  com.day.cq.workflow.exec.WorkItem
 *  com.day.cq.workflow.exec.Workflow
 *  com.day.cq.workflow.exec.WorkflowData
 *  com.day.cq.workflow.exec.WorkflowProcess
 *  com.day.cq.workflow.metadata.MetaDataMap
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  org.apache.commons.lang3.StringUtils
 *  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.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.jcr.api.SlingRepository
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.wcm.translation.impl.process;

import com.adobe.aemds.guide.service.GuideLocalizationService;
import com.adobe.cq.wcm.translation.impl.TranslationPrepareResource;
import com.adobe.cq.wcm.translation.impl.TranslationRuleConfigurationFile;
import com.adobe.cq.wcm.translation.impl.TranslationUtils;
import com.adobe.granite.translation.api.TranslationConfig;
import com.adobe.granite.translation.api.TranslationException;
import com.adobe.granite.translation.api.TranslationManager;
import com.adobe.granite.translation.core.MachineTranslationCloudConfig;
import com.adobe.granite.translation.core.MachineTranslationUtil;
import com.adobe.granite.translation.core.TranslationCloudConfigUtil;
import com.adobe.granite.ui.clientlibs.HtmlLibraryManager;
import com.day.cq.wcm.api.LanguageManager;
import com.day.cq.wcm.api.PageManagerFactory;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.Workflow;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.exec.WorkflowProcess;
import com.day.cq.workflow.metadata.MetaDataMap;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
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.jcr.api.SlingRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.DOMException;
import org.xml.sax.SAXException;

@Component
@Service(value={WorkflowProcess.class})
@Properties(value={@Property(name="service.description", value={"Translate Site Workflow Process"}), @Property(name="service.vendor", value={"Adobe"}), @Property(name="process.label", value={"WCM: Translate Site Process"})})
public class TranslateSitePrepareProcess
implements WorkflowProcess {
    private static final Logger log = LoggerFactory.getLogger(TranslateSitePrepareProcess.class);
    @Reference
    private TranslationManager translationManager = null;
    @Reference
    private TranslationCloudConfigUtil translationCloudConfigUtil = null;
    @Reference
    private LanguageManager languageManager;
    @Reference
    private SlingRepository repository;
    @Reference
    private ResourceResolverFactory resolverFactory;
    @Reference
    protected TranslationConfig transConfig;
    @Reference
    PageManagerFactory pageManagerFactory;
    @Reference
    private HtmlLibraryManager htmlLibraryManager = null;
    @Reference
    private GuideLocalizationService guideLocalizationService = null;
    private static final String UPDATE_ASSET_SOURCE_ROOT_METADATA_KEY = "assetUpdateSourceRoot";
    private static final String UPDATE_ASSET_WORKFLOW_METADATA_KEY = "updateAssetsWorkflow";

    public void execute(WorkItem item, WorkflowSession workflowSession, MetaDataMap args) throws WorkflowException {
        log.debug("Translating language copy for workitem {}", (Object)(item != null ? item.getId() : "<null>"));
        String destLanguage = null;
        String sourceLanguage = null;
        Resource destResource = null;
        String destinationPath = null;
        String projectName = null;
        String projectPath = null;
        String strProjectFolderPath = null;
        boolean bCreateNew = true;
        boolean bAddAsset = true;
        boolean bAddEmbeddedAssets = true;
        Session serviceUserSession = null;
        ResourceResolver resourceResolver = null;
        String strRootCloudConfigPath = null;
        MachineTranslationCloudConfig rootMachineTranslationCloudConfig = null;
        WorkflowData data = item.getWorkflowData();
        String strInitiatorUserID = "";
        String type = data.getPayloadType();
        String strPayLoadData = (String)data.getPayload();
        try {
            resourceResolver = this.resolverFactory.getServiceResourceResolver(Collections.singletonMap("sling.service.subservice", "translation-job"));
            MetaDataMap metaData = item.getWorkflowData().getMetaDataMap();
            metaData.put((Object)"noretry", (Object)true);
            serviceUserSession = (Session)resourceResolver.adaptTo(Session.class);
            if (metaData.containsKey((Object)"addAsset")) {
                bAddAsset = (Boolean)metaData.get("addAsset", Boolean.class);
            }
            if (metaData.containsKey((Object)"addEmbeddedAssets")) {
                bAddEmbeddedAssets = (Boolean)metaData.get("addEmbeddedAssets", Boolean.class);
            }
            if (type.equals("JCR_PATH") && strPayLoadData != null) {
                Resource sourceResource;
                String strSourcePath;
                String payloadData = strPayLoadData;
                if (serviceUserSession.itemExists(payloadData)) {
                    destinationPath = payloadData;
                }
                projectName = (String)metaData.get("projectTitle", String.class);
                strProjectFolderPath = (String)metaData.get("projectFolderPath", String.class);
                String strProjectType = (String)metaData.get("projectType", String.class);
                if ("add_existing".equals(strProjectType)) {
                    bCreateNew = false;
                    projectPath = (String)metaData.get("projectPath", String.class);
                }
                strRootCloudConfigPath = (String)metaData.get("configuration", String.class);
                sourceLanguage = (String)metaData.get("language", String.class);
                strInitiatorUserID = (String)metaData.get("initiatorUserId", String.class);
                if (StringUtils.isEmpty((CharSequence)sourceLanguage) && !StringUtils.isEmpty((CharSequence)(strSourcePath = (String)metaData.get("projectSourcePath", String.class))) && (sourceResource = resourceResolver.getResource(strSourcePath)) != null) {
                    sourceLanguage = this.getResourceLanguage(resourceResolver, sourceResource);
                }
            }
            if (StringUtils.isEmpty((CharSequence)strInitiatorUserID)) {
                strInitiatorUserID = item.getWorkflow().getInitiator();
            }
            if ((destResource = resourceResolver.getResource(destinationPath)) == null) {
                throw new WorkflowException("Failed to load page resource from payload.");
            }
            destLanguage = (String)metaData.get("destinationLanguage", String.class);
            if (StringUtils.isEmpty((CharSequence)destLanguage)) {
                destLanguage = this.getResourceLanguageRoot(destResource);
            }
            if (StringUtils.isEmpty((CharSequence)destLanguage)) {
                throw new WorkflowException("Failed to find destination language from payload.");
            }
            if (!TranslationUtils.isDestinationLanguageSupported(destLanguage, this.transConfig)) {
                log.error("Destination language not supported {}", (Object)destLanguage);
                throw new WorkflowException("Translation for destination language is not supported");
            }
            if (StringUtils.isEmpty((CharSequence)strRootCloudConfigPath)) {
                MachineTranslationUtil mtu = (MachineTranslationUtil)resourceResolver.adaptTo(MachineTranslationUtil.class);
                rootMachineTranslationCloudConfig = TranslationUtils.getMachineCloudConfigFromResource(mtu, destResource);
            } else {
                Resource cloudResource = resourceResolver.resolve(strRootCloudConfigPath);
                if (cloudResource != null && cloudResource.adaptTo(MachineTranslationCloudConfig.class) != null) {
                    rootMachineTranslationCloudConfig = (MachineTranslationCloudConfig)cloudResource.adaptTo(MachineTranslationCloudConfig.class);
                }
            }
            boolean updateAssetsWorkflow = false;
            if (metaData.get("updateAssetsWorkflow", String.class) != null) {
                updateAssetsWorkflow = ((String)metaData.get("updateAssetsWorkflow", String.class)).equals("true");
            }
            String assetUpdateSourceRoot = (String)metaData.get("assetUpdateSourceRoot", String.class);
            this.prepareResourceForTranslation(serviceUserSession, strInitiatorUserID, resourceResolver, destResource, destLanguage, sourceLanguage, projectName, strProjectFolderPath, projectPath, rootMachineTranslationCloudConfig, bCreateNew, bAddAsset, bAddEmbeddedAssets, updateAssetsWorkflow, assetUpdateSourceRoot);
        }
        catch (Exception e) {
            log.error("error while tranlating {}", (Throwable)e);
            log.error("Error while translating language copy for {} in language {}.", new Object[]{destinationPath, destLanguage});
            throw new WorkflowException("Error while translating language copy for " + destinationPath + " in " + destLanguage + ".", (Throwable)e);
        }
        finally {
            if (resourceResolver != null && resourceResolver.isLive()) {
                resourceResolver.close();
            }
        }
    }

    protected String getResourceLanguage(ResourceResolver resourceResolver, Resource resource) {
        return TranslationUtils.getResourceLanguage(resourceResolver, resource, this.languageManager);
    }

    private String getResourceLanguageRoot(Resource resource) {
        return TranslationUtils.getResourceLanguageRoot(resource);
    }

    public static String getRulesFilePath() {
        return "/etc/workflow/models/translation/translation_rules.xml";
    }

    private void prepareResourceForTranslation(Session userSession, String strInitiatorUserID, ResourceResolver resourceResolver, Resource pageResource, String destinationLanguage, String sourceLanguage, String strProjectName, String strProjectFolderPath, String projectPath, MachineTranslationCloudConfig rootMachineTranslationCloudConfig, boolean bCreateNew, boolean bAddAsset, boolean bAddEmbeddedAssets, boolean updateAssetsWorkflow, String assetUpdateSourceRoot) throws IOException, RepositoryException, XPathExpressionException, DOMException, ParserConfigurationException, SAXException, TransformerException, TranslationException {
        TranslationPrepareResource translationService = new TranslationPrepareResource(resourceResolver, strInitiatorUserID, rootMachineTranslationCloudConfig, destinationLanguage, sourceLanguage, userSession, new TranslationRuleConfigurationFile(resourceResolver, TranslateSitePrepareProcess.getRulesFilePath(), sourceLanguage, destinationLanguage, this.translationManager, this.translationCloudConfigUtil, this.pageManagerFactory, this.htmlLibraryManager, this.guideLocalizationService, bAddAsset, bAddEmbeddedAssets));
        if (updateAssetsWorkflow) {
            translationService.setbUpdateAssetsWorkflow(true);
            translationService.setAssetUpdateSourceRoot(assetUpdateSourceRoot);
            translationService.setAssetUpdateDestinationRoot(pageResource.getPath());
        }
        translationService.processResourceForTranslation(pageResource, strProjectName, strProjectFolderPath, projectPath, resourceResolver, this.pageManagerFactory, bCreateNew);
    }

    protected void bindTranslationManager(TranslationManager translationManager) {
        this.translationManager = translationManager;
    }

    protected void unbindTranslationManager(TranslationManager translationManager) {
        if (this.translationManager == translationManager) {
            this.translationManager = null;
        }
    }

    protected void bindTranslationCloudConfigUtil(TranslationCloudConfigUtil translationCloudConfigUtil) {
        this.translationCloudConfigUtil = translationCloudConfigUtil;
    }

    protected void unbindTranslationCloudConfigUtil(TranslationCloudConfigUtil translationCloudConfigUtil) {
        if (this.translationCloudConfigUtil == translationCloudConfigUtil) {
            this.translationCloudConfigUtil = null;
        }
    }

    protected void bindLanguageManager(LanguageManager languageManager) {
        this.languageManager = languageManager;
    }

    protected void unbindLanguageManager(LanguageManager languageManager) {
        if (this.languageManager == languageManager) {
            this.languageManager = null;
        }
    }

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

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

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

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

    protected void bindTransConfig(TranslationConfig translationConfig) {
        this.transConfig = translationConfig;
    }

    protected void unbindTransConfig(TranslationConfig translationConfig) {
        if (this.transConfig == translationConfig) {
            this.transConfig = null;
        }
    }

    protected void bindPageManagerFactory(PageManagerFactory pageManagerFactory) {
        this.pageManagerFactory = pageManagerFactory;
    }

    protected void unbindPageManagerFactory(PageManagerFactory pageManagerFactory) {
        if (this.pageManagerFactory == pageManagerFactory) {
            this.pageManagerFactory = null;
        }
    }

    protected void bindHtmlLibraryManager(HtmlLibraryManager htmlLibraryManager) {
        this.htmlLibraryManager = htmlLibraryManager;
    }

    protected void unbindHtmlLibraryManager(HtmlLibraryManager htmlLibraryManager) {
        if (this.htmlLibraryManager == htmlLibraryManager) {
            this.htmlLibraryManager = null;
        }
    }

    protected void bindGuideLocalizationService(GuideLocalizationService guideLocalizationService) {
        this.guideLocalizationService = guideLocalizationService;
    }

    protected void unbindGuideLocalizationService(GuideLocalizationService guideLocalizationService) {
        if (this.guideLocalizationService == guideLocalizationService) {
            this.guideLocalizationService = null;
        }
    }
}