FormDataProviderRegistryImpl.java 10.5 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.apache.commons.lang3.StringUtils
 *  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.sling.commons.osgi.ServiceUtil
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.forms.common.service.impl;

import com.adobe.forms.common.service.ContentType;
import com.adobe.forms.common.service.DataOptions;
import com.adobe.forms.common.service.DataProvider;
import com.adobe.forms.common.service.DataProviderBase;
import com.adobe.forms.common.service.DataXMLOptions;
import com.adobe.forms.common.service.DataXMLProvider;
import com.adobe.forms.common.service.FormDataProviderRegistry;
import com.adobe.forms.common.service.FormDataXMLProvider;
import com.adobe.forms.common.service.FormsException;
import com.adobe.forms.common.service.PrefillData;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import org.apache.commons.lang3.StringUtils;
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.sling.commons.osgi.ServiceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate=1, label="Form Data Prefill Services Provider")
@Service(value={FormDataProviderRegistry.class})
public class FormDataProviderRegistryImpl
implements FormDataProviderRegistry {
    private Logger logger = LoggerFactory.getLogger(FormDataProviderRegistryImpl.class);
    private static final String SERVICE_PROTOCOL = "service://";
    @Reference(name="DataXMLProvider", referenceInterface=DataXMLProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
    private Map<Comparable<Object>, DataXMLProvider> dataXmlProviders;
    @Reference(name="DataProvider", referenceInterface=DataProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
    private Map<Comparable<Object>, DataProvider> dataProviders;
    @Reference(name="formDataXMLProvider", referenceInterface=FormDataXMLProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
    private Map<Comparable<Object>, FormDataXMLProvider> oldProviders = new ConcurrentSkipListMap(Collections.reverseOrder());
    private Map<Comparable<Object>, DataProviderBase> dataProvidersBase = new ConcurrentSkipListMap(Collections.reverseOrder());
    private Map<String, DataProviderBase> dataProviderBaseNameMap = new ConcurrentHashMap<String, DataProviderBase>();

    private Collection<FormDataXMLProvider> getOldProviders() {
        return this.oldProviders.values();
    }

    protected void bindFormDataXMLProvider(FormDataXMLProvider provider, Map<String, Object> config) {
        this.oldProviders.put(ServiceUtil.getComparableForServiceRanking(config), provider);
    }

    protected void unbindFormDataXMLProvider(FormDataXMLProvider provider, Map<String, Object> config) {
        this.oldProviders.remove(ServiceUtil.getComparableForServiceRanking(config));
    }

    protected void bindDataXMLProvider(DataXMLProvider provider, Map<String, Object> config) {
        this.dataProvidersBase.put(ServiceUtil.getComparableForServiceRanking(config), provider);
        if (provider.getServiceName() != null) {
            this.dataProviderBaseNameMap.put(provider.getServiceName(), provider);
        }
    }

    protected void unbindDataXMLProvider(DataXMLProvider provider, Map<String, Object> config) {
        this.dataProvidersBase.remove(ServiceUtil.getComparableForServiceRanking(config));
        if (provider.getServiceName() != null) {
            this.dataProviderBaseNameMap.remove(provider.getServiceName());
        }
    }

    protected void bindDataProvider(DataProvider provider, Map<String, Object> config) {
        this.dataProvidersBase.put(ServiceUtil.getComparableForServiceRanking(config), provider);
        if (provider.getServiceName() != null) {
            this.dataProviderBaseNameMap.put(provider.getServiceName(), provider);
        }
    }

    protected void unbindDataProvider(DataProvider provider, Map<String, Object> config) {
        this.dataProvidersBase.remove(ServiceUtil.getComparableForServiceRanking(config));
        if (provider.getServiceName() != null) {
            this.dataProviderBaseNameMap.remove(provider.getServiceName());
        }
    }

    @Override
    public PrefillData getDataFromService(DataOptions options) throws FormsException {
        String dataRef;
        PrefillData prefillData = null;
        String _serviceName = options.getServiceName();
        if ((_serviceName == null || _serviceName.length() == 0) && (dataRef = options.getDataRef()).startsWith("service://")) {
            int protocolLength = "service://".length();
            int index = dataRef.indexOf("/", protocolLength);
            _serviceName = index == -1 ? dataRef.substring(protocolLength) : dataRef.substring(protocolLength, index);
            if (StringUtils.isBlank((CharSequence)_serviceName)) {
                this.logger.warn("Invalid service protocol found in " + dataRef + " .Protocol should be in the following format service://[SERVICE_NAME]/[IDENTIFIER]");
            }
        }
        if (StringUtils.isNotBlank((CharSequence)_serviceName)) {
            DataProviderBase dataProvider = this.dataProviderBaseNameMap.get(_serviceName);
            DataXMLProvider xmlProvider = null;
            if (dataProvider instanceof DataXMLProvider && (xmlProvider = (DataXMLProvider)dataProvider) != null) {
                DataXMLOptions xmlOptions = new DataXMLOptions(options);
                InputStream dataStream = xmlProvider.getDataXMLForDataRef(xmlOptions);
                if (dataStream != null) {
                    prefillData = new PrefillData(dataStream, ContentType.XML);
                } else {
                    this.logger.warn("No registered service found for service name " + _serviceName);
                }
            }
            if (dataProvider instanceof DataProvider && xmlProvider == null) {
                DataProvider provider = (DataProvider)dataProvider;
                if (provider != null) {
                    prefillData = provider.getPrefillData(options);
                } else {
                    this.logger.warn("No registered service found for service name " + _serviceName);
                }
            }
        } else {
            String data;
            try {
                for (DataProviderBase dataProvider : this.dataProvidersBase.values()) {
                    if (dataProvider instanceof DataXMLProvider) {
                        DataXMLProvider provider = (DataXMLProvider)dataProvider;
                        DataXMLOptions xmlOptions = new DataXMLOptions(options);
                        InputStream dataStream = null;
                        try {
                            dataStream = provider.getDataXMLForDataRef(xmlOptions);
                        }
                        catch (Exception ex) {
                            this.logger.warn("The current provider could not return the the appropriate data XML" + ex.getMessage(), (Throwable)ex);
                        }
                        if (dataStream != null) {
                            prefillData = new PrefillData(dataStream, ContentType.XML);
                            break;
                        }
                    }
                    if (!(dataProvider instanceof DataProvider)) continue;
                    DataProvider provider = (DataProvider)dataProvider;
                    PrefillData data2 = null;
                    try {
                        data2 = provider.getPrefillData(options);
                    }
                    catch (Exception ex) {
                        this.logger.warn("The current provider could not return the the appropriate data" + ex.getMessage(), (Throwable)ex);
                    }
                    if (data2 == null || data2.getInputStream() == null) continue;
                    prefillData = data2;
                    break;
                }
            }
            catch (Exception e) {
                this.logger.error("The current provider could not return the the appropriate data." + e.getMessage(), (Throwable)e);
            }
            if (prefillData == null && (data = this.getDataXMLFromService(options.getDataRef())) != null) {
                try {
                    ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes("UTF-8"));
                    prefillData = new PrefillData(dataStream, ContentType.XML);
                }
                catch (UnsupportedEncodingException e) {
                    this.logger.error("Unable to read data using utf-8 encoding " + e.getMessage(), (Throwable)e);
                }
            }
        }
        return prefillData;
    }

    public String getDataXMLFromService(String dataRef) throws FormsException {
        String result;
        result = null;
        try {
            for (FormDataXMLProvider provider : this.getOldProviders()) {
                try {
                    String dataXML = provider.getDataXMLForDataRef(dataRef);
                    if (dataXML == null) continue;
                    result = dataXML;
                    break;
                }
                catch (Exception e) {
                    this.logger.error("The current provider could not return the the appropriate data XML" + e.getMessage(), (Throwable)e);
                    continue;
                }
            }
        }
        catch (Exception e) {
            this.logger.error("Error in returning the service to provide the desired data XML", (Throwable)e);
            throw new FormsException(e);
        }
        return result;
    }

    @Override
    public List<DataProviderBase> getProviders() {
        ArrayList<DataProviderBase> result = new ArrayList<DataProviderBase>();
        for (DataProviderBase provider : this.dataProvidersBase.values()) {
            result.add(provider);
        }
        return result;
    }
}