Hi, Im trying to do a simple Access control program using Jess.  Everything 
pretty much shadows the Pricing example that comes with Jess.  I changed only a 
few variable names and modified a couple of the parts that weren't need, 
because mine should be actually simpler.  All I want to do is have a handfule 
of rules that check for a user info with respect to a certain file and decides 
whether they have read-write priveledges or just read priveledges.  And also to 
assign read-write priveledges to users if they are owners of the respected file 
that they want to access.  I am sorry if its just some simple error, but I have 
been stumped on this for some time, so I don't know what to do.  Right now my 
Java classes  are in seperate files in the same package, but Ill just cut and 
paste them all here so it will be easier to look at them.  The file after all 
the JAva files is my .clp JEss file, then after that is the error I'm getting.  
It's a casting error but it doesn't make any sense
  to me why I would be getting that.  Anyway , they look like:



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:Exception in thread "main"
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:(

Reply via email to