blob: 143c1b516455c987fcbd789a2e87a95771850128 [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.hapi;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.annotation.versioning.ProviderType;
@ProviderType
public interface HApiUtil {
String DEFAULT_RESOURCE_TYPE = "sling/hapi/components/type";
String RESOURCE_TYPE = "org.apache.sling.hapi.tools.resourcetype";
String RESOURCE_TYPE_DESC = "The resource used for hapi types";
String DEFAULT_COLLECTION_RESOURCE_TYPE = "sling/hapi/components/typescollection";
String COLLECTION_RESOURCE_TYPE = "org.apache.sling.hapi.tools.collectionresourcetype";
String COLLECTION_RESOURCE_TYPE_DESC = "The resource used for hapi type collections";
String DEFAULT_SEARCH_PATH = "/libs/sling/hapi/types";
String SEARCH_PATHS = "org.apache.sling.hapi.tools.searchpaths";
String SEARCH_PATHS_DESC = "The path under which children resources can be identified as hapi types by their FQDN value in addition to the type path";
String DEFAULT_SERVER_URL = "http://localhost:8080";
String EXTERNAL_URL = "org.apache.sling.hapi.tools.externalurl";
String EXTERNAL_URL_DESC = "The external URL of the instance. This will prefix hapi absolute URLs";
boolean DEFAULT_ENABLED = true;
String ENABLED = "org.apache.sling.hapi.tools.enabled";
String ENABLED_DESC = "Whether hapi is enabled or completely disabled (no output rendered in components)";
/**
* <p>Get a HApi type jcr node from a type identifier.</p>
* <p>The JCR node must be [nt:unstructured], a descendant of any of the HAPi search path defined by the
* {@see HAPI_PATHS} config and the sling:resourceType should be set to the value defined by the {@see HAPI_RESOURCE_TYPE} config</p>
* <p>The first result is returned</p>
* @param resolver The sling resource resolver object
* @param type The type identifier, which is either in the form of a jcr path,
* same as the path for {@link: ResourceResolver#getResource(String)}. If the path cannot be resolved, type is treated like
* a fully qualified domain name, which has to match the "fqdn" property on the JCR node which represents the type.
* @return The first node that matches that type or null if none is found.
* @throws RepositoryException
*/
@Deprecated
Node getTypeNode(ResourceResolver resolver, String type) throws RepositoryException;
/**
* <p>Get a HApi type Resource from a type identifier.</p>
* <p>The Resource must be [nt:unstructured], a descendant of any of the HAPi search path defined by the
* {@see HAPI_PATHS} config and the sling:resourceType should be set to the value defined by the {@see HapiUtil#RESOURCE_TYPE}
* config</p>
* <p>The first result is returned</p>
* @param resolver The sling resource resolver object
* @param type The type identifier, which is either in the form of a jcr path,
* same as the path for {@link: ResourceResolver#getResource(String)}. If the path cannot be resolved, type is treated like
* a fully qualified domain name, which has to match the "fqdn" property on the Resource which represents the type.
* @return The first Resource that matches that type or null if none is found.
* @throws RepositoryException
*/
Resource getTypeResource(ResourceResolver resolver, String type) throws RepositoryException;
/**
* <p>Get a HApi type collection Resource from a collection identifier.</p>
* <p>The Resource must be [nt:unstructured], a descendant of any of the HAPi search path defined by the
* {@see HAPI_PATHS} config and the sling:resourceType should be set to the value defined by the
* {@see HapiUtil#COLLECTION_RESOURCE_TYPE} config</p>
* <p>The first result is returned</p>
* @param resolver The sling resource resolver object
* @param collection The collection identifier, which is either in the form of a jcr path,
* same as the path for {@link: ResourceResolver#getResource(String)}. If the path cannot be resolved, collection is
* treated like a fully qualified domain name, which has to match the "fqdn" property on the Resource which
* represents the type.
* @return The first Resource that matches that collection or null if none is found.
* @throws RepositoryException
*/
Resource getTypeCollectionResource(ResourceResolver resolver, String collection) throws RepositoryException;
/**
* <p>Get a HApi type object from a type identifier.</p>
* <p>The type identifier is resolved to a {@link javax.jcr.Node} and then
* {@link #fromNode(org.apache.sling.api.resource.ResourceResolver, javax.jcr.Node)} is called.</p>
* <p>For restrictions on the {@link javax.jcr.Node}
* see {@link HApiUtil#getTypeNode(org.apache.sling.api.resource.ResourceResolver, String)}</p>
* @param resolver The sling resource resolver object
* @param type The type identifier, which is either in the form of a jcr path,
* same as the path for{@link: ResourceResolver#getResource(String)}. If the path cannot be resolved, type is treated like
* a fully qualified domain name, which has to match the "fqdn" property on the JCR node which represents the type.
* @return The HApiType resolved from the type identifier
* @throws javax.jcr.RepositoryException
*/
HApiType fromPath(ResourceResolver resolver, String type) throws RepositoryException;
/**
* <p>Get a HApi type object from the {@link javax.jcr.Node}.</p>
* The Node has the following properties:
* <ul>
* <li>name: A 'Name' of the type (mandatory)</li>
* <li>description: A 'String' with the description text for this type (mandatory)</li>
* <li>fqdn: A 'String' with the fully qualified domain name; A namespace like a java package (mandatory)</li>
* <li>extends: A type identifier (either a path or a fqdn); (optional). This defines the parent type of this type</li>
* <li>parameter: A multivalue property to define a list of java-like generic types
* that can be used as types for properties; (optional)</li>
* </ul>
*
* <p>The properties of this type are defined as children nodes.</p>
* <p>The name of property node defines the name of the property for this type. </p>
* The children property nodes have the following properties:
* <ul>
* <li>type: The type identifier (mandatory). Can be of type 'Name' or 'Path'
* See {@link HApiUtil#getTypeNode(org.apache.sling.api.resource.ResourceResolver, String)}
* for the format of this value</li>
* <li>description: A 'String' with the description for this property (mandatory)</li>
* <li>multiple: A 'Boolean' that defines whether this property can exist multiple times on an object of this type (optional)</li>
* </ul>
*
* @param resolver The resource resolver
* @param typeNode The jcr node of the HApi type
* @return The HApiType
* @throws RepositoryException
*/
@Deprecated
HApiType fromNode(ResourceResolver resolver, Node typeNode) throws RepositoryException;
/**
* <p>Get a HApi type object from the {@link org.apache.sling.api.resource.Resource}.</p>
* The Resource has the following properties:
* <ul>
* <li>name: A 'Name' of the type (mandatory)</li>
* <li>description: A 'String' with the description text for this type (mandatory)</li>
* <li>fqdn: A 'String' with the fully qualified domain name; A namespace like a java package (mandatory)</li>
* <li>extends: A type identifier (either a path or a fqdn); (optional). This defines the parent type of this type</li>
* <li>parameter: A multivalue property to define a list of java-like generic types
* that can be used as types for properties; (optional)</li>
* </ul>
*
* <p>The properties of this type are defined as children resources.</p>
* <p>The name of property resource defines the name of the property for this type. </p>
* The children property nodes have the following properties:
* <ul>
* <li>type: The type identifier (mandatory). Can be of type 'Name' or 'Path'
* See {@link HApiUtil#getTypeNode(org.apache.sling.api.resource.ResourceResolver, String)}
* for the format of this value</li>
* <li>description: A 'String' with the description for this property (mandatory)</li>
* <li>multiple: A 'Boolean' that defines whether this property can exist multiple times on an object of this type (optional)</li>
* </ul>
*
* @param resolver The resource resolver
* @param typeResource The sling Resource of the HApi type
* @return The HApiType
* @throws RepositoryException
*/
HApiType fromResource(ResourceResolver resolver, Resource typeResource) throws RepositoryException;
/**
* <p>Get a {@link HApiTypesCollection} object from a {@link org.apache.sling.api.resource.Resource}.</p>
* The Resource has the following properties:
* <ul>
* <li>name: A 'Name' of the type collection (mandatory)</li>
* <li>description: A 'String' with the description text for this type collection (mandatory)</li>
* <li>fqdn: A 'String' with the fully qualified domain name; A namespace like a java package (mandatory)</li>
* </ul>
*
* <p> The types collection will be populated with direct child Resources of the {{collectionResource}},
* which have the resourceType equal to the value of the {@link HApiUtil#RESOURCE_TYPE} property
*
* @param resolver The resource resolver
* @param collectionResource The sling Resource of the HApi type collection
* @return The HApiTypesCollection
* @throws RepositoryException
*/
HApiTypesCollection collectionFromResource(ResourceResolver resolver, Resource collectionResource) throws RepositoryException;
/**
* <p>Get a {@link HApiTypesCollection} object from a path String.</p>
* <p>{@see HApiUtil#collectionFromResource}</p>
*
* @param resolver The resource resolver
* @param collectionPath The sling resource path of the HApi type collection
* @return The HApiTypesCollection
* @throws RepositoryException
*/
HApiTypesCollection collectionFromPath(ResourceResolver resolver, String collectionPath) throws RepositoryException;
/**
* Get a new instance of AttributeHelper for the type identified by 'type'
* @param resolver
* @param type See {@link #getTypeNode(org.apache.sling.api.resource.ResourceResolver, String)}
* for the format of the type identifier
* @return
* @throws RepositoryException
*/
MicrodataAttributeHelper getHelper(ResourceResolver resolver, String type) throws RepositoryException;
}