iSeries Remote Systems
v6.0.0

com.ibm.etools.systems.as400cmdsubsys.impl
Class AS400SubSystemImpl

java.lang.Object
  extended byorg.eclipse.emf.common.notify.impl.BasicNotifierImpl
      extended byorg.eclipse.emf.ecore.impl.BasicEObjectImpl
          extended byorg.eclipse.emf.ecore.impl.EObjectImpl
              extended bycom.ibm.etools.systems.subsystems.impl.SubSystemImpl
                  extended bycom.ibm.etools.systems.as400cmdsubsys.impl.AS400SubSystemImpl
All Implemented Interfaces:
AS400SubSystem, org.eclipse.emf.ecore.EObject, IAdaptable, IISeriesSubSystem, org.eclipse.emf.ecore.InternalEObject, com.ibm.etools.systems.subsystems.IRemoteObjectResolver, IRunnableWithProgress, com.ibm.etools.systems.model.ISystemResourceChangeEvents, org.eclipse.emf.common.notify.Notifier, com.ibm.etools.systems.subsystems.SubSystem, com.ibm.etools.systems.filters.SystemFilterPoolReferenceManagerProvider
Direct Known Subclasses:
CmdSubSystemImpl, FileSubSystemImpl, JobSubSystemImpl

public class AS400SubSystemImpl
extends com.ibm.etools.systems.subsystems.impl.SubSystemImpl
implements AS400SubSystem, IISeriesSubSystem


Nested Class Summary
 
Nested classes inherited from class com.ibm.etools.systems.subsystems.impl.SubSystemImpl
com.ibm.etools.systems.subsystems.impl.SubSystemImpl.ConnectRunnable, com.ibm.etools.systems.subsystems.impl.SubSystemImpl.DisplayErrorMessageRunnable
 
Nested classes inherited from class org.eclipse.emf.ecore.impl.BasicEObjectImpl
org.eclipse.emf.ecore.impl.BasicEObjectImpl.EPropertiesHolder, org.eclipse.emf.ecore.impl.BasicEObjectImpl.EPropertiesHolderImpl
 
Nested classes inherited from class org.eclipse.emf.common.notify.impl.BasicNotifierImpl
org.eclipse.emf.common.notify.impl.BasicNotifierImpl.EAdapterList
 
Nested classes inherited from class org.eclipse.emf.ecore.InternalEObject
org.eclipse.emf.ecore.InternalEObject.EStore
 
Field Summary
static String copyright
           
protected  Shell shell
           
 
Fields inherited from class com.ibm.etools.systems.subsystems.impl.SubSystemImpl
_system, ADDITIONAL_ATTRIBUTES_EDEFAULT, additionalAttributes, additionalAttributesESet, cancelable, DELIM_VENDOR_ATTR_VALUE, DELIM_VENDOR_ATTRS, DELIM_VENDOR_NAME, doConnection, FACTORY_ID_EDEFAULT, factoryId, filterPoolReferenceManager, hidden, HIDDEN_EDEFAULT, IBM_ATTRIBUTES_EDEFAULT, ibmAttributes, ibmAttributesESet, ibmAttrs, monitor, name, NAME_EDEFAULT, operation, OPERATION_CANCEL_SHELL, OPERATION_CONNECT, OPERATION_DISCONNECT, OPERATION_GET_PROPERTIES, OPERATION_GET_PROPERTY, OPERATION_REMOVE_SHELL, OPERATION_RESOLVE_ABSOLUTE, OPERATION_RESOLVE_ABSOLUTES, OPERATION_RESOLVE_RELATIVE, OPERATION_RUN_COMMAND, OPERATION_RUN_SHELL, OPERATION_SEND_COMMAND_TO_SHELL, OPERATION_SET_PROPERTIES, OPERATION_SET_PROPERTY, parentConnection, parentSubSystemFactory, pmDialog, port, PORT_EDEFAULT, previousUserIdKey, remoteServerLauncher, runContext, runException, runInput, runInput2, runInputs, runInputs2, runInThread, runObject, runOutput, runOutputs, runOutputString, runOutputStrings, saveFileName, sortResults, SUBSYSTEM_FILE_NAME, supportsConnecting, USE_SSL_EDEFAULT, USER_ID_EDEFAULT, userId, useSSL, VENDOR_ATTRIBUTES_EDEFAULT, vendorAttributes, vendorAttributesESet, vendorAttrs
 
