blob: 1b499941e8d0f016c2adcba106d6b04187fde83c [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.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;
}
}