public function processRequest()
 {
     $can_edit = $this->requireApplicationCapability(NuanceSourceManageCapability::CAPABILITY);
     $request = $this->getRequest();
     $user = $request->getUser();
     $source_id = $this->getSourceID();
     $is_new = !$source_id;
     if ($is_new) {
         $source = NuanceSource::initializeNewSource($user);
     } else {
         $source = id(new NuanceSourceQuery())->setViewer($user)->withIDs(array($source_id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne();
     }
     if (!$source) {
         return new Aphront404Response();
     }
     $definition = NuanceSourceDefinition::getDefinitionForSource($source);
     $definition->setActor($user);
     $response = $definition->buildEditLayout($request);
     if ($response instanceof AphrontResponse) {
         return $response;
     }
     $layout = $response;
     $crumbs = $this->buildApplicationCrumbs();
     return $this->buildApplicationPage(array($crumbs, $layout), array('title' => $definition->getEditTitle()));
 }
 protected function newEditableObject()
 {
     $viewer = $this->getViewer();
     $definition = $this->getSourceDefinition();
     if (!$definition) {
         throw new PhutilInvalidStateException('setSourceDefinition');
     }
     return NuanceSource::initializeNewSource($viewer, $definition);
 }
 public function handleRequest(AphrontRequest $request)
 {
     $can_edit = $this->requireApplicationCapability(NuanceSourceManageCapability::CAPABILITY);
     $viewer = $this->getViewer();
     $sources_uri = $this->getApplicationURI('source/');
     $source_id = $request->getURIData('id');
     $is_new = !$source_id;
     if ($is_new) {
         $source = NuanceSource::initializeNewSource($viewer);
         $type = $request->getURIData('type');
         $map = NuanceSourceDefinition::getAllDefinitions();
         if (empty($map[$type])) {
             return new Aphront404Response();
         }
         $source->setType($type);
         $cancel_uri = $sources_uri;
     } else {
         $source = id(new NuanceSourceQuery())->setViewer($viewer)->withIDs(array($source_id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne();
         if (!$source) {
             return new Aphront404Response();
         }
         $cancel_uri = $source->getURI();
     }
     $definition = NuanceSourceDefinition::getDefinitionForSource($source);
     $definition->setActor($viewer);
     $response = $definition->buildEditLayout($request);
     if ($response instanceof AphrontResponse) {
         return $response;
     }
     $layout = $response;
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(pht('Sources'), $sources_uri);
     if ($is_new) {
         $crumbs->addTextCrumb(pht('New'));
     } else {
         $crumbs->addTextCrumb($source->getName(), $cancel_uri);
         $crumbs->addTextCrumb(pht('Edit'));
     }
     return $this->buildApplicationPage(array($crumbs, $layout), array('title' => $definition->getEditTitle()));
 }