Fields inherited from class org.eclipse.emf.ecore.impl.EObjectImpl
eAdapters, eContainer, eContainerFeatureID, EDELIVER, EDYNAMIC_CLASS, eFlags, ELAST_EOBJECT_FLAG, ELAST_NOTIFIER_FLAG, eProperties, EPROXY
 
Fields inherited from interface com.ibm.etools.systems.subsystems.IRemoteObjectResolver
Copyright
 
Fields inherited from interface com.ibm.etools.iseries.core.IISeriesSubSystem
Copyright
 
Fields inherited from interface com.ibm.etools.systems.model.ISystemResourceChangeEvents
EVENT_ADD, EVENT_ADD_FILTER_REFERENCE, EVENT_ADD_FILTERSTRING_REFERENCE, EVENT_ADD_MANY, EVENT_ADD_RELATIVE, EVENT_CHANGE_CHILDREN, EVENT_CHANGE_FILTER_REFERENCE, EVENT_CHANGE_FILTERSTRING_REFERENCE, EVENT_COLLAPSE_ALL, EVENT_COLLAPSE_SELECTED, EVENT_COMMAND_FINISHED, EVENT_COMMAND_HISTORY_UPDATE, EVENT_COMMAND_MESSAGE, EVENT_COMMAND_RUN, EVENT_COMMAND_SHELL_FINISHED, EVENT_COMMAND_SHELL_REMOVED, EVENT_COMPILE_COMMAND_RUN, EVENT_DELETE, EVENT_DELETE_FILTER_REFERENCE, EVENT_DELETE_FILTERSTRING_REFERENCE, EVENT_DELETE_MANY, EVENT_EXPAND_SELECTED, EVENT_ICON_CHANGE, EVENT_MOVE_FILTER_REFERENCES, EVENT_MOVE_FILTERSTRING_REFERENCES, EVENT_MOVE_MANY, EVENT_MUST_COLLAPSE, EVENT_PROPERTY_CHANGE, EVENT_PROPERTYSHEET_UPDATE, EVENT_REFRESH, EVENT_REFRESH_REMOTE, EVENT_REFRESH_SELECTED, EVENT_REFRESH_SELECTED_FILTER, EVENT_REFRESH_SELECTED_PARENT, EVENT_RENAME, EVENT_RENAME_FILTER_REFERENCE, EVENT_REPLACE_CHILDREN, EVENT_REVEAL_AND_SELECT, EVENT_SEARCH_FINISHED, EVENT_SELECT, EVENT_SELECT_EXPAND, EVENT_SELECT_REMOTE, PROPERTYSHEET_UPDATE_EVENT
 
Fields inherited from interface org.eclipse.emf.ecore.InternalEObject
EOPPOSITE_FEATURE_BASE
 
Constructor Summary
protected AS400SubSystemImpl()
          Constructor.
 
Method Summary
protected  void checkForCommandErrors(com.ibm.etools.systems.dstore.core.model.DataElement status)
          Standard error handling routine to handle conditions when the DataElement status for a command sent to the miners is returned with an error.
 ISeriesFile createFileWithAbsoluteName(String path, int recordLength)
          Create a new src physical file with the specified path and record length
 ISeriesLibrary createLibraryWithAbsoluteName(String libraryName)
          Find or create a new library with the specified path
 ISeriesMember createMemberWithAbsoluteName(String path, String memberType, int recordLength)
          Create a new member with the specified path and member type
 Object eGet(org.eclipse.emf.ecore.EStructuralFeature eFeature, boolean resolve)
          
