blob: 2acb7cbaa3a54752afdcfd6fdead7adb7d2541f4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.distribution.resources.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.sling.api.resource.ModifyingResourceProvider;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.ResourceProvider;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.component.impl.DistributionComponentKind;
import org.apache.sling.distribution.component.impl.DistributionConfiguration;
import org.apache.sling.distribution.component.impl.DistributionConfigurationManager;
import org.apache.sling.distribution.resources.DistributionResourceTypes;
import org.apache.sling.distribution.resources.impl.common.AbstractModifyingResourceProvider;
import org.apache.sling.distribution.resources.impl.common.SimplePathInfo;
/**
* {@link ResourceProvider} for Osgi configurations for a specific configuration factory.
* All CRUD operations are supported for the underlying resources.
* The accepted path is resourceRoot/{friendlyNameProperty}/childResourceName.
*/
public class DistributionConfigurationResourceProvider extends AbstractModifyingResourceProvider implements ResourceProvider, ModifyingResourceProvider {
private static final String SETTINGS_RESOURCE_TYPE = DistributionResourceTypes.DEFAULT_SETTING_RESOURCE_TYPE;
private final DistributionConfigurationManager configurationManager;
private final DistributionComponentKind kind;
public DistributionConfigurationResourceProvider(DistributionConfigurationManager configurationManager, String kind, String resourceRoot) {
super(resourceRoot);
this.configurationManager = configurationManager;
this.kind = DistributionComponentKind.fromName(kind);
}
@Override
protected void saveInternalResources(ResourceResolver resourceResolver, Map<String, Map<String, Object>> changedResources,
Set<String> deletedResources) throws PersistenceException {
for (Map.Entry<String, Map<String, Object>> entry : changedResources.entrySet()) {
String resourceName = entry.getKey();
Map<String, Object> properties = entry.getValue();
String componentName = getConfigName(resourceName);
DistributionConfiguration config = new DistributionConfiguration(kind, componentName, properties);
configurationManager.saveConfig(resourceResolver, config);
}
for (String resourceName : deletedResources) {
String componentName = getConfigName(resourceName);
configurationManager.deleteConfig(resourceResolver, kind, componentName);
}
}
@Override
protected Map<String, Object> getInternalResourceProperties(ResourceResolver resolver, SimplePathInfo pathInfo) {
if (pathInfo.isRoot()) {
return getResourceRootProperties(resolver);
} else if (pathInfo.isMain()) {
return getResourceProperties(resolver, pathInfo.getMainResourceName());
} else if (pathInfo.isChild()) {
String configName = getConfigName(pathInfo.getMainResourceName());
DistributionConfiguration config = configurationManager.getConfig(resolver, kind, configName);
if (config != null) {
return getChildResourceProperties(config, pathInfo.getChildResourceName());
}
}
return null;
}
@Override
protected Iterable<String> getInternalResourceChildren(ResourceResolver resolver, SimplePathInfo pathInfo) {
if (pathInfo.isMain()) {
String configName = getConfigName(pathInfo.getMainResourceName());
DistributionConfiguration config = configurationManager.getConfig(resolver, kind, configName);
if (config != null) {
return getChildResourceChildren(config, pathInfo.getChildResourceName());
}
}
return null;
}
private Map<String, Object> getChildResourceProperties(DistributionConfiguration config, String childResourceName) {
return null;
}
private Iterable<String> getChildResourceChildren(DistributionConfiguration config, String childResourceName) {
return null;
}
private Map<String, Object> getResourceRootProperties(ResourceResolver resolver) {
List<DistributionConfiguration> configsList = configurationManager.getConfigs(resolver, kind);
List<String> nameList = new ArrayList<String>();
for (DistributionConfiguration config : configsList) {
nameList.add(config.getName());
}
Map<String, Object> result = new HashMap<String, Object>();
result.put(ITEMS, nameList.toArray(new String[nameList.size()]));
String resourceType = getRootResourceType(kind);
result.put(SLING_RESOURCE_TYPE, resourceType);
return result;
}
private Map<String, Object> getResourceProperties(ResourceResolver resolver, String resourceName) {
String componentName = getConfigName(resourceName);
DistributionConfiguration config = configurationManager.getConfig(resolver, kind, componentName);
if (config != null) {
Map<String, Object> result = new HashMap<String, Object>();
result.putAll(config.getProperties());
String resourceType = getResourceType(kind);
result.put(SLING_RESOURCE_TYPE, resourceType);
return result;
}
return null;
}
private String getConfigName(String configName) {
return configName;
}
private String getResourceType(DistributionComponentKind kind) {
return SETTINGS_RESOURCE_TYPE;
}
private String getRootResourceType(DistributionComponentKind kind) {
return SETTINGS_RESOURCE_TYPE;
}
}