Java syntax like "DefaultEdge.class" is (more or less) just syntactic sugar for 
'java.lang.Class.forName("org.jgrapht.graph.DefaultEdge");' which in Jess will 
come out like "(Class.forName org.jgrapht.graph.DefaultEdge)"  (taking 
advantage of the default static imports from the java.lang package.) So you 
want to do something like

    (bind ?edge-class (Class.forName org.jgrapht.graph.DefaultEdge))
    (bind ?graph (new org.jgrapht.graph.DefaultDirectedGraph ?edge-class))

From: owner-jess-us...@sandia.gov [mailto:owner-jess-us...@sandia.gov] On 
Behalf Of Aurélien Mazurie
Sent: Wednesday, August 07, 2013 7:11 PM
To: jess-users
Subject: JESS: [EXTERNAL] Issue with static methods (or generics?)

Dear Jess users,
I am having trouble instantiating a Java class from within a rule's RHS, and 
cannot figure out how to solve this problem.

The code in my RHS creates an instance of a class from the JGraphT library. As 
seen in  
https://github.com/jgrapht/jgrapht/blob/master/jgrapht-demo/src/main/java/org/jgrapht/demo/HelloJGraphT.java
 (lines 91-92), the creation of a DefaultDirectedGraph instance require another 
class as argument; here, DefaultEdge.

I couldn't find an example in the Jess documentation about how to do that. For 
example, I tried the following:

            (bind ?edge-class org.jgrapht.graph.DefaultEdge)
            (bind ?graph (new org.jgrapht.graph.DefaultDirectedGraph 
?edge-class))

I also tried variations such as

            (bind ?edge-class org.jgrapht.graph.DefaultEdge)
            (bind ?graph (new org.jgrapht.graph.DefaultDirectedGraph 
(?edge-class getClass))

or

            (bind ?edge-class (new org.jgrapht.graph.DefaultEdge))
            (bind ?graph (new org.jgrapht.graph.DefaultDirectedGraph 
?edge-class))

Any idea about what the syntax should be to properly instantiate the 
DefaultDirectedGraph class? For information (but not certain how relevant it is 
here), I succeeded in the past in using java.util.regex.Pattern and its static 
method 'compile' by typing

            (bind ?pattern-class java.util.regex.Pattern)
            (bind ?matches ((?pattern-class compile "...") matcher ?string))

Best,
Aurélien

Reply via email to