faizel commented on pull request #421:
URL: https://github.com/apache/cayenne/pull/421#issuecomment-625968759


   @stariy95 I am able to provide an explicit option for specifying an external 
tool via `CgenConfiguration`, however in order to make it usable in 
'ClassGenerationAction' without using any system properties, I have to defer 
the creation of the velocity context until it is needed because the needed 
configuration option is not available to `ClassGenerationAction` in time. It is 
needed in the constructor, however the configuration is not supplied until 
after the constructor is invoked (in `DefaultClassGenerationActionFactory`). 
This means I have to delay the velocity context creation in 
`ClassGenerationAction` until the `resetContextForArtifact(Artifact)` method is 
called. It works, but it obviously introduces a risk.
   
   There are a couple of alternatives to this approach, but both have trade 
offs:
   
   1. Add `CgenConfiguration` as a parameter to `ClassGenerationAction`’s 
constructor and alter the `DefaultClassGenerationActionFactory` to supply the 
configuration during construction. That would allow the velocity context to be 
created where it currently is, in `ClassGenerationAction`’s constructor. This 
results in an API change for `ClassGenerationAction`'s constructor, however the 
constructor is only called from the `DefaultClassGenerationActionFactory` (the 
`CgenConfiguration` is already passed in to its `createAction` factory method 
as an argument). It would be a simple change to instantiate the action with the 
cgen configuration as argument rather than setting it immediately afterwards. 
Regardless, this may not be a desirable approach due to API change.
   
   2. The other alternative is to leave all the code in `ClassGenerationAction` 
unchanged, and instead explicitly set **only** the `org.apache.velocity.tools` 
system property in the maven plugin if the `externalToolConfig` configuration 
is set. Obviously, this means that it would have to set a system property, 
however the upside is that it is limited in scope to the maven plugin and only 
one specific system property is set. The existing cgen code is unchanged (with 
the exception of CgenConfiguration of course).
   
   I would appreciate your thoughts on this as I don’t want to commit something 
that goes against your vision for Cayenne. My personal preference is for 
alternative 2, however I understand that is an approach you were trying to 
avoid. After that, I would prefer the scheme of lazily creating the context.  
If none of the three options is suitable, then I have no problem shelving this 
and maintaining something locally in my own project.


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to