Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [cme-dev] Towards use cases for Conman loaders



Stan,

Wow, there's a lot of interesting stuff here. As you say, the space is
large and we'll need to pick some key points. I've added some notes below
in red  that suggest enlargements, without the implication that they should
be included in the points chosen in the end.

- Harold



                                                                       
             Stan                                                      
             Sutton/Watson/IBM                                         
             @IBMUS                                                     To
             Sent by:                  cme-dev@xxxxxxxxxxx             
             cme-dev-admin@ecl                                          cc
             ipse.org                  Stan Sutton/Watson/IBM@IBMUS    
                                                                   Subject
                                       [cme-dev] Towards use cases for 
             06/22/2004 05:58          Conman loaders                  
             PM                                                        
                                                                       
                                                                       
             Please respond to                                         
                  cme-dev                                              
                                                                       
                                                                       





Hello All,

As part of the on-going effort to redesign the Conman loaders I'd like to
suggest some ideas for use cases involving the loaders.  (As Peri has
pointed out, this is past due, and I agree with her--even though I am
mainly to blame for the delay.  :-)  )

I am a novice at use-case specification, but I hope the ideas listed below
are a start in the right direction.  The text actually includes three
parts:  The first is suggestions for use case scenarios (more specific for
end users, more general--or vague--for tool builders).  The second is lists
of generic actions abstracted from the scenarios.  The third is a list of
some of the dimensions of concern that apply to loader design.  Ultimately
(I believe) we want to pick some points in the concern space so as to
implement a useful set of capabilities, in support of actions, that will
allow us to address validated scenarios--although the idea is to drive this
process top-down.

Comments and suggestions on any and all of this are requested.  We need to
validate the use cases in order to firm up the requirements in order to
complete a design in order to get the loaders built!

Thanks in advance and regards,

Stan



Use-Case Scenarios for Loaders

We envision two kinds of users for the CME, end users and tool
builders.  Thus we can imagine two corresponding sorts of use-case
scenario.

End-User Scenarios

Some candidate scenarios:

   The user opens a CME perspective and presses a button that initializes a
   concern model by loading (alternatively)

   All of the source model (or the corresponding binary model)
   The upper levels of the source model
   Certain types of elements (entirely or just the upper levels)
   The user is exploring down into a model and opens an element for which
   the children have not been loaded (perhaps by just double-clicking it,
   perhaps by right clicking and selecting a option from a menu); the user
   may want to

   Load all of the children to their ultimate depth
   Load the immediate children
   Load the children of some particular type (or possibly a "working set"
   of types)
   Load the children down to a certain descendent type (e.g., Java project
   to Java packages)
   The user has run a query resulting in the return of some elements that
   are the descendents of some other elements, say, a collection of
   methods; the user may then want to

   Load the immediate container (e.g., the declaring type)
   Load up to some kind of container (e.g., the top-level type or package)
   Load all the way up to the top of the model
   The user is interested in an element and asks to see (some or all of )
   the relationships for that element
   The user has a relationship for an element and wishes to navigate to one
   of the other elements involved in the relationship

Presumably loading can be either eager or lazy, as noted later in the
document. If the user asks to load some amount of material, it can actually
be done lazily as needed, as long as it is never missed.

When a user executes a query, including following a relationship, the query
might conceptually extend beyond elements already loaded, introducing
various options:
   Look only in loaded elements (including those that remain to be loaded
   lazily; the query results should not depend on what the loader has
   happened to load so far)
   Warn the user that loading other elements will expand the result of the
   query, and ask what to do
   Automatically load more elements. This should not be confined to the
   results needed for the query, or the concern model contents will depend
   on the query history. But a query could cause the loaders to load
   (perhaps lazily) further levels of detail. Possbily warn the user if
   this will take a long time.

I think the same sorts of criteria that apply to substructure also apply to
related elements. If an element is loaded, relationships from it can be
determined, and there are similar questions about how to handle their
targets, from not loading them at all (ignore the relationships or create
stubs, as options), to full transitive closure. A related issue is how to
handle dangling references, where the target cannot be found.

