[jboss-svn-commits] JBL Code SVN: r21135 - in labs/jbossrules/trunk: drools-guvnor/src/main/java/org/drools/guvnor/server/security and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jul 20 22:54:47 EDT 2008


Author: jervisliu
Date: 2008-07-20 22:54:47 -0400 (Sun, 20 Jul 2008)
New Revision: 21135

Added:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/CategoryFilter.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolver.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryPathType.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageNameType.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageUUIDType.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedAuthenticator.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermission.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermissionStore.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolverTest.java
Removed:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedAuthenticator.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermission.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionStore.java
Modified:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/AssetItemFilter.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/PackageFilter.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionResolver.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/PackageBasedPermissionResolverTest.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java
Log:
Added role based authorization for category path. Added Analyst type. 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/AssetItemFilter.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/AssetItemFilter.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/AssetItemFilter.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -15,6 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import org.drools.guvnor.server.security.PackageUUIDType;
 import org.drools.repository.AssetItem;
 import org.drools.repository.RepositoryFilter;
 import org.jboss.seam.contexts.Contexts;
@@ -30,8 +31,7 @@
 		if (!Contexts.isSessionContextActive()) {
 			return true;
 		} else {
-			return Identity.instance().hasPermission("ignoredanyway", action,
-					((AssetItem) artifact).getPackage().getUUID());
+			return Identity.instance().hasPermission(new PackageUUIDType(((AssetItem) artifact).getPackage().getUUID()), action);
 		}
 	}
 

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/CategoryFilter.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/CategoryFilter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/CategoryFilter.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,39 @@
+package org.drools.guvnor.server;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+import org.drools.guvnor.server.security.CategoryPathType;
+import org.drools.repository.RepositoryFilter;
+import org.jboss.seam.contexts.Contexts;
+import org.jboss.seam.security.Identity;
+
+public class CategoryFilter implements RepositoryFilter {
+
+	public boolean accept(Object artifact, String action) {
+		if (!(artifact instanceof String))
+			return false;
+
+		// for GWT hosted mode - debug only
+		if (!Contexts.isSessionContextActive()) {
+			return true;
+		} else {
+			return Identity.instance().hasPermission(new CategoryPathType((String)artifact), null);
+		}
+	}
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/PackageFilter.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/PackageFilter.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/PackageFilter.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -1,7 +1,4 @@
 package org.drools.guvnor.server;
-
-import org.drools.guvnor.client.rpc.PackageConfigData;
-import org.drools.repository.RepositoryFilter;
 /*
  * Copyright 2005 JBoss Inc
  *
@@ -17,6 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+
+
+import org.drools.guvnor.client.rpc.PackageConfigData;
+import org.drools.guvnor.server.security.PackageUUIDType;
+import org.drools.repository.RepositoryFilter;
 import org.jboss.seam.contexts.Contexts;
 import org.jboss.seam.security.Identity;
 
@@ -30,8 +33,7 @@
 		if (!Contexts.isSessionContextActive()) {
 			return true;
 		} else {
-			return Identity.instance().hasPermission("ignoredanyway", action,
-					((PackageConfigData) artifact).uuid);
+			return Identity.instance().hasPermission(new PackageUUIDType(((PackageConfigData) artifact).uuid), action);
 		}
 	}
 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -1,4 +1,5 @@
 package org.drools.guvnor.server;
+
 /*
  * Copyright 2005 JBoss Inc
  *
@@ -15,7 +16,6 @@
  * limitations under the License.
  */
 
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -83,6 +83,9 @@
 import org.drools.guvnor.server.contenthandler.IRuleAsset;
 import org.drools.guvnor.server.contenthandler.IValidating;
 import org.drools.guvnor.server.contenthandler.ModelContentHandler;
+import org.drools.guvnor.server.security.CategoryPathType;
+import org.drools.guvnor.server.security.PackageNameType;
+import org.drools.guvnor.server.security.PackageUUIDType;
 import org.drools.guvnor.server.security.RoleTypes;
 import org.drools.guvnor.server.util.BRMSSuggestionCompletionLoader;
 import org.drools.guvnor.server.util.LoggingHelper;
@@ -124,431 +127,473 @@
 import com.google.gwt.user.client.rpc.SerializableException;
 
 /**
- * This is the implementation of the repository service to drive the GWT based front end.
- *
+ * This is the implementation of the repository service to drive the GWT based
+ * front end.
+ * 
  * @author Michael Neale
  */
 @Name("org.drools.guvnor.client.rpc.RepositoryService")
 @AutoCreate
-public class ServiceImplementation
-    implements
-    RepositoryService {
+public class ServiceImplementation implements RepositoryService {
 
-    @In
-    public RulesRepository repository;
+	@In
+	public RulesRepository repository;
 
+	private static final long serialVersionUID = 400L;
 
-    private static final long serialVersionUID = 400L;
-    private static final DateFormat dateFormatter = DateFormat.getInstance();
-    private static final Logger log = LoggingHelper.getLogger();
-    private MetaDataMapper metaDataMapper = new MetaDataMapper();
+	private static final DateFormat dateFormatter = DateFormat.getInstance();
 
-    /** Used for a simple cache of binary packages to avoid serialization from the database - for test scenarios.*/
-	static Map<String, RuleBase> ruleBaseCache = Collections.synchronizedMap(new HashMap<String, RuleBase>());
+	private static final Logger log = LoggingHelper.getLogger();
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String[] loadChildCategories(String categoryPath) {
+	private MetaDataMapper metaDataMapper = new MetaDataMapper();
 
-        CategoryItem item = repository.loadCategory( categoryPath );
-        List children = item.getChildTags();
-        String[] list = new String[children.size()];
-        for ( int i = 0; i < list.length; i++ ) {
-            list[i] = ((CategoryItem) children.get( i )).getName();
-        }
-        return list;
+	/**
+	 * Used for a simple cache of binary packages to avoid serialization from
+	 * the database - for test scenarios.
+	 */
+	static Map<String, RuleBase> ruleBaseCache = Collections
+			.synchronizedMap(new HashMap<String, RuleBase>());
 
-    }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String[] loadChildCategories(String categoryPath) {
+		List<String> resultList = new ArrayList<String>();
+		CategoryFilter filter = new CategoryFilter();
 
+		CategoryItem item = repository.loadCategory(categoryPath);
+		List children = item.getChildTags();
+		for (int i = 0; i < children.size(); i++) {
+			String childCategoryName = ((CategoryItem) children.get(i)).getName();
+			if (filter.accept(childCategoryName, null)) {
+				resultList.add(childCategoryName);
+			}
+		}
 
+		String[] resultArr = resultList.toArray(new String[resultList.size()]);
+		return resultArr;
+	}
 
 	@WebRemote
-    @Restrict("#{s:hasRole('admin')}")
-    public Boolean createCategory(String path,
-                                  String name,
-                                  String description) {
-        log.info( "USER:" + repository.getSession().getUserID()
-                  + " CREATING cateogory: [" + name + "] in path [" + path + "]" );
+	@Restrict("#{s:hasRole('admin')}")
+	public Boolean createCategory(String path, String name, String description) {
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " CREATING cateogory: [" + name + "] in path [" + path + "]");
 
-        if (path == null || "".equals(path)) {
-            path = "/";
-        }
+		if (path == null || "".equals(path)) {
+			path = "/";
+		}
 
-        CategoryItem item = repository.loadCategory( path );
-        item.addCategory( name, description );
-        repository.save();
-        return Boolean.TRUE;
-    }
+		CategoryItem item = repository.loadCategory(path);
+		item.addCategory(name, description);
+		repository.save();
+		return Boolean.TRUE;
+	}
 
-
-    /**
-     * This will create a new asset. It will be saved, but not checked in.
-     * The initial state will be the draft state.
-     */
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String createNewRule(String ruleName,
-                                 String description,
-                                 String initialCategory,
-                                 String initialPackage,
-                                 String format) throws SerializableException {
+	/**
+	 * This will create a new asset. It will be saved, but not checked in. The
+	 * initial state will be the draft state.
+	 */
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String createNewRule(String ruleName, String description,
+			String initialCategory, String initialPackage, String format)
+			throws SerializableException {
 		if (Contexts.isSessionContextActive()) {
-			Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_ADMIN,
-					initialPackage);
+			Identity.instance().checkPermission(
+					new PackageNameType(initialPackage),
+					RoleTypes.PACKAGE_ADMIN);
 		}
 
-        log.info( "USER:" + repository.getSession().getUserID() +
-                           " CREATING new asset name [" + ruleName + "] in package [" + initialPackage + "]" );
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " CREATING new asset name [" + ruleName + "] in package ["
+				+ initialPackage + "]");
 
-        try {
+		try {
 
-            PackageItem pkg = repository.loadPackage( initialPackage );
-            AssetItem asset = pkg.addAsset( ruleName, description, initialCategory, format );
+			PackageItem pkg = repository.loadPackage(initialPackage);
+			AssetItem asset = pkg.addAsset(ruleName, description,
+					initialCategory, format);
 
-            applyPreBuiltTemplates( ruleName,
-                                    format,
-                                    asset );
-            repository.save();
+			applyPreBuiltTemplates(ruleName, format, asset);
+			repository.save();
 
+			return asset.getUUID();
+		} catch (RulesRepositoryException e) {
+			if (e.getCause() instanceof ItemExistsException) {
+				return "DUPLICATE";
+			} else {
+				throw new SerializableException(e.getMessage());
+			}
+		}
 
-            return asset.getUUID();
-        } catch (RulesRepositoryException e) {
-        	if (e.getCause() instanceof ItemExistsException) {
-        		return "DUPLICATE";
-        	} else {
-        		throw new SerializableException(e.getMessage());
-        	}
-        }
+	}
 
-    }
-
-
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void deleteUncheckedRule(String uuid, String initialPackage) {
-    	if (Contexts.isSessionContextActive()) {
-			Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_ADMIN,
-					initialPackage);
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void deleteUncheckedRule(String uuid, String initialPackage) {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(initialPackage),
+					RoleTypes.PACKAGE_ADMIN);
 		}
 
-        AssetItem asset = repository.loadAssetByUUID( uuid );
-        asset.remove();
-        repository.save();
-    }
+		AssetItem asset = repository.loadAssetByUUID(uuid);
+		asset.remove();
+		repository.save();
+	}
 
