/* * Copyright © 2013. Palomino Labs (http://palominolabs.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.palominolabs.crm.sf.soap; import com.palominolabs.crm.sf.soap.jaxwsstub.partner.FieldType; import com.palominolabs.crm.sf.soap.jaxwsstub.partner.FieldTypeType; import com.palominolabs.crm.sf.soap.jaxwsstub.partner.PicklistEntryType; import com.palominolabs.crm.sf.soap.jaxwsstub.partner.SoapTypeType; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Metadata about an individual field in an SObject description. */ @Immutable public final class FieldDescription { /** * Underlying auto-generated class */ private final FieldType stubField; /** * The provided FieldType object MUST NOT BE MODIFIED after it is passed to this constructor. Using it in the * constructor must be an ownership change. * * @param stubField the FieldType from the API */ FieldDescription(FieldType stubField) { this.stubField = stubField; } /** * For variable-length fields (including binary fields), the maximum size of the field, in bytes. * * @return max size */ public int getByteLength() { return this.stubField.getByteLength(); } /** * Returns the formula specified for this field. * * @return a String or null */ @CheckForNull public String getCalculatedFormula() { return this.stubField.getCalculatedFormula(); } /** * The name of the field that controls the values of this picklist. It only applies if type is picklist or * multipicklist and dependentPicklist is true. See About Dependent Picklists. The mapping of controlling field to * dependent field is stored in the validFor attribute of each PicklistEntry for this picklist. See validFor. * * It may be null, but it's not specified when it is null. My guess is that it's null when this isn't a dependent * picklist field. * * @return controller name, or null. */ @CheckForNull public String getControllerName() { return this.stubField.getControllerName(); } /** * The default value specified for this field if the formula is not used. If no value has been specified, this field * is not returned. * * @return default value formula, or null. */ @CheckForNull public String getDefaultValueFormula() { return this.stubField.getDefaultValueFormula(); } /** * For fields of type integer. Maximum number of digits. The API returns an error if an integer value exceeds the * number of digits. * * @return max number of digits */ public int getDigits() { return this.stubField.getDigits(); } /** * The text that displays in the field-level help hover text for this field. * * Note: this property is not returned unless at least one field on the object contains a value. When at least one * field has field-level help, all fields on the object list the property with either the field-level help value or * null for fields that have blank field-level help. * * @return help text, or null */ public String getInlineHelpText() { return this.stubField.getInlineHelpText(); } /** * Text label that is displayed next to the field in the Salesforce user interface. This label can be localized. * * @return the label */ public String getLabel() { return this.stubField.getLabel(); } /** * For string fields, the maximum size of the field in Unicode characters (not bytes). * * @return max length */ public int getLength() { return this.stubField.getLength(); } /** * Field name used in API calls, such as create(), delete(), and query(). * * @return the name of the field (including __c if it is a custom field) */ public String getName() { return this.stubField.getName(); } /** * Provides the list of valid values for the picklist. Specified only if restrictedPicklist is true. * * @return list of possible picklist values. */ @Nonnull public List<PicklistEntry> getPicklistValues() { List<PicklistEntry> entries = new ArrayList<PicklistEntry>(); // the stub returns an empty list if the underlying value is null for (PicklistEntryType apiEntry : this.stubField.getPicklistValues()) { PicklistEntry entry = new PicklistEntry(apiEntry); entries.add(entry); } return Collections.unmodifiableList(entries); } /** * For fields of type double. Maximum number of digits that can be stored, including all numbers to the left and to * the right of the decimal point (but excluding the decimal point character). * * This is precision in the sense of sql numerics, not IEEE floats: if precision is 5 and scale is 2, 999.99 is * valid but 9999.0 is not. * * @return precision */ public int getPrecision() { return this.stubField.getPrecision(); } /** * For fields that refer to other objects, this array indicates the object types of the referenced objects. * * @return list of object types=. */ @SuppressWarnings("TypeMayBeWeakened") @Nonnull public List<String> getReferenceTo() { // the stub returns an empty list if the underlying value is null, so no null check return Collections.unmodifiableList(this.stubField.getReferenceTo()); } /** * The name of the relationship, if it exists. * * @return relationship name, or null */ @CheckForNull public String getRelationshipName() { return this.stubField.getRelationshipName(); } /** * This field is valid for all master-detail relationships, but the value is only non-zero for junction objects. A * junction object has two master-detail relationships, and is analogous to an association table in a many-to-many * relationship. Junction objects must define one parent object as primary (0), the other as secondary (1). The * definition of primary or secondary affects delete behavior and inheritance of look and feel, and record ownership * for junction objects. For more information, see the Salesforce online help. * * 0 or 1 are the only valid values, and 0 is always the value for objects that are not junction objects. * * Can be null. * * @return an Integer, or null. */ @CheckForNull public Integer getRelationshipOrder() { return this.stubField.getRelationshipOrder(); } /** * For fields of type double. Number of digits to the right of the decimal point. The API silently truncates any * extra digits to the right of the decimal point, but it returns a fault response if the number has too many digits * to the left of the decimal point. * * @return the scale */ public int getScale() { return this.stubField.getScale(); } /** * The returned enum is from the generated code. * * @return the soap type enum */ public SoapTypeType getSoapType() { return this.stubField.getSoapType(); } /** * The returned enum is from the generated code. * * @return the (enum) type of the field ("string", "numeric", "Id", ...) */ public FieldTypeType getType() { return this.stubField.getType(); } /** * Indicates whether this field is an autonumber field (true) or not (false). Analogous to a SQL IDENTITY type, * autonumber fields are read only, non-createable text fields with a maximum length of 30 characters. Autonumber * fields are read-only fields used to provide a unique ID that is independent of the internal object ID (such as a * purchase order number or invoice number). Autonumber fields are configured entirely in the Salesforce user * interface. The API provides access to this attribute so that client applications can determine whether a given * field is an autonumber field. * * @return true if auto-numbered */ public boolean isAutoNumber() { return this.stubField.isAutoNumber(); } /** * Indicates whether the field is a custom formula field (true) or not (false). Note that custom formula fields are * always read-only. * * @return true if calculated */ public boolean isCalculated() { return this.stubField.isCalculated(); } /** * Indicates whether the field is case sensitive (true) or not (false). * * @return true if case sensitive */ public boolean isCaseSensitive() { return this.stubField.isCaseSensitive(); } /** * Indicates whether the field can be created (true) or not (false). If true, then this field value can be set in a * create() call. * * @return true if creatable */ public boolean isCreateable() { return this.stubField.isCreateable(); } /** * Indicates whether the field is a custom field (true) or not (false). * * @return true if this is a custom field */ public boolean isCustom() { return this.stubField.isCustom(); } /** * Indicates whether this field is defaulted when created (true) or not (false). If true, then Salesforce implicitly * assigns a value for this field when the object is created, even if a value for this field is not passed in on the * create() call. For example, in the Opportunity object, the Probability field has this attribute because its value * is derived from the Stage field. Similarly, the Owner has this attribute on most objects because its value is * derived from the current user (if the Owner field is not specified). * * @return true if defaulted on create */ public boolean isDefaultedOnCreate() { return this.stubField.isDefaultedOnCreate(); } /** * Indicates whether a picklist is a dependent picklist (true) where available values depend on the chosen values * from a controlling field, or not (false). See About Dependent Picklists in the API docs. * * @return true if this is a dependent picklist. May be null. */ public Boolean isDependentPicklist() { return this.stubField.isDependentPicklist(); } /** * Reserved for future use. * * @return deprecated and hidden */ boolean isDeprecatedAndHidden() { return this.stubField.isDeprecatedAndHidden(); } /** * (Not directly documented: it's described in the CustomField documentation in the metadata api.) * * Indicates whether the field is an external ID field (true) or not (false). May be null * * @return Boolean or null */ public Boolean isExternalId() { return this.stubField.isExternalId(); } /** * Indicates whether the field is filterable (true) or not (false). If true, then this field can be specified in the * WHERE clause of a query string in a query() call. * * @return true if filterable */ public boolean isFilterable() { return this.stubField.isFilterable(); } /** * @return true if the field can be used in a GROUP BY */ public boolean isGroupable() { return stubField.isGroupable(); } /** * Indicates whether a field such as a hyperlink custom formula field has been formatted for HTML and should be * encoded for display in HTML (true) or not (false). Also indicates whether a field is a custom formula field that * has an IMAGE text function. * * @return true if html formatted. May be null. */ public Boolean isHtmlFormatted() { return this.stubField.isHtmlFormatted(); } /** * Indicates whether the field can be used to specify a record in an upsert() call (true) or not (false). * * @return true if it usable in upsert() */ public boolean isIdLookup() { return this.stubField.isIdLookup(); } /** * Indicates whether this field is a name field (true) or not (false). Used to identify the name field for standard * objects (such as AccountName for an Account object) and custom objects. Limited to one per object, except where * FirstName and LastName fields are used (such as in the Contact object). * * If a compound name is present, for example the Name field on a person account, nameField is set to true for that * record. If no compound name is present, FirstName and LastName have this field set to true. * * @return true if it is a name field */ public boolean isNameField() { return this.stubField.isNameField(); } /** * Indicates whether the field's value is the Name of the parent of this object (true) or not (false). Used for * objects whose parents may be more than one type of object, for example a task may have an account or a contact as * a parent. * * @return true if this field is the name of the parent of the obj. May be null. */ public Boolean isNamePointing() { return this.stubField.isNamePointing(); } /** * Indicates whether the field is nillable (true) or not (false). A nillable field can have empty content. A * non-nillable field must have a value in order for the object to be created or saved. * * @return true if nillable */ public boolean isNillable() { return this.stubField.isNillable(); } /** * Indicates whether the field is a restricted picklist (true) or not (false). * * @return true if it is restricted */ public boolean isRestrictedPicklist() { return this.stubField.isRestrictedPicklist(); } /** * Indicates whether a query can sort on this field (true) or not (false). May be null. * * @return true if sortable, or null. */ public Boolean isSortable() { return this.stubField.isSortable(); } /** * Indicates whether the value must be unique true) or not false). * * @return true if unique */ public boolean isUnique() { return this.stubField.isUnique(); } /** * Indicates whether the field is updateable (true) or not (false). If true, then this field value can be set in an * update() call. * * @return true if updateable */ public boolean isUpdateable() { return this.stubField.isUpdateable(); } /** * Sets the minimum sharing access level required on the master record to create, edit, or delete child records. * This field applies only to master-detail or junction object custom field types. * * true - Allows users with "Read" access to the master record permission to create, edit, or delete child records. * This setting makes sharing less restrictive. false - Allows users with "Read/Write" access to the master record * permission to create, edit, or delete child records. This setting is more restrictive than true, and is the * default value. * * For junction objects, the most restrictive access from the two parents is enforced. For example, if you set to * true on both master-detail fields, but users have "Read" access to one master record and "Read/Write" access to * the other master record, users won't be able to create, edit, or delete child records. * * May be null. * * @return a Boolean, or null. */ public Boolean isWriteRequiresMasterRead() { return this.stubField.isWriteRequiresMasterRead(); } /** * @return true if FieldPermissions can be spcified for the field. */ public boolean isPermissionable() { return stubField.isPermissionable(); } /** * Undocumented * * @return a Boolean or null */ @Nullable public Boolean isCascadeDelete() { return stubField.isCascadeDelete(); } /** * Undocumented * * @return a Boolean or null */ @Nullable public Boolean isDisplayLocationInDecimal() { return stubField.isDisplayLocationInDecimal(); } /** * Undocumented * * @return a Boolean or null */ @Nullable public Boolean isRestrictedDelete() { return stubField.isRestrictedDelete(); } }