Thanks very much for that help! It seems very simple now, but I couldn't figure the problem was coming from their, so I kept altering and testing the casting statment as opposed to checking the problem. I didn't see that. The sample program uses the Set.add() to add things to orderItems to orders, but it does it on a different statement and doesnt use the returned boolean. It sure makes a lot of sense now!! I actually have been constructing this piece by piece, I thought I was almost done. I already had completed all the simpler classes by themselves and tested them and they were working. The last demo database class Iis the one I have been really stuck on. Even still after fixing that, after I run the program Im not getting the value of the file permission though, only the location of it. I can't understand why this is happening. Ill just repost the code. At the end of the code I posted is the results of running the program. Any help about how to fix this, or ev en about things I should be doing to better trouble shoot the problem wouldbe very much appreciated.
import java.util.ArrayList; import java.util.Collection; public interface Database { public Collection getFiles(); public Profile getProfile(int profileNumber); } import java.util.Iterator; import jess.JessException; public class Demo { public static void main(String[] args) { try { DemoDatabase database = new DemoDatabase(); UserAccessEngine engine = new UserAccessEngine(database); processRole(database, engine, 1); processRole(database, engine, 2); processRole(database, engine, 3); processRole(database, engine, 4); } catch (JessException e) { e.printStackTrace(); } } private static void processRole(DemoDatabase database, UserAccessEngine engine, int aID) throws JessException { //Iterator files, prints out a message prior to getting the needed info Iterator roles; System.out.println("First and Last Name of User " + aID + ":"); String firstName = database.getProfile(aID).getfirst(); String lastName = database.getProfile(aID).getlast(); System.out.println(firstName + " " + lastName); roles = engine.run(aID); System.out.println("Roles for " + firstName + ":"); while (roles.hasNext()) { System.out.println(" " + roles.next()); } System.out.println(); } } import java.util.ArrayList; import java.util.Map; import java.util.Collection; import java.util.HashMap; /** * A toy implementation of the Database interface with some * hard-coded file and profile data. */ public class DemoDatabase implements Database { private ArrayList files; private Profile profile; private Map profiles; public DemoDatabase() { createFiles(); createProfiles(); } private void createProfiles() { profiles = new HashMap(); ArrayList userProfiles = new ArrayList(); profiles.put(new Integer(1), userProfiles.add(new Profile(1, "Mike", "Artz"))); profiles.put(new Integer(2), userProfiles.add(new Profile(2, "Suzy", "Kolber"))); profiles.put(new Integer(3), userProfiles.add(new Profile(3, "Stan", "Mikita"))); profiles.put(new Integer(4), userProfiles.add(new Profile(4, "Nikita", "Kruschev"))); } private void createFiles() { files = new ArrayList(); files.add(new FileRead("Mike", "Artz", "file.txt", 1)); files.add(new FileRead("Tom", "Saywer", "picOfYourMom.jpg", 5)); files.add(new FileRead("Chris", "Webber", "NBAJAMS.exe", 6)); } public Collection getFiles() { return files; } public Profile getProfile(int profileNumber) { //return new Profile(1, "Mike", "Artz"); return (Profile)profiles.get(new Integer(profileNumber)); } } public class FilePermission { private String fileName; private int profileNum; private String last; private String first; private String role; public FilePermission(String aFileName, int aProfileNum, String aLast, String aFirst, String aRole) { last = aLast; first = aFirst; fileName = aFileName; profileNum = aProfileNum; role = aRole; } public String getfileName() { return fileName; } public int getprofileNum() { return profileNum; } public String getlast() { return last; } public String getfirst() { return first; } public String getrole() { return role; } } public class FileRead { private String ownerFirst; private String ownerLast; private String file; private int ownerID; public FileRead(String aFirst, String aLast, String aFile, int aOwnerID) { ownerFirst = aLast; ownerLast = aFirst; file = aFile; ownerID = aOwnerID; } public String getownerFirst() { return ownerFirst; } public String getownerLast() { return ownerLast; } public String getFile() { return file; } public int getownerID() { return ownerID; } } public class Profile { private String last; private String first; private int idNum; public Profile(int aID, String aFirst, String aLast) { idNum = aID; last = aLast; first = aFirst; } public String getlast() { return last; } public String getfirst() { return first; } public int getidNum() { return idNum; } } import jess.*; import java.util.Iterator; public class UserAccessEngine { private Rete engine; private WorkingMemoryMarker marker; private Database database; public UserAccessEngine(Database aDatabase) throws JessException { // Create a Jess rule engine engine = new Rete(); engine.reset(); // Load the user access rules engine.batch("C:\\Users\\Michael\\workspace\\JessUserAccess\\lib\\users.clp"); // Load the user access data into working memory database = aDatabase; engine.addAll(database.getFiles()); // Mark end of user access data for later marker = engine.mark(); } private void loadOrderData(int profileNumber) throws JessException { // Retrive the profile from the database Profile profile = database.getProfile(profileNumber); if (profile != null) { // Add the profile to working memory engine.add(profile); } } public Iterator run(int profileNumber) throws JessException { // Remove any previous user access data, leaving only catalog data engine.resetToMark(marker); // Load data for this profile loadOrderData(profileNumber); // Fire the rules that apply to this profile engine.run(); // Return the list of roles created by the rules return engine.getObjects(new Filter.ByClass(FilePermission.class)); } } THIS IS MY JESS FILE ;; First define templates for the model classes so we can use them ;; in our user access rules. This doesn't create any model objects -- ;; it just tells Jess to examine the classes and set up templates ;; using their properties (import C:.Users.Michael.workspace.JessUserAccess.src*) ;; (deftemplate FilePermission (declare (from-class ;; FilePermission))) (deftemplate FileRead (declare (from-class FileRead))) (deftemplate Profile (declare (from-class Profile))) ;; Now define the user access rules themselves. Each rule matches a set ;; of conditions and then creates a Role object to represent a ;; role that user has on a file. The rules assume that ;; there will be just one User, along with all the Files. (defglobal ?*read-write* = read-write) (defglobal ?*read* = read) (defrule owner-role "Give a user the read-write role if he or she is the owner of the file." (FileRead (ownerFirst ?ownerFirst)(ownerLast ?ownerLast)(file ?file)(ownerID ID?)) (Profile(first ?ownerFirst)(last ?ownerLast) (idNum ?ID)) => (add (new FilePermission ?file ?ID ?ownerLast ?ownerFirst ?*read-write*))) (defrule read-role "Give a user the read role if he or she is not the owner of the file." (FileRead (ownerFirst ?ownerFirst)(ownerLast ?ownerLast)(file ?file) (ownerID ?ID)) (Profile(first ?First)(last ?Last) (idNum ?idNum)) => (add (new FilePermission ?file ?idNum ?Last ?First ?*read*))) First and Last Name of User 1: Mike Artz Roles for Mike: filepermiss...@186db54 filepermiss...@a97b0b filepermiss...@cd2c3c First and Last Name of User 2: Suzy Kolber Roles for Suzy: filepermiss...@506411 filepermiss...@1d99a4d filepermiss...@56a499 First and Last Name of User 3: Stan Mikita Roles for Stan: filepermiss...@1e859c0 filepermiss...@c9ba38 filepermiss...@1e0be38 First and Last Name of User 4: Nikita Kruschev Roles for Nikita: filepermiss...@1430b5c filepermiss...@1aaa14a filepermiss...@7a84e4 > From: ejfr...@sandia.gov > To: jess-users@sandia.gov > Subject: Re: JESS: Jess Access Control > Date: Fri, 7 Jan 2011 20:30:00 -0500 > > > On Jan 7, 2011, at 8:06 PM, Michael Eugene Artz wrote: > > It's a casting error but it doesn't make any sense to me why I > > would be getting that. > > userProfiles is a java.util.Set. The method Set.add() returns boolean > (true means the add() succeeded, false means the object was already in > the set.) So here you're mapping Integer to Boolean. > > > > profiles.put(new Integer(1), userProfiles.add(new Profile(1, > > "Mike", "Artz"))); > > profiles.put(new Integer(2), userProfiles.add(new Profile(2, > > "Suzy", "Kolber"))); > > profiles.put(new Integer(3), userProfiles.add(new Profile(3, > > "Stan", "Mikita"))); > > profiles.put(new Integer(4), userProfiles.add(new Profile(4, > > "Nikita", "Kruschev"))); > > > > Here you're assuming that the values in profiles are Profile objects, > but as we said, they're Booleans. > > > > public Profile getProfile(int profileNumber) > > { > > //return new Profile(1, "Mike", "Artz"); > > return (Profile)profiles.get(new Integer(profileNumber)); > > } > > > > Which is what the error says: the values are Booleans, not Profiles. > The trace tells you exactly what line causes the errors, so a > println() or two would have easily told you the whole story. > > > > java.lang.ClassCastException: java.lang.Boolean cannot be cast to > > Profile > > at DemoDatabase.getProfile(DemoDatabase.java:49) > > at Demo.processRole(Demo.java:31) > > at Demo.main(Demo.java:13) > > > > > > I wonder if I could this all much simpler and Im just wasting my > > time completely:( > > > > > When I assemble a large program like this, I start with a small > program that does one little thing, and I test it. I then add a little > more, and test that, and so on. At each step, I make sure all the new > code does what it's supposed to do. I keep all the test code so it can > be run at any time to verify that the program still works. That way, > you never find yourself looking at a big pile of code and wondering > where the problem is: the problem is always just in that last little > bit you just coded. > > Good luck! > > > --------------------------------------------------------- > Ernest Friedman-Hill > Informatics & Decision Sciences Phone: (925) 294-2154 > Sandia National Labs > PO Box 969, MS 9012 ejfr...@sandia.gov > Livermore, CA 94550 http://www.jessrules.com > > > > > > -------------------------------------------------------------------- > To unsubscribe, send the words 'unsubscribe jess-users y...@address.com' > in the BODY of a message to majord...@sandia.gov, NOT to the list > (use your own address!) List problems? Notify owner-jess-us...@sandia.gov. > -------------------------------------------------------------------- >