TranslateLanguageCopyProcess.java 12.2 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.translation.api.TranslationException
 *  com.adobe.granite.translation.api.TranslationManager
 *  com.adobe.granite.translation.api.TranslationService
 *  com.adobe.granite.translation.api.TranslationService$TranslationServiceInfo
 *  com.day.cq.wcm.api.LanguageManager
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.api.PageManager
 *  com.day.cq.workflow.WorkflowException
 *  com.day.cq.workflow.WorkflowSession
 *  com.day.cq.workflow.exec.WorkItem
 *  com.day.cq.workflow.exec.WorkflowData
 *  com.day.cq.workflow.exec.WorkflowProcess
 *  com.day.cq.workflow.metadata.MetaDataMap
 *  javax.jcr.Binary
 *  javax.jcr.Node
 *  javax.jcr.PathNotFoundException
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.ValueFormatException
 *  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.cq.wcm.translation.impl.TranslationConfiguration;
import com.adobe.cq.wcm.translation.impl.TranslationResult;
import com.adobe.cq.wcm.translation.impl.Translator;
import com.adobe.granite.translation.api.TranslationException;
import com.adobe.granite.translation.api.TranslationManager;
import com.adobe.granite.translation.api.TranslationService;
import com.day.cq.wcm.api.LanguageManager;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
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.WorkflowData;
import com.day.cq.workflow.exec.WorkflowProcess;
import com.day.cq.workflow.metadata.MetaDataMap;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.ValueFormatException;
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.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;

