| /* |
| * 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 org.apache.sling.api.resource.ResourceProvider; |
| import org.apache.sling.api.resource.ResourceResolver; |
| import org.apache.sling.distribution.component.impl.DistributionComponent; |
| import org.apache.sling.distribution.component.impl.DistributionComponentConstants; |
| import org.apache.sling.distribution.component.impl.DistributionComponentKind; |
| import org.apache.sling.distribution.component.impl.DistributionComponentProvider; |
| import org.apache.sling.distribution.resources.impl.common.AbstractReadableResourceProvider; |
| import org.apache.sling.distribution.resources.impl.common.SimplePathInfo; |
| |
| /** |
| * {@link ResourceProvider} for Osgi services for a specific service interface. |
| * The main resource contains a list of service properties and can be adapted to the underlying service. |
| * The accepted path is resourceRoot/{friendlyNameProperty}/childResourceName. |
| */ |
| public class DistributionServiceResourceProvider extends AbstractReadableResourceProvider { |
| |
| private final DistributionComponentKind kind; |
| private final DistributionComponentProvider componentProvider; |
| |
| DistributionServiceResourceProvider(String kind, |
| DistributionComponentProvider componentProvider, |
| String resourceRoot) { |
| super(resourceRoot); |
| this.kind = DistributionComponentKind.fromName(kind); |
| this.componentProvider = componentProvider; |
| } |
| |
| @Override |
| protected Map<String, Object> getInternalResourceProperties(ResourceResolver resolver, SimplePathInfo pathInfo) { |
| if (pathInfo.isRoot()) { |
| return getResourceRootProperties(); |
| } else if (pathInfo.isMain()) { |
| return getResourceProperties(resolver, pathInfo.getMainResourceName()); |
| } else if (pathInfo.isChild()) { |
| DistributionComponent<?> component = componentProvider.getComponent(kind, pathInfo.getMainResourceName()); |
| |
| if (component != null) { |
| return getChildResourceProperties(component, pathInfo.getChildResourceName()); |
| } |
| } |
| |
| return null; |
| } |
| |
| |
| @Override |
| protected Iterable<String> getInternalResourceChildren(ResourceResolver resolver, SimplePathInfo pathInfo) { |
| if (pathInfo.isMain()) { |
| DistributionComponent<?> component = componentProvider.getComponent(kind, pathInfo.getMainResourceName()); |
| |
| if (component != null) { |
| return getChildResourceChildren(component, pathInfo.getChildResourceName()); |
| } |
| } |
| |
| return null; |
| } |
| |
| private Map<String, Object> getResourceProperties(ResourceResolver resolver, String resourceName) { |
| |
| DistributionComponent<?> component = componentProvider.getComponent(kind, resourceName); |
| |
| if (component != null) { |
| Map<String, Object> properties = new HashMap<String, Object>(); |
| |
| properties.put(DistributionComponentConstants.PN_NAME, resourceName); |
| properties.put(INTERNAL_ADAPTABLE, component.getService()); |
| |
| String resourceType = kind.getResourceType(); |
| properties.put(SLING_RESOURCE_TYPE, resourceType); |
| return properties; |
| } |
| |
| return null; |
| } |
| |
| private Map<String, Object> getResourceRootProperties() { |
| |
| List<DistributionComponent<?>> componentList = componentProvider.getComponents(kind); |
| |
| List<String> nameList = new ArrayList<String>(); |
| for (DistributionComponent<?> component : componentList) { |
| nameList.add(component.getName()); |
| } |
| |
| Map<String, Object> result = new HashMap<String, Object>(); |
| result.put(ITEMS, nameList.toArray(new String[nameList.size()])); |
| |
| String resourceType = kind.getRootResourceType(); |
| result.put(SLING_RESOURCE_TYPE, resourceType); |
| |
| return result; |
| } |
| |
| Map<String, Object> getChildResourceProperties(DistributionComponent<?> component, String childResourceName) { |
| return null; |
| } |
| |
| Iterable<String> getChildResourceChildren(DistributionComponent<?> component, String childResourceName) { |
| return null; |
| } |
| } |