/*
 * 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.tenant;

import java.util.Iterator;

import org.osgi.annotation.versioning.ProviderType;

/**
 * The <code>Tenant</code> interface represents a tenant which may be used to
 * further customize request and other processing.
 * <p>
 * This interface is intended to be implemented by the implementor of the
 * {@link TenantProvider} interface to be returned by the tenant accessor
 * methods.
 */
@ProviderType
public interface Tenant {

	/**
	 * The name of the {@link #getProperty(String) property} whose string
	 * representation is used as this tenant's {@link #getName() name} (value is
	 * "sling.tenant.name").
	 *
	 * @see #getName()
	 * @see #getProperty(String)
	 */
	String PROP_NAME = "tenant.name";

	/**
	 * The name of the {@link #getProperty(String) property} whose string
	 * representation is used as this tenant's {@link #getDescription()
	 * description} (value is "sling.tenant.description").
	 *
	 * @see #getDescription()
	 * @see #getProperty(String)
	 */
	String PROP_DESCRIPTION = "tenant.description";

	/**
	 * Returns the unique identifier of this tenant.
	 * <p>
	 * The tenant identifier has not predefined mapping to a property and may be
	 * generated automatically by the TenantProvider.
	 */
	String getId();

	    /**
     * Returns the name of the tenant. This is a short name for quickly
     * identifying this tenant. This name is not required to be globally unique.
     * <p>
     * The name of the tenant is the string representation of the
     * {@link #PROP_NAME} property or {@code null} if the property is not
     * defined.
     */
    String getName();

    /**
     * Returns a human readable description of this tenant.
     * <p>
     * The description of the tenant is the string representation of the
     * {@link #PROP_DESCRIPTION} property or {@code null} if the property is not
     * defined.
     */
	String getDescription();

	/**
	 * Returns the named property or <code>null</code> if no such property
	 * exists or if the property value itself is <code>null</code>.
	 */
	Object getProperty(String name);

	/**
	 * Returns the named property converted to the requested type or
	 * <code>null</code> if the property does not exist, the property value
	 * itself is <code>null</code> or cannot be converted to the requested type.
	 */
	<Type> Type getProperty(String name, Type type);

	/**
	 * Returns an iterator or String values representing the names of defined
	 * properties of this tenant.
	 */
	Iterator<String> getPropertyNames();
}