-    /**
-     * For some format types, we add some sugar by adding a new template.
-     */
-    private void applyPreBuiltTemplates(String ruleName,
-                                        String format,
-                                        AssetItem asset) {
-        if (format.equals( AssetFormats.DSL_TEMPLATE_RULE )) {
-            asset.updateContent( "when\n\nthen\n" );
-        } else if (format.equals( AssetFormats.FUNCTION )) {
-            asset.updateContent( "function <returnType> " + ruleName + "(<args here>) {\n\n\n}" );
-        } else if (format.equals( AssetFormats.DSL )) {
-            asset.updateContent( "[when]Condition sentence template {var}=" +
-                    "rule language mapping {var}\n" +
-                    "[then]Action sentence template=rule language mapping");
-        } else if (format.equals( AssetFormats.DECISION_SPREADSHEET_XLS )) {
-            asset.updateBinaryContentAttachment( this.getClass().getResourceAsStream( "/SampleDecisionTable.xls" ) );
-            asset.updateBinaryContentAttachmentFileName( "SampleDecisionTable.xls" );
-        }  else if (format.equals( AssetFormats.DRL )) {
-            asset.updateContent( "when\n\t#conditions\nthen\n\t#actions");
-        } else if (format.equals( AssetFormats.ENUMERATION )) {
+	/**
+	 * For some format types, we add some sugar by adding a new template.
+	 */
+	private void applyPreBuiltTemplates(String ruleName, String format,
+			AssetItem asset) {
+		if (format.equals(AssetFormats.DSL_TEMPLATE_RULE)) {
+			asset.updateContent("when\n\nthen\n");
+		} else if (format.equals(AssetFormats.FUNCTION)) {
+			asset.updateContent("function <returnType> " + ruleName
+					+ "(<args here>) {\n\n\n}");
+		} else if (format.equals(AssetFormats.DSL)) {
+			asset.updateContent("[when]Condition sentence template {var}="
+					+ "rule language mapping {var}\n"
+					+ "[then]Action sentence template=rule language mapping");
+		} else if (format.equals(AssetFormats.DECISION_SPREADSHEET_XLS)) {
+			asset.updateBinaryContentAttachment(this.getClass()
+					.getResourceAsStream("/SampleDecisionTable.xls"));
+			asset
+					.updateBinaryContentAttachmentFileName("SampleDecisionTable.xls");
+		} else if (format.equals(AssetFormats.DRL)) {
+			asset.updateContent("when\n\t#conditions\nthen\n\t#actions");
+		} else if (format.equals(AssetFormats.ENUMERATION)) {
 
-        }
-    }
+		}
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public PackageConfigData[] listPackages() {
-    	RepositoryFilter pf = new PackageFilter();
-        return listPackages(false, pf);
-    }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public PackageConfigData[] listPackages() {
+		RepositoryFilter pf = new PackageFilter();
+		return listPackages(false, pf);
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public PackageConfigData[] listArchivedPackages() {
-    	RepositoryFilter pf = new PackageFilter();
-        return listPackages(true, pf);
-    }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public PackageConfigData[] listArchivedPackages() {
+		RepositoryFilter pf = new PackageFilter();
+		return listPackages(true, pf);
+	}
 
-	private PackageConfigData[] listPackages(boolean archive, RepositoryFilter filter) {
+	private PackageConfigData[] listPackages(boolean archive,
+			RepositoryFilter filter) {
 		List<PackageConfigData> result = new ArrayList<PackageConfigData>();
 		PackageIterator pkgs = repository.listPackages();
 		pkgs.setArchivedIterator(archive);
-        while(pkgs.hasNext()) {
-            PackageItem pkg = (PackageItem) pkgs.next();
+		while (pkgs.hasNext()) {
+			PackageItem pkg = (PackageItem) pkgs.next();
 
-            PackageConfigData data = new PackageConfigData();
-            data.uuid = pkg.getUUID();
-            data.name = pkg.getName();
-            data.archived = pkg.isArchived();
-            if (!archive && (filter == null || filter.accept(data, RoleTypes.PACKAGE_READONLY))) {
-            	result.add(data);
-            } else if (archive && data.archived && (filter == null || filter.accept(data, RoleTypes.PACKAGE_READONLY))) {
-            	result.add(data);
-            }
-        }
+			PackageConfigData data = new PackageConfigData();
+			data.uuid = pkg.getUUID();
+			data.name = pkg.getName();
+			data.archived = pkg.isArchived();
+			if (!archive
+					&& (filter == null || filter.accept(data,
+							RoleTypes.PACKAGE_READONLY))) {
+				result.add(data);
+			} else if (archive
+					&& data.archived
+					&& (filter == null || filter.accept(data,
+							RoleTypes.PACKAGE_READONLY))) {
+				result.add(data);
+			}
+		}
 
-        sortPackages(result);
-        PackageConfigData[] resultArr = result.toArray( new PackageConfigData[result.size()] );
+		sortPackages(result);
+		PackageConfigData[] resultArr = result
+				.toArray(new PackageConfigData[result.size()]);
 		return resultArr;
 	}
 
 	void sortPackages(List<PackageConfigData> result) {
-		Collections.sort( result, new Comparator<Object>() {
+		Collections.sort(result, new Comparator<Object>() {
 
-            public int compare(final Object o1,
-                               final Object o2) {
-                final PackageConfigData d1 = (PackageConfigData) o1;
-                final PackageConfigData d2 = (PackageConfigData) o2;
-                return d1.name.compareTo( d2.name );
-            }
+			public int compare(final Object o1, final Object o2) {
+				final PackageConfigData d1 = (PackageConfigData) o1;
+				final PackageConfigData d2 = (PackageConfigData) o2;
+				return d1.name.compareTo(d2.name);
+			}
 
-        });
+		});
 	}
 
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult loadRuleListForCategories(String categoryPath,
+			int skip, int numRows, String tableConfig)
+			throws SerializableException {
+		// love you
+		// long time = System.currentTimeMillis();
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult loadRuleListForCategories(String categoryPath, int skip, int numRows, String tableConfig) throws SerializableException {
-    	//love you
-        //long time = System.currentTimeMillis();
-    	RepositoryFilter filter = new AssetItemFilter();
-        AssetPageList list = repository.findAssetsByCategory( categoryPath, false, skip, numRows, filter);
-        TableDisplayHandler handler = new TableDisplayHandler(tableConfig);
-        //log.debug("time for load: " + (System.currentTimeMillis() - time) );
-        return handler.loadRuleListTable( list );
+		// First check the user has permission to access this categoryPath. This
+		// check only applies to
+		// ANALYST role, always return true for
+		// admin|package.admin|package.dev|package.readonly roles.
+		// We will then use AssetItemFilter to enforce package-based
+		// permissions.
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new CategoryPathType(categoryPath), null);
+		}
 
-    }
+		RepositoryFilter filter = new AssetItemFilter();
+		AssetPageList list = repository.findAssetsByCategory(categoryPath,
+				false, skip, numRows, filter);
+		TableDisplayHandler handler = new TableDisplayHandler(tableConfig);
+		// log.debug("time for load: " + (System.currentTimeMillis() - time) );
+		return handler.loadRuleListTable(list);
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult loadRuleListForState(String stateName, int skip, int numRows, String tableConfig) throws SerializableException {
-    	//love you
-        //long time = System.currentTimeMillis();
+	}
 
-    	RepositoryFilter filter = new AssetItemFilter();
-        AssetPageList list = repository.findAssetsByState( stateName, false, skip, numRows, filter);
-        TableDisplayHandler handler = new TableDisplayHandler(tableConfig);
-        //log.debug("time for load: " + (System.currentTimeMillis() - time) );
-        return handler.loadRuleListTable( list );
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult loadRuleListForState(String stateName, int skip,
+			int numRows, String tableConfig) throws SerializableException {
+		// love you
+		// long time = System.currentTimeMillis();
 
-    }
+		RepositoryFilter filter = new AssetItemFilter();
+		AssetPageList list = repository.findAssetsByState(stateName, false,
+				skip, numRows, filter);
+		TableDisplayHandler handler = new TableDisplayHandler(tableConfig);
+		// log.debug("time for load: " + (System.currentTimeMillis() - time) );
+		return handler.loadRuleListTable(list);
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableConfig loadTableConfig(String listName) {
-        TableDisplayHandler handler = new TableDisplayHandler(listName);
-        return handler.loadTableConfig();
-    }
+	}
 
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableConfig loadTableConfig(String listName) {
+		TableDisplayHandler handler = new TableDisplayHandler(listName);
+		return handler.loadTableConfig();
+	}
 
-    /**
-     * This actually does the hard work of loading up an asset based
-     * on its format.
-     */
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public RuleAsset loadRuleAsset(String uuid) throws SerializableException {
-        AssetItem item = repository.loadAssetByUUID( uuid );
-        RuleAsset asset = new RuleAsset();
+	/**
+	 * This actually does the hard work of loading up an asset based on its
+	 * format.
+	 */
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public RuleAsset loadRuleAsset(String uuid) throws SerializableException {
+		AssetItem item = repository.loadAssetByUUID(uuid);
+		RuleAsset asset = new RuleAsset();
 
-        asset.uuid = uuid;
+		asset.uuid = uuid;
 
-        //load standard meta data
-        asset.metaData = populateMetaData( item );
+		// load standard meta data
+		asset.metaData = populateMetaData(item);
 
-    	if (Contexts.isSessionContextActive()) {
-			Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_READONLY,
-					asset.metaData.packageName);
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(asset.metaData.packageName),
+					RoleTypes.PACKAGE_READONLY);
 		}
 
-        // get package header
-        PackageItem pkgItem = repository.loadPackage( asset.metaData.packageName );
+		// get package header
+		PackageItem pkgItem = repository
+				.loadPackage(asset.metaData.packageName);
 
-        //load the content
-        ContentHandler handler = ContentManager.getHandler( asset.metaData.format );
-        handler.retrieveAssetContent(asset, pkgItem, item);
+		// load the content
+		ContentHandler handler = ContentManager
+				.getHandler(asset.metaData.format);
+		handler.retrieveAssetContent(asset, pkgItem, item);
 
-        return asset;
+		return asset;
 
-    }
+	}
 
 	private RuleAsset loadAsset(AssetItem item) throws SerializableException {
 		RuleAsset asset = new RuleAsset();
-        asset.uuid = item.getUUID();
-        //load standard meta data
-        asset.metaData = populateMetaData( item );
-        // get package header
-        PackageItem pkgItem = repository.loadPackage( asset.metaData.packageName );
-        //load the content
-        ContentHandler handler = ContentManager.getHandler( asset.metaData.format );
-        handler.retrieveAssetContent(asset, pkgItem, item);
+		asset.uuid = item.getUUID();
+		// load standard meta data
+		asset.metaData = populateMetaData(item);
+		// get package header
+		PackageItem pkgItem = repository
+				.loadPackage(asset.metaData.packageName);
+		// load the content
+		ContentHandler handler = ContentManager
+				.getHandler(asset.metaData.format);
+		handler.retrieveAssetContent(asset, pkgItem, item);
 		return asset;
 	}
 
+	/**
+	 * read in the meta data, populating all dublin core and versioning stuff.
+	 */
+	MetaData populateMetaData(VersionableItem item) {
+		MetaData meta = new MetaData();
 
-    /**
-     * read in the meta data, populating all dublin core and versioning stuff.
-     */
-    MetaData populateMetaData(VersionableItem item) {
-        MetaData meta = new MetaData();
+		meta.status = (item.getState() != null) ? item.getState().getName()
+				: "";
 
-        meta.status = (item.getState() != null) ? item.getState().getName() : "";
+		metaDataMapper.copyToMetaData(meta, item);
 
-        metaDataMapper.copyToMetaData( meta, item );
+		meta.createdDate = calendarToDate(item.getCreatedDate());
+		meta.lastModifiedDate = calendarToDate(item.getLastModified());
 
-        meta.createdDate = calendarToDate(item.getCreatedDate());
-        meta.lastModifiedDate = calendarToDate( item.getLastModified() );
+		return meta;
+	}
 
-        return meta;
-    }
+	/**
+	 * Populate meta data with asset specific info.
+	 */
+	MetaData populateMetaData(AssetItem item) {
+		MetaData meta = populateMetaData((VersionableItem) item);
+		meta.packageName = item.getPackageName();
 
-    /**
-     * Populate meta data with asset specific info.
-     */
-    MetaData populateMetaData(AssetItem item) {
-        MetaData meta = populateMetaData( (VersionableItem ) item);
-        meta.packageName = item.getPackageName();
+		List cats = item.getCategories();
+		meta.categories = new String[cats.size()];
+		for (int i = 0; i < meta.categories.length; i++) {
+			CategoryItem cat = (CategoryItem) cats.get(i);
+			meta.categories[i] = cat.getFullPath();
+		}
+		meta.dateEffective = calendarToDate(item.getDateEffective());
+		meta.dateExpired = calendarToDate(item.getDateExpired());
+		return meta;
 
-        List cats = item.getCategories();
-        meta.categories = new String[cats.size()];
-        for ( int i = 0; i < meta.categories.length; i++ ) {
-            CategoryItem cat = (CategoryItem) cats.get(i);
-            meta.categories[i] = cat.getFullPath();
-        }
-        meta.dateEffective = calendarToDate( item.getDateEffective() );
-        meta.dateExpired = calendarToDate( item.getDateExpired() );
-        return meta;
+	}
 
-    }
+	private Date calendarToDate(Calendar createdDate) {
+		if (createdDate == null)
+			return null;
+		return createdDate.getTime();
+	}
 
-    private Date calendarToDate(Calendar createdDate) {
-        if (createdDate == null) return null;
-        return createdDate.getTime();
-    }
+	private Calendar dateToCalendar(Date date) {
+		if (date == null)
+			return null;
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		return cal;
+	}
 
-    private Calendar dateToCalendar(Date date) {
-        if (date == null) return null;
-        Calendar cal = Calendar.getInstance();
-        cal.setTime( date );
-        return cal;
-    }
-
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String checkinVersion(RuleAsset asset) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-			Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER,
-					asset.metaData.packageName);
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String checkinVersion(RuleAsset asset) throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(asset.metaData.packageName),
+					RoleTypes.PACKAGE_DEVELOPER);
 		}
 
-    	log.info( "USER:" + repository.getSession().getUserID() +
-        " CHECKING IN asset: [" + asset.metaData.name + "] UUID: [" + asset.uuid + "]  ARCHIVED [" + asset.archived + "]");
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " CHECKING IN asset: [" + asset.metaData.name + "] UUID: ["
+				+ asset.uuid + "]  ARCHIVED [" + asset.archived + "]");
 
+		AssetItem repoAsset = repository.loadAssetByUUID(asset.uuid);
+		if (asset.metaData.lastModifiedDate.before(repoAsset.getLastModified()
+				.getTime())) {
+			return "ERR: Unable to save this asset, as it has been recently updated by ["
+					+ repoAsset.getLastContributor() + "]";
+		}
 
-        AssetItem repoAsset = repository.loadAssetByUUID( asset.uuid );
-        if (asset.metaData.lastModifiedDate.before( repoAsset.getLastModified().getTime())  ) {
-        	return "ERR: Unable to save this asset, as it has been recently updated by [" + repoAsset.getLastContributor() + "]";
-        }
+		repoAsset.archiveItem(asset.archived);
+		MetaData meta = asset.metaData;
 
+		metaDataMapper.copyFromMetaData(meta, repoAsset);
 
-        repoAsset.archiveItem( asset.archived );
-        MetaData meta = asset.metaData;
+		repoAsset.updateDateEffective(dateToCalendar(meta.dateEffective));
+		repoAsset.updateDateExpired(dateToCalendar(meta.dateExpired));
 
-        metaDataMapper.copyFromMetaData( meta, repoAsset );
+		repoAsset.updateCategoryList(meta.categories);
+		ContentHandler handler = ContentManager.getHandler(repoAsset
+				.getFormat());// new AssetContentFormatHandler();
+		handler.storeAssetContent(asset, repoAsset);
 
-        repoAsset.updateDateEffective( dateToCalendar( meta.dateEffective ) );
-        repoAsset.updateDateExpired( dateToCalendar( meta.dateExpired ) );
+		if (!(asset.metaData.format.equals(AssetFormats.TEST_SCENARIO))
+				|| asset.metaData.format.equals(AssetFormats.ENUMERATION)) {
+			PackageItem pkg = repoAsset.getPackage();
+			pkg.updateBinaryUpToDate(false);
+			this.ruleBaseCache.remove(pkg.getUUID());
 
+		}
 
-        repoAsset.updateCategoryList( meta.categories );
-        ContentHandler handler = ContentManager.getHandler( repoAsset.getFormat() );//new AssetContentFormatHandler();
-        handler.storeAssetContent( asset, repoAsset );
+		repoAsset.checkin(meta.checkinComment);
 
-        if (!(asset.metaData.format.equals(AssetFormats.TEST_SCENARIO))
-        		||
-        		asset.metaData.format.equals(AssetFormats.ENUMERATION)) {
-        		PackageItem pkg = repoAsset.getPackage();
-        		pkg.updateBinaryUpToDate(false);
-        		this.ruleBaseCache.remove(pkg.getUUID());
+		return repoAsset.getUUID();
+	}
 
-        }
-
-        repoAsset.checkin( meta.checkinComment );
-
-        return repoAsset.getUUID();
-    }
-
-
-
-
-
 	@WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult loadAssetHistory(String uuid) throws SerializableException {
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult loadAssetHistory(String uuid)
+			throws SerializableException {
 
-        List<TableDataRow> result = new ArrayList<TableDataRow>();
+		List<TableDataRow> result = new ArrayList<TableDataRow>();
 
-        AssetItem item = repository.loadAssetByUUID( uuid );
+		AssetItem item = repository.loadAssetByUUID(uuid);
 
-    	if (Contexts.isSessionContextActive()) {
-      	    Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_READONLY, item.getPackage().getUUID());
-    	}
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageUUIDType(item.getPackage().getUUID()),
+					RoleTypes.PACKAGE_READONLY);
+		}
 
+		AssetHistoryIterator it = item.getHistory();
 
-        AssetHistoryIterator it = item.getHistory();
+		// MN Note: this uses the lazy iterator, but then loads the whole lot
+		// up, and returns it.
+		// The reason for this is that the GUI needs to show things in numeric
+		// order by the version number.
+		// When a version is restored, its previous version is NOT what you
+		// thought it was - due to how JCR works
+		// (its more like CVS then SVN). So to get a linear progression of
+		// versions, we use the incrementing version number,
+		// and load it all up and sort it. This is not ideal.
+		// In future, we may do a "restore" instead just by copying content into
+		// a new version, not restoring a node,
+		// in which case the iterator will be in order (or you can just walk all
+		// the way back).
+		// So if there are performance problems with looking at lots of
+		// historical versions, look at this nasty bit of code.
+		while (it.hasNext()) {
+			AssetItem historical = (AssetItem) it.next();// new
+															// AssetItem(repo,
+															// element);
+			long versionNumber = historical.getVersionNumber();
+			if (!(versionNumber == 0)
+					&& !(versionNumber == item.getVersionNumber())) {
+				TableDataRow row = new TableDataRow();
+				row.id = historical.getVersionSnapshotUUID();
+				row.values = new String[4];
+				row.values[0] = Long.toString(historical.getVersionNumber());
+				row.values[1] = historical.getCheckinComment();
+				row.values[2] = dateFormatter.format(historical
+						.getLastModified().getTime());
+				row.values[3] = historical.getStateDescription();
+				result.add(row);
+			}
+		}
 
+		if (result.size() == 0)
+			return null;
+		TableDataResult table = new TableDataResult();
+		table.data = result.toArray(new TableDataRow[result.size()]);
 
-        //MN Note: this uses the lazy iterator, but then loads the whole lot up, and returns it.
-        //The reason for this is that the GUI needs to show things in numeric order by the version number.
-        //When a version is restored, its previous version is NOT what you thought it was - due to how JCR works
-        // (its more like CVS then SVN). So to get a linear progression of versions, we use the incrementing version number,
-        // and load it all up and sort it. This is not ideal.
-        // In future, we may do a "restore" instead just by copying content into a new version, not restoring a node,
-        // in which case the iterator will be in order (or you can just walk all the way back).
-        //So if there are performance problems with looking at lots of historical versions, look at this nasty bit of code.
-        while ( it.hasNext() ) {
-            AssetItem historical = (AssetItem) it.next();//new AssetItem(repo, element);
-            long versionNumber = historical.getVersionNumber();
-            if (! (versionNumber == 0)
-                            && ! (versionNumber == item.getVersionNumber() ))
-                {
-                TableDataRow row = new TableDataRow();
-                    row.id = historical.getVersionSnapshotUUID();
-                    row.values = new String[4];
-                    row.values[0] = Long.toString( historical.getVersionNumber());
-                    row.values[1] = historical.getCheckinComment();
-                    row.values[2] = dateFormatter.format( historical.getLastModified().getTime() );
-                    row.values[3] = historical.getStateDescription();
-                    result.add( row );
-            }
-        }
+		return table;
+	}
 
