Skip to content

Commit

Permalink
[MODM-112] Adding missing console commands for generating hydrator an…
Browse files Browse the repository at this point in the history
…d proxy classes.
  • Loading branch information
jwage committed Feb 11, 2011
1 parent 8bb20c1 commit 56fc267
Show file tree
Hide file tree
Showing 6 changed files with 332 additions and 3 deletions.
19 changes: 19 additions & 0 deletions lib/Doctrine/ODM/MongoDB/Hydrator/HydratorFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,25 @@ public function getHydratorFor($className)
return $this->hydrators[$className];
}

/**
* Generates hydrator classes for all given classes.
*
* @param array $classes The classes (ClassMetadata instances) for which to generate hydrators.
* @param string $toDir The target directory of the hydrator classes. If not specified, the
* directory configured on the Configuration of the DocumentManager used
* by this factory is used.
*/
public function generateHydratorClasses(array $classes, $toDir = null)
{
$hydratorDir = $toDir ?: $this->hydratorDir;
$hydratorDir = rtrim($hydratorDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
foreach ($classes as $class) {
$hydratorClassName = str_replace('\\', '', $class->name) . 'Proxy';
$hydratorFileName = $hydratorDir . $hydratorClassName . '.php';
$this->generateHydratorClass($class, $hydratorClassName, $hydratorFileName);
}
}

private function generateHydratorClass(ClassMetadata $class, $hydratorClassName, $fileName)
{
$code = '';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/

namespace Doctrine\ODM\MongoDB\Tools\Console\Command;

use Symfony\Component\Console\Input\InputArgument,
Symfony\Component\Console\Input\InputOption,
Symfony\Component\Console,
Doctrine\ODM\MongoDB\Tools\Console\MetadataFilter;

/**
* Command to (re)generate the hydrator classes used by doctrine.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.org
* @since 2.0
* @version $Revision$
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
*/
class GenerateHydratorsCommand extends Console\Command\Command
{
/**
* @see Console\Command\Command
*/
protected function configure()
{
$this
->setName('odm:generate:hydrators')
->setDescription('Generates hydrator classes for document classes.')
->setDefinition(array(
new InputOption(
'filter', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
'A string pattern used to match documents that should be processed.'
),
new InputArgument(
'dest-path', InputArgument::OPTIONAL,
'The path to generate your hydrator classes. If none is provided, it will attempt to grab from configuration.'
),
))
->setHelp(<<<EOT
Generates hydrator classes for document classes.
EOT
);
}

/**
* @see Console\Command\Command
*/
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
{
$dm = $this->getHelper('dm')->getDocumentManager();

$metadatas = $dm->getMetadataFactory()->getAllMetadata();
$metadatas = MetadataFilter::filter($metadatas, $input->getOption('filter'));

// Process destination directory
if (($destPath = $input->getArgument('dest-path')) === null) {
$destPath = $dm->getConfiguration()->getHydratorDir();
}

if ( ! is_dir($destPath)) {
mkdir($destPath, 0777, true);
}

$destPath = realpath($destPath);

if ( ! file_exists($destPath)) {
throw new \InvalidArgumentException(
sprintf("Hydrators destination directory '<info>%s</info>' does not exist.", $destPath)
);
} else if ( ! is_writable($destPath)) {
throw new \InvalidArgumentException(
sprintf("Hydrators destination directory '<info>%s</info>' does not have write permissions.", $destPath)
);
}

if (count($metadatas)) {
foreach ($metadatas as $metadata) {
$output->write(
sprintf('Processing document "<info>%s</info>"', $metadata->name) . PHP_EOL
);
}

// Generating Hydrators
$dm->getHydratorFactory()->generateHydratorClasses($metadatas, $destPath);

// Outputting information message
$output->write(PHP_EOL . sprintf('Hydrator classes generated to "<info>%s</INFO>"', $destPath) . PHP_EOL);
} else {
$output->write('No Metadata Classes to process.' . PHP_EOL);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/

namespace Doctrine\ODM\MongoDB\Tools\Console\Command;

use Symfony\Component\Console\Input\InputArgument,
Symfony\Component\Console\Input\InputOption,
Symfony\Component\Console,
Doctrine\ODM\MongoDB\Tools\Console\MetadataFilter;

/**
* Command to (re)generate the proxy classes used by doctrine.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.org
* @since 2.0
* @version $Revision$
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
*/
class GenerateProxiesCommand extends Console\Command\Command
{
/**
* @see Console\Command\Command
*/
protected function configure()
{
$this
->setName('odm:generate:proxies')
->setDescription('Generates proxy classes for document classes.')
->setDefinition(array(
new InputOption(
'filter', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
'A string pattern used to match documents that should be processed.'
),
new InputArgument(
'dest-path', InputArgument::OPTIONAL,
'The path to generate your proxy classes. If none is provided, it will attempt to grab from configuration.'
),
))
->setHelp(<<<EOT
Generates proxy classes for document classes.
EOT
);
}

/**
* @see Console\Command\Command
*/
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
{
$dm = $this->getHelper('dm')->getDocumentManager();

$metadatas = $dm->getMetadataFactory()->getAllMetadata();
$metadatas = MetadataFilter::filter($metadatas, $input->getOption('filter'));

// Process destination directory
if (($destPath = $input->getArgument('dest-path')) === null) {
$destPath = $dm->getConfiguration()->getProxyDir();
}

if ( ! is_dir($destPath)) {
mkdir($destPath, 0777, true);
}

$destPath = realpath($destPath);

if ( ! file_exists($destPath)) {
throw new \InvalidArgumentException(
sprintf("Proxies destination directory '<info>%s</info>' does not exist.", $destPath)
);
} else if ( ! is_writable($destPath)) {
throw new \InvalidArgumentException(
sprintf("Proxies destination directory '<info>%s</info>' does not have write permissions.", $destPath)
);
}

if (count($metadatas)) {
foreach ($metadatas as $metadata) {
$output->write(
sprintf('Processing document "<info>%s</info>"', $metadata->name) . PHP_EOL
);
}

// Generating Proxies
$dm->getProxyFactory()->generateProxyClasses($metadatas, $destPath);

// Outputting information message
$output->write(PHP_EOL . sprintf('Proxy classes generated to "<info>%s</INFO>"', $destPath) . PHP_EOL);
} else {
$output->write('No Metadata Classes to process.' . PHP_EOL);
}
}
}
80 changes: 80 additions & 0 deletions lib/Doctrine/ODM/MongoDB/Tools/Console/MetadataFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/

namespace Doctrine\ODM\MongoDB\Tools\Console;

/**
* Used by CLI Tools to restrict entity-based commands to given patterns.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.com
* @since 1.0
* @version $Revision$
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
*/
class MetadataFilter extends \FilterIterator implements \Countable
{
/**
* Filter Metadatas by one or more filter options.
*
* @param array $metadatas
* @param array|string $filter
* @return array
*/
static public function filter(array $metadatas, $filter)
{
$metadatas = new MetadataFilter(new \ArrayIterator($metadatas), $filter);
return iterator_to_array($metadatas);
}

private $_filter = array();

public function __construct(\ArrayIterator $metadata, $filter)
{
$this->_filter = (array)$filter;
parent::__construct($metadata);
}

public function accept()
{
if (count($this->_filter) == 0) {
return true;
}

$it = $this->getInnerIterator();
$metadata = $it->current();

foreach ($this->_filter AS $filter) {
if (strpos($metadata->name, $filter) !== false) {
return true;
}
}
return false;
}

public function count()
{
return count($this->getInnerIterator());
}
}
2 changes: 1 addition & 1 deletion tools/sandbox/cli-config.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
require_once 'config.php';

$helpers = array(
new Doctrine\ODM\MongoDB\Tools\Console\Helper\DocumentManagerHelper($dm),
'dm' => new Doctrine\ODM\MongoDB\Tools\Console\Helper\DocumentManagerHelper($dm),
);
6 changes: 4 additions & 2 deletions tools/sandbox/mongodb.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
require __DIR__ . DIRECTORY_SEPARATOR . 'cli-config.php';

$helperSet = isset($helperSet) ? $helperSet : new \Symfony\Component\Console\Helper\HelperSet();
foreach ($helpers as $helper) {
$helperSet->set($helper);
foreach ($helpers as $name => $helper) {
$helperSet->set($helper, $name);
}

$cli = new \Symfony\Component\Console\Application('Doctrine ODM MongoDB Command Line Interface', Doctrine\ODM\MongoDB\Version::VERSION);
$cli->setCatchExceptions(true);
$cli->setHelperSet($helperSet);
$cli->addCommands(array(
new \Doctrine\ODM\MongoDB\Tools\Console\Command\GenerateProxiesCommand(),
new \Doctrine\ODM\MongoDB\Tools\Console\Command\GenerateHydratorsCommand(),
new \Doctrine\ODM\MongoDB\Tools\Console\Command\Schema\CreateCommand(),
new \Doctrine\ODM\MongoDB\Tools\Console\Command\Schema\DropCommand(),
));
Expand Down

0 comments on commit 56fc267

Please sign in to comment.