com.ibm.etools.iseries.core.util
Class ISeriesDataElementUtil
java.lang.Object
com.ibm.etools.iseries.core.dstore.common.ISeriesDataElementHelpers
com.ibm.etools.iseries.core.util.ISeriesDataElementUtil
- All Implemented Interfaces:
- IISeriesDataElementDescriptorTypes, ISeriesDataStoreConstants
- public final class ISeriesDataElementUtil
- extends ISeriesDataElementHelpers
- implements IISeriesDataElementDescriptorTypes
This class is a utility class that can be used to
obtain the context of a DataElement, e.g. what subsystem it belongs to,
the system that subsystem belongs to, the connection name, etc.
Base function which does not rely on client-side code should be put in
the ISeriesDataElementHelpers class.
Fields inherited from interface com.ibm.etools.iseries.core.descriptors.IISeriesDataElementDescriptorTypes |
Copyright, DSPF_FILE_TYPE, DTA_FILE_TYPE, FILE_TYPE, LF_FILE_TYPE, LIB_TYPE, MBR_TYPE, MESSAGE_DESCRIPTION_TYPE, MODULE_TYPE, MSG_FILE_TYPE, OBJ_TYPE, PGM_MODULE_TYPE, PGM_TYPE, PROCEDURE_TYPE, QRYDFN_TYPE, SAVF_FILE_TYPE, SRC_FILE_TYPE, SRC_MBR_TYPE, SRVPGM_TYPE, UNKNOWN_TYPE |
Fields inherited from interface com.ibm.etools.iseries.core.dstore.common.ISeriesDataStoreConstants |
ABSTRACT_FILTER_DESCRIPTOR, ABSTRACT_NATIVE_FSO_DESCRIPTOR, API_ERROR, API_ERROR_DESCRIPTOR, API_OK, API_PTF_MISSING, API_RESULT_DESCRIPTOR, API_RETURN_CODE, AUTHORITY_LIST_NODE, AUTHORITY_NODE, BATCHCOMMAND_DESCRIPTOR, C_GET_EDIT_CCSID, C_LDA_READ, C_LDA_WRITE, C_USER_PREFERENCES_DIRECTORY, CCSID_DESCRIPTOR, CDRA_INFO, CHECK_AUTHORITY_COMMAND, CLEAR_LOCAL_CACHE, CMD_DEBUG_RELEASE_APPLICATION, CMD_DEBUG_SPAWN_AND_HOLD, CMD_GET_DEBUG_ROUTER_PORT, CMD_IJOB_ASSOCIATE, CMD_IJOB_RELEASE, CMD_IJOB_RUNPGM, CMD_MULTI_SPAWNFAIL, CMD_MULTI_SPAWNSUCC, CMD_RUNBATCHCOMMAND, CMD_RUNBATCHCOMMAND_NOHELP, CMD_RUNCOMMAND, CMD_RUNCOMMAND_MULTITHREADED, CMD_RUNCOMMAND_MULTITHREADED_NOHELP, CMD_RUNCOMMAND_NOHELP, COMM_SERVER_INFORMATION, COMMAND_DESCRIPTOR, COMMAND_FILTER_DESCRIPTOR, COMMAND_MINER, COMMAND_MINER_ROOT_ELEMENT, COMMAND_QUERY_DB_FIELDS, COMMAND_QUERY_DB_KEYS, COMMAND_QUERY_DSPF_ALL, COMMAND_QUERY_MODULE_LIST, COMMAND_QUERY_PROCEDURE_LIST, CREATE_EDIT_MASK, CURRENT_WORKING_DIR, CURRENT_WORKING_DIR_DESCRIPTOR, DBFIELD_ALIAS, DBFIELD_ALLOC_LENGTH, DBFIELD_ALWNUL, DBFIELD_CCSID_SPECIFIED, DBFIELD_COLHEAD1, DBFIELD_COLHEAD2, DBFIELD_COLHEAD3, DBFIELD_DATA_CCSID, DBFIELD_DATTIMFMT, DBFIELD_DATTIMSEP, DBFIELD_DBCS_ALTTYPE, DBFIELD_DBCS_COLHEAD, DBFIELD_DBCS_TEXTDESC, DBFIELD_DBCS_VALCHECK, DBFIELD_DECPOS, DBFIELD_DESCRIPTION, DBFIELD_DIGITS, DBFIELD_DISPLAY_LEN_FLAG, DBFIELD_DISPLAY_LENGTH, DBFIELD_DTFLAGS, DBFIELD_EDITCODE, DBFIELD_EDITCODE_SYMBOL, DBFIELD_EDITWORD, DBFIELD_ENCODING_SCHEME, DBFIELD_GENERIC_KEY_COUNT, DBFIELD_INBUF, DBFIELD_INTNAME, DBFIELD_KEYFIELD_ATTRS, DBFIELD_LENGTH, DBFIELD_MAXKEYLEN, DBFIELD_MIN_DISPLAY_LEN_FLAG, DBFIELD_NUMDBCS, DBFIELD_OPERATOR, DBFIELD_OUTBUF, DBFIELD_REF_FIELD, DBFIELD_REFSHIFT, DBFIELD_SST_END, DBFIELD_SST_START, DBFIELD_TYPE, DBFIELD_UCS2_CONVERT_FLAG, DBFIELD_USAGE, DBFIELD_VARLENGTH, DEBUG_HELD_JOB_DESCRIPTOR, DOWNLOAD_RESULT_AS400_SECURITY_EXCEPTION, DSPFFD_INBUF, DSPFFD_OUTBUF, EDCODE_CURSYM, EDCODE_DATESEP, EDCODE_DECSEP, EDCODE_JOBDESC, EDCODE_JOBDESCLIB, EDCODE_SYSDATE, EDCODE_TIMESEP, EDCODE_USERID, EDIT_CODE_DESCRIPTOR, EDIT_CODE_INFORMATION, EDIT_CODE_QUERY, EDIT_DESCRIPTION, EDIT_MASK_DESCRIPTOR, EDIT_MASK_INFO, EDTD_DECCHAR, EDTD_FILLCHAR, EDTD_FLOATSTR, EDTD_FRACTION_MASK, EDTD_INTMASK, EDTD_LEFTCHAR, EDTD_NEGCHAR, EDTD_POSCHAR, EDTD_RIGHTCHAR, EDTD_ZEROVAL, EDTM_RECLEN, ENVVAR_DESCRIPTOR, ENVVAR_INFO, ERROR_DESCRIPTOR, EVENTSFILE_DESCRIPTOR, FIELD_DESCRIPTOR, FIELD_LIST_NODE, FIELD_PROPERTIES_NODE, FILE_ACCPATHTYPE, FILE_ALTSEQ, FILE_BASEDONCOUNT, FILE_BASEDONFILES, FILE_DESCRIPTOR, FILE_DYNSEL, FILE_IGCFIELD, FILE_IGCLITERAL, FILE_JFILE, FILE_KEYACCESS, FILE_LANGID, FILE_OVERRIDE_INFO, FILE_OVERRIDE_SOURCE_DESCRIPTOR, FILE_OVERRIDE_TARGET_DESCRIPTOR, FILE_PROPERTIES_NODE, FILE_SELECTOMITLF, FILE_SRCFILE, IFS_FILE_FILTER_OBJECT, IFS_FILESYSTEM_MINER, IFS_FILTER_DESCRIPTOR, IFS_FOLDER_FILTER_OBJECT, IJOB_DATAQ_DESCRIPTOR, ISERIES_PROGRAM_DESCRIPTOR, JOB_DESCRIPTOR, JOB_FILTER_DESCRIPTOR, JOB_MINER, JOB_MINER_LOG_ELEMENT, JOB_MINER_ROOT_ELEMENT, JOB_PROPERTY_DESCRIPTOR, JOB_PROPERTY1_ELEMENT, JOB_PROPERTY2_ELEMENT, JOB_PROPERTY3_ELEMENT, JOB_PROPERTYINT_ELEMENT, JOBCMD_CHGJOB, JOBCMD_DSPJOBLOG, JOBCMD_ENDJOB, JOBCMD_ENDJOB_IMMED, JOBCMD_HOLDJOB, JOBCMD_QRYJOB_ALL_PROPERTIES, JOBCMD_QRYJOB_PROPERTY, JOBCMD_QRYJOB_PROPERTYP2, JOBCMD_QRYJOB_PROPERTYP3, JOBCMD_QRYJOB_PROPERTYPINT, JOBCMD_RELEASEJOB, JOBFILTERCMD_QUERY, JOBNAME_DESCRIPTOR, JOBPROP_ACCTCODE, JOBPROP_ACTIVESTATUS, JOBPROP_AUXIO, JOBPROP_BREAKMSGHDL, JOBPROP_CCSID, JOBPROP_CNTRYID, JOBPROP_CTLDENDREQ, JOBPROP_CURRSYSPOOL, JOBPROP_CURRUSER, JOBPROP_DATE_ENTERED, JOBPROP_DATE_STARTED, JOBPROP_DATEFMT, JOBPROP_DATESEP, JOBPROP_DBCSCAP, JOBPROP_DECFMT, JOBPROP_DESCRIPTION, JOBPROP_DEVRCYACT, JOBPROP_DFTCCSID, JOBPROP_ENDSEV, JOBPROP_INQMSGRPLY, JOBPROP_ITRANS, JOBPROP_KEEPDDMACT, JOBPROP_LANGID, JOBPROP_LOGCLP, JOBPROP_LOGLVL, JOBPROP_LOGSEV, JOBPROP_LOGTXT, JOBPROP_MAXCPU, JOBPROP_MAXTMPSTOR, JOBPROP_MSGQACT, JOBPROP_MSGQMAX, JOBPROP_OUTQ, JOBPROP_OUTQ_PTY, JOBPROP_PGMRC, JOBPROP_PRODRC, JOBPROP_PRTDEV, JOBPROP_PRTKEYFMT, JOBPROP_PRTTXT, JOBPROP_PURGE, JOBPROP_ROUTING, JOBPROP_RUNPTY, JOBPROP_SORTTAB, JOBPROP_SPECENV, JOBPROP_STATUSMSGHDL, JOBPROP_SUBMITNAME, JOBPROP_SUBMITNUMBER, JOBPROP_SUBMITUSER, JOBPROP_SUBSYSTEM, JOBPROP_SUBTYPE, JOBPROP_SWITCHES, JOBPROP_SYSPOOL, JOBPROP_THREADS, JOBPROP_TIMESEP, JOBPROP_TIMESLICE, JOBPROP_TIMESLICEPOOL, JOBPROP_TOTRESPTIME, JOBPROP_TYPE, JOBPROP_USEDCPU, JOBPROP_USEDTMPSTOR, JOBPROP_USERRC, JOBPROP_WAITTIME, KEYFIELD_LIST_NODE, KEYWORD_DESCRIPTOR, LDA_READ_EXCEPTION_DESCRIPTOR, LDA_READ_LIBRARY_NAME_DESCRIPTOR, LDA_READ_MEMBER_NAME_DESCRIPTOR, LDA_READ_NO_OUTPUT_DESCRIPTOR, LDA_WRITE_CCSID_DESCRIPTOR, LDA_WRITE_EXCEPTION_DESCRIPTOR, LDA_WRITE_LENGTH_DESCRIPTOR, LIB_FILTER_DESCRIPTOR, LIB_FILTER_STR_DESCRIPTOR, LIBRARY_DESCRIPTOR, LIBRARY_PROPERTIES_NODE, LIST_OBJ_LOCKS_COMMAND, MBR_FILTER_DESCRIPTOR, MBR_FILTER_STR_DESCRIPTOR, MEMBER_CHANGE_TIMESTAMP, MEMBER_CREATION_TIMESTAMP, MEMBER_DESCRIPTOR, MEMBER_NUMBER_OF_DELETED, MEMBER_NUMBER_OF_RECORDS, MEMBER_PROPERTIES_NODE, MEMBER_RESTOTE_TIMESTAMP, MEMBER_SAVE_TIMESTAMP, MESSAGE_DESCRIPTOR, MESSAGE_FILE_DESCRIPTOR, MESSAGED_DESCRIPTOR, MINER_VERSION, MODULE_DESCRIPTOR, MODULE_INTERNAL_DESCRIPTOR, MODULE_LANGID, MODULE_LIST_NODE, MODULE_PROPERTIES_NODE, MSGD_STRUCTURE_NODE, NATIVE_FILESYSTEM_MINER, NETINT_DESCRIPTOR, NETINT_LIST_NODE, NETINT_QUERY, NETWORK_ERROR_DESCRIPTOR, OBJ_FILTER_DESCRIPTOR, OBJ_FILTER_STR_DESCRIPTOR, OBJECT_DESCRIPTOR, OBJECT_PROPERTIES_NODE, PGM_DEBUGGABLE, PGM_OPM, PROCEDURE_DESCRIPTOR, PROCEDURE_LIST_NODE, PROGRAM_DESCRIPTOR, PROPERTY_DESCRIPTOR, QSYS_DESCRIPTOR, QUERY_CURRENT_WORKING_DIR, QUERY_DEVICE_RECORDS, QUERY_ENCODING_SCHEME, QUERY_ENV_VAR, QUERY_FIELD_LIST, QUERY_FILE_PROPERTIES, QUERY_MEMBER_PROPERTIES, QUERY_MESSAGE_DESCRIPTORS_COMMAND, QUERY_RECORD_LIST, QUERY_RECORD_PROPERTIES, RECORD_BUFFER_SIZE, RECORD_CCSID, RECORD_DESC, RECORD_DESCRIPTOR, RECORD_DEVICE_PROPERTIES, RECORD_FLDCNT, RECORD_HAS_SEP_IND_AREA, RECORD_HAS_START_LINE_NUM, RECORD_ISDBCS, RECORD_LEVELID, RECORD_LIST_NODE, RECORD_LOWEST_RESP_IND, RECORD_PROPERTIES_NODE, RECORD_RECLEN, RECORD_STANDARD_PROPERTIES, RECORD_TYPE, RELATIVE_FILTER_DESCRIPTOR, RESULT_MESSAGES_ELEMENT, RETRIEVE_FILE_OVERRIDE_COMMAND, SERVICE_PROGRAM_DESCRIPTOR, SORT_SEQ_TABLE, SORT_SEQ_TABLE_INFO, SPECIAL_FILTER_DESCRIPTOR, SQL_COLERROR, SQL_COLFIRSTBYTE, SQL_COLLASTBYTE, SQL_DESCRIPTOR, SQL_MSGFILE, SQL_MSGID, SQL_MSGLIB, SQL_MSGREPLACELEN, SQL_MSGREPLACETEXT, SQL_NUMSTMT, SQL_RECERORR, SQL_RECFIRSTBYTE, SQL_RECLASTBYTE, SQL_RETINFOLEN, SQL_STATE, SQL_SYNTAX_CHECK, SQL_SYNTAX_CHECK_INFO, SST_BYTESAVAIL, SST_BYTESRETURN, SST_COUNTRYID, SST_JOBCCSID, SST_LANGID, SST_QUERY, SST_SSTLIB, SST_SSTNAME, SST_SUBSITUTION, SST_TABLE, SST_TABLECCSID, SST_TABLELIB, SST_TABLENAME, SST_WEIGHT, STRUCTURE_NODE_DESCRIPTOR, SYSTEM_INFORMATION, SYSTEM_PROPERTY_DESCRIPTOR, SYSTEM_QIGC, SYSTEM_VRM, TABLE_DESCRIPTOR |
Method Summary |
static void |
dumpDataStore(com.ibm.etools.systems.dstore.core.model.DataElement element,
String fileName)
This method is to assist in debugging during development. |
static void |
dumpToLog(String message,
com.ibm.etools.systems.dstore.core.model.DataElement element)
This method is to assist in debugging customer problems. |
static CmdSubSystemImpl |
getCmdSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
getCmdSubSystem - Given a DataElement this method will return the CmdSubSystemImpl
object which produced this DataElement. |
static com.ibm.etools.systems.model.SystemConnection |
getConnection(com.ibm.etools.systems.dstore.core.model.DataElement element)
Get the system which represents the context of this object. |
static String |
getConnectionName(com.ibm.etools.systems.dstore.core.model.DataElement element)
Get the connection name of the system which is the context of this object |
static com.ibm.etools.systems.dstore.core.model.DataElement |
getDataElement(Object element)
Get the DataElement given the input. |
static int |
getDescriptorType(Object element)
Return a constant indicating the type of descriptor this data element has. |
static ISeriesDataElementDescriptorType |
getDescriptorTypeObject(Object element)
Return a constant object representing the type of descriptor this data element has. |
static FileSubSystemImpl |
getFileSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
getFileSubSystem - Given a DataElement this method will return the FileSubSystemImpl
object which produced this DataElement. |
static String |
getHostName(com.ibm.etools.systems.dstore.core.model.DataElement element)
Get the hostname the context system is associated with |
static AS400ifsFileSubSystemImpl |
getIFSFileSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
getIFSFileSubSystem - Given a DataElement this method will return the IFSFileSubSystemImpl
object which produced this DataElement. |
static ISeriesConnection |
getISeriesConnection(com.ibm.etools.systems.dstore.core.model.DataElement element)
Get the ISeriesConnection associated with the specified DataElement. |
static JobSubSystemImpl |
getJobSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
getJobSubSystem - Given a DataElement this method will return the JobSubSystemImpl
object which produced this DataElement. |
static String |
getLocalPath(com.ibm.etools.systems.dstore.core.model.DataElement mbrElement,
String downloadDir)
Returns the local path of the element it was to be downloaded. |
static String |
getNFSPath(com.ibm.etools.systems.dstore.core.model.DataElement mbrElement)
Returns the NFS path of the element. |
static com.ibm.etools.systems.model.SystemProfile |
getProfile(com.ibm.etools.systems.dstore.core.model.DataElement element)
Get the profile that owns the system which is the context of this object |
static String |
getProfileName(com.ibm.etools.systems.dstore.core.model.DataElement element)
Get the profile name that owns the system which is the context of this object |
static String |
getStatus(com.ibm.etools.systems.dstore.core.model.DataElement element)
Return the status property of an object data element |
static com.ibm.etools.systems.subsystems.SubSystem |
getSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element,
String factoryID)
Given a data element, and a subsystem factory ID, this will find the instance of
the subsystem which produced this dataelement. |
static com.ibm.etools.systems.subsystems.SubSystemFactory |
getSubSystemFactory(com.ibm.etools.systems.dstore.core.model.DataElement element)
Get subsystem factory of the subsystem which is a context for this object |
static com.ibm.etools.systems.subsystems.ISystem |
getSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
|
static boolean |
isDataStoreServerLocal(com.ibm.etools.systems.dstore.core.model.DataElement element)
Find out if the datastore server associated with this object is running locally |
Methods inherited from class com.ibm.etools.iseries.core.dstore.common.ISeriesDataElementHelpers |
addDeliminators, find, getDescription, getFile, getLibrary, getLibrary, getName, getSource, getSubmittedJobInformation, getSubtype, getType, removeDeliminators |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
copyright
public static final String copyright
- See Also:
- Constant Field Values
getDescriptorTypeObject
public static ISeriesDataElementDescriptorType getDescriptorTypeObject(Object element)
- Return a constant object representing the type of descriptor this data element has.
This object is better than the integer value, as it incorporates all unique behaviour
for this particular type.
getDescriptorType
public static int getDescriptorType(Object element)
- Return a constant indicating the type of descriptor this data element has.
Returns a constant from
IISeriesDataElementDescriptorTypes
.
This is now deprecated in favor of com.ibm.etools.iseries.core.dstore.common.ISeriesDataElementDescriptorType#getDescriptorTypeObject(DataElement)
getDataElement
public static com.ibm.etools.systems.dstore.core.model.DataElement getDataElement(Object element)
- Get the DataElement given the input. The input is either
a DataElement directly, or a ISeriesDataElementWrapper wrapper.
getSubSystem
public static com.ibm.etools.systems.subsystems.SubSystem getSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element,
String factoryID)
- Given a data element, and a subsystem factory ID, this will find the instance of
the subsystem which produced this dataelement.
getCmdSubSystem
public static CmdSubSystemImpl getCmdSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
- getCmdSubSystem - Given a DataElement this method will return the CmdSubSystemImpl
object which produced this DataElement.
- Returns:
- The CmdSubSystem which is associated with this DataElement
getFileSubSystem
public static FileSubSystemImpl getFileSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
- getFileSubSystem - Given a DataElement this method will return the FileSubSystemImpl
object which produced this DataElement.
- Returns:
- The FileSubSystem which is associated with this DataElement
getJobSubSystem
public static JobSubSystemImpl getJobSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
- getJobSubSystem - Given a DataElement this method will return the JobSubSystemImpl
object which produced this DataElement.
- Returns:
- The JobSubSystem which is associated with this DataElement
getIFSFileSubSystem
public static AS400ifsFileSubSystemImpl getIFSFileSubSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
- getIFSFileSubSystem - Given a DataElement this method will return the IFSFileSubSystemImpl
object which produced this DataElement.
- Returns:
- The IFSFileSubSystem which is associated with this DataElement
getSystem
public static com.ibm.etools.systems.subsystems.ISystem getSystem(com.ibm.etools.systems.dstore.core.model.DataElement element)
getSubSystemFactory
public static com.ibm.etools.systems.subsystems.SubSystemFactory getSubSystemFactory(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Get subsystem factory of the subsystem which is a context for this object
getConnection
public static com.ibm.etools.systems.model.SystemConnection getConnection(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Get the system which represents the context of this object.
Uses sequential search, so it should not be used where performance is a
factor.
getISeriesConnection
public static ISeriesConnection getISeriesConnection(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Get the ISeriesConnection associated with the specified DataElement.
getConnectionName
public static String getConnectionName(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Get the connection name of the system which is the context of this object
getProfile
public static com.ibm.etools.systems.model.SystemProfile getProfile(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Get the profile that owns the system which is the context of this object
getProfileName
public static String getProfileName(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Get the profile name that owns the system which is the context of this object
getHostName
public static String getHostName(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Get the hostname the context system is associated with
isDataStoreServerLocal
public static boolean isDataStoreServerLocal(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Find out if the datastore server associated with this object is running locally
getNFSPath
public static String getNFSPath(com.ibm.etools.systems.dstore.core.model.DataElement mbrElement)
- Returns the NFS path of the element. Assumes a member in the
tree view.
getLocalPath
public static String getLocalPath(com.ibm.etools.systems.dstore.core.model.DataElement mbrElement,
String downloadDir)
- Returns the local path of the element it was to be downloaded.
Basically appends the QSYS path on the server to the download
directory specified. Assumes a member in the tree view.
getStatus
public static String getStatus(com.ibm.etools.systems.dstore.core.model.DataElement element)
- Return the status property of an object data element
dumpToLog
public static void dumpToLog(String message,
com.ibm.etools.systems.dstore.core.model.DataElement element)
- This method is to assist in debugging customer problems. Specifically it was created for situations where
there are problems with the structure of the DataStore tree. It dumps the message and first level children
of the element to the log.
dumpDataStore
public static void dumpDataStore(com.ibm.etools.systems.dstore.core.model.DataElement element,
String fileName)
- This method is to assist in debugging during development. It dumps
the DataStore tree starting from the dataelement specified and write
the output to the file specified.
Copyright © 2005 IBM Corp. All Rights Reserved.
Note: This documentation is for part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.