-        if (result.size() == 0) return null;
-        TableDataResult table = new TableDataResult();
-        table.data = result.toArray(new TableDataRow[result.size()]);
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult loadArchivedAssets(int skip, int numRows)
+			throws SerializableException {
+		List<TableDataRow> result = new ArrayList<TableDataRow>();
+		RepositoryFilter filter = new AssetItemFilter();
 
-        return table;
-    }
+		AssetItemIterator it = repository.findArchivedAssets();
+		it.skip(skip);
+		int count = 0;
+		while (it.hasNext()) {
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult loadArchivedAssets(int skip, int numRows) throws SerializableException {
-        List<TableDataRow> result = new ArrayList<TableDataRow>();
-    	RepositoryFilter filter = new AssetItemFilter();
+			AssetItem archived = (AssetItem) it.next();
 
-        AssetItemIterator it = repository.findArchivedAssets();
-        it.skip(skip);
-        int count = 0;
-        while ( it.hasNext() ) {
-
-            AssetItem archived = (AssetItem) it.next();
-
-            if (filter.accept(archived, "read")) {
+			if (filter.accept(archived, "read")) {
 				TableDataRow row = new TableDataRow();
 				row.id = archived.getUUID();
 				row.values = new String[5];
@@ -566,384 +611,406 @@
 			if (count == numRows) {
 				break;
 			}
-        }
+		}
 
+		TableDataResult table = new TableDataResult();
+		table.data = result.toArray(new TableDataRow[result.size()]);
 
+		return table;
+	}
 
-        TableDataResult table = new TableDataResult();
-        table.data = result.toArray(new TableDataRow[result.size()]);
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void restoreVersion(String versionUUID, String assetUUID,
+			String comment) {
+		AssetItem old = repository.loadAssetByUUID(versionUUID);
+		AssetItem head = repository.loadAssetByUUID(assetUUID);
 
-        return table;
-    }
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " RESTORE of asset: [" + head.getName() + "] UUID: ["
+				+ head.getUUID() + "] with historical version number: ["
+				+ old.getVersionNumber());
 
+		repository.restoreHistoricalAsset(old, head, comment);
 
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void restoreVersion(String versionUUID,
-                                 String assetUUID,
-                                 String comment) {
-        AssetItem old = repository.loadAssetByUUID( versionUUID );
-        AssetItem head = repository.loadAssetByUUID( assetUUID );
+	@WebRemote
+	@Restrict("#{s:hasRole('admin')}")
+	public byte[] exportRepository() throws SerializableException {
 
-        log.info( "USER:" + repository.getSession().getUserID() +
-                           " RESTORE of asset: [" + head.getName() + "] UUID: [" + head.getUUID() + "] with historical version number: [" + old.getVersionNumber() );
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " EXPORTING repository");
 
+		byte[] exportedOutput = null;
+		try {
+			exportedOutput = repository.exportRulesRepository();
+		} catch (Exception e) {
+			throw new SerializableException("Unable to export repository");
+		}
+		return exportedOutput;
+	}
 
-        repository.restoreHistoricalAsset( old,
-                                     head,
-                                     comment );
+	@WebRemote
+	@Restrict("#{s:hasRole('admin')}")
+	public String createPackage(String name, String description)
+			throws SerializableException {
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " CREATING package [" + name + "]");
+		PackageItem item = repository.createPackage(name, description);
 
-    }
+		return item.getUUID();
+	}
 
-    @WebRemote
-    @Restrict("#{s:hasRole('admin')}")
-    public byte[] exportRepository() throws SerializableException {
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public PackageConfigData loadPackageConfig(String uuid) {
+		PackageItem item = repository.loadPackageByUUID(uuid);
+		// the uuid passed in is the uuid of that deployment bundle, not the
+		// package uudi.
+		// we have to figure out the package name.
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(item.getName()),
+					RoleTypes.PACKAGE_READONLY);
+		}
 
-        log.info( "USER:" + repository.getSession().getUserID() +
-                           " EXPORTING repository");
+		PackageConfigData data = new PackageConfigData();
+		data.uuid = item.getUUID();
+		data.header = getDroolsHeader(item);
+		data.externalURI = item.getExternalURI();
+		data.description = item.getDescription();
+		data.name = item.getName();
+		data.lastModified = item.getLastModified().getTime();
+		data.dateCreated = item.getCreatedDate().getTime();
+		data.checkinComment = item.getCheckinComment();
+		data.lasContributor = item.getLastContributor();
+		data.state = item.getStateDescription();
+		data.isSnapshot = item.isSnapshot();
+		if (data.isSnapshot) {
+			data.snapshotName = item.getSnapshotName();
+		}
+		return data;
+	}
 
-        byte [] exportedOutput = null;
-        try {
-             exportedOutput =  repository.exportRulesRepository();
-        } catch ( Exception e ) {
-            throw new SerializableException( "Unable to export repository" );
-        }
-        return exportedOutput;
-    }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public ValidatedResponse savePackage(PackageConfigData data)
+			throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(new PackageUUIDType(data.uuid),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-    @WebRemote
-    @Restrict("#{s:hasRole('admin')}")
-    public String createPackage(String name,
-                                String description) throws SerializableException {
-        log.info( "USER:" + repository.getSession().getUserID() +
-                           " CREATING package [" + name + "]" );
-        PackageItem item = repository.createPackage( name, description );
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " SAVING package [" + data.name + "]");
 
-        return item.getUUID();
-    }
+		PackageItem item = repository.loadPackage(data.name);
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public PackageConfigData loadPackageConfig(String uuid) {
-        PackageItem item = repository.loadPackageByUUID( uuid );
-    	//the uuid passed in is the uuid of that deployment bundle, not the package uudi.
-        //we have to figure out the package name.
-    	if (Contexts.isSessionContextActive()) {
-		    Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_READONLY, item.getName());
-    	}
+		updateDroolsHeader(data.header, item);
+		item.updateExternalURI(data.externalURI);
+		item.updateDescription(data.description);
+		item.archiveItem(data.archived);
+		item.updateBinaryUpToDate(false);
+		this.ruleBaseCache.remove(data.uuid);
+		item.checkin(data.description);
 
-        PackageConfigData data = new PackageConfigData();
-        data.uuid = item.getUUID();
-        data.header = getDroolsHeader(item);
-        data.externalURI = item.getExternalURI();
-        data.description = item.getDescription();
-        data.name = item.getName();
-        data.lastModified = item.getLastModified().getTime();
-        data.dateCreated = item.getCreatedDate().getTime();
-        data.checkinComment = item.getCheckinComment();
-        data.lasContributor = item.getLastContributor();
-        data.state = item.getStateDescription();
-        data.isSnapshot = item.isSnapshot();
-        if (data.isSnapshot) {
-            data.snapshotName = item.getSnapshotName();
-        }
-        return data;
-    }
+		BRMSSuggestionCompletionLoader loader = new BRMSSuggestionCompletionLoader();
+		loader.getSuggestionEngine(item);
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public ValidatedResponse savePackage(PackageConfigData data) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    	    Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, data.uuid);
-    	}
+		ValidatedResponse res = new ValidatedResponse();
+		if (loader.hasErrors()) {
+			res.hasErrors = true;
+			String err = "";
+			for (Iterator iter = loader.getErrors().iterator(); iter.hasNext();) {
+				err += (String) iter.next();
+				if (iter.hasNext())
+					err += "\n";
+			}
+			res.errorHeader = "Package validation errors";
+			res.errorMessage = err;
+		}
 
-    	log.info( "USER:" + repository.getSession().getUserID() +
-                           " SAVING package [" + data.name + "]" );
+		return res;
+	}
 
-        PackageItem item = repository.loadPackage( data.name );
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult listAssets(String uuid, String formats[], int skip,
+			int numRows, String tableConfig) throws SerializableException {
+		// TODO: This does not work for package snapshot. package snspshot's
+		// UUID is different
+		// from its corresponding package. However we seem to expect to get same
+		// assets using the
+		// package snapshot UUID here
+		// Identity.instance().checkPermission("ignoredanyway", "read", uuid);
 
-        updateDroolsHeader( data.header, item );
-        item.updateExternalURI( data.externalURI );
-        item.updateDescription( data.description );
-        item.archiveItem( data.archived );
-        item.updateBinaryUpToDate(false);
-        this.ruleBaseCache.remove(data.uuid);
-        item.checkin( data.description );
+		if (numRows == 0) {
+			throw new DetailedSerializableException(
+					"Unable to return zero results (bug)",
+					"probably have the parameters around the wrong way, sigh...");
+		}
+		long start = System.currentTimeMillis();
+		PackageItem pkg = repository.loadPackageByUUID(uuid);
+		AssetItemIterator it = pkg.listAssetsByFormat(formats);
+		TableDisplayHandler handler = new TableDisplayHandler(tableConfig);
+		log.debug("time for asset list load: "
+				+ (System.currentTimeMillis() - start));
+		return handler.loadRuleListTable(it, skip, numRows);
+	}
 
-        BRMSSuggestionCompletionLoader loader = new BRMSSuggestionCompletionLoader();
-        loader.getSuggestionEngine( item );
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult queryFullText(String text, boolean seekArchived,
+			int skip, int numRows) throws SerializableException {
+		if (numRows == 0) {
+			throw new DetailedSerializableException(
+					"Unable to return zero results (bug)",
+					"probably have the parameters around the wrong way, sigh...");
+		}
+		AssetItemIterator it = repository.queryFullText(text, seekArchived);
+		TableDisplayHandler handler = new TableDisplayHandler("searchresults");
+		return handler.loadRuleListTable(it, skip, numRows);
+	}
 
-        ValidatedResponse res = new ValidatedResponse();
-        if (loader.hasErrors()) {
-            res.hasErrors = true;
-            String err = "";
-            for ( Iterator iter = loader.getErrors().iterator(); iter.hasNext(); ) {
-                err += (String) iter.next();
-                if (iter.hasNext()) err += "\n";
-            }
-            res.errorHeader  = "Package validation errors";
-            res.errorMessage = err;
-        }
-
-
-        return res;
-    }
-
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult listAssets(String uuid,
-                                              String formats[],
-                                              int skip,
-                                              int numRows,
-                                              String tableConfig) throws SerializableException {
-    	//TODO: This does not work for package snapshot. package snspshot's UUID is different
-    	//from its corresponding package. However we seem to expect to get same assets using the
-    	//package snapshot UUID here
-    	//Identity.instance().checkPermission("ignoredanyway", "read", uuid);
-
-    	if (numRows == 0) {
-    		throw new DetailedSerializableException("Unable to return zero results (bug)", "probably have the parameters around the wrong way, sigh...");
-    	}
-        long start = System.currentTimeMillis();
-        PackageItem pkg = repository.loadPackageByUUID( uuid );
-        AssetItemIterator it = pkg.listAssetsByFormat( formats );
-        TableDisplayHandler handler = new TableDisplayHandler(tableConfig);
-        log.debug("time for asset list load: " + (System.currentTimeMillis() - start) );
-        return handler.loadRuleListTable( it, skip,  numRows );
-    }
-
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult queryFullText(String text, boolean seekArchived, int skip, int numRows) throws SerializableException {
-    	if (numRows == 0) {
-    		throw new DetailedSerializableException("Unable to return zero results (bug)", "probably have the parameters around the wrong way, sigh...");
-    	}
-    	AssetItemIterator it = repository.queryFullText(text, seekArchived);
-    	TableDisplayHandler handler = new TableDisplayHandler("searchresults");
-    	return handler.loadRuleListTable(it, skip, numRows);
-    }
-
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult queryMetaData(final MetaDataQuery[] qr, Date createdAfter, Date createdBefore, Date modifiedAfter, Date modifiedBefore,
-    		boolean seekArchived, int skip, int numRows) throws SerializableException {
-    	if (numRows == 0) {
-    		throw new DetailedSerializableException("Unable to return zero results (bug)", "probably have the parameters around the wrong way, sigh...");
-    	}
-    	Map<String, String[]> q = new HashMap<String, String[]>() {{
-    		for (int i = 0; i < qr.length; i++) {
-    			String vals = (qr[i].valueList == null) ? "" : qr[i].valueList.trim();
-    			if (vals.length() > 0) {
-    				put(qr[i].attribute, vals.split(",\\s?"));
-    			}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult queryMetaData(final MetaDataQuery[] qr,
+			Date createdAfter, Date createdBefore, Date modifiedAfter,
+			Date modifiedBefore, boolean seekArchived, int skip, int numRows)
+			throws SerializableException {
+		if (numRows == 0) {
+			throw new DetailedSerializableException(
+					"Unable to return zero results (bug)",
+					"probably have the parameters around the wrong way, sigh...");
+		}
+		Map<String, String[]> q = new HashMap<String, String[]>() {
+			{
+				for (int i = 0; i < qr.length; i++) {
+					String vals = (qr[i].valueList == null) ? ""
+							: qr[i].valueList.trim();
+					if (vals.length() > 0) {
+						put(qr[i].attribute, vals.split(",\\s?"));
+					}
+				}
 			}
-    	}};
+		};
 
-    	DateQuery[] dates = new DateQuery[2];
+		DateQuery[] dates = new DateQuery[2];
 
+		dates[0] = new DateQuery("jcr:created", isoDate(createdAfter),
+				isoDate(createdBefore));
+		dates[1] = new DateQuery(AssetItem.LAST_MODIFIED_PROPERTY_NAME,
+				isoDate(modifiedAfter), isoDate(modifiedBefore));
+		AssetItemIterator it = repository.query(q, seekArchived, dates);
+		TableDisplayHandler handler = new TableDisplayHandler("searchresults");
+		return handler.loadRuleListTable(it, skip, numRows);
+	}
 
-    	dates[0] = new DateQuery("jcr:created", isoDate(createdAfter), isoDate(createdBefore));
-    	dates[1] = new DateQuery(AssetItem.LAST_MODIFIED_PROPERTY_NAME, isoDate(modifiedAfter), isoDate(modifiedBefore));
-    	AssetItemIterator it = repository.query(q, seekArchived, dates);
-    	TableDisplayHandler handler = new TableDisplayHandler("searchresults");
-    	return handler.loadRuleListTable(it, skip, numRows);
-    }
-
-
-    private String isoDate(Date d) {
-    	if (d != null) {
-    		Calendar cal = Calendar.getInstance();
-    		cal.setTime(d);
-    		return ISO8601.format(cal);
-    	}
+	private String isoDate(Date d) {
+		if (d != null) {
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(d);
+			return ISO8601.format(cal);
+		}
 		return null;
 	}
 
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String createState(String name) throws SerializableException {
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " CREATING state: [" + name + "]");
+		try {
+			String uuid = repository.createState(name).getNode().getUUID();
+			repository.save();
+			return uuid;
+		} catch (RepositoryException e) {
+			throw new SerializableException("Unable to create the status.");
+		}
+	}
 
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String[] listStates() throws SerializableException {
+		StateItem[] states = repository.listStates();
+		String[] result = new String[states.length];
+		for (int i = 0; i < states.length; i++) {
+			result[i] = states[i].getName();
+		}
+		return result;
+	}
 
-
 	@WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String createState(String name) throws SerializableException {
-        log.info( "USER:" + repository.getSession().getUserID() +
-                           " CREATING state: [" + name + "]" );
-        try {
-            String uuid = repository.createState( name ).getNode().getUUID();
-            repository.save();
-            return uuid;
-        } catch ( RepositoryException e ) {
-            throw new SerializableException( "Unable to create the status." );
-        }
-    }
+	@Restrict("#{identity.loggedIn}")
+	public void changeState(String uuid, String newState, boolean wholePackage) {
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String[] listStates() throws SerializableException {
-        StateItem[] states = repository.listStates();
-        String[] result = new String[states.length];
-        for ( int i = 0; i < states.length; i++ ) {
-            result[i] = states[i].getName();
-        }
-        return result;
-    }
+		if (!wholePackage) {
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void changeState(String uuid,
-                            String newState,
-                            boolean wholePackage) {
+			AssetItem asset = repository.loadAssetByUUID(uuid);
+			log.info("USER:" + repository.getSession().getUserID()
+					+ " CHANGING ASSET STATUS. Asset name, uuid: " + "["
+					+ asset.getName() + ", " + asset.getUUID() + "]" + " to ["
+					+ newState + "]");
 
-        if (!wholePackage) {
+			if (Contexts.isSessionContextActive()) {
+				Identity.instance().checkPermission(
+						new PackageUUIDType(asset.getPackage().getUUID()),
+						RoleTypes.PACKAGE_DEVELOPER);
+			}
 
-            AssetItem asset = repository.loadAssetByUUID( uuid );
-            log.info( "USER:" + repository.getSession().getUserID() +
-                               " CHANGING ASSET STATUS. Asset name, uuid: " +
-                    "[" + asset.getName() + ", " +asset.getUUID() + "]"
-                      +  " to [" + newState + "]");
+			asset.updateState(newState);
+		} else {
+			if (Contexts.isSessionContextActive()) {
+				Identity.instance().checkPermission(new PackageUUIDType(uuid),
+						RoleTypes.PACKAGE_DEVELOPER);
+			}
 
-        	if (Contexts.isSessionContextActive()) {
-           	    Identity.instance().checkPermission("ignoredanyway", "update", asset.getPackage().getUUID());
-        	}
+			PackageItem pkg = repository.loadPackageByUUID(uuid);
+			log.info("USER:" + repository.getSession().getUserID()
+					+ " CHANGING Package STATUS. Asset name, uuid: " + "["
+					+ pkg.getName() + ", " + pkg.getUUID() + "]" + " to ["
+					+ newState + "]");
+			pkg.changeStatus(newState);
+		}
+		repository.save();
+	}
 
-            asset.updateState( newState );
-        } else {
-        	if (Contexts.isSessionContextActive()) {
-        	    Identity.instance().checkPermission("ignoredanyway", "update", uuid);
-        	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void changeAssetPackage(String uuid, String newPackage,
+			String comment) {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(newPackage),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-            PackageItem pkg = repository.loadPackageByUUID( uuid );
-            log.info( "USER:" + repository.getSession().getUserID() +
-            " CHANGING Package STATUS. Asset name, uuid: " +
-                      "[" + pkg.getName() + ", " + pkg.getUUID() + "]"
-                        +  " to [" + newState + "]");
-            pkg.changeStatus(newState);
-        }
-        repository.save();
-    }
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " CHANGING PACKAGE OF asset: [" + uuid + "] to ["
+				+ newPackage + "]");
+		repository.moveRuleItemPackage(newPackage, uuid, comment);
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void changeAssetPackage(String uuid,
-                                   String newPackage,
-                                   String comment) {
-    	if (Contexts.isSessionContextActive()) {
-    	    Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, newPackage);
-    	}
+	}
 
-        log.info( "USER:" + repository.getSession().getUserID() +
-                           " CHANGING PACKAGE OF asset: [" + uuid + "] to [" + newPackage + "]");
-        repository.moveRuleItemPackage( newPackage, uuid, comment );
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String copyAsset(String assetUUID, String newPackage, String newName) {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(newPackage),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-    }
+		return repository.copyAsset(assetUUID, newPackage, newName);
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String copyAsset(String assetUUID,
-                          String newPackage,
-                          String newName) {
-    	if (Contexts.isSessionContextActive()) {
-    	    Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, newPackage);
-    	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public SnapshotInfo[] listSnapshots(String packageName) {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(packageName),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-        return repository.copyAsset( assetUUID, newPackage, newName );
-    }
+		String[] snaps = repository.listPackageSnapshots(packageName);
+		SnapshotInfo[] res = new SnapshotInfo[snaps.length];
+		for (int i = 0; i < snaps.length; i++) {
+			PackageItem snap = repository.loadPackageSnapshot(packageName,
+					snaps[i]);
+			SnapshotInfo info = new SnapshotInfo();
+			res[i] = info;
+			info.comment = snap.getCheckinComment();
+			info.name = snaps[i];
+			info.uuid = snap.getUUID();
+		}
+		return res;
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public SnapshotInfo[] listSnapshots(String packageName) {
-    	if (Contexts.isSessionContextActive()) {
-    	    Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, packageName);
-    	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void createPackageSnapshot(String packageName, String snapshotName,
+			boolean replaceExisting, String comment) {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(packageName), RoleTypes.PACKAGE_ADMIN);
+		}
 
-        String[] snaps = repository.listPackageSnapshots( packageName );
-        SnapshotInfo[] res = new SnapshotInfo[snaps.length];
-        for ( int i = 0; i < snaps.length; i++ ) {
-            PackageItem snap = repository.loadPackageSnapshot( packageName, snaps[i] );
-            SnapshotInfo info = new SnapshotInfo();
-            res[i] = info;
-            info.comment = snap.getCheckinComment();
-            info.name = snaps[i];
-            info.uuid = snap.getUUID();
-        }
-        return res;
-    }
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " CREATING PACKAGE SNAPSHOT for package: [" + packageName
+				+ "] snapshot name: [" + snapshotName);
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void createPackageSnapshot(String packageName,
-                                      String snapshotName,
-                                      boolean replaceExisting,
-                                      String comment) {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_ADMIN, packageName);
-    	}
+		if (replaceExisting) {
+			repository.removePackageSnapshot(packageName, snapshotName);
+		}
 
-        log.info( "USER:" + repository.getSession().getUserID() +
-         " CREATING PACKAGE SNAPSHOT for package: [" + packageName + "] snapshot name: [" + snapshotName );
+		repository.createPackageSnapshot(packageName, snapshotName);
+		PackageItem item = repository.loadPackageSnapshot(packageName,
+				snapshotName);
+		item.updateCheckinComment(comment);
+		repository.save();
 
-        if (replaceExisting) {
-            repository.removePackageSnapshot( packageName, snapshotName );
-        }
+	}
 
-        repository.createPackageSnapshot( packageName, snapshotName );
-        PackageItem item = repository.loadPackageSnapshot( packageName, snapshotName );
-        item.updateCheckinComment( comment );
-        repository.save();
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void copyOrRemoveSnapshot(String packageName, String snapshotName,
+			boolean delete, String newSnapshotName)
+			throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(packageName), RoleTypes.PACKAGE_ADMIN);
+		}
 
-    }
+		if (delete) {
+			log.info("USER:" + repository.getSession().getUserID()
+					+ " REMOVING SNAPSHOT for package: [" + packageName
+					+ "] snapshot: [" + snapshotName + "]");
+			repository.removePackageSnapshot(packageName, snapshotName);
+		} else {
+			if (newSnapshotName.equals("")) {
+				throw new SerializableException(
+						"Need to have a new snapshot name.");
+			}
+			log.info("USER:" + repository.getSession().getUserID()
+					+ " COPYING SNAPSHOT for package: [" + packageName
+					+ "] snapshot: [" + snapshotName + "] to ["
+					+ newSnapshotName + "]");
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void copyOrRemoveSnapshot(String packageName,
-                                     String snapshotName,
-                                     boolean delete,
-                                     String newSnapshotName) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_ADMIN, packageName);
-    	}
+			repository.copyPackageSnapshot(packageName, snapshotName,
+					newSnapshotName);
+		}
 
-        if (delete) {
-            log.info( "USER:" + repository.getSession().getUserID() +
-            " REMOVING SNAPSHOT for package: [" + packageName + "] snapshot: [" + snapshotName + "]" );
-            repository.removePackageSnapshot( packageName, snapshotName );
-        } else {
-            if (newSnapshotName.equals( "" )) {
-                throw new SerializableException("Need to have a new snapshot name.");
-            }
-            log.info( "USER:" + repository.getSession().getUserID() +
-                               " COPYING SNAPSHOT for package: [" + packageName + "] snapshot: [" + snapshotName + "] to [" + newSnapshotName + "]" );
+	}
 
-            repository.copyPackageSnapshot( packageName, snapshotName, newSnapshotName );
-        }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public TableDataResult quickFindAsset(String searchText, int max,
+			boolean searchArchived) {
 
-    }
+		String search = Pattern.compile("*", Pattern.LITERAL).matcher(
+				searchText).replaceAll(Matcher.quoteReplacement("%"));
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public TableDataResult quickFindAsset(String searchText, int max, boolean searchArchived) {
+		if (!search.endsWith("%")) {
+			search += "%";
+		}
 
-        String search = Pattern.compile("*", Pattern.LITERAL).matcher(searchText).replaceAll(Matcher.quoteReplacement("%"));
+		TableDataResult result = new TableDataResult();
 
-        if (!search.endsWith( "%" )) {
-            search += "%";
-        }
+		List<TableDataRow> resultList = new ArrayList<TableDataRow>();
 
+		long start = System.currentTimeMillis();
+		AssetItemIterator it = repository.findAssetsByName(search,
+				searchArchived); // search for archived items
+		log.debug("Search time: " + (System.currentTimeMillis() - start));
 
-        TableDataResult result = new TableDataResult();
-
-        List<TableDataRow> resultList = new ArrayList<TableDataRow>();
-
-        long start = System.currentTimeMillis();
-        AssetItemIterator it = repository.findAssetsByName( search, searchArchived ); // search for archived items
-        log.debug("Search time: " + (System.currentTimeMillis() - start));
-
-        RepositoryFilter filter = new AssetItemFilter();
-        for(int i = 0; i < max; i++) {
-            if (!it.hasNext()) {
-                break;
-            }
-            AssetItem item = (AssetItem) it.next();
+		RepositoryFilter filter = new AssetItemFilter();
+		for (int i = 0; i < max; i++) {
+			if (!it.hasNext()) {
+				break;
+			}
+			AssetItem item = (AssetItem) it.next();
 			if (filter.accept(item, RoleTypes.PACKAGE_READONLY)) {
 				TableDataRow row = new TableDataRow();
 				row.id = item.getUUID();
@@ -953,103 +1020,118 @@
 
 				resultList.add(row);
 			}
-        }
+		}
 
-        while (it.hasNext()) {
-        	if (filter.accept((AssetItem) it.next(), RoleTypes.PACKAGE_READONLY)) {
+		while (it.hasNext()) {
+			if (filter
+					.accept((AssetItem) it.next(), RoleTypes.PACKAGE_READONLY)) {
 				TableDataRow empty = new TableDataRow();
 				empty.id = "MORE";
 				resultList.add(empty);
 				break;
 			}
-        }
+		}
 
-        result.data = resultList.toArray( new TableDataRow[resultList.size()] );
-        return result;
+		result.data = resultList.toArray(new TableDataRow[resultList.size()]);
+		return result;
 
-    }
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void removeCategory(String categoryPath) throws SerializableException {
-        log.info( "USER:" + repository.getSession().getUserID() +
-        " REMOVING CATEGORY path: [" + categoryPath + "]" );
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void removeCategory(String categoryPath)
+			throws SerializableException {
+		log.info("USER:" + repository.getSession().getUserID()
+				+ " REMOVING CATEGORY path: [" + categoryPath + "]");
 
-        try {
-            repository.loadCategory( categoryPath ).remove();
-            repository.save();
-        } catch (RulesRepositoryException e) {
-        	throw new DetailedSerializableException("Unable to remove category. It is probably still used (even by archived items).", e.getMessage());
-        }
-    }
+		try {
+			repository.loadCategory(categoryPath).remove();
+			repository.save();
+		} catch (RulesRepositoryException e) {
+			throw new DetailedSerializableException(
+					"Unable to remove category. It is probably still used (even by archived items).",
+					e.getMessage());
+		}
+	}
 
-    @WebRemote
-    @Restrict("#{s:hasRole('admin')}")
-    public void clearRulesRepository() {
-        RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(repository.getSession());
-        admin.clearRulesRepository();
-    }
+	@WebRemote
+	@Restrict("#{s:hasRole('admin')}")
+	public void clearRulesRepository() {
+		RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(
+				repository.getSession());
+		admin.clearRulesRepository();
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public SuggestionCompletionEngine loadSuggestionCompletionEngine(String packageName) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_READONLY, packageName);
-    	}
-        try {
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public SuggestionCompletionEngine loadSuggestionCompletionEngine(
+			String packageName) throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(packageName),
+					RoleTypes.PACKAGE_READONLY);
+		}
+		try {
 
-            PackageItem pkg = repository.loadPackage( packageName );
-            BRMSSuggestionCompletionLoader loader = new BRMSSuggestionCompletionLoader();
-            return loader.getSuggestionEngine( pkg );
-        } catch (RulesRepositoryException e) {
-            log.error( e );
-            throw new SerializableException(e.getMessage());
-        }
+			PackageItem pkg = repository.loadPackage(packageName);
+			BRMSSuggestionCompletionLoader loader = new BRMSSuggestionCompletionLoader();
+			return loader.getSuggestionEngine(pkg);
+		} catch (RulesRepositoryException e) {
+			log.error(e);
+			throw new SerializableException(e.getMessage());
+		}
 
-    }
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public BuilderResult[] buildPackage(String packageUUID, String selectorConfigName, boolean force) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, packageUUID);
-    	}
-        PackageItem item = repository.loadPackageByUUID( packageUUID );
-        return buildPackage(selectorConfigName, force, item);
-    }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public BuilderResult[] buildPackage(String packageUUID,
+			String selectorConfigName, boolean force)
+			throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageUUIDType(packageUUID),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
+		PackageItem item = repository.loadPackageByUUID(packageUUID);
+		return buildPackage(selectorConfigName, force, item);
+	}
 
 	private BuilderResult[] buildPackage(String selectorConfigName,
 			boolean force, PackageItem item)
 			throws DetailedSerializableException {
 		if (!force && item.isBinaryUpToDate()) {
-        	//we can just return all OK if its up to date.
-        	return null;
-        }
-        ContentPackageAssembler asm = new ContentPackageAssembler(item, selectorConfigName);
-        if (asm.hasErrors()) {
-            BuilderResult[] result = generateBuilderResults( asm );
-            return result;
-        } else {
-            try {
-                ByteArrayOutputStream bout = new ByteArrayOutputStream();
-                ObjectOutput out = new DroolsObjectOutputStream(bout);
-                out.writeObject( asm.getBinaryPackage() );
+			// we can just return all OK if its up to date.
+			return null;
+		}
+		ContentPackageAssembler asm = new ContentPackageAssembler(item,
+				selectorConfigName);
+		if (asm.hasErrors()) {
+			BuilderResult[] result = generateBuilderResults(asm);
+			return result;
+		} else {
+			try {
+				ByteArrayOutputStream bout = new ByteArrayOutputStream();
+				ObjectOutput out = new DroolsObjectOutputStream(bout);
+				out.writeObject(asm.getBinaryPackage());
 
-                item.updateCompiledPackage( new ByteArrayInputStream( bout.toByteArray()) );
-                out.flush();
-                out.close();
+				item.updateCompiledPackage(new ByteArrayInputStream(bout
+						.toByteArray()));
+				out.flush();
+				out.close();
 
-                updateBinaryPackage(item, asm);
-                repository.save();
-            } catch (Exception e) {
-                log.error( e );
-                throw new DetailedSerializableException("An error occurred building the package.", e.getMessage());
-            }
+				updateBinaryPackage(item, asm);
+				repository.save();
+			} catch (Exception e) {
+				log.error(e);
+				throw new DetailedSerializableException(
+						"An error occurred building the package.", e
+								.getMessage());
+			}
 
+			return null;
 
-            return null;
-
-        }
+		}
 	}
 
 	private void updateBinaryPackage(PackageItem item,
@@ -1057,249 +1139,275 @@
 		item.updateBinaryUpToDate(true);
 		RuleBase rb = RuleBaseFactory.newRuleBase();
 		rb.addPackage(asm.getBinaryPackage());
-		//this.ruleBaseCache.put(item.getUUID(), rb);
+		// this.ruleBaseCache.put(item.getUUID(), rb);
 	}
 
-
-
 	private BuilderResult[] generateBuilderResults(ContentPackageAssembler asm) {
-        BuilderResult[] result = new BuilderResult[asm.getErrors().size()];
-        for ( int i = 0; i < result.length; i++ ) {
-            ContentAssemblyError err = asm.getErrors().get( i );
-            BuilderResult res = new BuilderResult();
-            res.assetName = err.itemInError.getName();
-            res.assetFormat = err.itemInError.getFormat();
-            res.message = err.errorReport;
-            res.uuid = err.itemInError.getUUID();
-            result[i] = res;
-        }
-        return result;
-    }
+		BuilderResult[] result = new BuilderResult[asm.getErrors().size()];
+		for (int i = 0; i < result.length; i++) {
+			ContentAssemblyError err = asm.getErrors().get(i);
+			BuilderResult res = new BuilderResult();
+			res.assetName = err.itemInError.getName();
+			res.assetFormat = err.itemInError.getFormat();
+			res.message = err.errorReport;
+			res.uuid = err.itemInError.getUUID();
+			result[i] = res;
+		}
+		return result;
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String buildPackageSource(String packageUUID) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, packageUUID);
-    	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String buildPackageSource(String packageUUID)
+			throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageUUIDType(packageUUID),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-        PackageItem item = repository.loadPackageByUUID( packageUUID );
-        ContentPackageAssembler asm = new ContentPackageAssembler(item, false);
-        return asm.getDRL();
-    }
+		PackageItem item = repository.loadPackageByUUID(packageUUID);
+		ContentPackageAssembler asm = new ContentPackageAssembler(item, false);
+		return asm.getDRL();
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String buildAssetSource(RuleAsset asset) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, asset.metaData.packageName);
-    	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String buildAssetSource(RuleAsset asset)
+			throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(asset.metaData.packageName),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-        AssetItem item = repository.loadAssetByUUID( asset.uuid );
+		AssetItem item = repository.loadAssetByUUID(asset.uuid);
 
-        ContentHandler handler = ContentManager.getHandler( item.getFormat() );//new AssetContentFormatHandler();
-        handler.storeAssetContent( asset, item );
-        StringBuffer buf = new StringBuffer();
-        if (handler.isRuleAsset()) {
+		ContentHandler handler = ContentManager.getHandler(item.getFormat());// new
+																				// AssetContentFormatHandler();
+		handler.storeAssetContent(asset, item);
+		StringBuffer buf = new StringBuffer();
+		if (handler.isRuleAsset()) {
 
-            BRMSPackageBuilder builder = new BRMSPackageBuilder(new PackageBuilderConfiguration());
-            //now we load up the DSL files
-            builder.setDSLFiles( BRMSPackageBuilder.getDSLMappingFiles( item.getPackage(), new BRMSPackageBuilder.DSLErrorEvent() {
-                public void recordError(AssetItem asset, String message) {
-                    //ignore at this point...
-                }
-            }));
-            ((IRuleAsset) handler).assembleDRL( builder, item, buf );
-        } else {
-            return item.getContent();
-        }
+			BRMSPackageBuilder builder = new BRMSPackageBuilder(
+					new PackageBuilderConfiguration());
+			// now we load up the DSL files
+			builder.setDSLFiles(BRMSPackageBuilder.getDSLMappingFiles(item
+					.getPackage(), new BRMSPackageBuilder.DSLErrorEvent() {
+				public void recordError(AssetItem asset, String message) {
+					// ignore at this point...
+				}
+			}));
+			((IRuleAsset) handler).assembleDRL(builder, item, buf);
+		} else {
+			return item.getContent();
+		}
 
-        return buf.toString();
-    }
+		return buf.toString();
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public BuilderResult[] buildAsset(RuleAsset asset) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, asset.metaData.packageName);
-    	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public BuilderResult[] buildAsset(RuleAsset asset)
+			throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(asset.metaData.packageName),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-    	try {
+		try {
 
-	        AssetItem item = repository.loadAssetByUUID( asset.uuid );
+			AssetItem item = repository.loadAssetByUUID(asset.uuid);
 
-	        ContentHandler handler = ContentManager.getHandler( item.getFormat() );//new AssetContentFormatHandler();
-	        handler.storeAssetContent( asset, item );
+			ContentHandler handler = ContentManager
+					.getHandler(item.getFormat());// new
+													// AssetContentFormatHandler();
+			handler.storeAssetContent(asset, item);
 
+			if (handler instanceof IValidating) {
+				return ((IValidating) handler).validateAsset(item);
+			} else {
 
-	        if (handler instanceof IValidating) {
-	            return ((IValidating) handler).validateAsset( item );
-	        } else {
+				ContentPackageAssembler asm = new ContentPackageAssembler(item);
+				if (!asm.hasErrors()) {
+					return null;
+				} else {
+					return generateBuilderResults(asm);
+				}
+			}
+		} catch (Exception e) {
+			log.error(e);
+			BuilderResult[] result = new BuilderResult[1];
 
-	            ContentPackageAssembler asm = new ContentPackageAssembler(item);
-	            if (!asm.hasErrors()) {
-	                return null;
-	            } else {
-	                return generateBuilderResults( asm );
-	            }
-	        }
-    	} catch (Exception e) {
-    		log.error(e);
-            BuilderResult[] result = new BuilderResult[1];
+			BuilderResult res = new BuilderResult();
+			res.assetName = asset.metaData.name;
+			res.assetFormat = asset.metaData.format;
+			res.message = "Unable to validate this asset. (Check log for detailed messages).";
+			res.uuid = asset.uuid;
+			result[0] = res;
 
-            BuilderResult res = new BuilderResult();
-            res.assetName = asset.metaData.name;
-            res.assetFormat = asset.metaData.format;
-            res.message = "Unable to validate this asset. (Check log for detailed messages).";
-            res.uuid = asset.uuid;
-            result[0] = res;
+			return result;
+		}
 
+	}
 
-            return result;
-    	}
+	@WebRemote
+	@Restrict("#{s:hasRole('admin')}")
+	public void copyPackage(String sourcePackageName, String destPackageName)
+			throws SerializableException {
+		try {
+			repository.copyPackage(sourcePackageName, destPackageName);
+		} catch (RulesRepositoryException e) {
+			log.error(e);
+			throw e;
+		}
 
-    }
+		// If we allow package owner to copy package, we will have to update the
+		// permission store
+		// for the newly copied package.
+		// Update permission store
+		/*
+		 * String copiedUuid = ""; try { PackageItem source =
+		 * repository.loadPackage( destPackageName ); copiedUuid =
+		 * source.getUUID(); } catch (RulesRepositoryException e) { log.error( e ); }
+		 * PackageBasedPermissionStore pbps = new PackageBasedPermissionStore();
+		 * pbps.addPackageBasedPermission(new PackageBasedPermission(copiedUuid,
+		 * Identity.instance().getPrincipal().getName(),
+		 * RoleTypes.PACKAGE_ADMIN));
+		 */
+	}
 
-    @WebRemote
-    @Restrict("#{s:hasRole('admin')}")
-    public void copyPackage(String sourcePackageName, String destPackageName) throws SerializableException {
-    	try {
-            repository.copyPackage( sourcePackageName, destPackageName );
-        } catch (RulesRepositoryException e) {
-            log.error( e );
-            throw e;
-        }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String renameAsset(String uuid, String newName) {
+		AssetItem item = repository.loadAssetByUUID(uuid);
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageUUIDType(item.getPackage().getUUID()),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-        //If we allow package owner to copy package, we will have to update the permission store
-        //for the newly copied package.
-        //Update permission store
-/*    	String copiedUuid = "";
-    	try {
-        	PackageItem source = repository.loadPackage( destPackageName );
-        	copiedUuid = source.getUUID();
-        } catch (RulesRepositoryException e) {
-            log.error( e );
-        }
-        PackageBasedPermissionStore pbps = new PackageBasedPermissionStore();
-        pbps.addPackageBasedPermission(new PackageBasedPermission(copiedUuid,
-				Identity.instance().getPrincipal().getName(),
-				RoleTypes.PACKAGE_ADMIN));*/
-    }
+		return repository.renameAsset(uuid, newName);
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String renameAsset(String uuid, String newName) {
-    	AssetItem item = repository.loadAssetByUUID( uuid );
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, item.getPackage().getUUID());
-    	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void archiveAsset(String uuid, boolean value) {
+		try {
+			AssetItem item = repository.loadAssetByUUID(uuid);
 
-        return repository.renameAsset( uuid, newName );
-    }
+			if (Contexts.isSessionContextActive()) {
+				Identity.instance().checkPermission(
+						new PackageUUIDType(item.getPackage().getUUID()),
+						RoleTypes.PACKAGE_DEVELOPER);
+			}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void archiveAsset(String uuid, boolean value) {
-        try {
-            AssetItem item = repository.loadAssetByUUID( uuid );
+			item.archiveItem(value);
+			PackageItem pkg = item.getPackage();
+			pkg.updateBinaryUpToDate(false);
+			this.ruleBaseCache.remove(pkg.getUUID());
+			item.checkin("unarchived");
 
-        	if (Contexts.isSessionContextActive()) {
-        		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, item.getPackage().getUUID());
-        	}
+		} catch (RulesRepositoryException e) {
+			log.error(e);
+			throw e;
+		}
+	}
 
-            item.archiveItem( value );
-    		PackageItem pkg = item.getPackage();
-    		pkg.updateBinaryUpToDate(false);
-    		this.ruleBaseCache.remove(pkg.getUUID());
-    		item.checkin( "unarchived" );
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void removeAsset(String uuid) {
+		try {
+			AssetItem item = repository.loadAssetByUUID(uuid);
+			if (Contexts.isSessionContextActive()) {
+				Identity.instance().checkPermission(
+						new PackageUUIDType(item.getPackage().getUUID()),
+						RoleTypes.PACKAGE_DEVELOPER);
+			}
 
-        } catch (RulesRepositoryException e) {
-            log.error( e );
-            throw e;
-        }
-    }
+			item.remove();
+			repository.save();
+		} catch (RulesRepositoryException e) {
+			log.error(e);
+			throw e;
+		}
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void removeAsset(String uuid) {
-        try {
-            AssetItem item = repository.loadAssetByUUID( uuid );
-        	if (Contexts.isSessionContextActive()) {
-        		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, item.getPackage().getUUID());
-        	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public void removePackage(String uuid) {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(new PackageUUIDType(uuid),
+					RoleTypes.PACKAGE_ADMIN);
+		}
+		try {
+			PackageItem item = repository.loadPackageByUUID(uuid);
+			item.remove();
+			repository.save();
+		} catch (RulesRepositoryException e) {
+			log.error(e);
+			throw e;
+		}
+	}
 
-            item.remove();
-            repository.save();
-        } catch (RulesRepositoryException e) {
-            log.error( e );
-            throw e;
-        }
-    }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String renamePackage(String uuid, String newName) {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(new PackageUUIDType(uuid),
+					RoleTypes.PACKAGE_ADMIN);
+		}
 
+		return repository.renamePackage(uuid, newName);
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public void removePackage(String uuid) {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_ADMIN, uuid);
-    	}
-        try {
-            PackageItem item = repository.loadPackageByUUID(uuid);
-            item.remove();
-            repository.save();
-        } catch (RulesRepositoryException e) {
-            log.error( e );
-            throw e;
-        }
-    }
+	@WebRemote
+	@Restrict("#{s:hasRole('admin')}")
+	public void rebuildSnapshots() throws SerializableException {
+		Iterator pkit = repository.listPackages();
+		while (pkit.hasNext()) {
+			PackageItem pkg = (PackageItem) pkit.next();
+			String[] snaps = repository.listPackageSnapshots(pkg.getName());
+			for (String snapName : snaps) {
+				PackageItem snap = repository.loadPackageSnapshot(
+						pkg.getName(), snapName);
+				BuilderResult[] res = this.buildPackage(snap.getUUID(), "",
+						true);
+				if (res != null) {
+					StringBuffer buf = new StringBuffer();
+					for (int i = 0; i < res.length; i++) {
+						buf.append(res[i].toString());
+						buf.append('\n');
+					}
+					throw new DetailedSerializableException(
+							"Unable to rebuild snapshot [" + snapName, buf
+									.toString()
+									+ "]");
+				}
+			}
+		}
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String renamePackage(String uuid, String newName) {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_ADMIN, uuid);
-    	}
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public String[] listRulesInPackage(String packageName)
+			throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(packageName),
+					RoleTypes.PACKAGE_READONLY);
+		}
 
-        return repository.renamePackage( uuid, newName );
-    }
-
-    @WebRemote
-    @Restrict("#{s:hasRole('admin')}")
-    public void rebuildSnapshots() throws SerializableException {
-        Iterator pkit = repository.listPackages();
-        while(pkit.hasNext()) {
-            PackageItem pkg = (PackageItem) pkit.next();
-            String[] snaps = repository.listPackageSnapshots( pkg.getName() );
-            for ( String snapName : snaps ) {
-                PackageItem snap = repository.loadPackageSnapshot( pkg.getName(), snapName );
-                BuilderResult[]  res = this.buildPackage( snap.getUUID(), "", true  ) ;
-                if (res != null) {
-                    StringBuffer buf = new StringBuffer();
-                    for ( int i = 0; i < res.length; i++ ) {
-                        buf.append( res[i].toString() );
-                        buf.append( '\n' );
-                    }
-                    throw new DetailedSerializableException("Unable to rebuild snapshot [" + snapName, buf.toString() + "]" );
-                }
-            }
-        }
-    }
-
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public String[] listRulesInPackage(String packageName) throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_READONLY, packageName);
-    	}
-
-    	PackageItem item = repository.loadPackage(packageName);
-        ContentPackageAssembler asm = new ContentPackageAssembler(item, false);
-        List<String> result = new ArrayList<String>();
-        DrlParser p = new DrlParser();
-        try {
+		PackageItem item = repository.loadPackage(packageName);
+		ContentPackageAssembler asm = new ContentPackageAssembler(item, false);
+		List<String> result = new ArrayList<String>();
+		DrlParser p = new DrlParser();
+		try {
 			PackageDescr pkg = p.parse(asm.getDRL());
 			int count = 0;
-			for (Iterator iterator = pkg.getRules().iterator(); iterator.hasNext();) {
+			for (Iterator iterator = pkg.getRules().iterator(); iterator
+					.hasNext();) {
 				RuleDescr r = (RuleDescr) iterator.next();
 				result.add(r.getName());
 				count++;
@@ -1313,98 +1421,108 @@
 			log.error(e);
 			return new String[0];
 		}
-    }
+	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
 	public ScenarioRunResult runScenario(String packageName, Scenario scenario)
 			throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, packageName);
-    	}
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageNameType(packageName),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-    	PackageItem item = this.repository.loadPackage(packageName);
+		PackageItem item = this.repository.loadPackage(packageName);
 
