public function testObjectListQuery()
 {
     $user = $this->generateNewTestUser();
     $name = $user->getUsername();
     $phid = $user->getPHID();
     $result = $this->parseObjectList("@{$name}");
     $this->assertEqual(array($phid), $result);
     $result = $this->parseObjectList("{$name}");
     $this->assertEqual(array($phid), $result);
     $result = $this->parseObjectList("{$name}, {$name}");
     $this->assertEqual(array($phid), $result);
     $result = $this->parseObjectList("@{$name}, {$name}");
     $this->assertEqual(array($phid), $result);
     $result = $this->parseObjectList('');
     $this->assertEqual(array(), $result);
     $result = $this->parseObjectList("{$name}!", array(), false, array('!'));
     $this->assertEqual(array(array('phid' => $phid, 'suffixes' => array('!' => '!'))), $result);
     $package = PhabricatorOwnersPackage::initializeNewPackage($user)->setName(pht('Query Test Package'))->save();
     $package_phid = $package->getPHID();
     $package_mono = $package->getMonogram();
     $result = $this->parseObjectList("{$package_mono} Any Ignored Text");
     $this->assertEqual(array($package_phid), $result);
     $result = $this->parseObjectList("{$package_mono} Any Text, {$name}");
     $this->assertEqual(array($package_phid, $phid), $result);
     $result = $this->parseObjectList("{$package_mono} Any Text!, {$name}", array(), false, array('!'));
     $this->assertEqual(array(array('phid' => $package_phid, 'suffixes' => array('!' => '!')), array('phid' => $phid, 'suffixes' => array())), $result);
     // Expect failure when loading a user if objects must be of type "DUCK".
     $caught = null;
     try {
         $result = $this->parseObjectList("{$name}", array('DUCK'));
     } catch (Exception $ex) {
         $caught = $ex;
     }
     $this->assertTrue($caught instanceof Exception);
     // Expect failure when loading an invalid object.
     $caught = null;
     try {
         $result = $this->parseObjectList('invalid');
     } catch (Exception $ex) {
         $caught = $ex;
     }
     $this->assertTrue($caught instanceof Exception);
     // Expect failure when loading ANY invalid object, by default.
     $caught = null;
     try {
         $result = $this->parseObjectList("{$name}, invalid");
     } catch (Exception $ex) {
         $caught = $ex;
     }
     $this->assertTrue($caught instanceof Exception);
     // With partial results, this should load the valid user.
     $result = $this->parseObjectList("{$name}, invalid", array(), true);
     $this->assertEqual(array($phid), $result);
 }
 protected function newEditableObject()
 {
     return PhabricatorOwnersPackage::initializeNewPackage($this->getViewer());
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getUser();
     $id = $request->getURIData('id');
     if ($id) {
         $package = id(new PhabricatorOwnersPackageQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW))->needOwners(true)->executeOne();
         if (!$package) {
             return new Aphront404Response();
         }
         $is_new = false;
     } else {
         $package = PhabricatorOwnersPackage::initializeNewPackage($viewer);
         $is_new = true;
     }
     $e_name = true;
     $v_name = $package->getName();
     $v_owners = mpull($package->getOwners(), 'getUserPHID');
     $v_auditing = $package->getAuditingEnabled();
     $v_description = $package->getDescription();
     $v_status = $package->getStatus();
     $errors = array();
     if ($request->isFormPost()) {
         $xactions = array();
         $v_name = $request->getStr('name');
         $v_owners = $request->getArr('owners');
         $v_auditing = $request->getStr('auditing') == 'enabled';
         $v_description = $request->getStr('description');
         $v_status = $request->getStr('status');
         $type_name = PhabricatorOwnersPackageTransaction::TYPE_NAME;
         $type_owners = PhabricatorOwnersPackageTransaction::TYPE_OWNERS;
         $type_auditing = PhabricatorOwnersPackageTransaction::TYPE_AUDITING;
         $type_description = PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION;
         $type_status = PhabricatorOwnersPackageTransaction::TYPE_STATUS;
         $xactions[] = id(new PhabricatorOwnersPackageTransaction())->setTransactionType($type_name)->setNewValue($v_name);
         $xactions[] = id(new PhabricatorOwnersPackageTransaction())->setTransactionType($type_owners)->setNewValue($v_owners);
         $xactions[] = id(new PhabricatorOwnersPackageTransaction())->setTransactionType($type_auditing)->setNewValue($v_auditing);
         $xactions[] = id(new PhabricatorOwnersPackageTransaction())->setTransactionType($type_description)->setNewValue($v_description);
         if (!$is_new) {
             $xactions[] = id(new PhabricatorOwnersPackageTransaction())->setTransactionType($type_status)->setNewValue($v_status);
         }
         $editor = id(new PhabricatorOwnersPackageTransactionEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true);
         try {
             $editor->applyTransactions($package, $xactions);
             $id = $package->getID();
             if ($is_new) {
                 $next_uri = '/owners/paths/' . $id . '/';
             } else {
                 $next_uri = '/owners/package/' . $id . '/';
             }
             return id(new AphrontRedirectResponse())->setURI($next_uri);
         } catch (AphrontDuplicateKeyQueryException $ex) {
             $e_name = pht('Duplicate');
             $errors[] = pht('Package name must be unique.');
         } catch (PhabricatorApplicationTransactionValidationException $ex) {
             $validation_exception = $ex;
             $e_name = $ex->getShortMessage($type_name);
         }
     }
     if ($is_new) {
         $cancel_uri = '/owners/';
         $title = pht('New Package');
         $button_text = pht('Continue');
     } else {
         $cancel_uri = '/owners/package/' . $package->getID() . '/';
         $title = pht('Edit Package');
         $button_text = pht('Save Package');
     }
     $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Name'))->setName('name')->setValue($v_name)->setError($e_name))->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorProjectOrUserDatasource())->setLabel(pht('Owners'))->setName('owners')->setValue($v_owners));
     if (!$is_new) {
         $form->appendChild(id(new AphrontFormSelectControl())->setLabel(pht('Status'))->setName('status')->setValue($v_status)->setOptions($package->getStatusNameMap()));
     }
     $form->appendChild(id(new AphrontFormSelectControl())->setName('auditing')->setLabel(pht('Auditing'))->setCaption(pht('With auditing enabled, all future commits that touch ' . 'this package will be reviewed to make sure an owner ' . 'of the package is involved and the commit message has ' . 'a valid revision, reviewed by, and author.'))->setOptions(array('disabled' => pht('Disabled'), 'enabled' => pht('Enabled')))->setValue($v_auditing ? 'enabled' : 'disabled'))->appendChild(id(new PhabricatorRemarkupControl())->setUser($viewer)->setLabel(pht('Description'))->setName('description')->setValue($v_description))->appendChild(id(new AphrontFormSubmitControl())->addCancelButton($cancel_uri)->setValue($button_text));
     $form_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setFormErrors($errors)->setForm($form);
     $crumbs = $this->buildApplicationCrumbs();
     if ($package->getID()) {
         $crumbs->addTextCrumb($package->getName(), $this->getApplicationURI('package/' . $package->getID() . '/'));
         $crumbs->addTextCrumb(pht('Edit'));
     } else {
         $crumbs->addTextCrumb(pht('New Package'));
     }
     return $this->buildApplicationPage(array($crumbs, $form_box), array('title' => $title));
 }