| /* |
| * 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.api.resource; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import org.apache.sling.api.adapter.SlingAdaptable; |
| import org.apache.sling.api.wrappers.DeepReadValueMapDecorator; |
| import org.apache.sling.api.wrappers.ValueMapDecorator; |
| |
| /** |
| * The <code>AbstractResource</code> is an abstract implementation of the |
| * {@link Resource} interface. |
| * <p> |
| * Implementations of the {@link Resource} interface are strongly encouraged to |
| * either extend from this class or the {@link ResourceWrapper} class instead of |
| * implementing the {@link Resource} from the ground up. This will ensure to |
| * always be able to support new methods that might be introduced in the |
| * {@link Resource} interface in the future. |
| * |
| * @since 2.1.0 (Sling API Bundle 2.1.0) |
| */ |
| public abstract class AbstractResource |
| extends SlingAdaptable |
| implements Resource { |
| |
| /** |
| * Returns the name of this resource. |
| * <p> |
| * This method is implemented as a pure string operation by calling the |
| * {@link ResourceUtil#getName(String)} method with the path of this |
| * resource. |
| */ |
| public String getName() { |
| return ResourceUtil.getName(getPath()); |
| } |
| |
| /** |
| * Returns the parent resource of this resource. |
| * <p> |
| * This method is implemented calling the {@link ResourceResolver#getParent(Resource)} method. |
| */ |
| public Resource getParent() { |
| return getResourceResolver().getParent(this); |
| } |
| |
| /** |
| * Returns the indicated child of this resource. |
| * <p> |
| * This method is implemented calling the |
| * {@link ResourceResolver#getResource(Resource, String)} method. As such |
| * the <code>relPath</code> argument may even be an absolute path or a path |
| * containing relative path segments <code>.</code> (current resource) and |
| * <code>..</code> (parent resource). |
| * <p> |
| * Implementations should not generally overwrite this method without |
| * calling this base class implementation. |
| */ |
| public Resource getChild(String relPath) { |
| return getResourceResolver().getResource(this, relPath); |
| } |
| |
| /** |
| * Returns an iterator on the direct child resources. |
| * <p> |
| * This method is implemented calling the |
| * {@link ResourceResolver#listChildren(Resource)} method. |
| * <p> |
| * Implementations should not generally overwrite this method without |
| * calling this base class implementation. |
| */ |
| public Iterator<Resource> listChildren() { |
| return getResourceResolver().listChildren(this); |
| } |
| |
| /** |
| * @see org.apache.sling.api.resource.Resource#getChildren() |
| */ |
| public Iterable<Resource> getChildren() { |
| return new Iterable<Resource>() { |
| |
| public Iterator<Resource> iterator() { |
| return listChildren(); |
| } |
| }; |
| } |
| |
| /** |
| * Checks to see if there are direct children of this resource by invoking |
| * {@link ResourceResolver#hasChildren(Resource)}. |
| */ |
| public boolean hasChildren() { |
| return getResourceResolver().hasChildren(this); |
| } |
| |
| /** |
| * Returns <code>true</code> if this resource is of the given resource type |
| * or if any of the super resource types equals the given resource type. |
| * <p> |
| * This method delegates to {@link ResourceResolver#isResourceType(Resource, String)} |
| */ |
| public boolean isResourceType(final String resourceType) { |
| return this.getResourceResolver().isResourceType(this, resourceType); |
| } |
| |
| /** |
| * This method calls {@link Resource#adaptTo(Class)} |
| * with the {@link ValueMap} class as an argument. If the |
| * <code>adaptTo</code> method returns a map, this map is returned. If the |
| * resource is not adaptable to a value map, next an adaption to {@link Map} |
| * is tried and if this is successful the map is wrapped as a value map. If |
| * the adaptions are not successful an empty value map is returned. |
| * @see org.apache.sling.api.resource.Resource#getValueMap() |
| */ |
| @SuppressWarnings({ "unchecked", "rawtypes" }) |
| public ValueMap getValueMap() { |
| // adapt to ValueMap if resource is not null |
| ValueMap valueMap = this.adaptTo(ValueMap.class); |
| |
| // if no resource or no ValueMap adapter, check Map |
| if (valueMap == null) { |
| |
| Map map = this.adaptTo(Map.class); |
| |
| // if not even adapting to map, assume an empty map |
| if (map == null) { |
| map = new HashMap<String, Object>(); |
| } |
| |
| // .. and decorate the plain map |
| valueMap = new DeepReadValueMapDecorator(this, new ValueMapDecorator(map)); |
| } |
| |
| return valueMap; |
| } |
| } |