All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.composum.sling.core.security.ConfigurationSet Maven / Gradle / Ivy

package com.composum.sling.core.security;

import com.composum.sling.core.ResourceHandle;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;

import org.jetbrains.annotations.NotNull;
import javax.jcr.query.Query;
import javax.servlet.http.HttpSession;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import static com.composum.sling.core.util.CoreConstants.PROP_DESCRIPTION;

public class ConfigurationSet implements Serializable {

    public static final String SA_INSTANCE = ConfigurationSet.class.getName() + "#instance";

    public static final String PN_SCRIPT = "script";
    public static final String PN_AUTO_SETUP = "autoSetup";
    public static final String PN_RANK = "rank";

    public static final String QUERY =
            "/jcr:root/conf//config[@sling:resourceType='composum/nodes/commons/components/security/config']";

    public class ConfigScript implements Comparable, Serializable {

        private final Configuration configuration;
        private final List category;
        private final String label;
        private final String name;
        private final String path;
        private final String description;
        private final boolean autoSetup;
        private final String scriptPath;
        private final Long rank;

        public ConfigScript(@NotNull final Configuration configuration, @NotNull final ResourceHandle handle) {
            this.configuration = configuration;
            category = Arrays.asList(handle.getProperty("category", new String[0]));
            label = handle.getTitle();
            name = handle.getName();
            path = handle.getPath();
            description = handle.getProperty(PROP_DESCRIPTION, "");
            scriptPath = handle.getProperty(PN_SCRIPT, "");
            autoSetup = handle.getProperty(PN_AUTO_SETUP, Boolean.FALSE);
            rank = handle.getProperty(PN_RANK, Long.class);
        }

        @NotNull
        public Configuration getConfiguration() {
            return configuration;
        }

        public boolean matches(@NotNull final Collection category) {
            for (String ownCategory : getCategory()) {
                if (category.contains(ownCategory)) {
                    return true;
                }
            }
            return false;
        }

        @NotNull
        public List getCategory() {
            return category;
        }

        @NotNull
        public String getCategories() {
            return StringUtils.join(getCategory(), ",");
        }

        public String getRank() {
            return rank != null ? Long.toString(rank) : null;
        }

        @NotNull
        public String getLabel() {
            return label;
        }

        @NotNull
        public String getName() {
            return name;
        }

        @NotNull
        public String getPath() {
            return path;
        }

        @NotNull
        public String getDescription() {
            return description;
        }

        public boolean isAutoSetup() {
            return autoSetup;
        }

        @NotNull
        public String getScriptPath() {
            return scriptPath;
        }

        @Override
        public int compareTo(ConfigScript other) {
            CompareToBuilder builder = new CompareToBuilder();
            builder.append(rank != null ? String.format("%04d", rank) : "0050", other.rank != null ? String.format("%04d", other.rank) : "0050");
            builder.append(getLabel(), other.getLabel());
            return builder.toComparison();
        }
    }

    public class Configuration implements Comparable, Serializable {

        private final List category;
        private final String label;
        private final String name;
        private final String path;
        private final String description;
        private final Map scripts = new TreeMap<>();
        private final Long rank;

        public Configuration(@NotNull final ResourceHandle handle) {
            category = Arrays.asList(handle.getProperty("category", new String[0]));
            label = handle.getTitle();
            name = handle.getName();
            path = handle.getPath();
            description = handle.getProperty(PROP_DESCRIPTION, "");
            rank = handle.getProperty(PN_RANK, Long.class);
            for (final Resource scriptRes : handle.getChildren()) {
                addScript(new ConfigScript(this, ResourceHandle.use(scriptRes)));
            }
        }

        public boolean matches(@NotNull final Collection category) {
            for (String ownCategory : getCategory()) {
                if (category.contains(ownCategory)) {
                    return true;
                }
            }
            return false;
        }

        @NotNull
        public List getCategory() {
            return category;
        }

        @NotNull
        public String getCategories() {
            return StringUtils.join(getCategory(), ",");
        }

        public String getRank() {
            return rank != null ? Long.toString(rank) : null;
        }

        @NotNull
        public String getLabel() {
            return label;
        }

        @NotNull
        public String getName() {
            return name;
        }

        @NotNull
        public String getPath() {
            return path;
        }

        @NotNull
        public String getDescription() {
            return description;
        }

        @NotNull
        public Map getScripts() {
            return scripts;
        }

        public void addScript(@NotNull final ConfigScript script) {
            scripts.put(script.getLabel(), script);
            for (final String category : getCategory()) {
                final List categoryScripts = scriptCategories.computeIfAbsent(category, k -> new ArrayList<>());
                if (!categoryScripts.contains(script)) {
                    categoryScripts.add(script);
                    Collections.sort(categoryScripts);
                }
            }
            for (final String category : script.getCategory()) {
                final List categoryScripts = scriptCategories.computeIfAbsent(category, k -> new ArrayList<>());
                if (!categoryScripts.contains(script)) {
                    categoryScripts.add(script);
                    Collections.sort(categoryScripts);
                }
                final List categoryConfigurations = configCategories.computeIfAbsent(category, k -> new ArrayList<>());
                if (!categoryConfigurations.contains(this)) {
                    categoryConfigurations.add(this);
                    Collections.sort(categoryConfigurations);
                }
            }
        }

        @Override
        public int compareTo(Configuration other) {
            CompareToBuilder builder = new CompareToBuilder();
            builder.append(rank != null ? String.format("%04d", rank) : "0050", other.rank != null ? String.format("%04d", other.rank) : "0050");
            builder.append(getLabel(), other.getLabel());
            return builder.toComparison();
        }
    }

    protected final Map configurations = new TreeMap<>();
    protected final Map> configCategories = new TreeMap<>();
    protected final Map> scriptCategories = new TreeMap<>();

    @SuppressWarnings("deprecation")
    public ConfigurationSet(@NotNull final ResourceResolver resolver) {
        final Iterator configIterator = resolver.findResources(QUERY, Query.XPATH);
        while (configIterator.hasNext()) {
            addConfiguration(new Configuration(ResourceHandle.use(configIterator.next())));
        }
    }

    public Map> getConfigCategories() {
        return configCategories;
    }

    public Map> getScriptCategories() {
        return scriptCategories;
    }

    public Map getConfigurations() {
        return configurations;
    }

    public void addConfiguration(@NotNull final Configuration configuration) {
        configurations.put(configuration.getLabel(), configuration);
        for (final String category : configuration.getCategory()) {
            final List categoryConfigurations = configCategories.computeIfAbsent(category, k -> new ArrayList<>());
            if (!categoryConfigurations.contains(configuration)) {
                categoryConfigurations.add(configuration);
                Collections.sort(categoryConfigurations);
            }
        }
    }

    @NotNull
    public static ConfigurationSet instance(@NotNull final SlingHttpServletRequest request) {
        ConfigurationSet instance = null;
        final HttpSession session = request.getSession(false);
        if (session != null) {
            try {  // try to use cached configuration
                instance = (ConfigurationSet) session.getAttribute(SA_INSTANCE);
            } catch (ClassCastException ignore) {
            }
        }
        if (instance == null) {
            instance = new ConfigurationSet(request.getResourceResolver());
            if (session != null) {
                session.setAttribute(SA_INSTANCE, instance);
            }
        }
        return instance;
    }

    public static void clear(@NotNull final SlingHttpServletRequest request) {
        ConfigurationSet instance = null;
        final HttpSession session = request.getSession(false);
        if (session != null) {
            session.removeAttribute(SA_INSTANCE);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy