public function loadProviders(Registry $registry)
 {
     if (file_exists($this->getPath())) {
         $providerRepository = $registry->getProviderRepository();
         foreach (new DirectoryIterator($this->getPath()) as $item) {
             if ($item->isFile() && ($suffixStart = strpos($item->getFilename(), 'Provider.php')) !== false) {
                 $className = substr($item->getFilename(), 0, $suffixStart + 8);
                 // $loadableFiles[$className] = $item->getPathname();
                 include_once $item->getPathname();
                 $providerRepository->addProvider(new $className());
             }
         }
     }
 }
Exemplo n.º 2
0
 /**
  * setRegistry()
  *
  * @param \Zend\Tool\Framework\Registry $registry
  * @return \Zend\Tool\Framework\Client\Console\ArgumentParser
  */
 public function setRegistry(Registry $registry)
 {
     // get the client registry
     $this->_registry = $registry;
     // set manifest repository, request, response for easy access
     $this->_manifestRepository = $this->_registry->getManifestRepository();
     $this->_request = $this->_registry->getRequest();
     $this->_response = $this->_registry->getResponse();
     return $this;
 }
Exemplo n.º 3
0
 /**
  * getMetadata() is required by the Manifest Interface.
  *
  * These are the following metadatas that will be setup:
  *
  * normalizedActionName
  *   - metadata for actions
  *   - value will be a dashed name for the action named in 'actionName'
  * normalizedProviderName
  *   - metadata for providers
  *   - value will be a dashed-name for the provider named in 'providerName'
  * normalizedProviderSpecialtyNames
  *   - metadata for providers
  * normalizedActionableMethodLongParameters
  *   - metadata for providers
  * normalizedActionableMethodShortParameters
  *   - metadata for providers
  *
  * @return array Array of Metadatas
  */
 public function getMetadata()
 {
     $metadatas = array();
     // setup the camelCase to dashed filter to use since cli expects dashed named
     $lowerFilter = new \Zend\Filter\FilterChain();
     $lowerFilter->attach(new \Zend\Filter\StringToLower());
     // get the registry to get the action and provider repository
     $actionRepository = $this->_registry->getActionRepository();
     $providerRepository = $this->_registry->getProviderRepository();
     // loop through all actions and create a metadata for each
     foreach ($actionRepository->getActions() as $action) {
         // each action metadata will be called
         $metadatas[] = new Metadata\Tool(array('name' => 'normalizedActionName', 'value' => $lowerFilter->filter($action->getName()), 'reference' => $action, 'actionName' => $action->getName(), 'clientName' => 'all'));
     }
     foreach ($providerRepository->getProviderSignatures() as $providerSignature) {
         // create the metadata for the provider's cliProviderName
         $metadatas[] = new Metadata\Tool(array('name' => 'normalizedProviderName', 'value' => $lowerFilter->filter($providerSignature->getName()), 'reference' => $providerSignature, 'clientName' => 'all', 'providerName' => $providerSignature->getName()));
         // create the metadatas for the per provider specialites in providerSpecaltyNames
         foreach ($providerSignature->getSpecialties() as $specialty) {
             if ($specialty == '_Global') {
                 continue;
             }
             $metadatas[] = new Metadata\Tool(array('name' => 'normalizedSpecialtyName', 'value' => $lowerFilter->filter($specialty), 'reference' => $providerSignature, 'clientName' => 'all', 'providerName' => $providerSignature->getName(), 'specialtyName' => $specialty));
         }
         // $actionableMethod is keyed by the methodName (but not used)
         foreach ($providerSignature->getActionableMethods() as $actionableMethodData) {
             $methodLongParams = array();
             $methodShortParams = array();
             // $actionableMethodData get both the long and short names
             foreach ($actionableMethodData['parameterInfo'] as $parameterInfoData) {
                 // filter to dashed
                 $methodLongParams[$parameterInfoData['name']] = $lowerFilter->filter($parameterInfoData['name']);
                 // simply lower the character, (its only 1 char after all)
                 $methodShortParams[$parameterInfoData['name']] = strtolower($parameterInfoData['name'][0]);
             }
             // create metadata for the long name cliActionableMethodLongParameters
             $metadatas[] = new Metadata\Tool(array('name' => 'normalizedActionableMethodLongParams', 'value' => $methodLongParams, 'clientName' => 'console', 'providerName' => $providerSignature->getName(), 'specialtyName' => $actionableMethodData['specialty'], 'actionName' => $actionableMethodData['actionName'], 'reference' => &$actionableMethodData));
             // create metadata for the short name cliActionableMethodShortParameters
             $metadatas[] = new Metadata\Tool(array('name' => 'normalizedActionableMethodShortParams', 'value' => $methodShortParams, 'clientName' => 'console', 'providerName' => $providerSignature->getName(), 'specialtyName' => $actionableMethodData['specialty'], 'actionName' => $actionableMethodData['actionName'], 'reference' => &$actionableMethodData));
         }
     }
     return $metadatas;
 }
Exemplo n.º 4
0
 protected function _handleDispatch()
 {
     // get the provider repository
     $providerRepository = $this->_registry->getProviderRepository();
     $request = $this->_registry->getRequest();
     // get the dispatchable provider signature
     $providerSignature = $providerRepository->getProviderSignature($request->getProviderName());
     // get the actual provider
     $provider = $providerSignature->getProvider();
     // ensure that we can pretend if this is a pretend request
     if ($request->isPretend() && !$provider instanceof \Zend\Tool\Framework\Provider\Pretendable) {
         throw new Exception('Dispatcher error - provider does not support pretend');
     }
     // get the action name
     $actionName = $this->_registry->getRequest()->getActionName();
     $specialtyName = $this->_registry->getRequest()->getSpecialtyName();
     if (!($actionableMethod = $providerSignature->getActionableMethodByActionName($actionName, $specialtyName))) {
         throw new Exception('Dispatcher error - actionable method not found');
     }
     // get the actual method and param information
     $methodName = $actionableMethod['methodName'];
     $methodParameters = $actionableMethod['parameterInfo'];
     // get the provider params
     $requestParameters = $this->_registry->getRequest()->getProviderParameters();
     // @todo This seems hackish, determine if there is a better way
     $callParameters = array();
     foreach ($methodParameters as $methodParameterName => $methodParameterValue) {
         if (!array_key_exists($methodParameterName, $requestParameters) && $methodParameterValue['optional'] == false) {
             if ($this instanceof Interactive\InteractiveInput) {
                 $promptSting = $this->getMissingParameterPromptString($provider, $actionableMethod['action'], $methodParameterValue['name']);
                 $parameterPromptValue = $this->promptInteractiveInput($promptSting)->getContent();
                 if ($parameterPromptValue == null) {
                     throw new Exception('Value supplied for required parameter "' . $methodParameterValue['name'] . '" is empty');
                 }
                 $callParameters[] = $parameterPromptValue;
             } else {
                 throw new Exception('A required parameter "' . $methodParameterValue['name'] . '" was not supplied.');
             }
         } else {
             $callParameters[] = array_key_exists($methodParameterName, $requestParameters) ? $requestParameters[$methodParameterName] : $methodParameterValue['default'];
         }
     }
     $this->_handleDispatchExecution($provider, $methodName, $callParameters);
 }
Exemplo n.º 5
0
    /**
     * _processActionableMethods() - process all methods that can be called on this provider.
     *
     */
    protected function _processActionableMethods()
    {

        $specialtyRegex = '#(.*)(' . implode('|', $this->_specialties) . ')$#i';


        $methods = $this->_providerReflection->getMethods();

        $actionableMethods = array();
        foreach ($methods as $method) {

            $methodName = $method->getName();

            /**
             * the following will determine what methods are actually actionable
             * public, non-static, non-underscore prefixed, classes that dont
             * contain the name "
             */
            if (!$method->getDeclaringClass()->isInstantiable()
                || !$method->isPublic()
                || $methodName[0] == '_'
                || $method->isStatic()
                || in_array($methodName, array('getContextClasses', 'getName')) // other protected public methods will nee to go here
                ) {
                continue;
            }

            /**
             * check to see if the method was a required method by a Zend_Tool_* interface
             */
            foreach ($method->getDeclaringClass()->getInterfaces() as $methodDeclaringClassInterface) {
                if (strpos($methodDeclaringClassInterface->getName(), 'Zend_Tool_') === 0
                    && $methodDeclaringClassInterface->hasMethod($methodName)) {
                    continue 2;
                }
            }

            $actionableName = ucfirst($methodName);

            if (substr($actionableName, -6) == 'Action') {
                $actionableName = substr($actionableName, 0, -6);
            }

            $actionableMethods[$methodName]['methodName'] = $methodName;

            $matches = null;
            if (preg_match($specialtyRegex, $actionableName, $matches)) {
                $actionableMethods[$methodName]['actionName'] = $matches[1];
                $actionableMethods[$methodName]['specialty'] = $matches[2];
            } else {
                $actionableMethods[$methodName]['actionName'] = $actionableName;
                $actionableMethods[$methodName]['specialty'] = '_Global';
            }

            // get the action, and create non-existent actions when they dont exist (the true part below)
            $action = $this->_registry->getActionRepository()->getAction($actionableMethods[$methodName]['actionName']);
            if ($action == null) {
                $action = new \Zend\Tool\Framework\Action\Base($actionableMethods[$methodName]['actionName']);
                $this->_registry->getActionRepository()->addAction($action);
            }
            $actionableMethods[$methodName]['action'] = $action;

            if (!in_array($actionableMethods[$methodName]['action'], $this->_actions)) {
                $this->_actions[] = $actionableMethods[$methodName]['action'];
            }

            $parameterInfo = array();
            $position = 1;
            foreach ($method->getParameters() as $parameter) {
                $currentParam = $parameter->getName();
                $parameterInfo[$currentParam]['position']    = $position++;
                $parameterInfo[$currentParam]['optional']    = $parameter->isOptional();
                $parameterInfo[$currentParam]['default']     = ($parameter->isOptional()) ? $parameter->getDefaultValue() : null;
                $parameterInfo[$currentParam]['name']        = $currentParam;
                $parameterInfo[$currentParam]['type']        = 'string';
                $parameterInfo[$currentParam]['description'] = null;
            }

            $matches = null;
            if (($docComment = $method->getDocComment()) != '' &&
                (preg_match_all('/@param\s+(\w+)+\s+(\$\S+)\s+(.*?)(?=(?:\*\s*@)|(?:\*\/))/s', $docComment, $matches)))
            {
                for ($i=0; $i <= count($matches[0])-1; $i++) {
                    $currentParam = ltrim($matches[2][$i], '$');

                    if ($currentParam != '' && isset($parameterInfo[$currentParam])) {

                        $parameterInfo[$currentParam]['type'] = $matches[1][$i];

                        $descriptionSource = $matches[3][$i];

                        if ($descriptionSource != '') {
                            $parameterInfo[$currentParam]['description'] = trim($descriptionSource);
                        }

                    }

                }

            }

            $actionableMethods[$methodName]['parameterInfo'] = $parameterInfo;

        }

        $this->_actionableMethods = $actionableMethods;
    }
Exemplo n.º 6
0
 /**
  * _respondWithSystemInformation()
  *
  * @param string $providerNameFilter
  * @param string $actionNameFilter
  * @param bool $includeAllSpecialties
  * @return \Zend\Tool\Framework\Client\Console\HelpSystem
  */
 protected function _respondWithSystemInformation($providerNameFilter = null, $actionNameFilter = null, $includeAllSpecialties = false)
 {
     $manifest = $this->_registry->getManifestRepository();
     $providerMetadatasSearch = array('type' => 'Tool', 'name' => 'providerName', 'clientName' => 'console');
     if (is_string($providerNameFilter)) {
         $providerMetadatasSearch = array_merge($providerMetadatasSearch, array('providerName' => $providerNameFilter));
     }
     $actionMetadatasSearch = array('type' => 'Tool', 'name' => 'actionName', 'clientName' => 'console');
     if (is_string($actionNameFilter)) {
         $actionMetadatasSearch = array_merge($actionMetadatasSearch, array('actionName' => $actionNameFilter));
     }
     // get the metadata's for the things to display
     $displayProviderMetadatas = $manifest->getMetadatas($providerMetadatasSearch);
     $displayActionMetadatas = $manifest->getMetadatas($actionMetadatasSearch);
     // create index of actionNames
     for ($i = 0; $i < count($displayActionMetadatas); $i++) {
         $displayActionNames[] = $displayActionMetadatas[$i]->getActionName();
     }
     foreach ($displayProviderMetadatas as $providerMetadata) {
         $providerNameDisplayed = false;
         $providerName = $providerMetadata->getProviderName();
         $providerSignature = $providerMetadata->getReference();
         foreach ($providerSignature->getActions() as $actionInfo) {
             $actionName = $actionInfo->getName();
             // check to see if this action name is valid
             if (($foundActionIndex = array_search($actionName, $displayActionNames)) === false) {
                 continue;
             } else {
                 $actionMetadata = $displayActionMetadatas[$foundActionIndex];
             }
             $specialtyMetadata = $manifest->getMetadata(array('type' => 'Tool', 'name' => 'specialtyName', 'providerName' => $providerName, 'specialtyName' => '_Global', 'clientName' => 'console'));
             // lets do the main _Global action first
             $actionableGlobalLongParamMetadata = $manifest->getMetadata(array('type' => 'Tool', 'name' => 'actionableMethodLongParams', 'providerName' => $providerName, 'specialtyName' => '_Global', 'actionName' => $actionName, 'clientName' => 'console'));
             $actionableGlobalMetadatas = $manifest->getMetadatas(array('type' => 'Tool', 'name' => 'actionableMethodLongParams', 'providerName' => $providerName, 'actionName' => $actionName, 'clientName' => 'console'));
             if ($actionableGlobalLongParamMetadata) {
                 if (!$providerNameDisplayed) {
                     $this->_respondWithProviderName($providerMetadata);
                     $providerNameDisplayed = true;
                 }
                 $this->_respondWithCommand($providerMetadata, $actionMetadata, $specialtyMetadata, $actionableGlobalLongParamMetadata);
                 $actionIsGlobal = true;
             } else {
                 $actionIsGlobal = false;
             }
             // check for providers without a _Global action
             $isSingleSpecialProviderAction = false;
             if (!$actionIsGlobal && count($actionableGlobalMetadatas) == 1) {
                 $isSingleSpecialProviderAction = true;
                 $this->_respondWithProviderName($providerMetadata);
                 $providerNameDisplayed = true;
             }
             if ($includeAllSpecialties || $isSingleSpecialProviderAction) {
                 foreach ($providerSignature->getSpecialties() as $specialtyName) {
                     if ($specialtyName == '_Global') {
                         continue;
                     }
                     $specialtyMetadata = $manifest->getMetadata(array('type' => 'Tool', 'name' => 'specialtyName', 'providerName' => $providerMetadata->getProviderName(), 'specialtyName' => $specialtyName, 'clientName' => 'console'));
                     $actionableSpecialtyLongMetadata = $manifest->getMetadata(array('type' => 'Tool', 'name' => 'actionableMethodLongParams', 'providerName' => $providerMetadata->getProviderName(), 'specialtyName' => $specialtyName, 'actionName' => $actionName, 'clientName' => 'console'));
                     if ($actionableSpecialtyLongMetadata) {
                         $this->_respondWithCommand($providerMetadata, $actionMetadata, $specialtyMetadata, $actionableSpecialtyLongMetadata);
                     }
                 }
             }
             // reset the special flag for single provider action with specialty
             $isSingleSpecialProviderAction = false;
             if (!$includeAllSpecialties && count($actionableGlobalMetadatas) > 1) {
                 $this->_response->appendContent('    Note: There are specialties, use ', array('color' => 'yellow', 'separator' => false));
                 $this->_response->appendContent('zf ' . $actionMetadata->getValue() . ' ' . $providerMetadata->getValue() . '.?', array('color' => 'cyan', 'separator' => false));
                 $this->_response->appendContent(' to get specific help on them.', array('color' => 'yellow'));
             }
         }
         if ($providerNameDisplayed) {
             $this->_response->appendContent(null, array('separator' => true));
         }
     }
     return $this;
 }