Methods inherited from class com.ibm.etools.systems.subsystems.impl.SubSystemImpl
addResolvedFilterStringObjects, basicSetFilterPoolReferenceManager, basicSetRemoteServerLauncher, cancelShell, checkIsConnected, clearLocalUserId, connect, connect, connect, deletingConnection, disconnect, disconnect, displayAsyncMsg, doesFilterListContentsOf, doesFilterMatch, doesFilterStringListContentsOf, doesFilterStringMatch, doesFilterTypeMatch, filterEventFilterCreated, filterEventFilterPoolReferenceCreated, filterEventFilterPoolReferenceDeleted, filterEventFilterPoolReferenceRenamed, filterEventFilterPoolReferenceReset, filterEventFilterPoolReferencesRePositioned, filterEventFilterPoolReferencesReset, filterEventFilterStringCreated, fireEvent, fireEvent, fireEvent, fireEvent, fireEvent, fireEvent, forceUserIdToUpperCase, getActiveWorkbenchShell, getActiveWorkbenchWindow, getAdapter, getAdditionalAttributes, getChildren, getConnectionOwnedFilterPoolName, getConnectionPrivateFilterPool, getExecutedCommands, getFactoryId, getFilterPoolReferenceManager, getFilterReferenceWithAbsoluteName, getFirstParentFilterString, getHostName, getIBMAttribute, getIbmAttributes, getLocalUserId, getLocalUserId, getName, getParentSubSystemFactory, getPort, getPortAsInt, getPreferencesKey, getPreferencesKey, getPreferencesManager, getProperties, getProperty, getQueryingMessage, getQueryingMessage, getRemoteServerLauncher, getResolvingMessage, getRunnableContext, getRunningMessage, getSaveFileName, getSettingMessage, getSettingMessage, getSystem, getSystemConnection, getSystemConnectionName, getSystemFilterPoolReferenceManager, getSystemProfile, getSystemProfileName, getSystemType, getTargetForFilter, getUDActionSubsystem, getUniqueOwningSystemFilterPool, getUserId, getUserIdGen, getVendorAttribute, getVendorAttributes, hasChildren, internalCancelShell, internalConnect, internalDisconnect, internalGetProperties, internalGetProperty, internalRemoveShell, internalResolveFilterString, internalResolveFilterString, internalResolveFilterStrings, internalRunShell, internalSendCommandToShell, internalSetProperties, internalSetProperty, isConnected, isHidden, isOffline, isSetAdditionalAttributes, isSetIbmAttributes, isSetVendorAttributes, isUseSSL, removeShell, renamingConnection, renamingProfile, resolveFilterString, resolveFilterString, resolveFilterString, resolveFilterString, resolveFilterStrings, resolveFilterStrings, run, runCommand, runShell, selectCommandSubSystem, sendCommandToShell, setAdditionalAttributes, setFactoryId, setFilterPoolReferenceManager, setHidden, setIBMAttribute, setIbmAttributes, setName, setParentConnection, setParentSubSystemFactory, setPort, setProperties, setProperty, setRemoteServerLauncher, setSaveFileName, setUserId, setUserIdGen, setUseSSL, setVendorAttribute, setVendorAttributes, showConnectCancelledMessage, showConnectErrorMessage, showDisconnectCancelledMessage, showDisconnectErrorMessage, showOperationCancelledMessage, showOperationErrorMessage, showOperationMessage, sortResolvedFilterStringObjects, toString, unsetAdditionalAttributes, unsetIbmAttributes, unsetVendorAttributes
 
Methods inherited from class org.eclipse.emf.ecore.impl.EObjectImpl
eAdapters, eBasicAdapters, eBasicProperties, eBasicSetContainer, eClass, eContainerFeatureID, eDeliver, eInternalContainer, eIsProxy, eProperties, eSetClass, eSetDeliver, eSetProxyURI
 
Methods inherited from class org.eclipse.emf.ecore.impl.BasicEObjectImpl
eAllContents, eBaseStructuralFeatureID, eBasicRemoveFromContainer, eBasicSetContainer, eContainer, eContainingFeature, eContainmentFeature, eContains, eContents, eCrossReferences, eDerivedStructuralFeatureID, eDerivedStructuralFeatureID, eDirectResource, eDynamicBasicRemoveFromContainer, eDynamicClass, eDynamicFeature, eDynamicFeatureID, eDynamicGet, eDynamicInverseAdd, eDynamicInverseRemove, eDynamicIsSet, eDynamicSet, eDynamicUnset, eGet, eHasSettings, eInternalResource, eObjectForURIFragmentSegment, eOpenGet, eOpenIsSet, eOpenSet, eOpenUnset, eProxyURI, eResolveProxy, eResource, eSetResource, eSetStore, eSetting, eSettingDelegate, eSettings, eStaticFeatureCount, eStore, eURIFragmentSegment
 
