Hey John,
Do you have any if it's plausible to throw together a prototype using the
JavaCore binary functionality? How much do you think it would take? Is that
something you're interested in?
I think (based on some discussion,) that most people are OK with creating
an "isEditable()" method for Forge 1, and doing some good ol'fashioned
refactoring for Forge 2!
Thoughts?
~Lincoln
On Fri, Feb 22, 2013 at 10:14 AM, <ggastald(a)redhat.com> wrote:
Hi !
This seems like a good way to go.
I've updated the JIRA in
https://issues.jboss.org/browse/FORGE-795 with
this info.
Thanks !
On 02/22/2013 12:01 PM, John Franey wrote:
Yes. AST is a component of javacore, but javacore is more than AST. So,
it would be more accurate to say: forge already uses a subset of JDT, the
ast parser. Here is a short tutorial:
http://www.vogella.com/articles/EclipseJDT/article.html
JavaCore's features seems to be a union of forge's source code features,
and the class inspection features (either from reflection or javaassit),
and JavaCore component has very close proximity to the eclipse AST parser
already put to use by forge, and assuming the requirements of forge java
plugin can be met by eclipse javacore, and, I think I read somewhere, there
is prototype to integrate forge into eclipse, and also, the forge team is
open to refactoring the forge java model. It is my opinion, that a more
than a casual look into javacore, as either the implementation of, or a
replacement to, the forge java model api, is reasonable.
Here is the javacore project page:
http://www.eclipse.org/jdt/core/index.php
Here is the javacore api pages:
http://help.eclipse.org/juno/index.jsp?topic=/org.eclipse.jdt.doc.isv/ref...
On Fri, Feb 22, 2013 at 12:30 AM, Lincoln Baxter, III <
lincolnbaxter(a)gmail.com> wrote:
> The Forge JavaParser already uses JDT :) I think we are talking about the
> same thing. We haven't looked at the compilation stuff yet, that's actually
> an interesting idea.
>
>
> On Fri, Feb 22, 2013 at 12:28 AM, Lincoln Baxter, III <
> lincolnbaxter(a)gmail.com> wrote:
>
>> Wait, JavaCore is or is not related to JDT?
>>
>>
>> On Thu, Feb 21, 2013 at 7:18 PM, John Franey <jjfraney(a)gmail.com> wrote:
>>
>>> Apache bcel hasn't had a release since 2006. I'm wondering if the
>>> class file format has moved on beyond bcel's reach. Its last official
>>> release is 5.2 in Feb 2006. Java 1.6 was released in December 2006, and
>>> nothing new from bcel project. Java 1.7 in 2011, and still silence. I
>>> wonder if it can support later class file formats somehow.
>>>
>>> javassist's latest release is December 2012 and seems to have jboss
>>> backing. Seems a safe choice on the face of it.
>>>
>>> Then, there is eclipse JavaCore. I wonder if JavaCore can be used
>>> without an eclipse workbench. If so, JavaCore can provide a single api for
>>> both source and binary classes, so it could replace the forge java source
>>> parser, too. I also wonder if forge could be a headless eclipse
>>> application - imagine the eclipse plugins available via forge's command
>>> line shell.
>>>
>>>
>>>
>>> On Thu, Feb 21, 2013 at 6:30 PM, Lincoln Baxter, III <
>>> lincolnbaxter(a)gmail.com> wrote:
>>>
>>>> What about something like this?
>>>>
>>>>
https://issues.jboss.org/browse/FORGE-795
>>>>
https://issues.jboss.org/browse/FORGE-796
>>>>
>>>>
>>>> On Wed, Feb 20, 2013 at 11:11 AM, Lincoln Baxter, III <
>>>> lincolnbaxter(a)gmail.com> wrote:
>>>>
>>>>> Hmm... I'm not sure. I think it would probably still be slightly
>>>>> misleading to have mutable interfaces for immutable objects, without
some
>>>>> kind of indicator. For instance, if someone were to pass the object
beyond
>>>>> its "intended" scope.
>>>>>
>>>>>
>>>>> On Tue, Feb 19, 2013 at 7:41 PM, John Franey
<jjfraney(a)gmail.com>wrote:
>>>>>
>>>>>> Thinking out loud, would isEditable still be needed if there were
a
>>>>>> lookup that returned only editable java resources, and another
query that
>>>>>> could return both binary and source resources? Plugins that
operate as
>>>>>> editors would use the former to find resources it knows it will
edit, and
>>>>>> will use the latter in order to inspect other classes (to resolve
super
>>>>>> class or throws declarations). Plugins that operate as readers
(like
>>>>>> scaffold plugins) would use only the latter. Hmm...even with
isEditable,
>>>>>> does it make sense to have these two kinds of methods?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Mon, Feb 18, 2013 at 9:43 PM, Lincoln Baxter, III <
>>>>>> lincolnbaxter(a)gmail.com> wrote:
>>>>>>
>>>>>>> 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
listforge-dev@lists.jboss.orghttps://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
listforge-dev@lists.jboss.orghttps://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
listforge-dev@lists.jboss.orghttps://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
listforge-dev@lists.jboss.orghttps://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
>>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> 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
>>>>
>>>
>>>
>>> _______________________________________________
>>> 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
>
_______________________________________________
forge-dev mailing
listforge-dev@lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/forge-dev
--
*George Gastaldi* | *Senior Software Engineer*
JBoss Forge Team
Red Hat
_______________________________________________
forge-dev mailing list
forge-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/forge-dev