Notes:

   It seems unlikely (at least to me) that an end user would be concerned
   with specific loaders or loader types, e.g., selecting a particular
   loader/loader type from a list of available loaders/loader
   types.  Actually, it seems unlikely that end users will be concerned
   with loaders at all.  Are there any prospective scenarios that would
   support the exposure of loaders to end users? I agree. The user might
   select kinds of artifacts to load or relationships to compute, as you
   noted above, but by artifact/relationship designation, not loader. (On
   the other hand, perhaps sophisticated users might configure the system
   with a particular loader/analyser they know abuot, and want to be able
   to turn it on and off).
   These scenarios all involve loading.  There are other scenarios that
   would involve unloading, but we're not quite at the point where we're
   ready to discuss unloading yet



Tool-Builder Scenarios

I'm not entirely sure how to characterize tool-builder scenarios, but
certainly in the design of the loaders the concerns of tool builders should
be taken into account.  It seems to me that one general way to characterize
tool-builder scenarios is in terms of problems to be solved, actions to be
implemented, effects to be achieved, and so on.

(Relative to a particular kind of tool (or component) such as a Conman
loader, it is also possible to characterize tool-builder scenarios as to
whether the tool builder is using loaders to build some other tool, or
whether the tool builder is building (adapting, configuring, extending,
maintaining) a loader itself (possibly based on an existing loader).  Here
I am focusing on the former kind of scenario:  what might a tool builder
want to do with a loader in the course of developing components or tools
that might involve concern-model loading.  However, scenarios for
loader-builders should also be considered at some point.)

Given the above, at least one category of tool-builder scenario might be
characterized as "implement end-user scenario X", where "X" is something
like  "top-down loading of a concern model" or "on-demand loading of
element children."  Full implementation of these scenarios will generally
involve the use not only of loaders but also of other Conman elements and
possibly of CME elements in general.  Note that the use of the loaders may
involve actions that a typical end-user would not generally see, such as
finding and invoking loaders.  These actions may also go beyond those
indicated in the standard loader interface (i.e., beyond testing the
applicability of a loader to an element and loading an element).

Thus, one sort of scenario for a tool builder would be to find some
mechanisms to effect the loader (and non-loader) actions required to
address an end-user scenario, and then to assemble those mechanisms into a
tool to support the end-user scenario.  The resulting requirements on us
would be to design loaders (and related components) in such a way as to
support tool builders in realizing such tool-building scenarios.

I could attempt to outline some specific tool-builder scenarios, but it
seems to me that there might be many of these, that is, more than one for
each of the end-user scenarios listed above, depending on alternative
implementation strategies or requirements.  It would be helpful if
prospective CME tool builders could suggest specific scenarios of interest.

Incremental update and its attendant support are likely to be important to
tool builders, and they'll need an interface to it.

I also wonder about the notion of "transient" concern model elements
(because I use them currently for methoids). These are real elements,
perhaps computed to show query results, but they behave like they are not
there for certain kinds of access and iteration (so the fact that some of
them have been created to show some query result doesn't really alter the
model itself). I'm not sure how good an idea this is, but creating units
for all methoids is not an option, so this sort of requirement must be
handled somehow.

Generic Loader Actions

 Considering the scenarios, we can abstract some generic sorts of actions
