Yeah, this gets a little tricky.. i.e. what do you ignore if you get to
level 2/3 of the graph, how do you specify what gets ignore there...?

Or should we only be concerned for the top level?

Mark

On Sat, Jun 20, 2009 at 11:07 AM, whostheJBoss
<dotfus...@changethings.org>wrote:

>
> Hmm, would composition still work for a single class? Maybe a flag
> list of both compositions and individual classes to ignore? Thanks
> Mark!
>
> On Jun 19, 5:45 pm, Mark Mandel <mark.man...@gmail.com> wrote:
> > Would you want to do it via the name of the class.. or would you prefer
> to
> > ignore by the name of the composition?
> >
> > Mark
> >
> > On Sat, Jun 20, 2009 at 3:36 AM, whostheJBoss <
> dotfus...@changethings.org>wrote:
> >
> >
> >
> > > Well, I had wanted to be able to do this with all my deletes by
> > > default so I would be able to cascade delete and provide a list of
> > > objects to ignore without writing custom methods to loop and drill
> > > through all of the objects. Anyway, I hacked up the change myself if
> > > anyone is interested in actually adding it to Transfer.
> >
> > > The changes are below (comments are provided where there changes are,
> > > I only provided snippets showing the portion of the code that contains
> > > changes). I'm sure I could have put the skip list in the visitingargs,
> > > but I didn't delve that deeply into it. This works as expected though.
> > > You call cascadeDelete with an additional argument, which is a comma-
> > > delimited list of objects to ignore.
> >
> > > I call it this way:
> >
> > >                deleteThis = instance.Transfer.get("users.posts",
> > > arguments.postID);
> > >                cdArgs = structNew();
> > >                cdArgs.transfer = deleteThis;
> > >                cdArgs.skip = "users.user";
> > >
>  instance.Transfer.cascadeDelete(argumentCollection=cdArgs);
> >
> > > This deletes everything on both sides of the post except the
> > > users.user object.
> >
> > > Here are the changes:
> >
> > > Transfer.cfc:
> > > ---------------------------------------------
> > > <cffunction name="cascadeDelete" hint="does a cascade down the object
> > > hierarchy, calling delete() as it goes" access="public"
> > > returntype="void" output="false">
> > >        <cfargument name="transfer" hint="The transferObject to create"
> > > type="TransferObject" required="Yes">
> > >        <cfargument name="depth" hint="the number of levels in which to
> > > cascade, 0 is unlimited" type="numeric" required="No" default="0">
> > >        <cfargument name="useTransaction" hint="deprecated: use
> > > TransferFactory.getTransaction for transaction management. Whether or
> > > not to use an internal transaction block" type="boolean" required="No"
> > > default="true">
> > >        // ******** ADDED SKIP ARGUMENT ********
> > >        <cfargument name="skip" type="string" required="No">
> >
> > > <cffunction name="visitObjectGraph" hint="visit each of the objects in
> > > the graph, calling 'visit({transfer:transferObject, visitArgs1...})'
> > > on the visitor for each TransferObject in the graph" access="public"
> > > returntype="void" output="false">
> > >        <cfargument name="transfer" hint="the starting object to visit"
> > > type="transfer.com.TransferObject" required="Yes">
> > >        <cfargument name="visitor" hint="the visitor object" type="any"
> > > required="Yes">
> > >        <cfargument name="visitingMethod" hint="the name of the method
> that
> > > is being visited" type="string" required="Yes">
> > >        <cfargument name="visitArgs" hint="visiting arguments, if there
> are
> > > any" type="struct" required="No" default="#StructNew()#">
> > >        <cfargument name="depth" hint="the max depth to go to"
> > > type="numeric"
> > > required="no" default="0">
> > >        <cfargument name="topDown" hint="travel top down, rather than
> bottom
> > > up" type="boolean" required="No" default="true">
> > >        <cfargument name="forceLoading" hint="if not loaded, force
> loading"
> > > type="boolean" required="No" default="false">
> > >        // ******** ADDED SKIP ARGUMENT ********
> > >        <cfargument name="skip" type="string" required="No">
> > > ---------------------------------------------
> >
> > > DynamicManager.cfc:
> > > ---------------------------------------------
> > > <cffunction name="visitObjectGraph" hint="visit each of the objects in
> > > the graph, calling 'visit({transfer:transferObject, visitArgs1...})'
> > > on the visitor for each TransferObject in the graph" access="public"
> > > returntype="void" output="false">
> > >        <cfargument name="transfer" hint="the starting object to visit"
> > > type="transfer.com.TransferObject" required="Yes">
> > >        <cfargument name="visitor" hint="the visitor object" type="any"
> > > required="Yes">
> > >        <cfargument name="visitingMethod" hint="the name of the method
> that
> > > is being visited" type="string" required="Yes">
> > >        <cfargument name="visitArgs" hint="visiting arguments, if there
> are
> > > any" type="struct" required="Yes">
> > >        <cfargument name="depth" hint="the max depth to go to"
> > > type="numeric"
> > > required="no" default="0">
> > >        <cfargument name="topDown" hint="travel top down, rather than
> bottom
> > > up" type="boolean" required="No" default="true">
> > >        <cfargument name="forceLoading" hint="if not loaded, force
> loading"
> > > type="boolean" required="No" default="false">
> > >        // ******** ADDED SKIP ARGUMENT ********
> > >        <cfargument name="skip" type="string" required="No">
> > > ---------------------------------------------
> >
> > > ObjectTreeWalker.cfc:
> > > ---------------------------------------------
> > > <cffunction name="visit" hint="visit each of the objects in the graph"
> > > access="public" returntype="void" output="false">
> > >        <cfargument name="transfer" hint="the starting object to visit"
> > > type="transfer.com.TransferObject" required="Yes">
> > >        <cfargument name="visitor" hint="the visitor object" type="any"
> > > required="Yes">
> > >        <cfargument name="visitingMethod" hint="the name of the method
> that
> > > is being visited" type="string" required="Yes">
> > >        <cfargument name="visitArgs" hint="visiting arguments, if there
> are
> > > any" type="struct" required="Yes">
> > >        <cfargument name="depth" hint="the max depth to go to"
> > > type="numeric"
> > > required="no" default="0">
> > >        <cfargument name="topDown" hint="travel top down, rather than
> bottom
> > > up" type="boolean" required="No" default="true">
> > >        <cfargument name="forceLoading" hint="if not loaded, force
> loading"
> > > type="boolean" required="No" default="false">
> > >        // ******** ADDED SKIP ARGUMENT ********
> > >        <cfargument name="skip" type="string" required="No" default="">
> >
> > >        <cfscript>
> > >                // ******** ADDED SKIP ARGUMENT AND 0 and structNew()
> for
> > > currentDepth and visitedHashs to be passed to traverse() ********
> > >                // ******** traverse() is expecting the argument after
> > > forceLoading to be depth, I supplied the default value here ********
> > >                // ******** and did the same with visitedHashs ********
> > >                traverse(arguments.transfer,
> > >                                arguments.visitor,
> > >                                arguments.visitingMethod,
> > >                                arguments.visitArgs,
> > >                                arguments.depth,
> > >                                arguments.topDown,
> > >                                arguments.forceLoading,
> > >                                0,
> > >                                structNew(),
> > >                                arguments.skip
> > >                                );
> > >        </cfscript>
> >
> > > <cffunction name="traverse" hint="traverses the object graph"
> > > access="private" returntype="void" output="false">
> > >        <cfargument name="transfer" hint="the starting object to visit"
> > > type="transfer.com.TransferObject" required="Yes">
> > >        <cfargument name="visitor" hint="the visitor object" type="any"
> > > required="Yes">
> > >        <cfargument name="visitingMethod" hint="the name of the method
> that
> > > is being visited" type="string" required="Yes">
> > >        <cfargument name="visitArgs" hint="visiting arguments, if there
> are
> > > any" type="struct" required="Yes">
> > >        <cfargument name="maxDepth" hint="the max depth to go to"
> > > type="numeric" required="yes">
> > >        <cfargument name="topDown" hint="travel top down, rather than
> bottom
> > > up" type="boolean" required="yes">
> > >        <cfargument name="forceLoading" hint="if not loaded, force
> loading"
> > > type="boolean" required="yes">
> > >        <cfargument name="currentDepth" hint="the max depth to go to"
> > > type="numeric" required="no" default="0">
> > >        <cfargument name="visitedHashs" hint="A struct of the identity
> hash
> > > codes, so we know what has been hit" type="struct" required="No"
> > > default="#StructNew()#">
> > >        // ******** ADDED SKIP ARGUMENT ********
> > >        <cfargument name="skip" type="string" required="No">
> >
> > > <cffunction name="visitTransfer" hint="visit a single object with the
> > > method that is provided" access="private" returntype="void"
> > > output="false">
> > >        <cfargument name="transfer" hint="the starting object to visit"
> > > type="transfer.com.TransferObject" required="Yes">
> > >        <cfargument name="visitor" hint="the visitor object" type="any"
> > > required="Yes">
> > >        <cfargument name="visitingMethod" hint="the name of the method
> that
> > > is being visited" type="string" required="Yes">
> > >        <cfargument name="visitArgs" hint="visiting arguments, if there
> are
> > > any" type="struct" required="Yes">
> > >        // ******** ADDED SKIP ARGUMENT ********
> > >        <cfargument name="skip" type="string" required="No">
> >
> > >        <cfscript>
> > >                arguments.visitArgs.transfer = arguments.transfer;
> > >        </cfscript>
> >
> > > // SET CLASSNAME OF OBJECT FOR CHECKING AGAINST SKIP LIST
> > > <cfif #isDefined("arguments.visitargs.transfer")#>
> > > <cfset skipThis = "#arguments.visitargs.transfer.getClassName()#">
> > > <cfelse>
> > > <cfset skipThis = "none">
> > > </cfif>
> >
> > > // ******** CHECK CLASSNAME AGAINST SKIPLIST TO ALLOW OR DENY DELETE
> > > ********
> > >        <cfscript>
> > > if (NOT isDefined("arguments.skip") or (isDefined("arguments.skip")
> > > AND listFindNoCase(arguments.skip, "#skipThis#") eq 0)) {
> > >                getMethodInvoker().invokeMethod(arguments.visitor,
> > > arguments.visitingMethod, arguments.visitArgs);
> > > }
> > >        </cfscript>
> > > </cffunction>
> >
> > > On Jun 19, 8:59 am, Chris Peterson <overrid...@gmail.com> wrote:
> > > > Why not write a decorator method to handle it, so you can
> >
> > ...
> >
> > read more ยป
> >
>


-- 
E: mark.man...@gmail.com
T: http://www.twitter.com/neurotic
W: www.compoundtheory.com

--~--~---------~--~----~------------~-------~--~----~
Before posting questions to the group please read:
http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer

You received this message because you are subscribed to the Google Groups 
"transfer-dev" group.
To post to this group, send email to transfer-dev@googlegroups.com
To unsubscribe from this group, send email to 
transfer-dev-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to