package com.buschmais.xo.impl;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.util.Map;
import java.util.Set;
import com.buschmais.xo.spi.datastore.DatastoreEntityMetadata;
import com.buschmais.xo.spi.datastore.DatastoreRelationMetadata;
import com.buschmais.xo.spi.datastore.TypeMetadataSet;
import com.buschmais.xo.spi.metadata.method.AbstractRelationPropertyMethodMetadata;
import com.buschmais.xo.spi.metadata.type.EntityTypeMetadata;
import com.buschmais.xo.spi.metadata.type.RelationTypeMetadata;
import com.buschmais.xo.spi.metadata.type.RepositoryTypeMetadata;
import com.buschmais.xo.spi.metadata.type.TypeMetadata;
/**
* Defines the interface for the metadata provider.
*
* @param <EntityMetadata> The type of datastore specific entity metadata.
* @param <EntityDiscriminator> The type of datastore specific entity type discriminators.
* @param <RelationMetadata> The type of datastore specific relation metadata.
* @param <RelationDiscriminator> The type of datastore specific relationtype discriminators.
*/
public interface MetadataProvider<EntityMetadata extends DatastoreEntityMetadata<EntityDiscriminator>, EntityDiscriminator, RelationMetadata extends DatastoreRelationMetadata<RelationDiscriminator>, RelationDiscriminator> {
/**
* Determine the {@link TypeMetadataSet} for a given set of entity discriminators.
*
* @param entityDiscriminators The entity descriminators.
* @return The {@link TypeMetadataSet}.
*/
TypeMetadataSet<EntityTypeMetadata<EntityMetadata>> getTypes(Set<EntityDiscriminator> entityDiscriminators);
/**
* Determine the set of entity discriminators for the given {@link TypeMetadataSet}.
*
* @param types The {@link TypeMetadataSet}.
* @return The set of discriminators.
*/
Set<EntityDiscriminator> getEntityDiscriminators(TypeMetadataSet<EntityTypeMetadata<EntityMetadata>> types);
/**
* Determine the {@link TypeMetadataSet} for a given relation discriminator.
*
* @param discriminator The relation descriminator.
* @return The {@link TypeMetadataSet}.
*/
TypeMetadataSet<RelationTypeMetadata<RelationMetadata>> getRelationTypes(Set<EntityDiscriminator> sourceDiscriminators, RelationDiscriminator discriminator, Set<EntityDiscriminator> targetDiscriminators);
/**
* Return a collection of all registered entity type metadata.
*
* @return The collection of all registered entity type metadata.
*/
Map<Class<?>, TypeMetadata> getRegisteredMetadata();
/**
* Return the entity metadata for a specific type.
*
* @param type The type.
* @return The entity metadata.
*/
EntityTypeMetadata<EntityMetadata> getEntityMetadata(Class<?> type);
/**
* Return the relation metadata for a specific type.
*
* @param relationType The relation type.
* @return The relation metadata.
*/
RelationTypeMetadata<RelationMetadata> getRelationMetadata(Class<?> relationType);
RelationTypeMetadata.Direction getRelationDirection(Set<Class<?>> sourceTypes, RelationTypeMetadata<RelationMetadata> relationMetadata, Set<Class<?>> targetTypes);
/**
* Return the repository metadata for a specific type.
*
* @param repositoryType The repository type.
* @return The repository metadata.
*/
RepositoryTypeMetadata getRepositoryMetadata(Class<?> repositoryType);
/**
* Return the property which represents a relation in an entity.
*
* @param entityType The entity.
* @param relationType The relation type.
* @param direction The direction.
* @param <R> The Relation type.
* @return The property metadata.
*/
<R> AbstractRelationPropertyMethodMetadata<?> getPropertyMetadata(Class<?> entityType, Class<R> relationType, RelationTypeMetadata.Direction direction);
/**
* Return the annotation which represents a query definition.
*
* @param annotatedElement The annotated element.
* @param <QL> The annotation type.
* @return The annotation or null if the element is not annotated with a query.
*/
<QL extends Annotation> QL getQuery(AnnotatedElement annotatedElement);
}