What if we refactor the JavaParser API to it's optimal form ? We may adopt a different
package to avoid conflict with what we got, maybe renaming to a standalone project, since
it's very useful to other projects as well, I guess.
Em 18/02/2013, às 23:44, "Lincoln Baxter, III" <lincolnbaxter(a)gmail.com>
escreveu:
I don't like it because it's not really optimal, but... I
don't really see a better way forward that doesn't break every API we have.
On Mon, Feb 18, 2013 at 9:43 PM, Lincoln Baxter, III <lincolnbaxter(a)gmail.com>
wrote:
> Well, I actually meant refactor the entire JavaParser so that the types are immutable
by default, but modifiable when desired by doing an intanceof and cast. This would, as
John said, be a fairly invasive, with a fair amount of downstream API impact, since all
users of these APIs would now need to reference these new types instead. It would mean
refactoring all of Forge.
>
> So from the perspective of Migration, it probably makes sense to do something like
add a method "isEditable()"
>
>
> On Thu, Feb 14, 2013 at 2:19 PM, Thomas Frühbeck <fruehbeck(a)aon.at> wrote:
>> If I understood Lincoln correctly, he meant adding an interface
EditableJavaSource, so no change in the existing implementations necessary.
>> So the boolean is substitutable by instanceof, your graceful error handling would
be supported.
>>
>> Am 14.02.2013 20:10, schrieb John Franey:
>>> I would follow my object-oriented instinct to agree that a
editable/non-editable parallel of the model would make sense. After all, an editable java
source is kind of a non-editable java source, and adds editing behavior.....
>>>
>>> However, the parallel model seems to be a significant undertaking, and has a
negative characteristic, in my opinion. Lets say there exists a method to search for and
return a JavaClass, editable or not. In a use case where the JavaClass is to be modified,
this method is inadequate. 1) The caller would have to check if the result is instance of
EditableJavaClass, then cast, or 2) an alternate query method would be provided to return
only EditableJavaClass and since methods cannot be overridden by return type the alternate
query method would have to be defined in a different interface. Not taht either of these
are difficult to overcome, but I think the parallel model would increase overall
complexity a little and add to the level of effort, and the benefit gained is merely type
protection against the runtime error of attempting to modify a non-editable java
component.
>>>
>>> To go against that impulse just a second, consider the option of a property
on the base class, a boolean: editable. This would avoid the parallel model, avoid
casting and support polymorphic calls. The runtime error of attempting to modify a
non-editable component can be handled in a few different ways: 1) a runtime exception, 2)
a quiet no-op. Without the editable property, I would not use a runtime exception. There
would be no chance for the forge plugin programmer to avoid the error
gracefully. With the property, the error is the programmer's and a runtime exception
could be appropriate.
>>>
>>> Regards,
>>> John
>>>
>>>
>>>
>>> On Thu, Feb 14, 2013 at 1:11 PM, Lincoln Baxter, III
<lincolnbaxter(a)gmail.com> wrote:
>>>> As I understood it, we need a way of explicitly noting when a JavaSource
instance is mutable or not. Perhaps splitting the API into a JavaSource an
EditableJavaSource parallel.
>>>>
>>>> It was also my understanding that proxies were going to be used to do
lazy-classloading for any JARs brought in via this system. I'm not sure we need to
worry about this just yet. We can get it working then think about performance
implications.
>>>>
>>>>
>>>> On Thu, Feb 14, 2013 at 12:23 PM, John Franey <jjfraney(a)gmail.com>
wrote:
>>>>> I have no intention of providing a way to modify the class definition
of a java class defined within a dependency of the user's project.
>>>>>
>>>>> Putting the question another way:
>>>>>
>>>>> To date, the forge java model today supports only modifiable java
components. This effort introduces non-modifiable java
components to the forge java model. This raises the question: Would the non-modifiable
java components be inspected with the same api that supports the
modifiable java components (JavaClass, and others). If no, what api is used to inspect
the non-modifiable java components?
>>>>>
>>>>> My naive answer is: the non-modifiable java components would be
inspected using the same api as the modifiable java components. Methods of that api that
expressly modify the java component would be inert for non-modifiable java components.
>>>>>
>>>>> John
>>>>>
>>>>>
>>>>>
>>>>> On Thu, Feb 14, 2013 at 12:05 PM, Thomas Frühbeck
<fruehbeck(a)aon.at> wrote:
>>>>>> Hmm, I expect loading of JARs not to the problem, is it? So the
loading and reflecting on the "external" class should be possible.
>>>>>> I was thinking of the next step, implementing kind of writable
JavaClass not just ignoring the changes, but making the modified class available to the
project.
>>>>>> Sorry if I misunderstood your quest? =)
>>>>>>
>>>>>> Thomas
>>>>>>
>>>>>> Am 14.02.2013 17:37, schrieb John Franey:
>>>>>>> Thomas,
>>>>>>>
>>>>>>> I have minimal exposure
to proxy due to experience with hibernate, but my understanding is not adequate to
understand how they would apply. Do I understand correctly that the benefit of a dynamic
proxy is high when a temporary class implementation is needed, and when a method of the
proxy is invoked, some action is taken, perhaps instantiating another implementation of
the interface. In this use case, we don't need to invoke the methods of a
project's class, we need to inspect the methods (and other members) of the class,
right?
>>>>>>>
>>>>>>> John
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Feb 14, 2013 at 11:22 AM, Thomas Frühbeck
<fruehbeck(a)aon.at> wrote:
>>>>>>>> exactly what I was looking for :-))
>>>>>>>> Thanks George!
>>>>>>>>
>>>>>>>> Am 14.02.2013 16:55,
schrieb George Gastaldi:
>>>>>>>>> Hi Thomas,
>>>>>>>>>
>>>>>>>>> Have a look in Forge 2.0 source code. We're using
javassist at it's best in the proxy module
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Em 14/02/2013, às 13:53, Thomas Frühbeck
<fruehbeck(a)aon.at>
escreveu:
>>>>>>>>>
>>>>>>>>>> Hi John,
>>>>>>>>>>
>>>>>>>>>> my two cents:
>>>>>>>>>> - this feature is a
must-have, if Forge should be more than a tool to
iniitialize projects, really great idea
>>>>>>>>>> - being pragmatic I would say this calls for
proxy classes, similar to CDI decorators or the copy-on-write strategy
>>>>>>>>>>
>>>>>>>>>> (AFAIK the downside to CDI decorators is that
they need interfaces on the base classes, thus again
requiring changes of the classes if they hadnt been designed for it
firstplace.)
>>>>>>>>>>
>>>>>>>>>> I have a very similar
problem I am currently trying to solve with silly wrapper
classes and was starting to think about dynamic proxy generation - unfortunately I have
_no_ experience with such technology other than being simple user :-/
>>>>>>>>>>
>>>>>>>>>> Have you thought about javassist? Is it an option
at all?
>>>>>>>>>>
>>>>>>>>>> Thomas
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Am 14.02.2013 16:21, schrieb John Franey:
>>>>>>>>>>> My motivation for this email is to satisfy
FORGE-773. However, this is also related to FORGE-563 and FORGE-424, and resolution could
enable other features.
>>>>>>>>>>>
>>>>>>>>>>> I have written a prototype:
>>>>>>>>>>> 1) an implementation of the forge java api
interfaces which delegates to java's
reflection, offering a read only perspective of java
components.
>>>>>>>>>>> 2) a forge module,
currently a facet, to search for a given binary class in
the project's dependencies and returns the result wrapped in the above delegate.
>>>>>>>>>>>
>>>>>>>>>>> These are demonstrable in a unit test.
>>>>>>>>>>>
>>>>>>>>>>> My dilemma now is how to integrate
these into the forge project. There are a
few different areas, but
I'll start with this:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> For some callers, a java class is a java
class, whether it originates as source code (from the current forge project) or is a class
from the dependency set. For example, scaffolding primarily is a read only operation. In
this use case, it would be
simpler for these clients to have a single interface to resolve
classes because whether a class is
source or binary is not relevant to the use case.
>>>>>>>>>>>
>>>>>>>>>>> On the other hand,
there is a set of classes in a user's
project that are modifiable. In these cases, a
java class is not a java class. Forge components might want the distinction somehow.
There ought the be some
distinction of which class is modifiable and which is not.
>>>>>>>>>>>
>>>>>>>>>>> Naively, I took the
first thinking that the existing forge java model would be
adequate. To have separate java api for read-only and read-write java model objects seems
a fundamental addition to the java model which requires much more effort. In absence of
such a model, I though to
implement 'no-op' for those code changing methods
(e.g., Named.setName()
would be inert). I assumed that forge component that change source code
would have necessary context to
know when it is operating on a source code module, avoiding attempts to modify a binary
class.
>>>>>>>>>>>
>>>>>>>>>>> So, I'm looking for
discussion and consensus on the above. Any
thoughts?
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> John
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
_______________________________________________
>>>>>>>>>>> forge-dev mailing list
>>>>>>>>>>> forge-dev(a)lists.jboss.org
>>>>>>>>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>>>>>>>> _______________________________________________
>>>>>>>>>> forge-dev mailing list
>>>>>>>>>> forge-dev(a)lists.jboss.org
>>>>>>>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> forge-dev mailing list
>>>>>>>>> forge-dev(a)lists.jboss.org
>>>>>>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> forge-dev mailing list
>>>>>>>> forge-dev(a)lists.jboss.org
>>>>>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> forge-dev mailing list
>>>>>>> forge-dev(a)lists.jboss.org
>>>>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> forge-dev mailing list
>>>>>> forge-dev(a)lists.jboss.org
>>>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> forge-dev mailing list
>>>>> forge-dev(a)lists.jboss.org
>>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>>
>>>>
>>>>
>>>> --
>>>> Lincoln Baxter, III
>>>>
http://ocpsoft.org
>>>> "Simpler is better."
>>>>
>>>> _______________________________________________
>>>> forge-dev mailing list
>>>> forge-dev(a)lists.jboss.org
>>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>>
>>>
>>>
>>> _______________________________________________
>>> forge-dev mailing list
>>> forge-dev(a)lists.jboss.org
>>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>>
>>
>> _______________________________________________
>> forge-dev mailing list
>> forge-dev(a)lists.jboss.org
>>
https://lists.jboss.org/mailman/listinfo/forge-dev
>
>
>
> --
> Lincoln Baxter, III
>
http://ocpsoft.org
> "Simpler is better."
--
Lincoln Baxter, III
http://ocpsoft.org
"Simpler is better."
_______________________________________________
forge-dev mailing list
forge-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/forge-dev