Methods inherited from class org.eclipse.emf.common.notify.impl.BasicNotifierImpl
eNotificationRequired, eNotify
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface com.ibm.etools.systems.subsystems.SubSystem
checkIsConnected, clearLocalUserId, connect, connect, connect, deletingConnection, disconnect, disconnect, doesFilterListContentsOf, doesFilterMatch, doesFilterStringListContentsOf, doesFilterStringMatch, forceUserIdToUpperCase, getAdditionalAttributes, getChildren, getFactoryId, getFilterPoolReferenceManager, getIbmAttributes, getLocalUserId, getName, getParentSubSystemFactory, getPort, getPortAsInt, getProperties, getProperty, getRemoteServerLauncher, getSaveFileName, getSystem, getSystemConnection, getSystemConnectionName, getSystemFilterPoolReferenceManager, getSystemProfile, getSystemProfileName, getTargetForFilter, getUDActionSubsystem, getUserId, getVendorAttribute, getVendorAttributes, hasChildren, isConnected, isHidden, isOffline, isSetAdditionalAttributes, isSetIbmAttributes, isSetVendorAttributes, isUseSSL, renamingConnection, renamingProfile, resolveFilterString, resolveFilterString, resolveFilterString, resolveFilterString, resolveFilterStrings, resolveFilterStrings, setAdditionalAttributes, setFactoryId, setFilterPoolReferenceManager, setHidden, setIbmAttributes, setName, setParentConnection, setParentSubSystemFactory, setPort, setProperties, setProperty, setRemoteServerLauncher, setSaveFileName, setUserId, setUseSSL, setVendorAttribute, setVendorAttributes, unsetAdditionalAttributes, unsetIbmAttributes, unsetVendorAttributes
 
Methods inherited from interface com.ibm.etools.systems.filters.SystemFilterPoolReferenceManagerProvider
filterEventFilterCreated, filterEventFilterPoolReferenceCreated, filterEventFilterPoolReferenceDeleted, filterEventFilterPoolReferenceRenamed, filterEventFilterPoolReferenceReset, filterEventFilterPoolReferencesRePositioned, filterEventFilterPoolReferencesReset, filterEventFilterStringCreated, getUniqueOwningSystemFilterPool
 
Methods inherited from interface org.eclipse.emf.ecore.EObject
eAllContents, eClass, eContainer, eContainingFeature, eContainmentFeature, eContents, eCrossReferences, eGet, eIsProxy, eResource
 
Methods inherited from interface org.eclipse.emf.common.notify.Notifier
eAdapters, eDeliver, eNotify, eSetDeliver
 
Methods inherited from interface org.eclipse.emf.ecore.InternalEObject
eNotificationRequired
 

Field Detail

copyright

public static final String copyright
See Also:
Constant Field Values

shell

protected Shell shell
Constructor Detail

AS400SubSystemImpl

protected AS400SubSystemImpl()
Constructor. Called by MOF. Do not instantiate directly!

Method Detail

eStaticClass

protected org.eclipse.emf.ecore.EClass eStaticClass()


eInverseAdd

public org.eclipse.emf.common.notify.NotificationChain eInverseAdd(org.eclipse.emf.ecore.InternalEObject otherEnd,
                                                                   int featureID,
                                                                   Class baseClass,
                                                                   org.eclipse.emf.common.notify.NotificationChain msgs)

Specified by:
eInverseAdd in interface org.eclipse.emf.ecore.InternalEObject

eInverseRemove

public org.eclipse.emf.common.notify.NotificationChain eInverseRemove(org.eclipse.emf.ecore.InternalEObject otherEnd,
                                                                      int featureID,
                                                                      Class baseClass,
                                                                      org.eclipse.emf.common.notify.NotificationChain msgs)

Specified by:
eInverseRemove in interface org.eclipse.emf.ecore.InternalEObject

eGet

public Object eGet(org.eclipse.emf.ecore.EStructuralFeature eFeature,
                   boolean resolve)

eSet

public void eSet(org.eclipse.emf.ecore.EStructuralFeature eFeature,
                 Object newValue)

Specified by:
eSet in interface org.eclipse.emf.ecore.EObject

