Search in sources :

Example 31 with ConfigurationMetadata

use of org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata in project sling by apache.

the class ConfigurationDataImpl method resolveNestedConfigs.

private void resolveNestedConfigs(Map<String, Object> props) {
    if (configMetadata == null) {
        return;
    }
    for (PropertyMetadata<?> propertyMetadata : configMetadata.getPropertyMetadata().values()) {
        if (propertyMetadata.isNestedConfiguration()) {
            ConfigurationMetadata nestedConfigMetadata = propertyMetadata.getConfigurationMetadata();
            String relatedConfigPath = resolvedConfigurationResource != null ? resolvedConfigurationResource.getPath() : null;
            String nestedConfigName;
            if (configResourceCollection) {
                String collectionItemName = StringUtils.defaultString(getCollectionItemName(), "newItem");
                nestedConfigName = configurationPersistenceStrategy.getCollectionParentConfigName(configName, relatedConfigPath) + "/" + configurationPersistenceStrategy.getCollectionItemConfigName(collectionItemName, relatedConfigPath) + "/" + nestedConfigMetadata.getName();
            } else {
                nestedConfigName = configurationPersistenceStrategy.getConfigName(configName, relatedConfigPath) + "/" + nestedConfigMetadata.getName();
            }
            if (propertyMetadata.getType().equals(ConfigurationMetadata.class)) {
                ConfigurationData configData = configurationManager.getConfiguration(contextResource, nestedConfigName);
                props.put(propertyMetadata.getName(), configData);
            } else if (propertyMetadata.getType().equals(ConfigurationMetadata[].class)) {
                Collection<ConfigurationData> configDatas = configurationManager.getConfigurationCollection(contextResource, nestedConfigName).getItems();
                props.put(propertyMetadata.getName(), configDatas.toArray(new ConfigurationData[configDatas.size()]));
            }
        }
    }
}
Also used : ConfigurationData(org.apache.sling.caconfig.management.ConfigurationData) Collection(java.util.Collection) ConfigurationMetadata(org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata)

Example 32 with ConfigurationMetadata

use of org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata in project sling by apache.

the class ConfigurationManagerImpl method newCollectionItem.

@Override
public ConfigurationData newCollectionItem(Resource resource, String configName) {
    ConfigNameUtil.ensureValidConfigName(configName);
    ConfigurationMetadata configMetadata = getConfigurationMetadata(configName);
    if (configMetadata != null) {
        return new ConfigurationDataImpl(configMetadata, resource, configName, this, configurationManagementSettings, configurationOverrideMultiplexer, configurationPersistenceStrategy, true);
    }
    return null;
}
Also used : ConfigurationMetadata(org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata)

Example 33 with ConfigurationMetadata

use of org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata in project sling by apache.

the class ConfigurationManagerImpl method getConfigurationCollection.

