I have a Java object (Representation) that contains a HashMap of Java objects
(Property).  I'd like to be able to select only the Representations that
have a Property with a given name and value.  

The Java code for the Representation and Property classes, as well as the
accompanying Jess code that I have so far, is as follows:

------------Representation.java---------------------------

package jessexample;

import java.util.*;

public class Representation {
        private String name;
        private Map properties;
        
        public Representation(String name) {
                this.name = name;
                this.properties = new HashMap();
        }
        
        public void addProperty(Object key, Object value) {
                this.properties.put(key, value);
        }
        
        public Object getProperty(Object key) {
                return this.properties.get(key);
        }
}

-------------Property.java------------------------------------

package jessexample;

public class Property {
        private String name;
        private String description;
        private Object value;
        
        public Property(String name, String description, Object value) {
                this.name = name;
                this.description = description;
                this.value = value;
        }

       // Getters and setters for name, description, and value fields
}

-----------Jess code-----------------

(deftemplate representation
   (slot name
      (type STRING))
   (slot object))

(import jessexample.*)
        
; Create a new Representation object called repA, and add an
example-property whose value is 1
(bind ?repA (new Representation "repA"))
(bind ?example-property-A (new Property "example-property" "an example
property" 1))
(?repA addProperty "example-property" ?example-property-A)
(assert (representation (name "repA") (object ?repA)))

; Create a new Representation object called repB, and add an
example-property whose value is 0
(bind ?repB (new Representation "repB"))
(bind ?example-property-B (new Property "example-property" "an example
property" 0))
(?repB addProperty "example-property" ?example-property-B)
(assert (representation (name "repB") (object ?repB)))

; Now check for all representations that have example-property whose value
is 1
(defrule check-example-property
    (representation (name ?name) (object ?object))
    ;;;;;;; not sure what should go here - the following doesn't seem to be
valid ;;;
    (bind ?thisObject (?object getProperty "example-property"))
    (bind ?thisPropValue (?thisObject getValue))
    (test (eq ?thisPropValue 1))
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    =>
    (printout t "Representation " ?name " has example-property whose value =
1" crlf)
)

Thanks!


Ernest Friedman-Hill wrote:
> 
> What I gave below certainly works within a rule -- can you describe  
> to me the specific scenario you're trying to work out?
> 
> On Sep 27, 2007, at 5:53 PM, marthawashington wrote:
> 
>>
>> I have a similar question regarding accessing Java collections from  
>> Jess.
>> How do you do this from inside a rule?  I've read through the book and
>> searched the forum but unfortunately am still not clear on this.
>>
>> Thanks!
>>
>>
>> Ernest Friedman-Hill wrote:
>>>
>>> You deal with Java objects from Jess the same way you deal with them
>>> from Java. There is no special syntax for dealing with collections --
>>> you just call the Java methods. To call a method "y" on a Java object
>>> in variable ?x with argument "z", you write
>>>
>>> (?x y "z")
>>>
>>> Here you want to call "get" on the ArrayList to get an element, and
>>> "getValue" on the result; it looks like
>>>
>>> (bind ?theObject (?arraylist get 1))
>>> (?theObject getValue "value1")
>>>
>>> of course you can eliminate the extra variable ?theObject and write
>>>
>>> ((?arraylist get 1) getValue "value1")
>>>
>>> Now, I'm a tiny bit concerned that you didn't actually mean
>>> "ArrayList" but rather "array" in your original post; which is it?
>>>
>>>
>>> On Sep 26, 2007, at 3:15 PM, Andrew Meng wrote:
>>>
>>>> Hello,
>>>>
>>>> I have a java arraylist collection declared in Jess. In a rule's
>>>> defination, I want to get some value from a  object contained in
>>>> arraylist. like,
>>>> (> arraylist[1].getValue("value1")    arraylist[0].getValue
>>>> ("value2") )
>>>>
>>>> Can anyone tell me what is the right way to do it in Jess?
>>>>
>>>> Thanks a lot in advance!
>>>> Andrew
>>>>
>>>> Discover the new Windows Vista Learn more!
>>>
>>> ---------------------------------------------------------
>>> Ernest Friedman-Hill
>>> Advanced Software Research          Phone: (925) 294-2154
>>> Sandia National Labs                FAX:   (925) 294-2234
>>> PO Box 969, MS 9012                 [EMAIL PROTECTED]
>>> Livermore, CA 94550                 http://www.jessrules.com
>>>
>>> --------------------------------------------------------------------
>>> To unsubscribe, send the words 'unsubscribe jess-users  
>>> [EMAIL PROTECTED]'
>>> in the BODY of a message to [EMAIL PROTECTED], NOT to the list
>>> (use your own address!) List problems? Notify owner-jess- 
>>> [EMAIL PROTECTED]
>>> --------------------------------------------------------------------
>>>
>>>
>>>
>>
>> -- 
>> View this message in context: http://www.nabble.com/JESS%3A-How-to- 
>> access-info-in-a-objects-cotained-in-a-arraylist.- 
>> tf4524484.html#a12931035
>> Sent from the Jess mailing list archive at Nabble.com.
>>
>> --------------------------------------------------------------------
>> To unsubscribe, send the words 'unsubscribe jess-users  
>> [EMAIL PROTECTED]'
>> in the BODY of a message to [EMAIL PROTECTED], NOT to the list
>> (use your own address!) List problems? Notify owner-jess- 
>> [EMAIL PROTECTED]
>> --------------------------------------------------------------------
> 
> ---------------------------------------------------------
> Ernest Friedman-Hill
> Advanced Software Research          Phone: (925) 294-2154
> Sandia National Labs                FAX:   (925) 294-2234
> PO Box 969, MS 9012                 [EMAIL PROTECTED]
> Livermore, CA 94550                 http://www.jessrules.com
> 
> --------------------------------------------------------------------
> To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
> in the BODY of a message to [EMAIL PROTECTED], NOT to the list
> (use your own address!) List problems? Notify [EMAIL PROTECTED]
> --------------------------------------------------------------------
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/JESS%3A-How-to-access-info-in-a-objects-cotained-in-a-arraylist.-tf4524484.html#a12943509
Sent from the Jess mailing list archive at Nabble.com.

--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------

Reply via email to