eUnset

public void eUnset(org.eclipse.emf.ecore.EStructuralFeature eFeature)

Specified by:
eUnset in interface org.eclipse.emf.ecore.EObject

eIsSet

public boolean eIsSet(org.eclipse.emf.ecore.EStructuralFeature eFeature)

Specified by:
eIsSet in interface org.eclipse.emf.ecore.EObject

getSystemManager

public com.ibm.etools.systems.subsystems.impl.AbstractSystemManager getSystemManager()
Return a singleton instance of an AbstractSystemManager subclass that manages a pool of ISystem objects, one per system connection. By default, getSystem() calls this, unless you override getSystem().

Specified by:
getSystemManager in interface com.ibm.etools.systems.subsystems.SubSystem
Returns:
ISeriesSystemManager.getTheISeriesSystemManager()

getISeriesSystem

public ISeriesSystemDataStore getISeriesSystem()
Return the shared ISystem system object for the given connection. You can use this to test if we are connected, or to retrieve an iSeries JDBC connection, for example.

Specified by:
getISeriesSystem in interface IISeriesSubSystem

getISeriesConnection

public ISeriesConnection getISeriesConnection()
Return the connection, as an ISeriesConnection.

See Also:
SubSystemImpl.getSystemConnection()

getToolboxAS400Object

public com.ibm.as400.access.AS400 getToolboxAS400Object()
Return the iSeries Toolbox for Java "AS400" object for this connection. This may, or may not, be connected yet. To test, call SubSystemImpl.isConnected() To connect, call SubSystemImpl.connect() or preferably SubSystemImpl.connect(Shell)

Specified by:
getToolboxAS400Object in interface IISeriesSubSystem

setShell

public void setShell(Shell shell)
Set the shell to be used when a dialog is needed, such as when prompting for password or showing an error message.

Specified by:
setShell in interface IISeriesSubSystem

getShell

public Shell getShell()
Get the shell to be used when a dialog is needed, such as when prompting for password or showing an error message. This is as last set by calling setShell(Shell).

Specified by:
getShell in interface IISeriesSubSystem

getCmdSubSystem

public CmdSubSystem getCmdSubSystem()
Method required in com.ibm.etools.iseries.core.IISeriesSubSystem interface.

Return the QSYS command subsystem. Overridden in command subsystem to return "this", but for others it looks up the command subsystem object and returns it.

Specified by:
getCmdSubSystem in interface IISeriesSubSystem

getObjectSubSystem

public FileSubSystem getObjectSubSystem()
Method required in com.ibm.etools.iseries.core.IISeriesSubSystem interface.

Return the QSYS file subsystem ("ISeries Objects"). Overridden in file subsystem to return "this",but for others it looks up the file subsystem object and returns it.

Specified by:
getObjectSubSystem in interface IISeriesSubSystem

getCommandExecutionProperties

public IISeriesSubSystemCommandExecutionProperties getCommandExecutionProperties()
Method required in com.ibm.etools.iseries.core.IISeriesSubSystem interface.

Return the Command Execution Property Page properties that are accessible from all iSeries subsystems. All our subsystems implement this method, but only the Objects SubSystem actually implements the interface and hence returns "this". All others return the objects subsystem instance.

Specified by:
getCommandExecutionProperties in interface IISeriesSubSystem

getCommandSubSystem

public com.ibm.etools.systems.subsystems.RemoteCmdSubSystem getCommandSubSystem()
Method defined in parent class

We override it to return getCmdSubSystem().

Specified by:
getCommandSubSystem in interface com.ibm.etools.systems.subsystems.SubSystem

internalRunCommand

protected Object[] internalRunCommand(IProgressMonitor monitor,
                                      String cmd,
                                      Object context)
                               throws InvocationTargetException,
                                      InterruptedException
Actually run a remote command. This is called by the run(IProgressMonitor monitor) method, which in turn is called by runCommand(...).

Throws:
InvocationTargetException
InterruptedException

internalGetProperty

protected String internalGetProperty(IProgressMonitor monitor,
                                     String key)
                              throws InvocationTargetException,
                                     InterruptedException
Actually get a remote property. This is called by the run(IProgressMonitor monitor) method, which in turn is called by getProperty(...).

