/**
  * {@inheritDoc}
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $modelClass = Validators::validateClass($input->getArgument('model'));
     $modelClassBasename = current(array_slice(explode('\\', $modelClass), -1));
     $bundle = $this->getBundle($input->getOption('bundle') ?: $this->getBundleNameFromClass($modelClass));
     $adminClassBasename = $input->getOption('admin') ?: $modelClassBasename . 'Admin';
     $adminClassBasename = Validators::validateAdminClassBasename($adminClassBasename);
     $managerType = $input->getOption('manager') ?: $this->getDefaultManagerType();
     $modelManager = $this->getModelManager($managerType);
     $skeletonDirectory = __DIR__ . '/../Resources/skeleton';
     $adminGenerator = new AdminGenerator($modelManager, $skeletonDirectory);
     try {
         $adminGenerator->generate($bundle, $adminClassBasename, $modelClass);
         $output->writeln(sprintf('%sThe admin class "<info>%s</info>" has been generated under the file "<info>%s</info>".', PHP_EOL, $adminGenerator->getClass(), realpath($adminGenerator->getFile())));
     } catch (\Exception $e) {
         $this->writeError($output, $e->getMessage());
     }
     if ($controllerClassBasename = $input->getOption('controller')) {
         $controllerClassBasename = Validators::validateControllerClassBasename($controllerClassBasename);
         $controllerGenerator = new ControllerGenerator($skeletonDirectory);
         try {
             $controllerGenerator->generate($bundle, $controllerClassBasename);
             $output->writeln(sprintf('%sThe controller class "<info>%s</info>" has been generated under the file "<info>%s</info>".', PHP_EOL, $controllerGenerator->getClass(), realpath($controllerGenerator->getFile())));
         } catch (\Exception $e) {
             $this->writeError($output, $e->getMessage());
         }
     }
     if ($servicesFile = $input->getOption('services')) {
         $adminClass = $adminGenerator->getClass();
         $file = sprintf('%s/Resources/config/%s', $bundle->getPath(), $servicesFile);
         $servicesManipulator = new ServicesManipulator($file);
         $controllerName = $controllerClassBasename ? sprintf('%s:%s', $bundle->getName(), substr($controllerClassBasename, 0, -10)) : 'SonataAdminBundle:CRUD';
         try {
             $id = $input->getOption('id') ?: $this->getAdminServiceId($bundle->getName(), $adminClassBasename);
             $servicesManipulator->addResource($id, $modelClass, $adminClass, $controllerName, $managerType);
             $output->writeln(sprintf('%sThe service "<info>%s</info>" has been appended to the file <info>"%s</info>".', PHP_EOL, $id, realpath($file)));
         } catch (\Exception $e) {
             $this->writeError($output, $e->getMessage());
         }
     }
     return 0;
 }
 public function testAddResourceWithEmptyServices()
 {
     file_put_contents($this->file, 'services:');
     $this->servicesManipulator->addResource('service_id', 'class', 'admin_class', 'controller_name', 'manager_type');
     $this->assertSame("services:\n    service_id:\n        class: admin_class\n        arguments: [~, class, controller_name]\n        tags:\n            - { name: sonata.admin, manager_type: manager_type, group: admin, label: class }\n", file_get_contents($this->file));
 }