public function loadMetadataForClass($className, ClassMetadata $class)
{
/** @var $class \Doctrine\ODM\PHPCR\Mapping\ClassMetadata */
try {
$element = $this->getElement($className);
} catch (DoctrineMappingException $e) {
// Convert Exception type for consistency with other drivers
throw new MappingException($e->getMessage(), $e->getCode(), $e);
}
if (!$element) {
return;
}
$element['type'] = isset($element['type']) ? $element['type'] : 'document';
if (isset($element['repositoryClass'])) {
$class->setCustomRepositoryClassName($element['repositoryClass']);
}
if (isset($element['translator'])) {
$class->setTranslator($element['translator']);
}
if (isset($element['versionable']) && $element['versionable']) {
$class->setVersioned($element['versionable']);
}
if (isset($element['referenceable']) && $element['referenceable']) {
$class->setReferenceable($element['referenceable']);
}
if (isset($element['uniqueNodeType']) && $element['uniqueNodeType']) {
$class->setUniqueNodeType($element['uniqueNodeType']);
}
if (isset($element['mixins'])) {
$mixins = array();
foreach ($element['mixins'] as $mixin) {
$mixins[] = $mixin;
}
$class->setMixins($mixins);
}
if (isset($element['inheritMixins'])) {
$class->setInheritMixins($element['inheritMixins']);
}
if (isset($element['nodeType'])) {
$class->setNodeType($element['nodeType']);
}
if ($element['type'] === 'mappedSuperclass') {
$class->isMappedSuperclass = true;
}
if (isset($element['fields'])) {
foreach ($element['fields'] as $fieldName => $mapping) {
if (is_string($mapping)) {
$type = $mapping;
$mapping = array();
$mapping['type'] = $type;
}
if (!isset($mapping['fieldName'])) {
$mapping['fieldName'] = $fieldName;
}
$class->mapField($mapping);
}
}
if (isset($element['uuid'])) {
$mapping = array('fieldName' => $element['uuid'], 'uuid' => true);
$class->mapField($mapping);
}
if (isset($element['id'])) {
if (is_array($element['id'])) {
if (!isset($element['id']['fieldName'])) {
throw new MappingException("Missing fieldName property for id field");
}
$fieldName = $element['id']['fieldName'];
} else {
$fieldName = $element['id'];
}
$mapping = array('fieldName' => $fieldName, 'id' => true);
if (isset($element['id']['generator']['strategy'])) {
$mapping['strategy'] = $element['id']['generator']['strategy'];
}
$class->mapId($mapping);
}
if (isset($element['node'])) {
$class->mapNode(array('fieldName' => $element['node']));
}
if (isset($element['nodename'])) {
$class->mapNodename(array('fieldName' => $element['nodename']));
}
if (isset($element['parentdocument'])) {
$mapping = array('fieldName' => $element['parentdocument'], 'cascade' => isset($element['cascade']) ? $this->getCascadeMode($element['cascade']) : 0);
$class->mapParentDocument($mapping);
}
if (isset($element['child'])) {
foreach ($element['child'] as $fieldName => $mapping) {
if (is_string($mapping)) {
$name = $mapping;
$mapping = array();
$mapping['nodeName'] = $name;
}
if (!isset($mapping['fieldName'])) {
$mapping['fieldName'] = $fieldName;
}
$mapping['cascade'] = isset($mapping['cascade']) ? $this->getCascadeMode($mapping['cascade']) : 0;
$class->mapChild($mapping);
}
}
if (isset($element['children'])) {
foreach ($element['children'] as $fieldName => $mapping) {
// TODO should we really support this syntax?
if (is_string($mapping)) {
$filter = $mapping;
$mapping = array();
$mapping['filter'] = $filter;
}
if (!isset($mapping['fieldName'])) {
$mapping['fieldName'] = $fieldName;
}
if (!isset($mapping['filter'])) {
$mapping['filter'] = null;
} elseif (is_string($mapping['filter'])) {
$mapping['filter'] = (array) $mapping['filter'];
}
if (!isset($mapping['fetchDepth'])) {
$mapping['fetchDepth'] = -1;
}
if (!isset($mapping['ignoreUntranslated'])) {
$mapping['ignoreUntranslated'] = false;
}
$mapping['cascade'] = isset($mapping['cascade']) ? $this->getCascadeMode($mapping['cascade']) : 0;
$class->mapChildren($mapping);
}
}
if (isset($element['referenceOne'])) {
foreach ($element['referenceOne'] as $fieldName => $reference) {
$this->addMappingFromReference($class, $fieldName, $reference, 'one');
}
}
if (isset($element['referenceMany'])) {
foreach ($element['referenceMany'] as $fieldName => $reference) {
$this->addMappingFromReference($class, $fieldName, $reference, 'many');
}
}
if (isset($element['locale'])) {
$class->mapLocale(array('fieldName' => $element['locale']));
}
if (isset($element['depth'])) {
$class->mapDepth(array('fieldName' => $element['depth']));
}
if (isset($element['mixedReferrers'])) {
foreach ($element['mixedReferrers'] as $name => $attributes) {
$mapping = array('fieldName' => $name, 'referenceType' => isset($attributes['referenceType']) ? $attributes['referenceType'] : null);
$class->mapMixedReferrers($mapping);
}
}
if (isset($element['referrers'])) {
foreach ($element['referrers'] as $name => $attributes) {
if (!isset($attributes['referencedBy'])) {
throw new MappingException("{$className} is missing the referencedBy attribute for the referrer field {$name}");
}
if (!isset($attributes['referringDocument'])) {
throw new MappingException("{$className} is missing the referringDocument attribute for the referrer field {$name}");
}
$mapping = array('fieldName' => $name, 'referencedBy' => $attributes['referencedBy'], 'referringDocument' => $attributes['referringDocument'], 'cascade' => isset($attributes['cascade']) ? $this->getCascadeMode($attributes['cascade']) : 0);
$class->mapReferrers($mapping);
}
}
if (isset($element['versionName'])) {
$class->mapVersionName(array('fieldName' => $element['versionName']));
}
if (isset($element['versionCreated'])) {
$class->mapVersionCreated(array('fieldName' => $element['versionCreated']));
}
if (isset($element['lifecycleCallbacks'])) {
foreach ($element['lifecycleCallbacks'] as $type => $methods) {
foreach ($methods as $method) {
$class->addLifecycleCallback($method, constant('Doctrine\\ODM\\PHPCR\\Event::' . $type));
}
}
}
if (isset($element['child_classes'])) {
$class->setChildClasses($element['child_classes']);
}
if (isset($element['is_leaf'])) {
$class->setIsLeaf($element['is_leaf']);
}
$class->validateClassMapping();
}