DefaultPdfBatchProviderImpl.java 8.27 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.aemds.guide.batch.api.BatchConfig
 *  com.adobe.aemds.guide.batch.api.BatchInput
 *  com.adobe.aemds.guide.batch.api.BatchProvider
 *  com.adobe.aemds.guide.batch.api.BatchResult
 *  com.adobe.aemds.guide.batch.api.PostProcessor
 *  com.adobe.aemds.guide.storage.api.StorageProvider
 *  com.adobe.aemfd.docmanager.Document
 *  com.adobe.icc.dbforms.obj.LetterRenderOptionsSpec
 *  com.adobe.icc.ddg.api.LetterRenderService
 *  com.adobe.icc.render.obj.PDFFile
 *  com.adobe.icc.render.obj.PDFResponseType
 *  org.apache.commons.io.IOUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.jcr.api.SlingRepository
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.aemds.guide.batch.impl;

import com.adobe.aemds.guide.batch.api.BatchConfig;
import com.adobe.aemds.guide.batch.api.BatchInput;
import com.adobe.aemds.guide.batch.api.BatchProvider;
import com.adobe.aemds.guide.batch.api.BatchResult;
import com.adobe.aemds.guide.batch.api.PostProcessor;
import com.adobe.aemds.guide.batch.impl.AbstractBatchProvider;
import com.adobe.aemds.guide.storage.api.StorageProvider;
import com.adobe.aemfd.docmanager.Document;
import com.adobe.icc.dbforms.obj.LetterRenderOptionsSpec;
import com.adobe.icc.ddg.api.LetterRenderService;
import com.adobe.icc.render.obj.PDFFile;
import com.adobe.icc.render.obj.PDFResponseType;
import java.io.InputStream;
import java.util.Calendar;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.jcr.api.SlingRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate=1, metatype=1, label="Default PDF Batch Provider", description="Default Batch Provider Service for PDF")
@Service(value={BatchProvider.class})
public class DefaultPdfBatchProviderImpl
extends AbstractBatchProvider {
    @Reference
    private SlingRepository slingRepository;
    @Reference
    private LetterRenderService letterRenderService;
    @Reference(target="(component.name=com.adobe.aemds.guide.storage.impl.DefaultJcrStorageProviderImpl)")
    private StorageProvider defaultStorageProvider;
    @Reference(target="(component.name=com.adobe.aemds.guide.batch.impl.DefaultPostProcessorImpl)")
    private PostProcessor defaultPostProcessor;
    private Logger logger = LoggerFactory.getLogger(DefaultPdfBatchProviderImpl.class);

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public BatchResult generateBatch(BatchInput batchInput, BatchConfig batchConfig) {
        if (batchInput == null || batchConfig == null) {
            this.logger.error("Batch provider {} cannot generate a batch without valid input or configuration", (Object)this);
            return null;
        }
        BatchResult batchResult = new BatchResult();
        String batchStartTime = Calendar.getInstance().toString();
        String batchId = UUID.randomUUID().toString();
        Map<Document, String> dataXMLs = this.getDataXMLs(batchInput, batchConfig);
        int recordsSubmitted = dataXMLs.size();
        int recordsFailed = 0;
        int recordsPassed = 0;
        int recordsProcessed = 0;
        LinkedHashMap<String, List<String>> storedRecords = new LinkedHashMap<String, List<String>>();
        LinkedHashMap<String, String> failedRecords = new LinkedHashMap<String, String>();
        StorageProvider storageProvider = this.getStorageProvider(batchConfig, this.defaultStorageProvider);
        PostProcessor postProcessor = this.getPostProcessor(batchConfig, this.defaultPostProcessor);
        String templateId = batchInput.getTemplateId();
        for (Document dataXML : dataXMLs.keySet()) {
            if (dataXML == null) continue;
            String failureReason = null;
            String storageId = null;
            String recordId = null;
            Document processedDoc = null;
            Document resultDoc = null;
            try {
                ++recordsProcessed;
                recordId = dataXMLs.get((Object)dataXML);
                LetterRenderOptionsSpec letterRenderOptionsSpec = new LetterRenderOptionsSpec();
                letterRenderOptionsSpec.setMergeDataOnServer(true);
                letterRenderOptionsSpec.setRenderInteractive(false);
                PDFResponseType pdfResult = this.letterRenderService.renderLetter(templateId, IOUtils.toString((InputStream)dataXML.getInputStream()), letterRenderOptionsSpec);
                resultDoc = new Document(pdfResult.getFile().getDocument());
                processedDoc = postProcessor.processBatchResult(resultDoc, null);
                HashMap<String, String> metaData = new HashMap<String, String>();
                metaData.put("PROVIDER_META_DATA_PATH_PREFIX", batchId);
                metaData.put("PROVIDER_META_DATA_PATH_SUFFIX", "pdf");
                storageId = storageProvider.store(processedDoc, metaData);
                ++recordsPassed;
            }
            catch (Exception ex) {
                failureReason = ex.toString();
                this.logger.warn("Records failed: " + ++recordsFailed + " " + failureReason, (Throwable)ex);
            }
            finally {
                this.safelyDispose(resultDoc);
                this.safelyDispose(processedDoc);
                this.safelyDispose(dataXML);
            }
            if (storageId != null) {
                storedRecords.put(recordId, this.asList(storageId));
                continue;
            }
            if (failureReason == null) continue;
            failedRecords.put(recordId, failureReason);
        }
        postProcessor.processStoreResult(storedRecords);
        String batchEndTime = Calendar.getInstance().toString();
        batchResult.setBatchId(batchId);
        batchResult.setTemplateId(templateId);
        batchResult.setStoredRecords(storedRecords);
        batchResult.setFailedRecords(failedRecords);
        HashMap<String, String> batchPerformance = new HashMap<String, String>();
        batchPerformance.put("BATCH_START_TIME", batchStartTime);
        batchPerformance.put("BATCH_END_TIME", batchEndTime);
        batchPerformance.put("BATCH_RECORD_COUNT", String.valueOf(recordsSubmitted));
        batchPerformance.put("BATCH_RECORDS_PROCESSED", String.valueOf(recordsProcessed));
        batchPerformance.put("BATCH_RECORDS_SUCCEEDED", String.valueOf(recordsPassed));
        batchPerformance.put("BATCH_RECORDS_FAILED", String.valueOf(recordsFailed));
        batchResult.setBatchPerformance(batchPerformance);
        return batchResult;
    }

    @Override
    public SlingRepository getSlingRepository() {
        return this.slingRepository;
    }

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

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

    protected void bindLetterRenderService(LetterRenderService letterRenderService) {
        this.letterRenderService = letterRenderService;
    }

    protected void unbindLetterRenderService(LetterRenderService letterRenderService) {
        if (this.letterRenderService == letterRenderService) {
            this.letterRenderService = null;
        }
    }

    protected void bindDefaultStorageProvider(StorageProvider storageProvider) {
        this.defaultStorageProvider = storageProvider;
    }

    protected void unbindDefaultStorageProvider(StorageProvider storageProvider) {
        if (this.defaultStorageProvider == storageProvider) {
            this.defaultStorageProvider = null;
        }
    }

    protected void bindDefaultPostProcessor(PostProcessor postProcessor) {
        this.defaultPostProcessor = postProcessor;
    }

    protected void unbindDefaultPostProcessor(PostProcessor postProcessor) {
        if (this.defaultPostProcessor == postProcessor) {
            this.defaultPostProcessor = null;
        }
    }
}