vendor/symfony/src/Symfony/Bundle/DoctrineBundle/Mapping/MetadataFactory.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/symfony/src/Symfony/Bundle/DoctrineBundle/Mapping/MetadataFactory.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,178 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\DoctrineBundle\Mapping;
+
+use Symfony\Bridge\Doctrine\RegistryInterface;
+use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Doctrine\ORM\Tools\EntityRepositoryGenerator;
+use Doctrine\ORM\Mapping\ClassMetadata;
+use Doctrine\ORM\Mapping\ClassMetadataInfo;
+use Doctrine\ORM\Mapping\MappingException;
+use Doctrine\ORM\ORMException;
+
+/**
+ * This class provides methods to access Doctrine entity class metadata for a
+ * given bundle, namespace or entity class.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class MetadataFactory
+{
+    private $registry;
+
+    /**
+     * Constructor.
+     *
+     * @param RegistryInterface $registry A RegistryInterface instance
+     */
+    public function __construct(RegistryInterface $registry)
+    {
+        $this->registry = $registry;
+    }
+
+    /**
+     * Gets the metadata of all classes of a bundle.
+     *
+     * @param BundleInterface $bundle A BundleInterface instance
+     *
+     * @return ClassMetadataCollection A ClassMetadataCollection instance
+     */
+    public function getBundleMetadata(BundleInterface $bundle)
+    {
+        $namespace = $bundle->getNamespace();
+        $metadata = $this->getMetadataForNamespace($namespace);
+        if (!$metadata->getMetadata()) {
+            throw new \RuntimeException(sprintf('Bundle "%s" does not contain any mapped entities.', $bundle->getName()));
+        }
+
+        $path = $this->getBasePathForClass($bundle->getName(), $bundle->getNamespace(), $bundle->getPath());
+
+        $metadata->setPath($path);
+        $metadata->setNamespace($bundle->getNamespace());
+
+        return $metadata;
+    }
+
+    /**
+     * Gets the metadata of a class.
+     *
+     * @param string $class A class name
+     * @param string $path  The path where the class is stored (if known)
+     *
+     * @return ClassMetadataCollection A ClassMetadataCollection instance
+     */
+    public function getClassMetadata($class, $path = null)
+    {
+        $metadata = $this->getMetadataForClass($class);
+        if (!$metadata->getMetadata()) {
+            throw MappingException::classIsNotAValidEntityOrMappedSuperClass($class);
+        }
+
+        $all = $metadata->getMetadata();
+        if (class_exists($class)) {
+            $r = $all[0]->getReflectionClass();
+            $path = $this->getBasePathForClass($class, $r->getNamespacename(), dirname($r->getFilename()));
+        } elseif (!$path) {
+            throw new \RuntimeException(sprintf('Unable to determine where to save the "%s" class (use the --path option).', $class));
+        }
+
+        $metadata->setPath($path);
+        $metadata->setNamespace($r->getNamespacename());
+
+        return $metadata;
+    }
+
+    /**
+     * Gets the metadata of all classes of a namespace.
+     *
+     * @param string $namespace A namespace name
+     * @param string $path      The path where the class is stored (if known)
+     *
+     * @return ClassMetadataCollection A ClassMetadataCollection instance
+     */
+    public function getNamespaceMetadata($namespace, $path = null)
+    {
+        $metadata = $this->getMetadataForNamespace($namespace);
+        if (!$metadata->getMetadata()) {
+            throw new \RuntimeException(sprintf('Namespace "%s" does not contain any mapped entities.', $namespace));
+        }
+
+        $all = $metadata->getMetadata();
+        if (class_exists($all[0]->name)) {
+            $r = $all[0]->getReflectionClass();
+            $path = $this->getBasePathForClass($namespace, $r->getNamespacename(), dirname($r->getFilename()));
+        } elseif (!$path) {
+            throw new \RuntimeException(sprintf('Unable to determine where to save the "%s" class (use the --path option).', $all[0]->name));
+        }
+
+        $metadata->setPath($path);
+        $metadata->setNamespace($namespace);
+
+        return $metadata;
+    }
+
+    private function getBasePathForClass($name, $namespace, $path)
+    {
+        $namespace = str_replace('\\', '/', $namespace);
+        $search = str_replace('\\', '/', $path);
+        $destination = str_replace('/'.$namespace, '', $search, $c);
+
+        if ($c != 1) {
+            throw new \RuntimeException(sprintf('Can\'t find base path for "%s" (path: "%s", destination: "%s").', $name, $path, $destination));
+        }
+
+        return $destination;
+    }
+
+    private function getMetadataForNamespace($namespace)
+    {
+        $metadata = array();
+        foreach ($this->getAllMetadata() as $m) {
+            if (strpos($m->name, $namespace) === 0) {
+                $metadata[] = $m;
+            }
+        }
+
+        return new ClassMetadataCollection($metadata);
+    }
+
+    private function getMetadataForClass($entity)
+    {
+        foreach ($this->getAllMetadata() as $metadata) {
+            if ($metadata->name === $entity) {
+                return new ClassMetadataCollection(array($metadata));
+            }
+        }
+
+        return new ClassMetadataCollection(array());
+    }
+
+    private function getAllMetadata()
+    {
+        $metadata = array();
+        foreach ($this->registry->getEntityManagers() as $em) {
+            $class = $this->getClassMetadataFactoryClass();
+            $cmf = new $class();
+            $cmf->setEntityManager($em);
+            foreach ($cmf->getAllMetadata() as $m) {
+                $metadata[] = $m;
+            }
+        }
+
+        return $metadata;
+    }
+
+    protected function getClassMetadataFactoryClass()
+    {
+        return 'Doctrine\\ORM\\Mapping\\ClassMetadataFactory';
+    }
+}