Hi Mark
It's nice to have your view on the this subject (even if it disassemble my current plan ;) )

Le 28/10/2010 18:17, Mark Proctor a écrit :
I actually want to move away from compile time generated bytecode inside
of the packages. Instead I want to move to just keeping validated
Strings that can be executed via MVEL. Additional we would use ASM to
bytecode compile often used strings at runtime.

Isn't it the role of the MVEL Optimizers (I've read they have something based on ASM) ?
BTW, are theses classes generated when rule Package are compiled ?

So I think giving you direct access to generated bytecode would be a bad
thing, it's internal and unstable and you can be sure we'll change it as
we want.

In a way, I don't care of what is inside the bytecode.
I'm only giving it to a bytecode parsing tool (aQute's Bnd) that will see what needs to be imported. So if there is some bytecode, I'm happy. if you change what code is generated, that will not affect me because Bnd will see that the imports have changed and will construct the bundle's manifest appropriately.

I only need the bytecode (and an API to get them cleanly ;) ).

What you want is to ensure that certain types are imported so Drools can
see them, right?
Yes, I want to ensure that generated classes in the bundle have all their imports/requirements fulfilled.
So instead we should be looking at some sort of
analysis tool to provide this, we sort of have this already, but it
won't be complete for your purposes but can be extended. So it tells you
want classes are used and were, and you can use the drl parser to
extract imports etc.

Can you give me some pointer(s) on what Drools currently have ?

The resouce type you suggest won't work. The generated class is just for
the consequence or some aslects of the "when" it is not the entire rule,
so in itself is not a complete resource.

Sure, a Package stores more than just the bytecode of generated stuff.
But I was thinking that if theses pre-compiled classes where already in the bundle, it was a waste of resources to also have them in the serialized Package resource...

Plus again I'd rather move
complete away from this pre-compiled concept and more to validated
strings with on the fly generation.

Usually, this is this (uncontrolled for OSGi) on-the-fly generation that cause some harms.

That said there is a need for environments like app-engine which don't
allow runtime bytecode generation and people want the perf boost of
bytecode to have fully pre-compiled rule sets.

Theses are good use cases too. Considering that OSGi "don't allow" runtime bytecode generation :)

  I would consider
something like this, where a .jar has all the pre-compiled rules. But we
are a long way from this, first we need to get an ASM rule compiler
working, that can compile a complete rule, then we can look into a full
pre-compiled ruleset.

What do you call a full pre-compiled ruleset ?
With my limited understanding, I consider an ASM compiler just like the old java compiler (it's just faster): it's another way to produce the same thing: executable bytecode. So I don't see how moving from eclipse compiler to ASM will make things better for me.


So if I want to sum up the discussion at this point we have:
* Only reflection trick to access generated bytecode
* Analysis tools may be appropriate to have some insights of what will be generated
* Rule Pre-compilation is currently not available

--G

Mark
On 26/10/2010 08:49, Guillaume Sauthier wrote:
Thanks for your answer Edson.

The reason I have is that runtime generated stuff usually don't fit well
in an OSGi model.

When you take a bundle, it has a statically defined set of "imported
packages". that means that when the bundle has been compiled, a list of
packages to be wired in at deployment time has been computed. This list
of packages if inferred from what the .class files (in the bundle)
requires to be executed (think of them as external dependencies).

Now if we generate some classes at runtime in an OSGi environment, we
can see that generated classes can have different (or additional)
requirements in terms of java packages. So usually, with OSGi, that ends
up by adding a special header called DynamicImport-Package into the
MANIFEST, with the side effects of breaking modularity :-(

This is what I want to avoid by having access to the generated classes
at the compilation phase: I can then use this bytecode (IOW giving it to
Bnd [1]) to complete the Import-Package MANIFEST header with the right
set of imported java packages.

As a second issue, less important for the moment and more runtime
oriented this time, I would like to know if/how we can add a new kind of
Resource.
Once we have generated the bytecode in the compilation phase, we can
assume that all the stuff is already here in the bundle. Why can't we
use it ?
I've seen the PKG Resource type, but it's some kind of serialization of
a whole Package, couldn't it be possible to have a new Package type (or
way to create a Package) that can use the ClassLoader to get access to
the already present bundle's resources instead of using the byte[] from
the serialized Package ?

WDYT?

Thanks
--G

[1]. http://www.aqute.biz/Code/Bnd

Le 25/10/2010 21:26, Edson Tirelli a écrit :
      Not exactly sure how helpful would it be to store the generated
bytecodes in an osgi bundle. Anyway, there is no API right now to do
that, but you can use reflection to achieve the same:

           PackageCompilationData data = pkg.getPackageCompilationData();
           Field field = PackageCompilationData.class.getDeclaredField( "store" 
);
           field.setAccessible( true );
           Map<String, byte[]>    store = (Map<String, byte[]>) field.get( data 
);

      If you can justify the need for such an API, I guess we could be
convinced to add one.

      Edson




2010/10/25 Guillaume Sauthier<[email protected]>:

Hi team

I've tried the IRC (without much success I admit), maybe here someone will
have some thoughts to share :)

I'm looking for a way to "intercept" the classes being generated by the
drools compiler.
I've seen that the classes bytecode is stored deep in
PackageStore/JavaDialectRuntimeData, so deep that I cannot easily access it
:)
The objective is to be able to give theses classes to Bnd (I want to store
all of that in an OSGi bundle) so that appropriate Import-Packages can be
computed. That will avoid to have DynamicImport-Packages all around my
bundles :)

Currently, what I get from the drools compiler is a
Collection<KnowledgePackage>    but I have no API (or didn't find any) to
access (or know) the classes generated by the compiler.

Any ideas ?
Thanks
--Guillaume

_______________________________________________
rules-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-dev




_______________________________________________
rules-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-dev



_______________________________________________
rules-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-dev


<<attachment: guillaume_sauthier.vcf>>

_______________________________________________
rules-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-dev

Reply via email to