FormDataXMLProviderRegistryImpl.java 7.18 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.DataXMLOptions;
import com.adobe.forms.common.service.DataXMLProvider;
import com.adobe.forms.common.service.FormDataXMLProvider;
import com.adobe.forms.common.service.FormDataXMLProviderRegistry;
import com.adobe.forms.common.service.FormsException;
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 Prefill Services Provider")
@Service(value={FormDataXMLProviderRegistry.class})
public class FormDataXMLProviderRegistryImpl
implements FormDataXMLProviderRegistry {
    private static final String SERVICE_PROTOCOL = "service://";
    @Reference(name="formDataXMLProvider", referenceInterface=FormDataXMLProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
    private Map<Comparable<Object>, FormDataXMLProvider> oldProviders = new ConcurrentSkipListMap(Collections.reverseOrder());
    @Reference(name="DataXMLProvider", referenceInterface=DataXMLProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
    private Map<Comparable<Object>, DataXMLProvider> newProviders = new ConcurrentSkipListMap(Collections.reverseOrder());
    private Map<String, DataXMLProvider> newProviderNameMap = new ConcurrentHashMap<String, DataXMLProvider>();
    private Logger logger = LoggerFactory.getLogger(FormDataXMLProviderRegistryImpl.class);

    @Override
    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;
    }

    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.newProviders.put(ServiceUtil.getComparableForServiceRanking(config), provider);
        if (provider.getServiceName() != null) {
            this.newProviderNameMap.put(provider.getServiceName(), provider);
        }
    }

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

    @Override
    public InputStream getDataXMLStreamFromService(DataXMLOptions options) throws FormsException {
        String dataRef;
        InputStream result = null;
        String _serviceName = options.getServiceName();
        if (StringUtils.isBlank((CharSequence)_serviceName) && (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)) {
            DataXMLProvider provider = this.newProviderNameMap.get(_serviceName);
            if (provider != null) {
                result = provider.getDataXMLForDataRef(options);
            } else {
                this.logger.warn("No registered service found for service name " + _serviceName);
            }
        } else {
            String data;
            for (DataXMLProvider provider : this.newProviders.values()) {
                try {
                    InputStream dataXMLStream = provider.getDataXMLForDataRef(options);
                    if (dataXMLStream == null) continue;
                    result = dataXMLStream;
                    break;
                }
                catch (Exception e) {
                    this.logger.error("The current provider could not return the the appropriate data XML" + e.getMessage(), (Throwable)e);
                    continue;
                }
            }
            if (result == null && (data = this.getDataXMLFromService(options.getDataRef())) != null) {
                try {
                    result = new ByteArrayInputStream(data.getBytes("UTF-8"));
                }
                catch (UnsupportedEncodingException e) {
                    this.logger.error("Unable to read data using utf-8 encoding " + e.getMessage(), (Throwable)e);
                }
            }
        }
        return result;
    }

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