-    	//nasty classloader needed to make sure we use the same tree the whole time.
+		// nasty classloader needed to make sure we use the same tree the whole
+		// time.
 		ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
 
 		final RuleBase rb;
 
 		try {
-	    	if (item.isBinaryUpToDate() && this.ruleBaseCache.containsKey(item.getUUID())) {
-	    		rb = this.ruleBaseCache.get(item.getUUID());
-	    		AbstractRuleBase arb = (AbstractRuleBase) rb;
-	    		//load up the existing class loader from before
+			if (item.isBinaryUpToDate()
+					&& this.ruleBaseCache.containsKey(item.getUUID())) {
+				rb = this.ruleBaseCache.get(item.getUUID());
+				AbstractRuleBase arb = (AbstractRuleBase) rb;
+				// load up the existing class loader from before
 
-	    	} else {
-	        	//load up the classloader we are going to use
-	    		List<JarInputStream> jars = BRMSPackageBuilder.getJars(item);
-	    		ClassLoader buildCl = BRMSPackageBuilder.createClassLoader(jars);
+			} else {
+				// load up the classloader we are going to use
+				List<JarInputStream> jars = BRMSPackageBuilder.getJars(item);
+				ClassLoader buildCl = BRMSPackageBuilder
+						.createClassLoader(jars);
 
-	    		//we have to build the package, and try again.
-	    		if (item.isBinaryUpToDate()) {
-	    			rb = loadRuleBase(item, buildCl);
-	    			this.ruleBaseCache.put(item.getUUID(), rb);
-	    		} else {
-	    			BuilderResult[] errs = this.buildPackage(null, false, item);
-	    			if (errs == null || errs.length == 0) {
-	    				rb = loadRuleBase(item, buildCl);
-	    				this.ruleBaseCache.put(item.getUUID(), rb);
-	    			} else {
-	    				return new ScenarioRunResult(errs, null);
-	    			}
-	    		}
-	    	}
+				// we have to build the package, and try again.
+				if (item.isBinaryUpToDate()) {
+					rb = loadRuleBase(item, buildCl);
+					this.ruleBaseCache.put(item.getUUID(), rb);
+				} else {
+					BuilderResult[] errs = this.buildPackage(null, false, item);
+					if (errs == null || errs.length == 0) {
+						rb = loadRuleBase(item, buildCl);
+						this.ruleBaseCache.put(item.getUUID(), rb);
+					} else {
+						return new ScenarioRunResult(errs, null);
+					}
+				}
+			}
 
-    		ClassLoader cl = this.ruleBaseCache.get(item.getUUID()).getPackages()[0].getPackageScopeClassLoader();
-	    	Thread.currentThread().setContextClassLoader(cl);
-	    	return runScenario(scenario, item, cl, rb);
+			ClassLoader cl = this.ruleBaseCache.get(item.getUUID())
+					.getPackages()[0].getPackageScopeClassLoader();
+			Thread.currentThread().setContextClassLoader(cl);
+			return runScenario(scenario, item, cl, rb);
 
 		} finally {
 			Thread.currentThread().setContextClassLoader(originalCL);
 		}
 
-
 	}
 
-	private RuleBase loadRuleBase(PackageItem item, ClassLoader cl)  throws DetailedSerializableException {
+	private RuleBase loadRuleBase(PackageItem item, ClassLoader cl)
+			throws DetailedSerializableException {
 		try {
-			RuleBase rb = RuleBaseFactory.newRuleBase(new RuleBaseConfiguration(cl));
-			Package bin = (Package) DroolsStreamUtils.streamIn(item.getCompiledPackageBytes(), cl);
+			RuleBase rb = RuleBaseFactory
+					.newRuleBase(new RuleBaseConfiguration(cl));
+			Package bin = (Package) DroolsStreamUtils.streamIn(item
+					.getCompiledPackageBytes(), cl);
 			rb.addPackage(bin);
 			return rb;
 		} catch (ClassNotFoundException e) {
 			log.error(e);
-			throw new DetailedSerializableException("A required class was not found.", e.getMessage());
+			throw new DetailedSerializableException(
+					"A required class was not found.", e.getMessage());
 		} catch (Exception e) {
 			log.error(e);
-			throw new DetailedSerializableException("Unable to load a rulebase.", e.getMessage());
+			throw new DetailedSerializableException(
+					"Unable to load a rulebase.", e.getMessage());
 		}
 	}
 
-	private ScenarioRunResult runScenario(
-			Scenario scenario, PackageItem item, ClassLoader cl, RuleBase rb)
-			throws DetailedSerializableException {
+	private ScenarioRunResult runScenario(Scenario scenario, PackageItem item,
+			ClassLoader cl, RuleBase rb) throws DetailedSerializableException {
 
-		//RuleBase rb = ruleBaseCache.get(item.getUUID());
+		// RuleBase rb = ruleBaseCache.get(item.getUUID());
 		Package bin = rb.getPackages()[0];
 
-
 		Set<String> imps = bin.getImports().keySet();
 		Set<String> allImps = new HashSet<String>(imps);
 		if (bin.getGlobals() != null) {
-			for (Iterator iterator = bin.getGlobals().keySet().iterator(); iterator.hasNext();) {
+			for (Iterator iterator = bin.getGlobals().keySet().iterator(); iterator
+					.hasNext();) {
 				Class c = (Class) bin.getGlobals().get(iterator.next());
 				allImps.add(c.getName());
 			}
 		}
-		allImps.add(bin.getName() + ".*"); //need this for Generated beans to work
+		allImps.add(bin.getName() + ".*"); // need this for Generated beans to
+											// work
 
-
 		ClassTypeResolver res = new ClassTypeResolver(allImps, cl);
 		SessionConfiguration sessionConfiguration = new SessionConfiguration();
-		sessionConfiguration.setKeepReference( false );
-		InternalWorkingMemory workingMemory = (InternalWorkingMemory) rb.newStatefulSession(sessionConfiguration);
+		sessionConfiguration.setKeepReference(false);
+		InternalWorkingMemory workingMemory = (InternalWorkingMemory) rb
+				.newStatefulSession(sessionConfiguration);
 		return runScenario(scenario, res, workingMemory);
 	}
 
@@ -1416,93 +1534,101 @@
 			return new ScenarioRunResult(null, scenario);
 		} catch (ClassNotFoundException e) {
 			log.error(e);
-			throw new DetailedSerializableException("Unable to load a required class.", e.getMessage());
+			throw new DetailedSerializableException(
+					"Unable to load a required class.", e.getMessage());
 		}
 	}
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
 	public BulkTestRunResult runScenariosInPackage(String packageUUID)
 			throws SerializableException {
-    	if (Contexts.isSessionContextActive()) {
-    		Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, packageUUID);
-    	}
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(
+					new PackageUUIDType(packageUUID),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
 		PackageItem item = repository.loadPackageByUUID(packageUUID);
 
 		ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
 		ClassLoader cl = null;
 
-
 		try {
-	    	if (item.isBinaryUpToDate() && this.ruleBaseCache.containsKey(item.getUUID())) {
-	     	 	RuleBase rb = this.ruleBaseCache.get(item.getUUID());
-	    		AbstractRuleBase arb = (AbstractRuleBase) rb;
-	    		//load up the existing class loader from before
-	    		cl = arb.getConfiguration().getClassLoader();
-	    		Thread.currentThread().setContextClassLoader(cl);
-	    	} else {
-	        	//load up the classloader we are going to use
-	    		List<JarInputStream> jars = BRMSPackageBuilder.getJars(item);
-	    		cl = BRMSPackageBuilder.createClassLoader(jars);
-	    		Thread.currentThread().setContextClassLoader(cl);
+			if (item.isBinaryUpToDate()
+					&& this.ruleBaseCache.containsKey(item.getUUID())) {
+				RuleBase rb = this.ruleBaseCache.get(item.getUUID());
+				AbstractRuleBase arb = (AbstractRuleBase) rb;
+				// load up the existing class loader from before
+				cl = arb.getConfiguration().getClassLoader();
+				Thread.currentThread().setContextClassLoader(cl);
+			} else {
+				// load up the classloader we are going to use
+				List<JarInputStream> jars = BRMSPackageBuilder.getJars(item);
+				cl = BRMSPackageBuilder.createClassLoader(jars);
+				Thread.currentThread().setContextClassLoader(cl);
 
-	    		//we have to build the package, and try again.
-	    		if (item.isBinaryUpToDate()) {
-	    			this.ruleBaseCache.put(item.getUUID(), loadRuleBase(item, cl));
-	    		} else {
-	    			BuilderResult[] errs = this.buildPackage(null, false, item);
-	    			if (errs == null || errs.length == 0) {
-	    				this.ruleBaseCache.put(item.getUUID(), loadRuleBase(item, cl));
-	    			} else {
-	    				return new BulkTestRunResult(errs, null, 0, null);
-	    			}
-	    		}
-	    	}
+				// we have to build the package, and try again.
+				if (item.isBinaryUpToDate()) {
+					this.ruleBaseCache.put(item.getUUID(), loadRuleBase(item,
+							cl));
+				} else {
+					BuilderResult[] errs = this.buildPackage(null, false, item);
+					if (errs == null || errs.length == 0) {
+						this.ruleBaseCache.put(item.getUUID(), loadRuleBase(
+								item, cl));
+					} else {
+						return new BulkTestRunResult(errs, null, 0, null);
+					}
+				}
+			}
 
-
-	    	AssetItemIterator it  = item.listAssetsByFormat(new String[] {AssetFormats.TEST_SCENARIO});
-	    	List<ScenarioResultSummary> resultSummaries = new ArrayList<ScenarioResultSummary>();
+			AssetItemIterator it = item
+					.listAssetsByFormat(new String[] { AssetFormats.TEST_SCENARIO });
+			List<ScenarioResultSummary> resultSummaries = new ArrayList<ScenarioResultSummary>();
 			RuleBase rb = ruleBaseCache.get(item.getUUID());
 			Package bin = rb.getPackages()[0];
 
-			ClassTypeResolver res = new ClassTypeResolver(bin.getImports().keySet(), cl);
+			ClassTypeResolver res = new ClassTypeResolver(bin.getImports()
+					.keySet(), cl);
 			SessionConfiguration sessionConfiguration = new SessionConfiguration();
-			sessionConfiguration.setKeepReference( false );
-			InternalWorkingMemory workingMemory = (InternalWorkingMemory) rb.newStatefulSession( sessionConfiguration);
+			sessionConfiguration.setKeepReference(false);
+			InternalWorkingMemory workingMemory = (InternalWorkingMemory) rb
+					.newStatefulSession(sessionConfiguration);
 
-			RuleCoverageListener coverage = new RuleCoverageListener(expectedRules(bin));
+			RuleCoverageListener coverage = new RuleCoverageListener(
+					expectedRules(bin));
 			workingMemory.addEventListener(coverage);
 
-	    	while(it.hasNext()) {
-	    		RuleAsset asset = loadAsset((AssetItem) it.next());
-	    		Scenario sc = (Scenario) asset.content;
-	    		sc = runScenario(sc, res, workingMemory).scenario;
+			while (it.hasNext()) {
+				RuleAsset asset = loadAsset((AssetItem) it.next());
+				Scenario sc = (Scenario) asset.content;
+				sc = runScenario(sc, res, workingMemory).scenario;
 
-	    		//clean out WM
-	    		Iterator<FactHandle> fhs = workingMemory.iterateFactHandles();
-	    		while(fhs.hasNext()) {
-	    			workingMemory.retract(fhs.next());
-	    		}
+				// clean out WM
+				Iterator<FactHandle> fhs = workingMemory.iterateFactHandles();
+				while (fhs.hasNext()) {
+					workingMemory.retract(fhs.next());
+				}
 
-	    		int[] totals = sc.countFailuresTotal();
-	    		resultSummaries.add(new ScenarioResultSummary(totals[0], totals[1], asset.metaData.name, asset.metaData.description, asset.uuid));
-	    	}
+				int[] totals = sc.countFailuresTotal();
+				resultSummaries.add(new ScenarioResultSummary(totals[0],
+						totals[1], asset.metaData.name,
+						asset.metaData.description, asset.uuid));
+			}
 
-	    	ScenarioResultSummary[] summaries = resultSummaries.toArray(new ScenarioResultSummary[resultSummaries.size()]);
+			ScenarioResultSummary[] summaries = resultSummaries
+					.toArray(new ScenarioResultSummary[resultSummaries.size()]);
 
-	    	BulkTestRunResult result = new BulkTestRunResult(null,
-	    						resultSummaries.toArray(summaries),
-	    						coverage.getPercentCovered(),
-	    						coverage.getUnfiredRules());
-	    	return result;
+			BulkTestRunResult result = new BulkTestRunResult(null,
+					resultSummaries.toArray(summaries), coverage
+							.getPercentCovered(), coverage.getUnfiredRules());
+			return result;
 
-
 		} finally {
 			Thread.currentThread().setContextClassLoader(originalCL);
 		}
 
-
 	}
 
 	private HashSet<String> expectedRules(Package bin) {
@@ -1514,11 +1640,13 @@
 	}
 
 	@WebRemote
-    @Restrict("#{identity.loggedIn}")
+	@Restrict("#{identity.loggedIn}")
 	public AnalysisReport analysePackage(String packageUUID)
 			throws SerializableException {
 		if (Contexts.isSessionContextActive()) {
-			Identity.instance().checkPermission("ignoredanyway", RoleTypes.PACKAGE_DEVELOPER, packageUUID);
+			Identity.instance().checkPermission(
+					new PackageUUIDType(packageUUID),
+					RoleTypes.PACKAGE_DEVELOPER);
 		}
 
 		String drl = this.buildPackageSource(packageUUID);
@@ -1527,43 +1655,53 @@
 			return runner.analyse(drl);
 		} catch (DroolsParserException e) {
 			log.error(e);
-			throw new DetailedSerializableException("Unable to parse the rules.", e.getMessage());
+			throw new DetailedSerializableException(
+					"Unable to parse the rules.", e.getMessage());
 		}
 	}
 
 	@WebRemote