@SuppressWarnings("unchecked")
@Override
public ConfigurationCollectionData getConfigurationCollection(Resource resource, String configName) {
    ConfigNameUtil.ensureValidConfigName(configName);
    if (log.isDebugEnabled()) {
        log.debug("Get configuration collection for context path {}, name '{}'", resource.getPath(), configName);
    }
    ConfigurationMetadata configMetadata = getConfigurationMetadata(configName);
    List<ConfigurationData> configData = new ArrayList<>();
    // get all possible colection parent config names
    Collection<String> collectionParentConfigNames = configurationPersistenceStrategy.getAllCollectionParentConfigNames(configName);
    // get configuration resource items
    List<Iterator<Resource>> configResourceInheritanceChains = new ArrayList<>();
    for (String collectionParentConfigName : collectionParentConfigNames) {
        Collection<Iterator<Resource>> result = configurationResourceResolvingStrategy.getResourceCollectionInheritanceChain(resource, configurationResourceResolverConfig.configBucketNames(), collectionParentConfigName);
        if (result != null) {
            configResourceInheritanceChains.addAll(result);
        }
    }
    String writebackConfigResourceCollectionParentPath = null;
    if (configResourceInheritanceChains != null) {
        for (Iterator<Resource> configResourceInheritanceChain : configResourceInheritanceChains) {
            ResettableIterator resettableConfigResourceInheritanceChain = new ListIteratorWrapper(configResourceInheritanceChain);
            Resource configResource = applyPersistenceAndInheritance(resource.getPath(), configName, resettableConfigResourceInheritanceChain, true);
            resettableConfigResourceInheritanceChain.reset();
            Resource untransformedConfigResource = (Resource) resettableConfigResourceInheritanceChain.next();
            if (configResource != null) {
                // get writeback resource for "reverse inheritance detection"
                Resource writebackConfigResource = null;
                String writebackConfigResourcePath = null;
                for (String configBucketName : configurationResourceResolverConfig.configBucketNames()) {
                    writebackConfigResourceCollectionParentPath = configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource, configBucketName, configName);
                    if (writebackConfigResourceCollectionParentPath != null) {
                        writebackConfigResourceCollectionParentPath = configurationPersistenceStrategy.getCollectionParentResourcePath(writebackConfigResourceCollectionParentPath);
                        writebackConfigResourcePath = writebackConfigResourceCollectionParentPath + "/" + untransformedConfigResource.getName();
                        writebackConfigResource = configResource.getResourceResolver().getResource(writebackConfigResourcePath);
                        if (writebackConfigResource != null) {
                            writebackConfigResource = configurationPersistenceStrategy.getCollectionItemResource(writebackConfigResource);
                            break;
                        }
                    }
                }
                if (log.isTraceEnabled() && configResource != null) {
                    log.trace("+ Found config resource for context path " + resource.getPath() + ": " + configResource.getPath() + " " + MapUtil.traceOutput(configResource.getValueMap()) + ", " + "writeback config resource: " + writebackConfigResourcePath);
                }
                resettableConfigResourceInheritanceChain.reset();
                configData.add(new ConfigurationDataImpl(configMetadata, configResource, writebackConfigResource, applyPersistence(resettableConfigResourceInheritanceChain, true), resource, configName, this, configurationManagementSettings, configurationOverrideMultiplexer, configurationPersistenceStrategy, true, untransformedConfigResource.getName()));
            }
        }
    }
    // fallback for writeback path detection when no configuration resources does exist yet
    if (writebackConfigResourceCollectionParentPath == null) {
        for (String configBucketName : configurationResourceResolverConfig.configBucketNames()) {
            writebackConfigResourceCollectionParentPath = configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource, configBucketName, configName);
            if (writebackConfigResourceCollectionParentPath != null) {
                break;
            }
        }
    }
    // get properties of parent resource of the current level
    Map<String, Object> resourceCollectionParentProps = null;
    if (writebackConfigResourceCollectionParentPath != null) {
        Resource writebackConfigResourceCollectionParent = resource.getResourceResolver().getResource(writebackConfigResourceCollectionParentPath);
        if (writebackConfigResourceCollectionParent != null) {
            resourceCollectionParentProps = writebackConfigResourceCollectionParent.getValueMap();
        }
    }
    return new ConfigurationCollectionDataImpl(configName, configData, writebackConfigResourceCollectionParentPath, resourceCollectionParentProps, configurationManagementSettings);
}
Also used : ListIteratorWrapper(org.apache.commons.collections.iterators.ListIteratorWrapper) ArrayList(java.util.ArrayList) ConfigurationData(org.apache.sling.caconfig.management.ConfigurationData) Resource(org.apache.sling.api.resource.Resource) ConfigurationMetadata(org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata) ResettableIterator(org.apache.commons.collections.ResettableIterator) ResettableIterator(org.apache.commons.collections.ResettableIterator) Iterator(java.util.Iterator)

Aggregations

ConfigurationMetadata (org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata)33 Test (org.junit.Test)17 PropertyMetadata (org.apache.sling.caconfig.spi.metadata.PropertyMetadata)9 Before (org.junit.Before)5 AnnotationClassParser.buildConfigurationMetadata (org.apache.sling.caconfig.impl.metadata.AnnotationClassParser.buildConfigurationMetadata)4 ConfigurationData (org.apache.sling.caconfig.management.ConfigurationData)4 ConfigurationMetadataProvider (org.apache.sling.caconfig.spi.ConfigurationMetadataProvider)3 HashMap (java.util.HashMap)2 ResettableIterator (org.apache.commons.collections.ResettableIterator)2 ListIteratorWrapper (org.apache.commons.collections.iterators.ListIteratorWrapper)2 Resource (org.apache.sling.api.resource.Resource)2 ImmutableSortedSet (com.google.common.collect.ImmutableSortedSet)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Iterator (java.util.Iterator)1 LinkedHashSet (java.util.LinkedHashSet)1 SortedSet (java.util.SortedSet)1 Configuration (org.apache.sling.caconfig.annotation.Configuration)1 Property (org.apache.sling.caconfig.annotation.Property)1 AllTypesConfig (org.apache.sling.caconfig.example.AllTypesConfig)1