that might be generally useful in a loader:

   Load a complete model beginning at the root element (e.g., an Eclipse
   workspace)
   Load a complete submodel, beginning at an intermediate element (e.g.,
   load an Eclipse project or Java package)

   Note:  Equivalent to loading a particular element, including its
   children
   Load just a particular element, with no children or parents
   Load a particular element with its children down to some specified depth
   (e.g., load a Java project to depth 1, which might be package roots)
      Note:  At one extreme this would accommodate loading to the complete
      depth of the element, which would be equivalent 2 above, as I see it
      Load a particular element with its children of one or more specified
      types (e.g., load a type with methods and initializers)
      Load a particular element with its children down to some specified
      type (e.g., load a project down to the level of top-level types)
         Note:  As I think of it, this includes the loading of children
         intermediate to children of the specified type, but it excludes
         the loading of children that are not intermediate to children of
         the specified type (so, in the example, this would entail the
         loading of projects, package roots, packages, and types, but not
         the loading of non-package folders in the project, and not the
         loading of non-Java files in a package)
         Load a particular element with its parent(s) to the root of the
         model (e.g., with a CIType load the CITypeSpace and CIUniverse)
         Would it be possible to characterize these in terms of the
         resulting model, rather than the sourc artifacts? Similarly some
         of the others?
         Load a particular element with its parent(s) to one or more
         specified levels (e.g., load a CIMethod to height 2 (depth -2?),
         thereby also loading the CIType and CITypeSpace)
         Load a particular element with its parent(s) of one or more
         specified types (e.g., load a Java type with its parent-as-package
         or its parent-as-folder)
            Note:  I haven't really worked out the notion of multiple
            parents of different types; I just suggest it here for
            completeness.  There seem to be at least two ways to make sense
            of this notion:  1) there is a single parent element which can
            be viewed (or cast) as multiple kinds of thing (e.g., a
            directory might be a Folder might be Project might be a
            JavaProject); 2) there are multiple sets of containment
            (parent-child) relationships that apply to a particular element
            (i.e., the element exists in multidimensional space), and there
            are actually distinct elements of different types that might be
            considered as its parent (not sure that we have a good example
            of this yet, outside of Conman, though).
            Load a particular element with its parents up to some specified
            type (e.g., load a CIMethod up to the containing CITypeSpace)
               Note:  notes analogous to those for case 6 apply here
            The above actions are all varieties of "load"; in each of these
            cases the ability to test the applicability of a loader to one
            or more elements is also implied.

            There are a number of other generic sorts of actions, in
            addition to "load" and "isApplicableTo", that may also be
            useful for loaders.  These include:
               Create a loader (may need to be done very differently
               depending especially on the type of domain model to be
               loaded)
               Register a loader for a particular kind of artifact
               Find a loader
               For a given element
               For a given type of element
               Satisfying various properties
               Find the loader that loaded a given element
               Record the loader that loaded a given element
               Control the number or type of loaders used to load a given
               element
               Control the invocation of loaders (e.g., eager versus lazy
               invocation strategies)

            I am sure that neither of the above lists is exhaustive and I
            welcome suggestions as to how they might be extended or
            adapted.


            Dimensions of Concern for Loader Design

            The above actions (especially the first group) are described
            mostly in terms of the direction and extent of loading.  Those
            represent two dimensions of concern in the characterization of
            loaders or loader behavior.  To avoid a combinatorial
            explosion, I neglected other dimensions when compiling that
            list.  Off the top of my head I can think of at least the
            following dimensions of concern for loader design:

            Direction of load:
               Up
               Down
               Neither
               Both

            Extent of load: Similar for related elements (or treat
            containment as a relationship and do this for related
            elements). Is something like "detail level" a useful
            abstraction here? I vaguely remember our coming up with some
            useful levels that made sense across different kinds of
            artifacts.
               Fixed (at whatever)
               Specified by number of levels (regardless of kind of
               element)
               Specified by kind(s) of element
               Immediate
               Transitive (i.e., to a specified kind of element, including
               intermediate elements)

            Means of loader selection:
               Specified by instance
               Specified by type
               Note:  We don't yet have a formal notion of loader type;
               this case would be a special case of the following ...
               Specified by criteria
               Selected by some strategy Does one of these include
               isApplicable?
                  Note:  Not sure that there's a strict difference between
                  selection criteria and selection strategies.  Selection
                  by criteria might be one strategy for choosing a loader,
                  but selection of first available would be another
                  strategy (and that doesn't seem like a criterion to me)

               Number of loaders used (when loading a particular element):
                  One
                  Some
                  Note:  Under some analyses this might not be a distinct
                  case, e.g., "some" of the loader in a collection might be
                  "all" as selected according to some criterion
                  All

               Source domain:
                  Whatever source domains you might want, alone or in
                  combination (e.g., CIT., Eclipse core resources, Eclipse
                  JDT resources,  ...)

               Target range:
                  Whatever combinations of model elements and structure you
                  might want

               Reuse versus reload:
                  Load a new element only if an existing element is not
                  found
                  Load a new element even if an existing element is found
                  Replacing the found element
                  "Supplementing" the found element

               And I'm sure there are others.





Back to the top