-    @Restrict("#{identity.loggedIn}")
-	public String[] listTypesInPackage(String packageUUID) throws SerializableException {
+	@Restrict("#{identity.loggedIn}")
+	public String[] listTypesInPackage(String packageUUID)
+			throws SerializableException {
 		if (Contexts.isSessionContextActive()) {
-			Identity.instance().checkPermission("ignoredanyway", "package.readoly", packageUUID);
+			Identity.instance().checkPermission(
+					new PackageUUIDType(packageUUID), "package.readoly");
 		}
 
 		PackageItem pkg = this.repository.loadPackageByUUID(packageUUID);
 		List<String> res = new ArrayList<String>();
-		AssetItemIterator it = pkg.listAssetsByFormat(new String[] {AssetFormats.MODEL, AssetFormats.DRL_MODEL});
+		AssetItemIterator it = pkg.listAssetsByFormat(new String[] {
+				AssetFormats.MODEL, AssetFormats.DRL_MODEL });
 
 		JarInputStream jis = null;
 
 		try {
-			while(it.hasNext()) {
+			while (it.hasNext()) {
 				AssetItem asset = (AssetItem) it.next();
 				if (!asset.isArchived()) {
 					if (asset.getFormat().equals(AssetFormats.MODEL)) {
-						jis = new JarInputStream(asset.getBinaryContentAttachment());
+						jis = new JarInputStream(asset
+								.getBinaryContentAttachment());
 						JarEntry entry = null;
 						while ((entry = jis.getNextJarEntry()) != null) {
 							if (!entry.isDirectory()) {
 								if (entry.getName().endsWith(".class")) {
-									 res.add(ModelContentHandler.convertPathToName(entry.getName()));
+									res
+											.add(ModelContentHandler
+													.convertPathToName(entry
+															.getName()));
 								}
 							}
 						}
 					} else {
-						//its delcared model
+						// its delcared model
 						DrlParser parser = new DrlParser();
 						try {
-							PackageDescr desc = parser.parse(asset.getContent());
-							List<TypeDeclarationDescr> types = desc.getTypeDeclarations();
+							PackageDescr desc = parser
+									.parse(asset.getContent());
+							List<TypeDeclarationDescr> types = desc
+									.getTypeDeclarations();
 							for (TypeDeclarationDescr typeDeclarationDescr : types) {
 								res.add(typeDeclarationDescr.getTypeName());
 							}
@@ -1578,36 +1716,36 @@
 			return res.toArray(new String[res.size()]);
 		} catch (IOException e) {
 			log.error(e);
-			throw new DetailedSerializableException("Unable to read the jar files in the package.", e.getMessage());
+			throw new DetailedSerializableException(
+					"Unable to read the jar files in the package.", e
+							.getMessage());
 		} finally {
 			IOUtils.closeQuietly(jis);
 		}
 
-
 	}
 
 	@WebRemote
-    //@Restrict("#{identity.loggedIn}")
-    @Restrict("#{s:hasRole('admin')}")
+	// @Restrict("#{identity.loggedIn}")
+	@Restrict("#{s:hasRole('admin')}")
 	public LogEntry[] showLog() {
 		return LoggingHelper.getMessages();
 
 	}
 
-
 	@WebRemote
-    @Restrict("#{identity.loggedIn}")
+	@Restrict("#{identity.loggedIn}")
 	public void renameCategory(String fullPathAndName, String newName) {
 		repository.renameCategory(fullPathAndName, newName);
 	}
 
-    public static String getDroolsHeader(PackageItem pkg) {
-    	if (pkg.containsAsset("drools")) {
-    		return pkg.loadAsset("drools").getContent();
-    	} else {
-    		return "";
-    	}
-    }
+	public static String getDroolsHeader(PackageItem pkg) {
+		if (pkg.containsAsset("drools")) {
+			return pkg.loadAsset("drools").getContent();
+		} else {
+			return "";
+		}
+	}
 
 	public static void updateDroolsHeader(String string, PackageItem pkg) {
 		pkg.checkout();
@@ -1625,19 +1763,19 @@
 
 	}
 
-
 	@WebRemote
-    @Restrict("#{identity.loggedIn}")
-	public String[] loadDropDownExpression(String[] valuePairs, String expression) {
+	@Restrict("#{identity.loggedIn}")
+	public String[] loadDropDownExpression(String[] valuePairs,
+			String expression) {
 		Map<String, String> context = new HashMap<String, String>();
 		for (int i = 0; i < valuePairs.length; i++) {
 			String[] pair = valuePairs[i].split("=");
 			context.put(pair[0], pair[1]);
 		}
-		//first interpolate the pairs
+		// first interpolate the pairs
 		expression = (String) TemplateRuntime.eval(expression, context);
 
-		//now we can eval it for real...
+		// now we can eval it for real...
 		Object result = MVEL.eval(expression);
 		if (result instanceof String[]) {
 			return (String[]) result;
@@ -1654,41 +1792,38 @@
 		}
 	}
 
-
-
 	@WebRemote
 	@Restrict("#{identity.loggedIn}")
 	public void rebuildPackages() throws SerializableException {
-        Iterator pkit = repository.listPackages();
-        StringBuffer errs = new StringBuffer();
-        while(pkit.hasNext()) {
-            PackageItem pkg = (PackageItem) pkit.next();
-            try {
-	            BuilderResult[]  res = this.buildPackage( pkg.getUUID(), "", true  ) ;
-	            if (res != null) {
-	            	errs.append("Unable to build package name [" + pkg.getName() + "]\n");
-	                StringBuffer buf = new StringBuffer();
-	                for ( int i = 0; i < res.length; i++ ) {
-	                    buf.append( res[i].toString() );
-	                    buf.append( '\n' );
-	                }
-	                log.warn(buf.toString());
+		Iterator pkit = repository.listPackages();
+		StringBuffer errs = new StringBuffer();
+		while (pkit.hasNext()) {
+			PackageItem pkg = (PackageItem) pkit.next();
+			try {
+				BuilderResult[] res = this
+						.buildPackage(pkg.getUUID(), "", true);
+				if (res != null) {
+					errs.append("Unable to build package name ["
+							+ pkg.getName() + "]\n");
+					StringBuffer buf = new StringBuffer();
+					for (int i = 0; i < res.length; i++) {
+						buf.append(res[i].toString());
+						buf.append('\n');
+					}
+					log.warn(buf.toString());
 
-	            }
-            } catch (Exception e) {
-            	log.error(e);
-            	errs.append("An error occurred building package [" + pkg.getName() + "]\n");
-            }
-        }
+				}
+			} catch (Exception e) {
+				log.error(e);
+				errs.append("An error occurred building package ["
+						+ pkg.getName() + "]\n");
+			}
+		}
 
-        if (errs.toString().length() > 0) {
-        	throw new DetailedSerializableException("Unable to rebuild all packages.", errs.toString());
-        }
+		if (errs.toString().length() > 0) {
+			throw new DetailedSerializableException(
+					"Unable to rebuild all packages.", errs.toString());
+		}
 	}
 
-
-
-
-
-
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolver.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolver.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,96 @@
+package org.drools.guvnor.server.security;
+
+import static org.jboss.seam.ScopeType.APPLICATION;
+import static org.jboss.seam.annotations.Install.FRAMEWORK;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.drools.guvnor.server.ServiceImplementation;
+import org.drools.repository.PackageItem;
+import org.drools.repository.RulesRepository;
+import org.drools.repository.RulesRepositoryException;
+import org.jboss.seam.Component;
+import org.jboss.seam.Seam;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Install;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Startup;
+import org.jboss.seam.annotations.intercept.BypassInterceptors;
+import org.jboss.seam.contexts.Contexts;
+import org.jboss.seam.log.LogProvider;
+import org.jboss.seam.log.Logging;
+import org.jboss.seam.security.Identity;
+import org.jboss.seam.security.Role;
+import org.jboss.seam.security.SimplePrincipal;
+import org.jboss.seam.security.permission.PermissionResolver;
+
+/**
+ * Resolves category-based permissions.
+ *  
+ * @author Jervis Liu
+ */
+ at Name("org.drools.guvnor.server.security.categoryBasedPermissionResolver")
+ at Scope(APPLICATION)
+ at BypassInterceptors
+ at Install(precedence = org.jboss.seam.annotations.Install.APPLICATION)
+ at Startup
+public class CategoryBasedPermissionResolver implements PermissionResolver,
+		Serializable {
+
+	@Create
+	public void create() {
+	}
+
+	public boolean hasPermission(Object target, String action) {
+		List<RoleBasedPermission> permissions = (List<RoleBasedPermission>) Contexts
+				.getSessionContext().get("packageBasedPermission");
+
+		String requestedPath;
+		if (target instanceof CategoryPathType) {
+			requestedPath = ((CategoryPathType)target).getCategoryPath();
+		} else {
+			// CategoryBasedPermissionResolver only grants permissions based on categoryPath. 
+			// Return false if the input is not a categoryPath, as this will be the reponsibility 
+			//of other PermissionResolvers in the resolver chain.
+			return false;
+		}
+		
+		//the admin can do everything
+		if (Identity.instance().hasRole(RoleTypes.ADMIN)) {
+			return true;
+		}
+		
+		//category path based permission check only applies to analyst role. For all the other 
+		//roles(admin|package.admin|package.dev|package.readonly) we always grant permisssion.
+		boolean isPermitted = true;
+		for (RoleBasedPermission pbp : permissions) {
+			//the permission check only applies to the analyst role
+			if (RoleTypes.ANALYST.equals(pbp.getRole())) {
+				isPermitted = false;
+				if(isPermitted(requestedPath, pbp.getCategoryPath())) {
+					return true;
+				}
+			}
+		}
+
+		return isPermitted;
+	}
+
+	private boolean isPermitted(String requestedPath, String allowedPath) {
+		return requestedPath.equals(allowedPath) || isSubPath(allowedPath, requestedPath);
+	}
+	
+	private boolean isSubPath(String parentPath, String subPath) {
+		//TODO: 
+		return false;
+	}
+
+	public void filterSetByAction(Set<Object> targets, String action) {
+	}
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryPathType.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryPathType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/CategoryPathType.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,19 @@
+package org.drools.guvnor.server.security;
+
+
+/**
+ * This class is used to indicate this is a type that contains categoryPath
+ *  
+ */
+public class CategoryPathType {
+	private String categoryPath;
+	
+	public CategoryPathType(String categoryPath) {
+		this.categoryPath = categoryPath;
+	}
+	
+	String getCategoryPath() {
+		return categoryPath;
+	}
+
+}

Deleted: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedAuthenticator.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedAuthenticator.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedAuthenticator.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -1,55 +0,0 @@
-package org.drools.guvnor.server.security;
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.jboss.seam.annotations.Name;
-import org.jboss.seam.contexts.Contexts;
-import org.jboss.seam.security.Identity;
-
-/**
- * Use this authenticator for package based authentication. 
- * @author Jervis Liu
- */
- at Name("packageBasedAuthenticator")
-public class PackageBasedAuthenticator {
-    
-    private static final Logger log = Logger.getLogger( PackageBasedAuthenticator.class );
-    
-    public boolean authenticate() {
-        if (SecurityServiceImpl.GUEST_LOGIN.equals( Identity.instance().getUsername())) {
-            return false;
-        }
-        log.info( "User logged in via default authentication module (no security check).");
-        
-       	PackageBasedPermissionStore pbps = new PackageBasedPermissionStore();
-    	List<PackageBasedPermission> permissions = pbps.getPackageBasedPermissionsByUserName(Identity.instance().getUsername());
-
-    	//The admin role is added into Identity so that we can call Identity.hadRole("admin")
-    	//later. Other permissions are stored in session context
-    	for(PackageBasedPermission p : permissions) {
-    		if(RoleTypes.ADMIN.equalsIgnoreCase(p.getRole())) {
-    			Identity.instance().addRole(RoleTypes.ADMIN);
-    		}
-    	}
-    	Contexts.getSessionContext().set("packageBasedPermission", permissions);
-        return true;
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermission.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermission.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermission.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -1,39 +0,0 @@
-package org.drools.guvnor.server.security;
-
-public class PackageBasedPermission {
-	private String packageUUID;
-	private String userName;
-	private String role;
-	
-	public PackageBasedPermission(String packageUUID, String userName, String role) {
-		this.packageUUID = packageUUID;
-		this.userName = userName;
-		this.role = role;		
-	}
-	
-	public String getRole() {
-		return role;
-	}
-	
-	public void setRole(String role) {
-		this.role = role;
-	}
-	
-	public String getUserName() {
-		return userName;
-	}
-	
-	public void setUserName(String userName) {
-		this.userName = userName;
-	}
-
-	public String getPackageUUID() {
-		return packageUUID;
-	}
-
-	public void setPackageUUID(String packageUUID) {
-		this.packageUUID = packageUUID;
-	}
-	
-
-}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionResolver.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionResolver.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -48,33 +48,39 @@
 	}
 
 	public boolean hasPermission(Object target, String action) {
-		List<PackageBasedPermission> permissions = (List<PackageBasedPermission>) Contexts
+		List<RoleBasedPermission> permissions = (List<RoleBasedPermission>) Contexts
 				.getSessionContext().get("packageBasedPermission");
 
 		String targetUUDI = "";
-		if (target instanceof String) {
-			if (isUUDI((String) target)) {
-				targetUUDI = (String) target;
-			} else {
-				try {
-					ServiceImplementation si = (ServiceImplementation) Component
-							.getInstance("org.drools.guvnor.client.rpc.RepositoryService");
-					PackageItem source = si.repository
-							.loadPackage((String) target);
-					targetUUDI = source.getUUID();
-				} catch (RulesRepositoryException e) {
-					//ignore
-				}
+		
+		if (target instanceof PackageUUIDType) {
+			targetUUDI = ((PackageUUIDType) target).getUUID();
+		} else if (target instanceof PackageNameType) {
+			try {
+				ServiceImplementation si = (ServiceImplementation) Component
+						.getInstance("org.drools.guvnor.client.rpc.RepositoryService");
+				PackageItem source = si.repository
+						.loadPackage(((PackageNameType) target)
+								.getPackageName());
+				targetUUDI = source.getUUID();
+			} catch (RulesRepositoryException e) {
+				return false;
 			}
+
+		} else {
+			// PackageBasedPermissionResolver only grants permissions based on package info. 
+			// Return false if the input is not a pacakge info, as this will be the reponsibility 
+			//of other PermissionResolvers in the resolver chain.
+			return false;
 		}
 		
-		//the admin can do everything
+		//admin can do everything
 		if (Identity.instance().hasRole(RoleTypes.ADMIN)) {
 			return true;
 		}
 		
-		for (PackageBasedPermission pbp : permissions) {
-			//only when the user has the permission to operate the specific action on this package
+		for (RoleBasedPermission pbp : permissions) {
+			//only when the user has the permission to perform the specific action on this package
 			if (targetUUDI.equalsIgnoreCase(pbp.getPackageUUID())
 					&& isPermitted(action, pbp.getRole())) {
 				return true;
@@ -92,10 +98,6 @@
 				return false;
 			} else if ("package.developer".equalsIgnoreCase(requestedAction)) {
 				return true;
-			} else if ("package.analyst".equalsIgnoreCase(requestedAction)) {
-				return true;
-			} else if ("package.testonly".equalsIgnoreCase(requestedAction)) {
-				return true;
 			} else if ("package.readonly".equalsIgnoreCase(requestedAction)) {
 				return true;
 			}
@@ -104,10 +106,6 @@
 				return false;
 			} else if ("package.developer".equalsIgnoreCase(requestedAction)) {
 				return false;
-			} else if ("package.analyst".equalsIgnoreCase(requestedAction)) {
-				return false;
-			} else if ("package.testonly".equalsIgnoreCase(requestedAction)) {
-				return false;
 			} else if ("package.readonly".equalsIgnoreCase(requestedAction)) {
 				return true;
 			}
@@ -116,15 +114,6 @@
 		return false;
 	}
 
-	private boolean isUUDI(String uuid) {
-		//hack implementation
-		if (uuid.length() < 36) {
-			return false;
-		} else {
-			return true;
-		}
-	}
-
 	public void filterSetByAction(Set<Object> targets, String action) {
 	}
 }

Deleted: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionStore.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionStore.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionStore.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -1,36 +0,0 @@
-package org.drools.guvnor.server.security;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PackageBasedPermissionStore {
-	private static List<PackageBasedPermission> pbps = new ArrayList<PackageBasedPermission>();
-	
-	//Mock data	
-	static {
-		pbps.add(new PackageBasedPermission("631b3d79-5b67-42fb-83da-714624970a6b", "jervis", "package.admin"));
-		pbps.add(new PackageBasedPermission("47982482-7912-4881-97ec-e852494383d7", "jervis", "package.guest"));		
-		//pbps.add(new PackageBasedPermission(null, "jervis", "admin"));			
-	}
-	
-	public PackageBasedPermissionStore() {
-	}
-	
-	public List<PackageBasedPermission> getPackageBasedPermissions() {
-		return null;
-	}
-	
-	public List<PackageBasedPermission> getPackageBasedPermissionsByUserName(String userName) {
-		return pbps;
-	}	
-	
-	public List<PackageBasedPermission> getPackageBasedPermissionsByPackage(String packageName) {
-		return null;
-	}
-	
-	public void addPackageBasedPermission(PackageBasedPermission pbp) {
-		pbps.add(pbp);		
-	}
-
-
-}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageNameType.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageNameType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageNameType.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,20 @@
+package org.drools.guvnor.server.security;
+
+
+/**
+ * This class is used to indicate this is a type that contains packageName
+ *  
+ */
+public class PackageNameType {
+
+	private String packageName;
+	
+	public PackageNameType(String packageName) {
+		this.packageName = packageName;
+	}
+	
+	String getPackageName() {
+		return packageName;
+	}
+
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageUUIDType.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageUUIDType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageUUIDType.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,20 @@
+package org.drools.guvnor.server.security;
+
+
+/**
+ * This class is used to indicate this is a type that contains pacakge UUID
+ *  
+ */
+public class PackageUUIDType {
+
+	private String uuid;
+	
+	public PackageUUIDType(String uuid) {
+		this.uuid = uuid;
+	}
+	
+	String getUUID() {
+		return uuid;
+	}
+
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedAuthenticator.java (from rev 21122, labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedAuthenticator.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedAuthenticator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedAuthenticator.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,55 @@
+package org.drools.guvnor.server.security;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.contexts.Contexts;
+import org.jboss.seam.security.Identity;
+
+/**
+ * Use this authenticator for role based authentication.
+ * @author Jervis Liu
+ */
+ at Name("roleBasedAuthenticator")
+public class RoleBasedAuthenticator {
+
+    private static final Logger log = Logger.getLogger(RoleBasedAuthenticator.class);
+
+    public boolean authenticate() {
+        if (SecurityServiceImpl.GUEST_LOGIN.equals( Identity.instance().getUsername())) {
+            return false;
+        }
+        log.info( "User logged in via RoleBasedAuthenticator.");
+
+       	RoleBasedPermissionStore pbps = new RoleBasedPermissionStore();
+    	List<RoleBasedPermission> permissions = pbps.getRoleBasedPermissionsByUserName(Identity.instance().getUsername());
+
+    	//The admin role is added into Identity so that we can call Identity.hadRole("admin")
+    	//later. Other permissions are stored in session context
+    	for(RoleBasedPermission p : permissions) {
+    		if(RoleTypes.ADMIN.equalsIgnoreCase(p.getRole())) {
+    			Identity.instance().addRole(RoleTypes.ADMIN);
+    		}
+    	}
+    	Contexts.getSessionContext().set("packageBasedPermission", permissions);
+        return true;
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermission.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermission.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermission.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,49 @@
+package org.drools.guvnor.server.security;
+
+public class RoleBasedPermission {
+	private String packageUUID;
+	private String categoryPath;
+	private String userName;
+	private String role;
+	
+	public RoleBasedPermission(String userName, String role, String packageUUID, String categoryPath) {
+		this.packageUUID = packageUUID;
+		this.categoryPath = categoryPath;		
+		this.userName = userName;
+		this.role = role;		
+	}
+	
+	public String getRole() {
+		return role;
+	}
+	
+	public void setRole(String role) {
+		this.role = role;
+	}
+	
+	public String getUserName() {
+		return userName;
+	}
+	
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getPackageUUID() {
+		return packageUUID;
+	}
+
+	public void setPackageUUID(String packageUUID) {
+		this.packageUUID = packageUUID;
+	}
+
+	public String getCategoryPath() {
+		return categoryPath;
+	}
+
+	public void setCategoryPath(String categoryPath) {
+		this.categoryPath = categoryPath;
+	}
+	
+
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermissionStore.java (from rev 21122, labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/PackageBasedPermissionStore.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermissionStore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/security/RoleBasedPermissionStore.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,37 @@
+package org.drools.guvnor.server.security;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RoleBasedPermissionStore {
+	private static List<RoleBasedPermission> rbps = new ArrayList<RoleBasedPermission>();
+	
+	//Mock data	
+	static {
+		rbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_ADMIN, "631b3d79-5b67-42fb-83da-714624970a6b", null));
+		rbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_READONLY, "47982482-7912-4881-97ec-e852494383d7", null));		
+		rbps.add(new RoleBasedPermission("jervis", RoleTypes.ANALYST, null, "category1"));		
+		rbps.add(new RoleBasedPermission("jervis", RoleTypes.ANALYST, null, "category2"));		
+	}
+	
+	public RoleBasedPermissionStore() {
+	}
+	
+	public List<RoleBasedPermission> getRoleBasedPermissions() {
+		return null;
+	}
+	
+	public List<RoleBasedPermission> getRoleBasedPermissionsByUserName(String userName) {
+		return rbps;
+	}	
+	
+	public List<RoleBasedPermission> getRoleBasedPermissionsByPackage(String packageName) {
+		return null;
+	}
+	
+	public void addRoleBasedPermission(RoleBasedPermission rbp) {
+		rbps.add(rbp);		
+	}
+
+
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -1917,7 +1917,7 @@
 
 	public void testVerifier() throws Exception {
 		ServiceImplementation impl = getService();
-		PackageItem pkg = impl.repository.createPackage("testAnalysis", "");
+		PackageItem pkg = impl.repository.createPackage("testVerifier", "");
 		AssetItem asset = pkg.addAsset("SomeDRL", "");
 		asset.updateFormat(AssetFormats.DRL);
 

Added: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolverTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolverTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/CategoryBasedPermissionResolverTest.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -0,0 +1,61 @@
+package org.drools.guvnor.server.security;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jboss.seam.contexts.Contexts;
+import org.jboss.seam.contexts.Lifecycle;
+import org.jboss.seam.security.Identity;
+
+import junit.framework.TestCase;
+
+public class CategoryBasedPermissionResolverTest extends TestCase {
+	
+    public void testAnalyst() throws Exception {
+    	//Mock up SEAM contexts
+    	Map application = new HashMap<String, Object>();    	
+    	Lifecycle.beginApplication(application);
+    	Lifecycle.beginCall();   	
+    	MockIdentity midentity = new MockIdentity();
+    	//this makes Identity.hasRole("admin") return false
+    	midentity.setHasRole(false);    	
+    	Contexts.getSessionContext().set("org.jboss.seam.security.identity", midentity);
+    	
+    	
+    	List<RoleBasedPermission> pbps = new ArrayList<RoleBasedPermission>();
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_ADMIN, "631b3d79-5b67-42fb-83da-714624970a6b", null));
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_READONLY, "47982482-7912-4881-97ec-e852494383d7", null));	
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.ANALYST, null, "category1"));
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.ANALYST, null, "category2"));
+    	Contexts.getSessionContext().set("packageBasedPermission", pbps);
+    	
+    	CategoryBasedPermissionResolver resolver = new CategoryBasedPermissionResolver();
+        assertTrue(resolver.hasPermission(new CategoryPathType("category1"), null));
+        assertTrue(resolver.hasPermission(new CategoryPathType("category2"), null));
+        assertFalse(resolver.hasPermission(new CategoryPathType("category3/category3"), null));
+        //TODO:
+        //assertTrue(resolver.hasPermission(new CategoryPathType("/category1/category2"), null));
+ 
+    	Lifecycle.endApplication();   
+    } 
+ }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/PackageBasedPermissionResolverTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/PackageBasedPermissionResolverTest.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/security/PackageBasedPermissionResolverTest.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -43,15 +43,15 @@
     	Contexts.getSessionContext().set("org.jboss.seam.security.identity", midentity);
     	
     	
-    	List<PackageBasedPermission> pbps = new ArrayList<PackageBasedPermission>();
-		pbps.add(new PackageBasedPermission("631b3d79-5b67-42fb-83da-714624970a6b", "jervis", RoleTypes.ADMIN));
-		pbps.add(new PackageBasedPermission("47982482-7912-4881-97ec-e852494383d7", "jervis", RoleTypes.PACKAGE_READONLY));		
+    	List<RoleBasedPermission> pbps = new ArrayList<RoleBasedPermission>();
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.ADMIN, "631b3d79-5b67-42fb-83da-714624970a6b", null));
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_READONLY, "47982482-7912-4881-97ec-e852494383d7", null));		
     	Contexts.getSessionContext().set("packageBasedPermission", pbps);
     	
     	PackageBasedPermissionResolver resolver = new PackageBasedPermissionResolver();
     	
-        assertTrue(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", "create"));
-        assertTrue(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "create"));
+        assertTrue(resolver.hasPermission(new PackageUUIDType("631b3d79-5b67-42fb-83da-714624970a6b"), RoleTypes.ADMIN));
+        assertTrue(resolver.hasPermission(new PackageUUIDType("47982482-7912-4881-97ec-e852494383d7"), RoleTypes.ADMIN));
 
     	Lifecycle.endApplication();
     }    
@@ -68,16 +68,16 @@
     	Contexts.getSessionContext().set("org.jboss.seam.security.identity", midentity);
     	
     	
-    	List<PackageBasedPermission> pbps = new ArrayList<PackageBasedPermission>();
-		pbps.add(new PackageBasedPermission("631b3d79-5b67-42fb-83da-714624970a6b", "jervis", RoleTypes.PACKAGE_ADMIN));
+    	List<RoleBasedPermission> pbps = new ArrayList<RoleBasedPermission>();
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_ADMIN, "631b3d79-5b67-42fb-83da-714624970a6b", null));
     	Contexts.getSessionContext().set("packageBasedPermission", pbps);
     	
     	PackageBasedPermissionResolver resolver = new PackageBasedPermissionResolver();
-        assertTrue(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", "package.admin"));
-    	assertTrue(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", "package.developer"));
-        assertTrue(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", "package.readonly"));
+        assertTrue(resolver.hasPermission(new PackageUUIDType("631b3d79-5b67-42fb-83da-714624970a6b"), RoleTypes.PACKAGE_ADMIN));
+    	assertTrue(resolver.hasPermission(new PackageUUIDType("631b3d79-5b67-42fb-83da-714624970a6b"), RoleTypes.PACKAGE_DEVELOPER));
+        assertTrue(resolver.hasPermission(new PackageUUIDType("631b3d79-5b67-42fb-83da-714624970a6b"), RoleTypes.PACKAGE_READONLY));
         
-        assertFalse(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "package.readonly"));
+        assertFalse(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", RoleTypes.PACKAGE_READONLY));
 
     	Lifecycle.endApplication();   
     } 
@@ -94,17 +94,17 @@
     	Contexts.getSessionContext().set("org.jboss.seam.security.identity", midentity);
     	
     	
-    	List<PackageBasedPermission> pbps = new ArrayList<PackageBasedPermission>();
-		pbps.add(new PackageBasedPermission("47982482-7912-4881-97ec-e852494383d7", "jervis", RoleTypes.PACKAGE_DEVELOPER));		
+    	List<RoleBasedPermission> pbps = new ArrayList<RoleBasedPermission>();
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_DEVELOPER, "47982482-7912-4881-97ec-e852494383d7", null));		
     	Contexts.getSessionContext().set("packageBasedPermission", pbps);
     	
     	PackageBasedPermissionResolver resolver = new PackageBasedPermissionResolver();
         
-    	assertFalse(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "package.admin"));
-    	assertTrue(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "package.developer"));
-        assertTrue(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "package.readonly"));
+    	assertFalse(resolver.hasPermission(new PackageUUIDType("47982482-7912-4881-97ec-e852494383d7"), RoleTypes.PACKAGE_ADMIN));
+    	assertTrue(resolver.hasPermission(new PackageUUIDType("47982482-7912-4881-97ec-e852494383d7"), RoleTypes.PACKAGE_DEVELOPER));
+        assertTrue(resolver.hasPermission(new PackageUUIDType("47982482-7912-4881-97ec-e852494383d7"), RoleTypes.PACKAGE_READONLY));
         