Throws:
InvocationTargetException
InterruptedException

internalSetProperty

protected Object internalSetProperty(IProgressMonitor monitor,
                                     String key,
                                     String value)
                              throws InvocationTargetException,
                                     InterruptedException
Actually set a remote property. This is called by the run(IProgressMonitor monitor) method, which in turn is called by setProperty(...).

Throws:
InvocationTargetException
InterruptedException

internalGetProperties

protected String[] internalGetProperties(IProgressMonitor monitor,
                                         String[] keys)
                                  throws InvocationTargetException,
                                         InterruptedException
Actually get multiple remote properties. This is called by the run(IProgressMonitor monitor) method, which in turn is called by getProperties(...).

Throws:
InvocationTargetException
InterruptedException

internalSetProperties

protected Object internalSetProperties(IProgressMonitor monitor,
                                       String[] keys,
                                       String[] values)
                                throws InvocationTargetException,
                                       InterruptedException
Actually set multiple remote properties. This is called by the run(IProgressMonitor monitor) method, which in turn is called by setProperties(...).

Throws:
InvocationTargetException
InterruptedException

getPropertyPage

public PropertyPage getPropertyPage(Composite parent)
Override so we are sure no pages are contributed to the subsystems tab of the property page for the parent connection.

Specified by:
getPropertyPage in interface com.ibm.etools.systems.subsystems.SubSystem

createLibraryWithAbsoluteName

public ISeriesLibrary createLibraryWithAbsoluteName(String libraryName)
Find or create a new library with the specified path

Parameters:
libraryName - the name of the library
Returns:
the new library

createFileWithAbsoluteName

public ISeriesFile createFileWithAbsoluteName(String path,
                                              int recordLength)
Create a new src physical file with the specified path and record length

Parameters:
path - the qualified path of the file
recordLength - the record length for the file
Returns:
the new File

createMemberWithAbsoluteName

public ISeriesMember createMemberWithAbsoluteName(String path,
                                                  String memberType,
                                                  int recordLength)
Create a new member with the specified path and member type

Parameters:
path - the qualified path of the member
memberType - the type of the member
Returns:
the new member

getObjectWithAbsoluteName

public Object getObjectWithAbsoluteName(String key)
                                 throws Exception
Return the object within the subsystem that corresponds to the specified unique ID. For DataElements, this amounts to looking up the ID in the DataStore.

Specified by:
getObjectWithAbsoluteName in interface com.ibm.etools.systems.subsystems.IRemoteObjectResolver
Throws:
Exception

getCacheManager

public com.ibm.etools.systems.subsystems.ICacheManager getCacheManager()
Retieve cache manager for this subsystem. All iSeries subsystems for a connection share the same cache manager.

Specified by:
getCacheManager in interface com.ibm.etools.systems.subsystems.SubSystem

setCacheManager

protected void setCacheManager(CacheManager cacheMgr)

supportsCaching

public boolean supportsCaching()
Specified by:
supportsCaching in interface com.ibm.etools.systems.subsystems.SubSystem

internalGetCacheManager

protected CacheManager internalGetCacheManager()
Internal getter for cache manager which returns the iSeries specific cache manager instance.


getDataStore

protected com.ibm.etools.systems.dstore.core.model.DataStore getDataStore()
Helper method for retrieving the DataStore object for this subsystem.


checkForCommandErrors

protected void checkForCommandErrors(com.ibm.etools.systems.dstore.core.model.DataElement status)
                              throws com.ibm.etools.systems.core.messages.SystemMessageException
Standard error handling routine to handle conditions when the DataElement status for a command sent to the miners is returned with an error. This routine should be kept insync with the AbstractISeriesMiner.handleException routine which populates the status element with the error.

Parameters:
status - The DataElement status object for the command
Throws:
com.ibm.etools.systems.core.messages.SystemMessageException - which contains the error returned from the host
Since:
WDSc 5.1.2

internalDataStoreError

protected void internalDataStoreError(String subsystem,
                                      String method,
                                      String message)
                               throws com.ibm.etools.systems.core.messages.SystemMessageException
Helper method for logging datastore internal errors and throwing internal error exception

Throws:
com.ibm.etools.systems.core.messages.SystemMessageException

iSeries Remote Systems
v6.0.0

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.