DiscoveryConfigurationCache.java 3.42 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.commons.osgi.PropertiesUtil
 *  org.osgi.service.cm.Configuration
 *  org.osgi.service.cm.ConfigurationAdmin
 *  org.osgi.service.cm.ConfigurationEvent
 *  org.osgi.service.cm.ConfigurationListener
 *  org.osgi.service.component.ComponentContext
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.offloading.impl;

import java.util.Dictionary;
import java.util.Set;
import java.util.concurrent.ConcurrentSkipListSet;
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.commons.osgi.PropertiesUtil;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ConfigurationEvent;
import org.osgi.service.cm.ConfigurationListener;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service(value={ConfigurationListener.class, DiscoveryConfigurationCache.class})
public class DiscoveryConfigurationCache
implements ConfigurationListener {
    private static final Logger LOG = LoggerFactory.getLogger(DiscoveryConfigurationCache.class);
    private Set<String> allowedHosts = new ConcurrentSkipListSet<String>();
    @Reference
    private ConfigurationAdmin configurationAdmin;

    public void configurationEvent(ConfigurationEvent configurationEvent) {
        if (configurationEvent.getPid().equals("org.apache.sling.discovery.impl.Config")) {
            this.updateAllowedHosts();
        }
    }

    public Set<String> getAllowedHosts() {
        return this.allowedHosts;
    }

    private void updateAllowedHosts() {
        try {
            String filter = "(service.pid=org.apache.sling.discovery.impl.Config)";
            Configuration[] configurations = this.configurationAdmin.listConfigurations(filter);
            if (configurations != null) {
                boolean clearSet = false;
                for (Configuration c : configurations) {
                    String[] whitelistedHosts;
                    Dictionary properties = c.getProperties();
                    if (properties == null || (whitelistedHosts = PropertiesUtil.toStringArray(properties.get("topologyConnectorWhitelist"))) == null) continue;
                    if (!clearSet) {
                        this.allowedHosts.clear();
                        clearSet = true;
                    }
                    for (String host : whitelistedHosts) {
                        this.allowedHosts.add(host);
                    }
                }
            }
        }
        catch (Exception e) {
            LOG.error("Cannot search configurations for PID=org.apache.sling.discovery.impl.Config", (Throwable)e);
        }
    }

    protected void activate(ComponentContext componentContext) {
        this.updateAllowedHosts();
    }

    protected void bindConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
        this.configurationAdmin = configurationAdmin;
    }

    protected void unbindConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
        if (this.configurationAdmin == configurationAdmin) {
            this.configurationAdmin = null;
        }
    }
}