-        assertFalse(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", "package.readonly"));
+        assertFalse(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", RoleTypes.PACKAGE_READONLY));
 
     	Lifecycle.endApplication();   
     }    
@@ -121,17 +121,17 @@
     	Contexts.getSessionContext().set("org.jboss.seam.security.identity", midentity);
     	
     	
-    	List<PackageBasedPermission> pbps = new ArrayList<PackageBasedPermission>();
-		pbps.add(new PackageBasedPermission("47982482-7912-4881-97ec-e852494383d7", "jervis", RoleTypes.PACKAGE_READONLY));		
+    	List<RoleBasedPermission> pbps = new ArrayList<RoleBasedPermission>();
+		pbps.add(new RoleBasedPermission("jervis", RoleTypes.PACKAGE_READONLY, "47982482-7912-4881-97ec-e852494383d7", null));		
     	Contexts.getSessionContext().set("packageBasedPermission", pbps);
     	
     	PackageBasedPermissionResolver resolver = new PackageBasedPermissionResolver();
         
-        assertFalse(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "package.admin"));
-        assertFalse(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "package.developer"));
-        assertTrue(resolver.hasPermission("47982482-7912-4881-97ec-e852494383d7", "package.readonly"));
+        assertFalse(resolver.hasPermission(new PackageUUIDType("47982482-7912-4881-97ec-e852494383d7"), RoleTypes.PACKAGE_DEVELOPER));
+        assertFalse(resolver.hasPermission(new PackageUUIDType("47982482-7912-4881-97ec-e852494383d7"), RoleTypes.PACKAGE_DEVELOPER));
+        assertTrue(resolver.hasPermission(new PackageUUIDType("47982482-7912-4881-97ec-e852494383d7"), RoleTypes.PACKAGE_READONLY));
         
-        assertFalse(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", "package.readonly"));
+        assertFalse(resolver.hasPermission("631b3d79-5b67-42fb-83da-714624970a6b", RoleTypes.PACKAGE_READONLY));
 
     	Lifecycle.endApplication();   
     } 

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java	2008-07-20 13:01:15 UTC (rev 21134)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java	2008-07-21 02:54:47 UTC (rev 21135)
@@ -778,7 +778,7 @@
 		    if ( isNotSnapshot( parentNode ) && parentNode.getPrimaryNodeType().getName().equals( AssetItem.RULE_NODE_TYPE_NAME ) ) {
 		        if ( seekArchivedAsset || !parentNode.getProperty( AssetItem.CONTENT_PROPERTY_ARCHIVE_FLAG ).getBoolean() ) {
 		        	AssetItem ai = new AssetItem( this, parentNode );
-		        	if(filter == null || filter.accept(ai, "read")) {
+		        	if(filter == null || filter.accept(ai, "repackage.readonly")) {
 		        		results.add(ai);
 		        		rows++;
 		        	}




More information about the jboss-svn-commits mailing list