[nbdev] Re: how to avoid duplicate org.openide.text.Annotations

  • From: " " < >
  • To:
  • Subject: [nbdev] Re: how to avoid duplicate org.openide.text.Annotations
  • Date: Mon, 15 Oct 2012 09:37:13 +0200

Hi Jaroslav,

> Making getAnnotations public is not secure. Everyone could get a hold
> on
> annotations added by others. Something more clear would have to be
> implemented.
You're right. Everyone could detach foreign annotations. I see the point.
> Anyway you can never attach one annotation twice via
> Annotation.attach. Of
> course, that does not support your use case, but on the other hand, I
> don't
> understand how you know what Annotatable you want to detach from,
> when you
> don't have reference to your Annotation!?
That's the second part of my question.
How would you tell if an Annotation has already been added. In my case,
the criteria would be an internal AnnotationType, the ShortMessage and
the Position. The latter one is the problem, because the offset can
change when the Document gets edited.

Scenario:
Annotation-instance A gets attached to Line.Part at offset 10.
Document is edited (user inserts one character before offset 10).
Annotation-instance B gets attached at offset 11 (B is effectively the
same as A and shouldn't be attached)

My thoughts were:
As the Line.Parts offset changes, when the document gets edited, I could
keep a reference to the Line.Part in the Annotation.
As NbDocument manages it's Annotations in the annoMap
(Map<Annotation,AnnotationDesc>) and throws IllegalStateException when
adding an Annotation with the same hashKey twice, I could easily
implement hashCode and equals based upon the criteria including
Line.Part and make use of the Exception.
But of course, I was mistaken because the hashCode of an Annotation
would change when editing the document, while this Annotation would be
stored as a Key in the Map of NbEditorDocument.
And one shouldn't mutate the hashCode of a Map-Key while it is stored in
a Map.

So sadly there seems to be no easy solution. So I'm gonna keep a Map of
Annotations by myself.

Thanks for the replies.

Greetings,

Thomas


On 14.10.2012 20:37, Jaroslav Tulach wrote:
> Making getAnnotations public is not secure. Everyone could get a hold on 
> annotations added by others. Something more clear would have to be 
> implemented.
> 
> Anyway you can never attach one annotation twice via Annotation.attach. Of 
> course, that does not support your use case, but on the other hand, I don't 
> understand how you know what Annotatable you want to detach from, when you 
> don't have reference to your Annotation!?
> 
> -jt
> 
> Dne So 13. října 2012 15:37:23, 
> 
>  napsal(a):
>> Hi Miloslav,
>>
>> thanks for the reply.
>> So I was right. There's no easy way. If you store all annotations to a
>> document, you'll have to listen to this document as well. Upon
>> document-disposal, you'd have to dispose all annotations as well.
>>
>> If I'm not mistaken here, then I believe that this is unnecessary. And I
>> believe that this likely leads to code that doesn't care about keeping
>> orphan annotations in memory while the document already has been disposed.
>>
>> I'm sure that if you would make the (already existing, but
>> package-private) method org.openide.text.Annotatable::getAnnotations
>> public (maybe returning Collections::unmodifiableList instead of the
>> field itself), developers could perform easy tests whether or not they
>> should attach their Annotations. This would naturally lead to less
>> memory "misuse", more lightweight and easier-to-write code.
>>
>> Anyway: thanks for your response Miloslav,
>>
>> Thomas
>>
>> On 13.10.2012 09:05, Miloslav Metelka wrote:
>>> Hi Thomas,
>>>
>>>  the clients attaching the annotations typically hold all annotations
>>>
>>> that they attach to a given document and typically upon e.g.
>>> recompilation they deattach and reattach all the annotations. If you
>>> want to inspect a list of your annotations then I would suggest holding
>>> them in a list sorted according to their positions in the document so
>>> that you can binary-search it. You may then possibly check
>>> whether the annotation is inside the given line by using line elements
>>> (line root element is returned by Document.getDefaultRootElement()).
>>> If you would just want to highlight fractions of line (without having
>>> icon) you may consider using HighlightingLayer in editor.lib2 too.
>>>
>>> -Mila
>>>
>>> On 10/08/2012 02:19 PM, 
>>> 
>>>  wrote:
>>>> Dear List,
>>>>
>>>> I'm dealing with custom org.openide.text.Annotations. Currently my main
>>>> goals are to add annotations to Line and Line.Part, to delete
>>>> annotations when appropriate (line has been edited) and to avoid having
>>>> the same Annotations added twice.
>>>>
>>>> I have had some trouble with it and after several hours of trial/error,
>>>> I feel stuck (again). So if you feel able to give a hint or if you have
>>>> a best-practice for that, please, just skip reading this long mail at
>>>> any time and shout it out. I'd really appreciate any hint.
>>>>
>>>> I used org.openide.text.Annotation#attach(Annotatable) in the first
>>>> Place. (e.g. myAnnotation.attach(myLinePart))
>>>>
>>>> Main problem is to avoid duplicate Annotations (same message, same
>>>> position).
>>>>
>>>> I noticed that developers life could be very much easier, if
>>>> org.openide.text.Annotatable would provide a public method like
>>>> attachIfNotPresent(Annotatable) or getAnnotations(). The latter one to
>>>> enable the developer to check quickly if this annotation has already
>>>> been set.
>>>>
>>>> Because Annotatable manages the Annotations as a List, _and_ doesn't
>>>> provide a method to retrieve the collection of Annotations already
>>>> stored in this Annotatable, I think I'm required to manage mappings of
>>>> Line.Parts and annotations if want to avoid duplicates. This would
>>>> include listening to disposal of Documents and stuff, in order to avoid
>>>> memory leaks. I feel like I have to write a whole lot of code, just to
>>>> manage what is already managed multiple times.
>>>>
>>>> After several hours of searching and trial error, this is currently my
>>>> last approach (which doesn't work either due to the problems described
>>>> below):
>>>>
>>>> I noticed that NbEditorDocument maps Annotations to AnnotationDescs
>>>> using Annotations as keys in a HashMap. It also throws
>>>> IllegalStateExceptions when trying to "add an Annotation that has
>>>> already been added" or when trying to "remove an Annotation that has not
>>>> been added" (problem: what _is_ an Annotation that has already been
>>>> added..).
>>>>
>>>> I wanted to make use of this IllegalStateException to determine whether
>>>> an Annotation has already been set.
>>>>
>>>> Back to the problem: How would you tell if an Annotation equals another
>>>> Annotation or how would you calculate a valid and reasonable hashCode?
>>>>
>>>> AnnotationType, ShortMessage and Position should be the same. As the
>>>> offset can change, Position would be required to be an Object whose
>>>> offset-property gets updated as the position changes. So I tried to use
>>>> hashCode of Line and Line.Part before I noticed that Line.Part-Instances
>>>> will always be created freshly, not reused even if they describe the
>>>> same location.
>>>>
>>>> The original offset is not a valid criteria when comparing one
>>>> Annotation with another (that's what the hashCode is actually generated
>>>> for, remember the NbEditorDocument HashMap<Annotation,AnnotationDesc>),
>>>> nor is the current offset of a Position Instance hashable, cause this
>>>> could change the hashValue of an object that is already stored in a
>>>> HashMap, which wouldn't work either.
>>>>
>>>> I'm really stuck again. Is there any way (besides creating a big fat
>>>> Annotation-Management-Cluster) to deal with these problems?
>>>>
>>>> I'm pretty sure I missed a point.
>>>>
>>>>
>>>> Thanks in advance,
>>>>
>>>> Thomas
> 



[nbdev] how to avoid duplicate org.openide.text.Annotations

10/08/2012

[nbdev] Re: how to avoid duplicate org.openide.text.Annotations

Miloslav Metelka 10/13/2012

[nbdev] Re: how to avoid duplicate org.openide.text.Annotations

10/13/2012

[nbdev] Re: how to avoid duplicate org.openide.text.Annotations

Jaroslav Tulach 10/14/2012

[nbdev] Re: how to avoid duplicate org.openide.text.Annotations

10/15/2012

Project Features

About this Project

www was started in November 2009, is owned by jpirek, and has 21 members.
By use of this website, you agree to the NetBeans Policies and Terms of Use (revision 20140418.2d69abc). © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo
 
 
Close
loading
Please Confirm
Close