[Glass] Can I plug a custom transcript proxy for one closure execution?
Dale Henrichs via Glass
glass at lists.gemtalksystems.com
Mon Aug 10 09:46:14 PDT 2015
On 08/10/2015 05:23 AM, Mariano Martinez Peck wrote:
>
> On Fri, Aug 7, 2015 at 5:50 PM, Dale Henrichs via Glass
> <glass at lists.gemtalksystems.com
> <mailto:glass at lists.gemtalksystems.com>> wrote:
>
> On 08/07/2015 01:09 PM, Mariano Martinez Peck via Glass wrote:
>> I think what I need is impossible to do...
>>
>> btw...*there is no way I can add a symbol dictionary to the
>> symbolList of the current user but only for the scope of the
>> running gem?*
> There are two symbol lists for a session available:
>
> GsSession currentSession userProfile symbolList. "persistent
> symbolList"
> GsSession currentSession symbolList. "transient copy of user's
> symbolList"
>
> Changes made to the transient copy of the symbolList are not
> persisted on a commit.
>
>
> Hi Dale,
>
> Having a transient version of the symbolList for inside the gem is a
> brilliant idea!!! Thanks to whoever thought about that :)
>
>> I know if I don't commit my changes will be only for current
>> session. But my background processes DO commit and so they would
>> also commit this change.
> It occurs to me that there is an alternate solution. in 3.x, there
> are two method dictionaries associated with a class: a
> persistentMethodDict and a transientMethodDict. methods stashed in
> the transientMethodDict override those methods in the
> persistentMethodDict, but the transientMethodDict is not persisted
> and is session specific ...
>
> So, if you arranged to compile a new version of TranscriptProxy
> class>>show: into the transientMethodDict, then you could
> effectively change the behavior for just the session even in the
> presence of commits.
>
> For 3.3 I've created a set of methods that make if easy to install
> and remove individual transient methods, but to be honest there is
> some fairly convoluted logic involved and I'm not sure that the
> code would translate straight from 3.3 to 3.1.0.6 without some
> work ...
>
>
>
> OK...yes, i searched how I could install a transient compiled method
> that would override the behavior of the persistent one but I found no
> way in 3.1.0.6. So...I think I will leave with the override...
> (continue below)
>
>
> Hmmmmmmm,
>
> Perhaps if you changed the method to be something like the following:
>
> show: anObject
> | proxy |
> (ObjectLogEntry transcript: anObject printString object:
> anObject) addToLog.
> (proxy := self proxyTranscript) ~~ nil
> ifTrue: [ proxy show: anObject ]
> ifFalse: [
> (GsSession currentSession symbolList objectNamed:
> #SkipLogging)
> ifNotNil: [ GsFile gciLogServer: '--transcript--' ,
> anObject printString ] ]
>
> And then in the gems where you want to skip tranlogging for the
> session, you do the following:
>
> | skipLoggingDict symbolList |
> skipLoggingDict := SymbolDictionary new.
> skipLoggingDict at: #'SkipLogging' put: Object new.
> symbolList := GsSession currentSession symbolList.
> symbolList add: skipLoggingDict before: UserGlobals
>
> This code defines #'SkipLogging' in the transient symbol list so
> it is safe to commit ...
>
>
> Thanks Dale. That works perfectly. Of course, to avoid the override of
> #show: I tried my own subclass and I tried to do:
>
> skipLoggingDict at: #'Transcript' put: MyProxyTranscriptSubclass.
> And of course, that doesn't work because I imagine all compiled
> methods that were already compiled have an association pointing back
> to the persistent user globals rather than my modified transient one.
> So yeah, a solution would be installing a transient compiled method in
> TranscriptProxy class. But if you say that this is complicated for
> 3.1.0.6, I think i can live with the override.
>
> BTW Dale, do you think we should add this in the real TranscriptProxy?
> If true, let me know and I can open an issue. This is the code:
>
> TranscriptProxy class >> show: anObject
> | proxy |
> *(GsSession currentSession symbolList objectNamed:
> #SkipObjectLogLogging) *
> ifNil: [ (ObjectLogEntry transcript: anObject printString object:
> anObject) addToLog ].
> (proxy := self proxyTranscript) ~~ nil
> ifTrue: [ proxy show: anObject ]
> ifFalse: [
> *(GsSession currentSession symbolList objectNamed:
> #SkipGemLogFileLogging) *
> ifNil: [ GsFile gciLogServer: '--transcript--' , anObject
> printString ] ]
>
>
> And an example of usage:
>
> | skipLoggingDict symbolList |
> skipLoggingDict := SymbolDictionary new.
> * skipLoggingDict at: #'SkipObjectLogLogging' put: Object new.*
> symbolList := GsSession currentSession symbolList.
> symbolList add: skipLoggingDict before: UserGlobals.
>
Sounds good...
Dale
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20150810/8e8412a2/attachment.html>
More information about the Glass
mailing list