Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15344450
D13497.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
12 KB
Referenced Files
None
Subscribers
None
D13497.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1709,6 +1709,7 @@
'PhabricatorCustomFieldAttachment' => 'infrastructure/customfield/field/PhabricatorCustomFieldAttachment.php',
'PhabricatorCustomFieldConfigOptionType' => 'infrastructure/customfield/config/PhabricatorCustomFieldConfigOptionType.php',
'PhabricatorCustomFieldDataNotAvailableException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldDataNotAvailableException.php',
+ 'PhabricatorCustomFieldHeraldField' => 'infrastructure/customfield/herald/PhabricatorCustomFieldHeraldField.php',
'PhabricatorCustomFieldImplementationIncompleteException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldImplementationIncompleteException.php',
'PhabricatorCustomFieldIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldIndexStorage.php',
'PhabricatorCustomFieldInterface' => 'infrastructure/customfield/interface/PhabricatorCustomFieldInterface.php',
@@ -5339,6 +5340,7 @@
'PhabricatorCustomFieldAttachment' => 'Phobject',
'PhabricatorCustomFieldConfigOptionType' => 'PhabricatorConfigOptionType',
'PhabricatorCustomFieldDataNotAvailableException' => 'Exception',
+ 'PhabricatorCustomFieldHeraldField' => 'HeraldField',
'PhabricatorCustomFieldImplementationIncompleteException' => 'Exception',
'PhabricatorCustomFieldIndexStorage' => 'PhabricatorLiskDAO',
'PhabricatorCustomFieldList' => 'Phobject',
diff --git a/src/applications/herald/adapter/HeraldAdapter.php b/src/applications/herald/adapter/HeraldAdapter.php
--- a/src/applications/herald/adapter/HeraldAdapter.php
+++ b/src/applications/herald/adapter/HeraldAdapter.php
@@ -1,8 +1,5 @@
<?php
-/**
- * @task customfield Custom Field Integration
- */
abstract class HeraldAdapter extends Phobject {
const FIELD_TITLE = 'title';
@@ -100,7 +97,6 @@
private $contentSource;
private $isNewObject;
private $applicationEmail;
- private $customFields = false;
private $customActions = null;
private $queuedTransactions = array();
private $emailPHIDs = array();
@@ -199,10 +195,6 @@
}
return $value;
default:
- if ($this->isHeraldCustomKey($field_name)) {
- return $this->getCustomFieldValue($field_name);
- }
-
throw new Exception(pht("Unknown field '%s'!", $field_name));
}
}
@@ -365,17 +357,7 @@
}
public function getFields() {
- $fields = array_keys($this->getFieldImplementationMap());
-
- $custom_fields = $this->getCustomFields();
- if ($custom_fields) {
- foreach ($custom_fields->getFields() as $custom_field) {
- $key = $custom_field->getFieldKey();
- $fields[] = $this->getHeraldKeyFromCustomKey($key);
- }
- }
-
- return $fields;
+ return array_keys($this->getFieldImplementationMap());
}
public function getFieldNameMap() {
@@ -417,7 +399,7 @@
self::FIELD_TASK_STATUS => pht('Task status'),
self::FIELD_PUSHER_IS_COMMITTER => pht('Pusher same as committer'),
self::FIELD_PATH => pht('Path'),
- ) + $this->getCustomFieldNameMap();
+ );
}
@@ -552,9 +534,6 @@
self::CONDITION_IS_FALSE,
);
default:
- if ($this->isHeraldCustomKey($field)) {
- return $this->getCustomFieldConditions($field);
- }
throw new Exception(
pht(
"This adapter does not define conditions for field '%s'!",
@@ -933,15 +912,6 @@
return $impl->getHeraldFieldValueType($condition);
}
- if ($this->isHeraldCustomKey($field)) {
- $value_type = $this->getCustomFieldValueTypeForFieldAndCondition(
- $field,
- $condition);
- if ($value_type !== null) {
- return $value_type;
- }
- }
-
switch ($condition) {
case self::CONDITION_CONTAINS:
case self::CONDITION_NOT_CONTAINS:
@@ -1205,9 +1175,7 @@
$field_type = $condition->getFieldName();
- $default = $this->isHeraldCustomKey($field_type)
- ? pht('(Unknown Custom Field "%s")', $field_type)
- : pht('(Unknown Field "%s")', $field_type);
+ $default = pht('(Unknown Field "%s")', $field_type);
$field_name = idx($this->getFieldNameMap(), $field_type, $default);
@@ -1226,9 +1194,7 @@
$action_type = $action->getAction();
- $default = $this->isHeraldCustomKey($action_type)
- ? pht('(Unknown Custom Action "%s") equals', $action_type)
- : pht('(Unknown Action "%s") equals', $action_type);
+ $default = pht('(Unknown Action "%s") equals', $action_type);
$action_name = idx(
$this->getActionNameMap($rule_global),
@@ -1362,186 +1328,6 @@
return $phids;
}
-/* -( Custom Field Integration )------------------------------------------- */
-
-
- /**
- * Returns the prefix used to namespace Herald fields which are based on
- * custom fields.
- *
- * @return string Key prefix.
- * @task customfield
- */
- private function getCustomKeyPrefix() {
- return 'herald.custom/';
- }
-
-
- /**
- * Determine if a field key is based on a custom field or a regular internal
- * field.
- *
- * @param string Field key.
- * @return bool True if the field key is based on a custom field.
- * @task customfield
- */
- private function isHeraldCustomKey($key) {
- $prefix = $this->getCustomKeyPrefix();
- return (strncmp($key, $prefix, strlen($prefix)) == 0);
- }
-
-
- /**
- * Convert a custom field key into a Herald field key.
- *
- * @param string Custom field key.
- * @return string Herald field key.
- * @task customfield
- */
- private function getHeraldKeyFromCustomKey($key) {
- return $this->getCustomKeyPrefix().$key;
- }
-
-
- /**
- * Get custom fields for this adapter, if appliable. This will either return
- * a field list or `null` if the adapted object does not implement custom
- * fields or the adapter does not support them.
- *
- * @return PhabricatorCustomFieldList|null List of fields, or `null`.
- * @task customfield
- */
- private function getCustomFields() {
- if ($this->customFields === false) {
- $this->customFields = null;
-
-
- $template_object = $this->newObject();
- if ($template_object instanceof PhabricatorCustomFieldInterface) {
- $object = $this->getObject();
- if (!$object) {
- $object = $template_object;
- }
-
- $fields = PhabricatorCustomField::getObjectFields(
- $object,
- PhabricatorCustomField::ROLE_HERALD);
- $fields->setViewer(PhabricatorUser::getOmnipotentUser());
- $fields->readFieldsFromStorage($object);
-
- $this->customFields = $fields;
- }
- }
-
- return $this->customFields;
- }
-
-
- /**
- * Get a custom field by Herald field key, or `null` if it does not exist
- * or custom fields are not supported.
- *
- * @param string Herald field key.
- * @return PhabricatorCustomField|null Matching field, if it exists.
- * @task customfield
- */
- private function getCustomField($herald_field_key) {
- $fields = $this->getCustomFields();
- if (!$fields) {
- return null;
- }
-
- foreach ($fields->getFields() as $custom_field) {
- $key = $custom_field->getFieldKey();
- if ($this->getHeraldKeyFromCustomKey($key) == $herald_field_key) {
- return $custom_field;
- }
- }
-
- return null;
- }
-
-
- /**
- * Get the field map for custom fields.
- *
- * @return map<string, string> Map of Herald field keys to field names.
- * @task customfield
- */
- private function getCustomFieldNameMap() {
- $fields = $this->getCustomFields();
- if (!$fields) {
- return array();
- }
-
- $map = array();
- foreach ($fields->getFields() as $field) {
- $key = $field->getFieldKey();
- $name = $field->getHeraldFieldName();
- $map[$this->getHeraldKeyFromCustomKey($key)] = $name;
- }
-
- return $map;
- }
-
-
- /**
- * Get the value for a custom field.
- *
- * @param string Herald field key.
- * @return wild Custom field value.
- * @task customfield
- */
- private function getCustomFieldValue($field_key) {
- $field = $this->getCustomField($field_key);
- if (!$field) {
- return null;
- }
-
- return $field->getHeraldFieldValue();
- }
-
-
- /**
- * Get the Herald conditions for a custom field.
- *
- * @param string Herald field key.
- * @return list<const> List of Herald conditions.
- * @task customfield
- */
- private function getCustomFieldConditions($field_key) {
- $field = $this->getCustomField($field_key);
- if (!$field) {
- return array(
- self::CONDITION_NEVER,
- );
- }
-
- return $field->getHeraldFieldConditions();
- }
-
-
- /**
- * Get the Herald value type for a custom field and condition.
- *
- * @param string Herald field key.
- * @param const Herald condition constant.
- * @return const|null Herald value type constant, or null to use the default.
- * @task customfield
- */
- private function getCustomFieldValueTypeForFieldAndCondition(
- $field_key,
- $condition) {
-
- $field = $this->getCustomField($field_key);
- if (!$field) {
- return self::VALUE_NONE;
- }
-
- return $field->getHeraldFieldValueType($condition);
- }
-
-
/* -( Applying Effects )--------------------------------------------------- */
diff --git a/src/applications/herald/field/HeraldField.php b/src/applications/herald/field/HeraldField.php
--- a/src/applications/herald/field/HeraldField.php
+++ b/src/applications/herald/field/HeraldField.php
@@ -71,19 +71,25 @@
'FIELDCONST'));
}
- if (!is_string($const) || (strlen($const) > 32)) {
+ $limit = self::getFieldConstantByteLimit();
+ if (!is_string($const) || (strlen($const) > $limit)) {
throw new Exception(
pht(
'"%s" class "%s" has an invalid "%s" property. Field constants '.
- 'must be strings and no more than 32 bytes in length.',
+ 'must be strings and no more than %s bytes in length.',
__CLASS__,
get_class($this),
- 'FIELDCONST'));
+ 'FIELDCONST',
+ new PhutilNumber($limit)));
}
return $const;
}
+ final public static function getFieldConstantByteLimit() {
+ return 64;
+ }
+
final public static function getAllFields() {
return id(new PhutilClassMapQuery())
->setAncestorClass(__CLASS__)
diff --git a/src/infrastructure/customfield/herald/PhabricatorCustomFieldHeraldField.php b/src/infrastructure/customfield/herald/PhabricatorCustomFieldHeraldField.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/customfield/herald/PhabricatorCustomFieldHeraldField.php
@@ -0,0 +1,68 @@
+<?php
+
+final class PhabricatorCustomFieldHeraldField extends HeraldField {
+
+ const FIELDCONST = 'herald.custom';
+
+ private $customField;
+
+ public function setCustomField(PhabricatorCustomField $custom_field) {
+ $this->customField = $custom_field;
+ return $this;
+ }
+
+ public function getCustomField() {
+ return $this->customField;
+ }
+
+ public function supportsObject($object) {
+ return ($object instanceof PhabricatorCustomFieldInterface);
+ }
+
+ public function getFieldsForObject($object) {
+ $field_list = PhabricatorCustomField::getObjectFields(
+ $object,
+ PhabricatorCustomField::ROLE_HERALD);
+ $field_list->setViewer(PhabricatorUser::getOmnipotentUser());
+ $field_list->readFieldsFromStorage($object);
+
+ $prefix = 'herald.custom/';
+ $limit = self::getFieldConstantByteLimit();
+
+ $map = array();
+ foreach ($field_list->getFields() as $field) {
+ $key = $field->getFieldKey();
+
+ // NOTE: This use of digestToLength() isn't preferred (you should
+ // normally digest a key unconditionally, so that it isn't possible to
+ // arrange a collision) but preserves backward compatibility.
+
+ $full_key = $prefix.$key;
+ if (strlen($full_key) > $limit) {
+ $full_key = PhabricatorHash::digestToLength($full_key, $limit);
+ }
+
+ $map[$full_key] = id(new PhabricatorCustomFieldHeraldField())
+ ->setCustomField($field);
+ }
+
+ return $map;
+ }
+
+ public function getHeraldFieldName() {
+ return $this->getCustomField()->getHeraldFieldName();
+ }
+
+ public function getHeraldFieldValue($object) {
+ return $this->getCustomField()->getHeraldFieldValue();
+ }
+
+ public function getHeraldFieldConditions() {
+ return $this->getCustomField()->getHeraldFieldConditions();
+ }
+
+ public function getHeraldFieldValueType($condition) {
+ return $this->getCustomField()->getHeraldFieldValueType($condition);
+ }
+
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Mar 11, 4:39 AM (1 w, 4 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7499340
Default Alt Text
D13497.diff (12 KB)
Attached To
Mode
D13497: Make Herald custom field integration modular
Attached
Detach File
Event Timeline
Log In to Comment