[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [platform-debug-dev] problems with the AsynchronousViewer framework

Greetings,

Thanks for your input/use of the framework.

Since the asynchronous viewer support in 3.2 was provisional, you should 
stay tuned to the following bugs so you can see how the support is shaping 
up for API in 3.3:

        https://bugs.eclipse.org/bugs/show_bug.cgi?id=153500
        https://bugs.eclipse.org/bugs/show_bug.cgi?id=161435
        https://bugs.eclipse.org/bugs/show_bug.cgi?id=154135

> 
> The JFace viewer framework is awesome, because it allows for reuse of so 
many 
> components:
> 
> 1. You can reuse viewers and populate them with own elements by 
providing an 
> own content-provider

Since the debug view contains mixed models (i.e. Java debugger, C debugger 
and others), one content provider is not sufficient. The platform does not 
know how to generate/update content for the models. Thus, the "adaptable" 
infrastructure allows for pluggable content and responding to model 
updates (via model proxy).

> 
> ------------------ (end JFace praise) ---------------------
> 
> It appears to me that some of the above advantages are lost with the 
> AsynchronousViewer framework (using the debug model as an example, but 
the 
> problems are more general, in our opinion):
> 
> 1. You can still reuse viewers and feed them with an own model "input"

(1) This seems more like a fact than "issue". I.e. - yes you can re-use 
views with your own input and content adapter.

> 
> 2. You cannot adapt a content adapter for an existing element because it 
is 
> fetched via IAdaptable.getAdapter(). You cannot provide an own 
> IAdapterFactory for an existing element (because you cannot "override" 
the 
> existing IAdapterFactory).

(2) This is true. The intended use case is for debug implementors to 
provide their relevant content adapters for their know use cases/views. We 
were not designing for others to extend/override content for a debug 
model. So, yes, this is currently a known limitation.

> 
> 3. You can still reuse content adapters (depending on their 
implementation). 
> Some debug model content adapters (e.g. StackFrameContentAdapter) 
however 
> contain hardcoded checks for the view in various methods. Example:
> 
>   protected Object[] getChildren(Object parent, 
IPresentationContextcontext) 
> throws CoreException {
>         String id = context.getPart().getSite().getId();
>         IStackFrame frame = (IStackFrame) parent;
>         if (id.equals(IDebugUIConstants.ID_VARIABLE_VIEW)) {
>             return frame.getVariables();
>         } else if (id.equals(IDebugUIConstants.ID_REGISTER_VIEW)) {
>             return frame.getRegisterGroups();
>         }
>         return EMPTY;
>    }
> 
> (Even worse in this example -- this content adapter provides a 
hardcoded, 
> different logic for all supported views, making it unusable for anything 

> else.)

(3) This is true. Since the same element has different content in 
different views, the adapter accounts for this. Returning "empty" content 
is probably a bad implementation for "unknown" views. The presentation 
context is used to tell the adapter what context content is being asked 
for. This is really the same problem as (2) - i.e. how to override or 
extend content provided by the "original" contributor (for new views).

> 
> 4. Elements can only be displayed in those views that the content 
adapter 
> supports, due to supportsContext()/supportsPartId(). Because an element 
is 
> basically tied to its content adapter, which cannot be replaced/extended 
(see 
> point 2), this means, that you cannot show an element in any other view 
than 
> those listed in supportsPartId().

(Yes , this is an elaboration on the same point).

> 
> For problem 2., it might be possible to reimplement 
> AsynchronousModel.getContentAdapter() and getLabelAdapter(). Would that 
be 
> the right way to provide an own AsynchronousModel (possibly inheriting 
from 
> an existing model) and reimplement those methods to provide own 
adapters?

In 3.3, we have a new implementation that does not use a model (cache of 
the model objects). In 3.3 (in a branch), we use a JFace tree viewer with 
the VIRTUAL support and a special content provider. However, the 
implementation is not intending to expose the viewer or content provider 
implementation. Only the content adapter interfaces will be exposed. So, 
in 3.3, this approach will not work.

I think that the issue boils down to one issue with the framework, which 
is how to extend or override content for existing models, when content 
adpaters are already provided. Right now the answer is that there is no 
way to do this. It is something we should consider.

Thanks,

Darin Wright