@Component
@Service(value={WorkflowProcess.class})
@Properties(value={@org.apache.felix.scr.annotations.Property(name="service.description", value={"Translate Language Copy Workflow Process"}), @org.apache.felix.scr.annotations.Property(name="service.vendor", value={"Adobe"}), @org.apache.felix.scr.annotations.Property(name="process.label", value={"WCM: Translate Language Copy Process"})})
public class TranslateLanguageCopyProcess
implements WorkflowProcess {
    private static final Logger log = LoggerFactory.getLogger(TranslateLanguageCopyProcess.class);
    public static final String TYPE_JCR_PATH = "JCR_PATH";
    private static final String CONFIG_FILE_PATH = "/etc/workflow/models/translation/config.properties";
    @Reference
    private TranslationManager translationManager = null;
    @Reference
    private LanguageManager languageManager;
    @Reference
    private SlingRepository repository;
    @Reference
    private ResourceResolverFactory resolverFactory;

    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;
        Resource destResource = null;
        String destinationPath = null;
        Session userSession = null;
        ResourceResolver resourceResolver = null;
        WorkflowData data = item.getWorkflowData();
        String type = data.getPayloadType();
        try {
            String payloadData;
            resourceResolver = this.resolverFactory.getServiceResourceResolver(Collections.singletonMap("sling.service.subservice", "translation-job"));
            userSession = (Session)resourceResolver.adaptTo(Session.class);
            if (type.equals("JCR_PATH") && data.getPayload() != null && userSession.itemExists(payloadData = (String)data.getPayload())) {
                destinationPath = payloadData;
            }
            if ((destResource = resourceResolver.getResource(destinationPath)) == null) {
                throw new WorkflowException("Failed to load page resource from payload.");
            }
            destLanguage = this.getResourceLanguage(resourceResolver, destResource);
            if (StringUtils.isEmpty((CharSequence)destLanguage)) {
                throw new WorkflowException("Failed to find destination language from payload.");
            }
            if (!this.isDestinationLanguageTranslationSupported(destLanguage, destResource)) {
                log.error("Destination language not supported {}", (Object)destLanguage);
                throw new WorkflowException("Translation for destination language is not supported");
            }
            this.translateResource(resourceResolver, this.languageManager, destResource, destLanguage);
        }
        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 language " + destLanguage + ".", (Throwable)e);
        }
        finally {
            if (resourceResolver != null && resourceResolver.isLive()) {
                resourceResolver.close();
            }
        }
    }

    private boolean isDestinationLanguageTranslationSupported(String strDestinationLanguage, Resource pageResource) throws TranslationException {
        log.trace("Inside function isDestinationLanguageTranslationSupported, with destination lang {}", (Object)strDestinationLanguage);
        boolean bRetVal = false;
        TranslationService tSvc = this.translationManager.createTranslationService(pageResource);
        if (tSvc != null) {
            Map availableLanguageMap = tSvc.supportedLanguages();
            if (availableLanguageMap.containsKey(strDestinationLanguage)) {
                bRetVal = true;
            } else {
                for (String code : availableLanguageMap.keySet()) {
                    if (StringUtils.equalsIgnoreCase((CharSequence)strDestinationLanguage, (CharSequence)code)) {
                        bRetVal = true;
                        break;
                    }
                    if (!StringUtils.equalsIgnoreCase((CharSequence)strDestinationLanguage, (CharSequence)((CharSequence)availableLanguageMap.get(code)))) continue;
                    bRetVal = true;
                    break;
                }
            }
            if (!bRetVal && tSvc.getTranslationServiceInfo() != null) {
                log.error("Translation service with name {}, does not support {} language", (Object)tSvc.getTranslationServiceInfo().getTranslationServiceName(), (Object)strDestinationLanguage);
            }
        } else {
            log.trace("Error in getting translation Service, got null");
        }
        return bRetVal;
    }

    protected String getResourceLanguage(ResourceResolver resourceResolver, Resource resource) {
        Page containingPage;
        if (resourceResolver == null) {
            log.error("resourceResolver was null!");
            return null;
        }
        PageManager pm = (PageManager)resourceResolver.adaptTo(PageManager.class);
        Page page = containingPage = pm != null ? pm.getContainingPage(resource) : null;
        if (containingPage == null) {
            return null;
        }
        return containingPage.getLanguage(true).toString();
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    private void loadPropertySettings(ResourceResolver resourceResolver, TranslationConfiguration config) throws IOException, PathNotFoundException, ValueFormatException, RepositoryException {
        Resource config_resource = resourceResolver.getResource(this.getConfigFilePath());
        Node config_node = (Node)config_resource.adaptTo(Node.class);
        Node jcrContent = config_node.getNode("jcr:content");
        InputStream contentStream = jcrContent.getProperty("jcr:data").getBinary().getStream();
        BufferedReader bufferedReader = null;
        try {
            String strLine;
            bufferedReader = new BufferedReader(new InputStreamReader(contentStream));
            while ((strLine = bufferedReader.readLine()) != null) {
                String strTrimmedValue;
                log.trace("read attribute line {}", (Object)strLine);
                int iComment = strLine.indexOf(35);
                if (iComment != -1) {
                    strLine = strLine.substring(0, iComment);
                }
                if ((strTrimmedValue = StringUtils.trim((String)strLine)).isEmpty()) continue;
                config.addPropertyToTranslate(strTrimmedValue);
                log.trace("attribute name configured for translation : {}", (Object)strTrimmedValue);
            }
        }
        finally {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
        }
    }

    protected String getConfigFilePath() {
        return "/etc/workflow/models/translation/config.properties";
    }

    private void translateResource(ResourceResolver resourceResolver, LanguageManager languageManager, Resource pageResource, String destinationLanguage) throws IOException, PathNotFoundException, ValueFormatException, RepositoryException {
        TranslationConfiguration config = new TranslationConfiguration();
        config.setDestinationLanguage(destinationLanguage);
        this.loadPropertySettings(resourceResolver, config);
        config.setTranslationManager(this.translationManager);
        Translator translationService = new Translator(config, languageManager);
        TranslationResult result = new TranslationResult();
        translationService.translateResourcePage(result, resourceResolver, pageResource);
    }

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

    protected void unbindTranslationManager(TranslationManager translationManager) {
        if (this.translationManager == translationManager) {
            this.translationManager = 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;
        }
    }
}