public function loadMetadataForClass($className, ClassMetadata $metadata)
{
$class = $metadata->getReflectionClass();
if (!$class) {
$class = new \ReflectionClass((string) $className);
}
$classAnnotations = $this->reader->getClassAnnotations($class);
$classMapping = array();
$validMapping = false;
foreach ($classAnnotations as $annotation) {
switch (get_class($annotation)) {
case 'Doctrine\\Search\\Mapping\\Annotations\\ElasticSearchable':
$classMapping = (array) $annotation;
$classMapping['class'] = 'ElasticSearchable';
$validMapping = true;
break;
case 'Doctrine\\Search\\Mapping\\Annotations\\Searchable':
$classMapping = (array) $annotation;
$classMapping['class'] = 'Searchable';
$validMapping = true;
break;
case 'Doctrine\\Search\\Mapping\\Annotations\\ElasticRoot':
$rootMapping = (array) $annotation;
$metadata->mapRoot($this->rootToArray($rootMapping));
break;
}
}
if (!$validMapping) {
throw MappingException::classIsNotAValidDocument($className);
}
$this->annotateClassMetadata($classMapping, $metadata);
$properties = $class->getProperties();
foreach ($properties as $property) {
$propertyAnnotations = $this->reader->getPropertyAnnotations($property);
foreach ($propertyAnnotations as $annotation) {
switch (get_class($annotation)) {
case 'Doctrine\\Search\\Mapping\\Annotations\\Id':
$metadata->identifier = $property->getName();
break;
case 'Doctrine\\Search\\Mapping\\Annotations\\Parameter':
$mapping = $this->parameterToArray($property->getName(), (array) $annotation);
$metadata->mapParameter($mapping);
break;
case 'Doctrine\\Search\\Mapping\\Annotations\\Field':
case 'Doctrine\\Search\\Mapping\\Annotations\\ElasticField':
case 'Doctrine\\Search\\Mapping\\Annotations\\SolrField':
$mapping = $this->fieldToArray($property->getName(), (array) $annotation);
$metadata->mapField($mapping);
break;
}
}
}
}